• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

wexlergroup / FreeBird.jl / 12425832067

20 Dec 2024 05:01AM UTC coverage: 9.157% (+2.7%) from 6.452%
12425832067

push

github

web-flow
Merge pull request #63 from wexlergroup/feature/lattice-gas

New walker systems

111 of 1111 new or added lines in 23 files covered. (9.99%)

1 existing line in 1 file now uncovered.

126 of 1376 relevant lines covered (9.16%)

0.54 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/SamplingSchemes/NestedSampling.jl
1
"""
2
    mutable struct NestedSamplingParameters <: SamplingParameters
3

4
The `NestedSamplingParameters` struct represents the parameters used in the nested sampling scheme.
5

6
# Fields
7
- `mc_steps::Int64`: The number of total Monte Carlo moves to perform.
8
- `initial_step_size::Float64`: The initial step size, which is the fallback step size if MC routine fails to accept a move.
9
- `step_size::Float64`: The on-the-fly step size used in the sampling process.
10
- `step_size_lo::Float64`: The lower bound of the step size.
11
- `step_size_up::Float64`: The upper bound of the step size.
12
- `fail_count::Int64`: The number of failed MC moves in a row.
13
- `allowed_fail_count::Int64`: The maximum number of failed MC moves allowed before resetting the step size.
14

15
"""
16
mutable struct NestedSamplingParameters <: SamplingParameters
17
    mc_steps::Int64
18
    initial_step_size::Float64
19
    step_size::Float64
20
    step_size_lo::Float64
21
    step_size_up::Float64
22
    fail_count::Int64
23
    allowed_fail_count::Int64
24
end
25

26
mutable struct LatticeNestedSamplingParameters <: SamplingParameters
27
    mc_steps::Int64
28
    energy_perturbation::Float64
29
    fail_count::Int64
30
    allowed_fail_count::Int64
31
end
32

33

34

35
"""
36
    abstract type MCRoutine
37

38
An abstract type representing a Monte Carlo routine.
39
"""
40
abstract type MCRoutine end
41

42
"""
43
    struct MCRandomWalkMaxE <: MCRoutine
44
A type for generating a new walker by performing a random walk for decorrelation on the highest-energy walker.
45
"""
46
struct MCRandomWalkMaxE <: MCRoutine end
47

48
"""
49
    struct MCRandomWalkClone <: MCRoutine
50
A type for generating a new walker by cloning an existing walker and performing a random walk for decorrelation.
51
"""
52
struct MCRandomWalkClone <: MCRoutine end
53

54
"""
55
    struct MCNewSample <: MCRoutine
56
A type for generating a new walker from a random configuration. Currently, it is intended to use this routine for lattice gas systems.
57
"""
58
struct MCNewSample <: MCRoutine end
59

60
"""
61
    MCDemonWalk <: MCRoutine
62

63
A Monte Carlo routine for performing demon walks.
64

65
# Fields
66
- `e_demon_tolerance::typeof(0.0u"eV")`: The tolerance for the energy difference in the demon walk. Tighter tolerance will lead to lower overall acceptance of the demon walk.
67
- `demon_energy_threshold::typeof(0.0u"eV")`: The energy threshold for the demon walk. Lower threshold will limit the exploration of the potential energy landscape but increase the overall acceptance of the demon walk.
68
- `demon_gain_threshold::typeof(0.0u"eV")`: The gain threshold for the demon during each walk. Similar to the `demon_energy_threshold`, lower gain threshold will limit the exploration of the potential energy landscape but increase the overall acceptance of the demon walk.
69
- `max_add_steps::Int`: The maximum number of steps to add in the demon walk if the demon energy `e_demon` is higher than the `demon_energy_threshold`.
70
"""
71
@kwdef struct MCDemonWalk <: MCRoutine 
72
    e_demon_tolerance::typeof(0.0u"eV")=1e-9u"eV"
73
    demon_energy_threshold::typeof(0.0u"eV")=Inf*u"eV"
74
    demon_gain_threshold::typeof(0.0u"eV")=Inf*u"eV"
75
    max_add_steps::Int=1_000_000
76
end
77

