examples: fix notices for pendulum-simulation, simplify --workers option handling, fix assertions for v test examples/pendulum-simulation

This commit is contained in:
Delyan Angelov 2024-01-29 04:37:46 +02:00
parent 77b8097f51
commit db61723206
No known key found for this signature in database
GPG key ID: 66886C0F12D595ED
6 changed files with 31 additions and 38 deletions

View file

@ -1,37 +1,32 @@
module main module main
import log
import benchmark import benchmark
import sim import sim
import sim.anim import sim.anim
import sim.args as simargs import sim.args as simargs
fn main() { fn main() {
unbuffer_stdout()
args := simargs.parse_args(extra_workers: 1)! as simargs.ParallelArgs args := simargs.parse_args(extra_workers: 1)! as simargs.ParallelArgs
mut app := anim.new_app(args) mut app := anim.new_app(args)
mut workers := []thread{cap: args.workers} mut workers := []thread{cap: args.workers}
mut bmark := benchmark.start() mut bmark := benchmark.start()
defer { defer {
app.request_chan.close() app.request_chan.close()
sim.log('Waiting for workers to finish') log.info('Waiting for workers to finish')
workers.wait() workers.wait()
app.result_chan.close() app.result_chan.close()
sim.log('Workers finished!') log.info('Workers finished!')
bmark.measure(@FN) bmark.measure(@FN)
sim.log('Done!') log.info('Done!')
} }
for id in 0 .. args.workers { for id in 0 .. args.workers {
workers << spawn sim.sim_worker(id, app.request_chan, [app.result_chan]) workers << spawn sim.sim_worker(id, app.request_chan, [app.result_chan])
} }
handle_request := fn [app] (request &sim.SimRequest) ! { handle_request := fn [app] (request &sim.SimRequest) ! {
app.request_chan <- request app.request_chan <- request
} }
spawn app.gg.run() spawn app.gg.run()
sim.run(args.params, grid: args.grid, on_request: sim.SimRequestHandler(handle_request)) sim.run(args.params, grid: args.grid, on_request: sim.SimRequestHandler(handle_request))
} }

View file

