Skip to content

Commit f275882

Browse files
Merge pull request #112 from CliMA/ne/input_ekp_struct
Enable EKP struct as input arg for initialize
2 parents 4232948 + 57288cf commit f275882

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

src/ekp_interface.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,12 +190,17 @@ end
190190
"""
191191
initialize(ensemble_size, observations, noise, prior, output_dir; kwargs...)
192192
initialize(ensemble_size, observations, prior, output_dir; kwargs...)
193+
initialize(eki::EnsembleKalmanProcess, prior, output_dir)
193194
initialize(config::ExperimentConfig; kwargs...)
194195
initialize(filepath::AbstractString; kwargs...)
195196
196197
Initialize the EnsembleKalmanProcess object and parameter files.
197198
199+
Can take in an existing EnsembleKalmanProcess which will be used to generate the
200+
initial parameter ensemble.
201+
198202
Noise is optional when the observation is an EKP.ObservationSeries.
203+
199204
Additional kwargs may be passed through to the EnsembleKalmanProcess constructor.
200205
"""
201206
initialize(filepath::AbstractString; kwargs...) =
@@ -244,6 +249,11 @@ initialize(
244249
ekp_kwargs...,
245250
)
246251

252+
function initialize(eki::EKP.EnsembleKalmanProcess, prior, output_dir)
253+
save_eki_state(eki, output_dir, 0, prior)
254+
return eki
255+
end
256+
247257
function _initialize(
248258
ensemble_size,
249259
observations,

test/ekp_interface.jl

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ import ClimaCalibrate as CAL
55
import ClimaParams as CP
66
import LinearAlgebra: I
77
using Test
8+
import Random
9+
10+
rng_seed = 1234
11+
Random.seed!(rng_seed)
12+
rng_ekp = Random.MersenneTwister(rng_seed)
813

914
FT = Float64
1015
output_dir = "test_init"
@@ -56,6 +61,30 @@ params = CP.get_parameter_values(td, param_names)
5661
@test params.two == 5.408386812503563
5762
end
5863

64+
@testset "Test passing an EKP struct into `initialize`" begin
65+
LHF_target = 4.0
66+
ensemble_size = 5
67+
N_iterations = 5
68+
Γ = 20.0 * EKP.I
69+
output_dir = joinpath("test", "custom_ekp")
70+
initial_ensemble =
71+
EKP.construct_initial_ensemble(rng_ekp, prior, ensemble_size)
72+
ensemble_kalman_process = EKP.EnsembleKalmanProcess(
73+
initial_ensemble,
74+
LHF_target,
75+
Γ,
76+
EKP.Inversion(),
77+
)
78+
CAL.initialize(ensemble_kalman_process, prior, output_dir)
79+
override_file =
80+
joinpath(output_dir, "iteration_000", "member_001", "parameters.toml")
81+
td = CP.create_toml_dict(FT; override_file)
82+
params = CP.get_parameter_values(td, param_names)
83+
@test params.one == 4.506555276137722
84+
@test params.two == 5.408386812503563
85+
end
86+
87+
5988
@testset "Environment variables" begin
6089
@test_throws ErrorException(
6190
"Experiment dir not found in environment. Ensure that env variable \"CALIBRATION_EXPERIMENT_DIR\" is set.",

0 commit comments

Comments
 (0)