78
"""
79
    struct MixedMCRoutine <: MCRoutine
80

81
A mutable struct representing a mixed Monte Carlo routine, where the main routine is used for the majority of the steps, 
82
    and the backup routine is used when the main routine fails to accept a move. Currently, it is intended to use `MCRandomWalk` 
83
    as the main routine and `MCDemonWalk` as the backup routine.
84

85
# Fields
86
- `main_routine::MCRoutine`: The main Monte Carlo routine.
87
- `back_up_routine::MCRoutine`: The backup Monte Carlo routine.
88
- `ns_params_main::NestedSamplingParameters`: The nested sampling parameters for the main routine.
89
- `ns_params_back_up::NestedSamplingParameters`: The nested sampling parameters for the backup routine.
90
"""
91
@kwdef mutable struct MixedMCRoutine <: MCRoutine
92
    main_routine::MCRoutine=MCRandomWalk()
93
    back_up_routine::MCRoutine=MCDemonWalk()
94
    ns_params_main::NestedSamplingParameters=NestedSamplingParameters(1000, 0.1, 0.1, 1e-6, 0.1, 0, 10)
95
    ns_params_back_up::NestedSamplingParameters=NestedSamplingParameters(10000, 0.01, 0.01, 1e-6, .01, 0, 10)
96
end
97

98

99

100

101
"""
102
    sort_by_energy!(liveset::LJAtomWalkers)
103

104
Sorts the walkers in the liveset by their energy in descending order.
105

106
# Arguments
107
- `liveset::LJAtomWalkers`: The liveset of walkers to be sorted.
108

109
# Returns
110
- `liveset::LJAtomWalkers`: The sorted liveset.
111
"""
NEW
112
function sort_by_energy!(liveset::AbstractLiveSet)
×
113
    sort!(liveset.walkers, by = x -> x.energy, rev=true)
×
114
    # println("after sort ats[1].system_data.energy: ", ats[1].system_data.energy)
115
    return liveset
×
116
end
117

118
"""
119
    update_iter!(liveset::AtomWalkers)
120

121
Update the iteration count for each walker in the liveset.
122

123
# Arguments
124
- `liveset::AtomWalkers`: The set of walkers to update.
125

126
"""
NEW
127
function update_iter!(liveset::AbstractLiveSet)
×
128
    for at in liveset.walkers
×
129
        at.iter += 1
×
130
    end
×
131
end
132

133

134
"""
135
    nested_sampling_step!(liveset::AtomWalkers, ns_params::NestedSamplingParameters, mc_routine::MCRandomWalk)
136

137
Perform a single step of the nested sampling algorithm using the Monte Carlo random walk routine.
138

139
Arguments
140
- `liveset::AtomWalkers`: The set of atom walkers.
141
- `ns_params::NestedSamplingParameters`: The parameters for nested sampling.
142
- `mc_routine::MCRandomWalk`: The Monte Carlo random walk routine. Currently within this function, the random walk is only applied to the highest-energy walker, i.e., the one being culled.
143

144
Returns
145
- `iter`: The iteration number after the step.
146
- `emax`: The highest energy recorded during the step.
147
- `liveset`: The updated set of atom walkers.
148
- `ns_params`: The updated nested sampling parameters.
149
"""
150
function nested_sampling_step!(liveset::AtomWalkers, ns_params::NestedSamplingParameters, mc_routine::MCRoutine)
×
151
    sort_by_energy!(liveset)
×
152
    ats = liveset.walkers
×
153
    lj = liveset.lj_potential
×
154
    iter::Union{Missing,Int} = missing
×
155
    emax::Union{Missing,typeof(0.0u"eV")} = liveset.walkers[1].energy
×
156
    if mc_routine isa MCRandomWalkMaxE
×
157
        to_walk = deepcopy(ats[1])
×
158
    elseif mc_routine isa MCRandomWalkClone
×
159
        to_walk = deepcopy(rand(ats[2:end]))
×
160
    else
161
        error("Unsupported MCRoutine type: $mc_routine")
×
162
    end
163
    accept, rate, at = MC_random_walk!(ns_params.mc_steps, to_walk, lj, ns_params.step_size, emax)
×
164
    @info "iter: $(liveset.walkers[1].iter), acceptance rate: $rate, emax: $emax, is_accepted: $accept, step_size: $(ns_params.step_size)"
×
165
    if accept
×
166
        push!(ats, at)
×
167
        popfirst!(ats)
×
168
        update_iter!(liveset)
×
169
        ns_params.fail_count = 0
×
170
        iter = liveset.walkers[1].iter