@ -101,6 +101,7 @@ fn parse_parallel_args(extra_workers int) !ParallelArgs {
fp.skip_executable() fp.skip_executable()
workers := fp.int('workers', 0, args.max_parallel_workers, 'amount of workers to use on simulation. Defaults to ${args.max_parallel_workers}') workers := fp.int('workers', 0, args.max_parallel_workers, 'amount of workers to use on simulation. Defaults to ${args.max_parallel_workers}')
dump(workers)
// output parameters // output parameters
width := fp.int('width', `w`, sim.default_width, 'width of the image output. Defaults to ${sim.default_width}') width := fp.int('width', `w`, sim.default_width, 'width of the image output. Defaults to ${sim.default_width}')
@ -140,6 +141,9 @@ fn parse_parallel_args(extra_workers int) !ParallelArgs {
grid: grid grid: grid
workers: get_workers(workers, extra_workers) workers: get_workers(workers, extra_workers)
} }
dump(extra_workers)
dump(args.max_parallel_workers)
dump(args)
sim.log('${args}') sim.log('${args}')
@ -148,11 +152,5 @@ fn parse_parallel_args(extra_workers int) !ParallelArgs {
@[inline] @[inline]
fn get_workers(workers int, extra_workers int) int { fn get_workers(workers int, extra_workers int) int {
result := if workers + extra_workers <= args.max_parallel_workers { return math.max(1, workers + extra_workers)
workers
} else {
args.max_parallel_workers - extra_workers
}
return math.max(1, result)
} }

View file

@ -42,7 +42,7 @@ pub fn test_get_rope_vector() {
pub fn test_get_forces_sum() { pub fn test_get_forces_sum() {
result := sim.params_test_mock_params.get_forces_sum(sim.params_test_mock_state) result := sim.params_test_mock_params.get_forces_sum(sim.params_test_mock_state)
expected := vector( expected := vector(
x: 3.637978807091713e-12 x: 3.410605131648481e-12
y: 5.229594535194337e-12 y: 5.229594535194337e-12
z: 9.094947017729282e-13 z: 9.094947017729282e-13
) )
@ -60,8 +60,8 @@ pub fn test_get_grav_force() {
pub fn test_get_magnet_position() { pub fn test_get_magnet_position() {
result := sim.params_test_mock_params.get_magnet_position(sim.params_test_mock_tetha) result := sim.params_test_mock_params.get_magnet_position(sim.params_test_mock_tetha)
expected := vector( expected := vector(
x: -0.024999999999999988 x: -0.02499999999999999
y: 0.043301270189221946 y: 0.04330127018922194
z: -0.03 z: -0.03
) )
assert result == expected assert result == expected
@ -71,7 +71,7 @@ pub fn test_get_magnet_force() {
result := sim.params_test_mock_params.get_magnet_force(sim.params_test_mock_tetha, result := sim.params_test_mock_params.get_magnet_force(sim.params_test_mock_tetha,
sim.params_test_mock_state) sim.params_test_mock_state)
expected := vector( expected := vector(
x: -157.45722976925555 x: -157.4572297692556
y: 1422.736432604726 y: 1422.736432604726
z: -632.5695169850264 z: -632.5695169850264
) )
@ -98,7 +98,7 @@ pub fn test_get_magnet1_force() {
pub fn test_get_magnet2_force() { pub fn test_get_magnet2_force() {
result := sim.params_test_mock_params.get_magnet2_force(sim.params_test_mock_state) result := sim.params_test_mock_params.get_magnet2_force(sim.params_test_mock_state)
expected := vector( expected := vector(
x: -157.45722976925555 x: -157.4572297692556
y: 1422.736432604726 y: 1422.736432604726
z: -632.5695169850264 z: -632.5695169850264
) )

View file

@ -29,9 +29,9 @@ pub fn new_grid_settings(settings GridSettings) GridSettings {
pub struct RunnerSettings { pub struct RunnerSettings {
pub: pub:
grid GridSettings grid GridSettings
on_request SimRequestHandler on_request SimRequestHandler = unsafe { nil }
on_start SimStartHandler on_start SimStartHandler = unsafe { nil }
on_finish SimFinishHandler on_finish SimFinishHandler = unsafe { nil }
} }
pub fn run(params SimParams, settings RunnerSettings) { pub fn run(params SimParams, settings RunnerSettings) {

View file

@ -53,10 +53,10 @@ pub fn test_increment() {
assert state.position.x == -0.016957230930171364 assert state.position.x == -0.016957230930171364
assert state.position.y == -0.02937078552673524 assert state.position.y == -0.02937078552673524
assert state.position.z == 0.0023110634753272796 assert state.position.z == 0.0023110634753272796
assert state.velocity.x == -7.251158929833044 assert state.velocity.x == -7.251158929833047
assert state.velocity.y == -12.559375680227637 assert state.velocity.y == -12.559375680227637
assert state.velocity.z == -105.9153968768638 assert state.velocity.z == -105.9153968768638
assert state.accel.x == 1.2126596023639044e-10 assert state.accel.x == 1.1368683772161604e-10
assert state.accel.y == 1.7431981783981126e-10 assert state.accel.y == 1.7431981783981126e-10
assert state.accel.z == 3.031649005909761e-11 assert state.accel.z == 3.031649005909761e-11
} }

View file

@ -34,27 +34,27 @@ fn test_compute_result() {
} }
expected_state := SimState{ expected_state := SimState{
position: vector( position: vector(
x: -0.01695723093017133 x: -0.01695723093017135
y: -0.02937078552673517 y: -0.029370785526735183
z: 0.002311063475327252 z: 0.002311063475327252
) )
velocity: vector( velocity: vector(
x: -7.251158929832518 x: -7.251158929831753
y: -12.559375680226692 y: -12.55937568022536
z: -105.91539687685668 z: -105.91539687684447
) )
accel: vector( accel: vector(
x: -3.789561257387201e-12 x: -1.1368683772161603e-11
y: 3.410605131648481e-11 y: -1.5916157281026244e-10
z: 3.031649005909761e-11 z: 0
) )
} }
expected := &SimResult{ expected := &SimResult{
state: expected_state state: expected_state
id: 0 id: 0
magnet1_distance: 0.07993696666249224 magnet1_distance: 0.07993696666249225
magnet2_distance: 0.07993696666249223 magnet2_distance: 0.07993696666249224
magnet3_distance: 0.03609361938278009 magnet3_distance: 0.03609361938278008
} }
result := compute_result(request) result := compute_result(request)
assert result == expected assert result == expected