248248
249249@testitem " mcsolve" setup= [TESetup] begin
250250 using SciMLOperators
251+ using Statistics
251252
252253 # Get parameters from TESetup to simplify the code
253254 H = TESetup. H
270271 progress_bar = Val (false ),
271272 jump_callback = DiscreteLindbladJumpCallback (),
272273 )
274+ sol_mc3 = mcsolve (H, ψ0, tlist, c_ops, e_ops = e_ops, progress_bar = Val (false ), keep_runs_results = Val (true ))
273275 sol_mc_states =
274276 mcsolve (H, ψ0, tlist, c_ops, saveat = saveat, progress_bar = Val (false ), keep_runs_results = Val (true ))
275277 sol_mc_states2 = mcsolve (
@@ -291,12 +293,17 @@ end
291293 @test prob_mc. prob. f. f isa MatrixOperator
292294 @test sum (abs, sol_mc. expect .- sol_me. expect) / length (tlist) < 0.1
293295 @test sum (abs, sol_mc2. expect .- sol_me. expect) / length (tlist) < 0.1
296+ @test sum (abs, average_expect (sol_mc3) .- sol_me. expect) / length (tlist) < 0.1
294297 @test sum (abs, expect_mc_states_mean .- vec (sol_me. expect[1 , saveat_idxs])) / length (tlist) < 0.1
295298 @test sum (abs, expect_mc_states_mean2 .- vec (sol_me. expect[1 , saveat_idxs])) / length (tlist) < 0.1
296299 @test length (sol_mc. times) == length (tlist)
297300 @test length (sol_mc. times_states) == 1
298301 @test size (sol_mc. expect) == (length (e_ops), length (tlist))
299302 @test size (sol_mc. states) == (1 ,)
303+ @test length (sol_mc3. times) == length (tlist)
304+ @test length (sol_mc3. times_states) == 1
305+ @test size (sol_mc3. expect) == (length (e_ops), 500 , length (tlist)) # ntraj = 500
306+ @test size (sol_mc3. states) == (500 , 1 ) # ntraj = 500
300307 @test length (sol_mc_states. times) == length (tlist)
301308 @test length (sol_mc_states. times_states) == length (saveat)
302309 @test size (sol_mc_states. states) == (500 , length (saveat)) # ntraj = 500
331338 @test_throws ArgumentError mcsolve (H, ψ0, tlist, c_ops, save_idxs = [1 , 2 ], progress_bar = Val (false ))
332339 @test_throws DimensionMismatch mcsolve (H, TESetup. ψ_wrong, tlist, c_ops, progress_bar = Val (false ))
333340
341+ # test average_states, average_expect, and std_expect
342+ expvals_all = sol_mc3. expect[:, :, 2 : end ] # ignore testing initial time point since its standard deviation is a very small value (basically zero)
343+ stdvals = std_expect (sol_mc3)
344+ @test average_states (sol_mc) == sol_mc. states
345+ @test average_expect (sol_mc) == sol_mc. expect
346+ @test size (stdvals) == (length (e_ops), length (tlist))
347+ @test all (
348+ isapprox .(
349+ stdvals[:, 2 : end ], # ignore testing initial time point since its standard deviation is a very small value (basically zero)
350+ dropdims (sqrt .(mean (abs2 .(expvals_all), dims = 2 ) .- abs2 .(mean (expvals_all, dims = 2 ))), dims = 2 );
351+ atol = 1e-6 ,
352+ ),
353+ )
354+ @test average_expect (sol_mc_states) === nothing
355+ @test std_expect (sol_mc_states) === nothing
356+ @test_throws ArgumentError std_expect (sol_mc)
357+
334358 @testset " Memory Allocations (mcsolve)" begin
335359 ntraj = 100
336360 for keep_runs_results in (Val (false ), Val (true ))
0 commit comments