×
171
    else
172
        @warn "Failed to accept MC move"
×
173
        emax = missing
×
174
        ns_params.fail_count += 1
×
175
    end
176
    adjust_step_size(ns_params, rate)
×
177
    return iter, emax, liveset, ns_params
×
178
end
179

180
"""
181
    nested_sampling_step!(liveset::LatticeGasWalkers, ns_params::LatticeNestedSamplingParameters, mc_routine::MCRoutine; accept_same_config::Bool=true)
182

183
Perform a single step of the nested sampling algorithm.
184

185
This function takes a `liveset` of lattice gas walkers, `ns_params` containing the parameters for nested sampling, and `mc_routine` representing the Monte Carlo 
186
routine for generating new samples. It performs a single step of the nested sampling algorithm by updating the liveset with a new walker.
187

188
## Arguments
189
- `liveset::LatticeGasWalkers`: The liveset of lattice gas walkers.
190
- `ns_params::LatticeNestedSamplingParameters`: The parameters for nested sampling.
191
- `mc_routine::MCRoutine`: The Monte Carlo routine for generating new samples.
192
- `accept_same_config::Bool=true`: A flag indicating whether to accept a new sample with the same configuration as an existing one. Default is `true`. Note that 
193
if it is set to `false`, the sampling process may take significantly longer to find a new configuration.
194

195
## Returns
196
- `iter`: The iteration number of the liveset after the step.
197
- `emax`: The maximum energy of the liveset after the step.
198
"""
NEW
199
function nested_sampling_step!(liveset::LatticeGasWalkers, 
×
200
                               ns_params::LatticeNestedSamplingParameters, 
201
                               mc_routine::MCRoutine;
202
                               accept_same_config::Bool=true)
NEW
203
    sort_by_energy!(liveset)
×
NEW
204
    ats = liveset.walkers
×
NEW
205
    h = liveset.hamiltonian
×
NEW
206
    iter::Union{Missing,Int} = missing
×
NEW
207
    emax::Union{Missing,Float64} = liveset.walkers[1].energy.val
×
NEW
208
    if mc_routine isa MCRandomWalkMaxE
×
NEW
209
        to_walk = deepcopy(ats[1])
×
NEW
210
    elseif mc_routine isa MCRandomWalkClone
×
NEW
211
        to_walk = deepcopy(rand(ats[2:end]))
×
212
    else
NEW
213
        error("Unsupported MCRoutine type: $mc_routine")
×
214
    end
NEW
215
    accept, rate, at = MC_random_walk!(ns_params.mc_steps, to_walk, h, emax; energy_perturb=ns_params.energy_perturbation)
×
NEW
216
    configs = [wk.configuration.occupations for wk in ats]
×
NEW
217
    if (at.configuration.occupations in configs) && !accept_same_config
×
NEW
218
        @warn "Configuration already exists in the liveset"
×
NEW
219
        accept = false
×
220
    end
NEW
221
    @info "iter: $(liveset.walkers[1].iter), acceptance rate: $rate, emax: $emax, is_accepted: $accept"
×
NEW
222
    if accept
×
NEW
223
        push!(ats, at)
×
NEW
224
        popfirst!(ats)
×
NEW
225
        update_iter!(liveset)
×
NEW
226
        ns_params.fail_count = 0
×
NEW
227
        iter = liveset.walkers[1].iter
×
228
    else
NEW
229
        @warn "Failed to accept MC move"
×
NEW
230
        emax = missing
×
NEW
231
        ns_params.fail_count += 1
×
232
    end
233
    # adjust_step_size(ns_params, rate)
NEW
234
    return iter, emax, liveset, ns_params
×
235
end
236

