Well, I’ve been thinking about it and I guess I can use tcollect if I make a transducer that maps a container of initial conditions into a container of simulation results.
EDIT: I corrected my code using tcollect
and dcollect
as follows and it seems work.
(some part of the corrected code)
# simulator
trajs_evaluate(x0, ts) = Sim(env, x0, ts, ẋ) |> TakeWhile(!terminal_condition) |> Map(postprocess) |> evaluate
# paralell simulation
n = rand(num)
@time data_single = trajs_evaluate(x0s[n], ts) # single scenario
@time data_multiple = x0s |> Map(x0 -> trajs_evaluate(x0, ts)) |> collect # multiple scenarios
@time data_parallel_t = x0s |> Map(x0 -> trajs_evaluate(x0, ts)) |> tcollect # multiple scenarios with thread-based parallel computing
@time data_parallel_d = x0s |> Map(x0 -> trajs_evaluate(x0, ts)) |> dcollect # multiple scenarios with process-based parallel computing
@test data_single == data_multiple[n]
@test data_multiple == data_parallel_t == data_parallel_d