237
"""
238
    nested_sampling_step!(liveset::LatticeGasWalkers, ns_params::LatticeNestedSamplingParameters, mc_routine::MCNewSample; accept_same_config::Bool=false)
239

240
Perform a single step of the nested sampling algorithm.
241

242
This function takes a `liveset` of lattice gas walkers, `ns_params` containing the parameters for nested sampling, and `mc_routine` representing the Monte Carlo routine for generating new samples. It performs a single step of the nested sampling algorithm by updating the liveset with a new walker.
243

244
## Arguments
245
- `liveset::LatticeGasWalkers`: The liveset of lattice gas walkers.
246
- `ns_params::LatticeNestedSamplingParameters`: The parameters for nested sampling.
247
- `mc_routine::MCNewSample`: The Monte Carlo routine for generating new samples.
248
- `accept_same_config::Bool=true`: A flag indicating whether to accept a new sample with the same configuration as an existing one.
249

250
## Returns
251
- `iter`: The iteration number of the liveset after the step.
252
- `emax`: The maximum energy of the liveset after the step.
253
- `liveset::LatticeGasWalkers`: The updated liveset after the step.
254
- `ns_params::LatticeNestedSamplingParameters`: The updated nested sampling parameters after the step.
255
"""
NEW
256
function nested_sampling_step!(liveset::LatticeGasWalkers, 
×
257
                               ns_params::LatticeNestedSamplingParameters, 
258
                               mc_routine::MCNewSample;
259
                               accept_same_config::Bool=true)
NEW
260
    sort_by_energy!(liveset)
×
NEW
261
    ats = liveset.walkers
×
NEW
262
    h = liveset.hamiltonian
×
NEW
263
    iter::Union{Missing,Int} = missing
×
NEW
264
    emax::Union{Missing,Float64} = liveset.walkers[1].energy.val
×
265

NEW
266
    to_walk = deepcopy(ats[1])
×
267

NEW
268
    accept, at = MC_new_sample!(to_walk, h, emax; energy_perturb=ns_params.energy_perturbation)
×
269
    # configs = [wk.configuration.occupations for wk in ats]
270
    # if (at.configuration.occupations in configs) && !accept_same_config
271
    #     @warn "Configuration already exists in the liveset"
272
    #     accept = false
273
    # end
NEW
274
    @info "iter: $(liveset.walkers[1].iter), emax: $emax, is_accepted: $accept"
×
NEW
275
    if accept
×
NEW
276
        push!(ats, at)
×
NEW
277
        popfirst!(ats)
×
NEW
278
        update_iter!(liveset)
×
NEW
279
        ns_params.fail_count = 0
×
NEW
280
        iter = liveset.walkers[1].iter
×
281
    else
NEW
282
        @warn "Failed to accept MC move"
×
NEW
283
        emax = missing
×
NEW
284
        ns_params.fail_count += 1
×
285
    end
286
    # adjust_step_size(ns_params, rate)
NEW
287
    return iter, emax, liveset, ns_params
×
288
end
289

290
"""
291
    nested_sampling_step!(liveset::AtomWalkers, ns_params::NestedSamplingParameters, mc_routine::MCDemonWalk)
292

293
Perform a single step of the nested sampling algorithm using the Monte Carlo demon walk routine.
294

295
# Arguments
296
- `liveset::AtomWalkers`: The set of atom walkers representing the current state of the system.
297
- `ns_params::NestedSamplingParameters`: The parameters for the nested sampling algorithm.
298
- `mc_routine::MCDemonWalk`: The parameters for the Monte Carlo demon walk.
299

300
# Returns
301
- `iter`: The iteration number after the step.
302
- `emax`: The maximum energy recorded during the step.
303
- `liveset`: The updated set of atom walkers after the step.
304
- `ns_params`: The updated nested sampling parameters after the step.
305
"""
306
function nested_sampling_step!(liveset::AtomWalkers, ns_params::NestedSamplingParameters, mc_routine::MCDemonWalk)
×
307
    sort_by_energy!(liveset)
×
308
    ats = liveset.walkers
×
309
    lj = liveset.lj_potential
×
310
    iter::Union{Missing,Int} = missing
×
311
    emax::Union{Missing,typeof(0.0u"eV")} = liveset.walkers[1].energy
×
312
    pick_a_random_walker = rand(ats[2:end])
×
313
    to_walk = deepcopy(pick_a_random_walker)
×
314
    accept, rate, at, _, _ = MC_nve_walk!(ns_params.mc_steps, to_walk, lj, ns_params.step_size;
×
315
                                        e_demon_tolerance=mc_routine.e_demon_tolerance,
316
                                        demon_energy_threshold=mc_routine.demon_energy_threshold,
317
                                        demon_gain_threshold=mc_routine.demon_gain_threshold,
318
                                        max_add_steps=mc_routine.max_add_steps)
319
    @info "acceptance rate: $rate, emax: $emax, is_accepted: $accept"
×
320
    if accept
×
321
        push!(ats, at)
×
322
        popfirst!(ats)
×
323
        update_iter!(liveset)
×
324
        ns_params.fail_count = 0
×
325
        iter = liveset.walkers[1].iter
×
326
    else
327
        @warn "Failed to accept MC move"
×
328
        emax = missing
×
329
        ns_params.fail_count += 1
×
330
    end
331
    adjust_step_size(ns_params, rate)
×
332
    return iter, emax, liveset, ns_params
×
333
end
334

335
"""
336
    adjust_step_size(ns_params::NestedSamplingParameters, rate::Float64)
337

338
Adjusts the step size of the nested sampling algorithm based on the acceptance rate. 
339
    If the acceptance rate is greater than 0.75, the step size is increased by 1%. 
340
    If the acceptance rate is less than 0.25, the step size is decreased by 1%.
341

342
# Arguments
343
- `ns_params::NestedSamplingParameters`: The parameters of the nested sampling algorithm.
344
- `rate::Float64`: The acceptance rate of the algorithm.
345
- `range::Tuple{Float64, Float64}`: The range of acceptance rates for adjusting the step size. Default is (0.25, 0.75).
346

347
# Returns
348
- `ns_params::NestedSamplingParameters`: The updated parameters with adjusted step size.
349
"""
350
function adjust_step_size(ns_params::NestedSamplingParameters, rate::Float64; range::Tuple{Float64, Float64}=(0.25, 0.75))
×
351
    if rate > range[2] && ns_params.step_size < ns_params.step_size_up
×
352
        ns_params.step_size *= 1.05
×
353
    elseif rate < range[1] && ns_params.step_size > ns_params.step_size_lo
×
354
        ns_params.step_size *= 0.95
×
355
    end
356
    return ns_params
×
357
end
358

359

360

361
"""
362
    nested_sampling_loop!(liveset::AtomWalkers, ns_params::NestedSamplingParameters, n_steps::Int64, mc_routine::MCRoutine; args...)
363

364
Perform a nested sampling loop for a given number of steps.
365

366
# Arguments
367
- `liveset::AtomWalkers`: The initial set of walkers.
368
- `ns_params::NestedSamplingParameters`: The parameters for nested sampling.
369
- `n_steps::Int64`: The number of steps to perform.
370
- `mc_routine::MCRoutine`: The Monte Carlo routine to use.
371

372
# Returns
373
- `df`: A DataFrame containing the iteration number and maximum energy for each step.
374
- `liveset`: The updated set of walkers.
375
- `ns_params`: The updated nested sampling parameters.
376
"""
377
function nested_sampling_loop!(liveset::AtomWalkers, 
×
378
                                ns_params::NestedSamplingParameters, 
379
                                n_steps::Int64, 
380
                                mc_routine::MCRoutine,
381
                                save_strategy::DataSavingStrategy)
382
    df = DataFrame(iter=Int[], emax=Float64[])
×
383
    for i in 1:n_steps
×
384
        write_walker_every_n(liveset.walkers[1], i, save_strategy)
×
385
        iter, emax, liveset, ns_params = nested_sampling_step!(liveset, ns_params, mc_routine)
×
386
        @debug "n_step $i, iter: $iter, emax: $emax"
×
387
        if ns_params.fail_count >= ns_params.allowed_fail_count
×
388
            @warn "Failed to accept MC move $(ns_params.allowed_fail_count) times in a row. Reset step size!"
×
389
            ns_params.fail_count = 0
×
390
            ns_params.step_size = ns_params.initial_step_size
×
391
        end
392
        if !(iter isa typeof(missing))
×
393
            push!(df, (iter, emax.val))
×
394
        end
395
        write_df_every_n(df, i, save_strategy)
×
396
        write_ls_every_n(liveset, i, save_strategy)
×
397
    end
×
398
    return df, liveset, ns_params
×
399
end
400

401
"""
402
    nested_sampling_loop!(liveset::LatticeGasWalkers, ns_params::LatticeNestedSamplingParameters, n_steps::Int64, mc_routine::MCRoutine; args...)
403

404
Perform a nested sampling loop on a lattice gas system for a given number of steps.
405

406
# Arguments
407
- `liveset::LatticeGasWalkers`: The initial set of walkers.
408
- `ns_params::LatticeNestedSamplingParameters`: The parameters for nested sampling.
409
- `n_steps::Int64`: The number of steps to perform.
410
- `mc_routine::MCRoutine`: The Monte Carlo routine to use.
411

412
# Keyword Arguments
413
- `args...`: Additional arguments.
414

415
# Returns
416
- `df`: A DataFrame containing the iteration number and maximum energy for each step.
417
- `liveset`: The updated set of walkers.
418
- `ns_params`: The updated nested sampling parameters.
419
"""
NEW
420
function nested_sampling_loop!(liveset::LatticeGasWalkers,
×
421
                                ns_params::LatticeNestedSamplingParameters, 
422
                                n_steps::Int64, 
423
                                mc_routine::MCRoutine,
424
                                save_strategy::DataSavingStrategy;
425
                                accept_same_config::Bool=false)
NEW
426
    df = DataFrame(iter=Int[], emax=Float64[], config=Any[])
×
NEW
427
    for i in 1:n_steps
×
428
        # write_walker_every_n(liveset.walkers[1], i, save_strategy)
429
        
NEW
430
        config = liveset.walkers[1].configuration.components
×
431

NEW
432
        iter, emax, liveset, ns_params = nested_sampling_step!(liveset, ns_params, mc_routine; accept_same_config=accept_same_config)
×
NEW
433
        @debug "n_step $i, iter: $iter, emax: $emax"
×
NEW
434
        if ns_params.fail_count >= ns_params.allowed_fail_count
×
NEW
435
            @warn "Failed to accept MC move $(ns_params.allowed_fail_count) times in a row. Break!"
×
NEW
436
            ns_params.fail_count = 0
×
NEW
437
            break
×
438
        end
NEW
439
        if !(iter isa typeof(missing))
×
NEW
440
            push!(df, (iter, emax, config))
×
441
        end
NEW
442
        write_df_every_n(df, i, save_strategy)
×
NEW
443
        write_ls_every_n(liveset, i, save_strategy)
×
NEW
444
    end
×
NEW
445
    return df, liveset, ns_params
×
446
end
447

448

449
"""
450
    nested_sampling_loop!(liveset::AtomWalkers, n_steps::Int64, mc_routine::MixedMCRoutine, save_strategy::DataSavingStrategy)
451

452
Perform a nested sampling loop for a given number of steps.
453

454
# Arguments
455
- `liveset::AtomWalkers`: The initial set of walkers.
456
- `n_steps::Int64`: The number of steps to perform.
457
- `mc_routine::MixedMCRoutine`: The mixed Monte Carlo routine to use.
458
- `save_strategy::DataSavingStrategy`: The strategy for saving data.
459

460
# Returns
461
- `df::DataFrame`: The data frame containing the iteration number and maximum energy for each step.
462
- `liveset::AtomWalkers`: The updated set of walkers.
463
- `mc_routine.ns_params_main`: The updated nested sampling parameters for the main routine.
464
"""
465
function nested_sampling_loop!(liveset::AtomWalkers,  
×
466
                                n_steps::Int64, 
467
                                mc_routine::MixedMCRoutine,
468
                                save_strategy::DataSavingStrategy)
469
    df = DataFrame(iter=Int[], emax=Float64[])
×
470
    for i in 1:n_steps
×
471
        write_walker_every_n(liveset.walkers[1], i, save_strategy)
×
472
        iter, emax, liveset, mc_routine.ns_params_main = nested_sampling_step!(liveset, mc_routine.ns_params_main, mc_routine.main_routine)
×
473
        if mc_routine.ns_params_main.fail_count >= mc_routine.ns_params_main.allowed_fail_count
×
474
            @warn "Failed to accept $(mc_routine.main_routine) move $(mc_routine.ns_params_main.allowed_fail_count) times in a row. Switching to back up routine $(mc_routine.back_up_routine)!"
×
475
            mc_routine.ns_params_main.fail_count = 0
×
476
            iter, emax, liveset, mc_routine.ns_params_back_up = nested_sampling_step!(liveset, mc_routine.ns_params_back_up, mc_routine.back_up_routine)
×
477
        end
478
        if !(iter isa typeof(missing))
×
479
            push!(df, (iter, emax.val))
×
480
        end
481
        write_df_every_n(df, i, save_strategy)
×
482
        write_ls_every_n(liveset, i, save_strategy)
×
483
    end
×
484
    return df, liveset, mc_routine.ns_params_main
×
485
end
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc