From 8c0e906edf89a38683a7ea1a7eb89d65bb2fd7b5 Mon Sep 17 00:00:00 2001 From: Tom Szendrey Date: Mon, 29 Jul 2024 16:27:10 -0400 Subject: [PATCH 1/8] rename step size as we have two. Add only to extra --- service/models/operations/simulate.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/service/models/operations/simulate.py b/service/models/operations/simulate.py index 2aeeebb..24066cd 100644 --- a/service/models/operations/simulate.py +++ b/service/models/operations/simulate.py @@ -21,6 +21,17 @@ class SimulateExtra(BaseModel): description="id from a previous calibration", example=None, ) + solver_method: str = Field( + "dopri5", + description="Optional field for CIEMSS calibration", + example="dopri5", + ) + # https://github.com/ciemss/pyciemss/blob/main/pyciemss/integration_utils/interface_checks.py + solver_step_size: float = Field( + None, + description="id from a previous calibration", + example=1.0, + ) class Simulate(OperationRequest): @@ -28,7 +39,7 @@ class Simulate(OperationRequest): model_config_id: str = Field(..., example="ba8da8d4-047d-11ee-be56") timespan: Timespan = Timespan(start=0, end=90) policy_intervention_id: str = Field(None, example="ba8da8d4-047d-11ee-be56") - step_size: float = 1.0 + logging_step_size: float = 1.0 extra: SimulateExtra = Field( None, description="optional extra system specific arguments for advanced use cases", @@ -51,14 +62,20 @@ def gen_pyciemss_args(self, job_id): extra_options.pop("inferred_parameters"), job_id ) + solver_options = {} + if self.extra.solver_step_size is not None: + solver_options = {"step_size": self.extra.solver_step_size} + return { "model_path_or_json": amr_path, - "logging_step_size": self.step_size, + "logging_step_size": self.logging_step_size, "start_time": self.timespan.start, "end_time": self.timespan.end, "static_parameter_interventions": static_interventions, "dynamic_parameter_interventions": dynamic_interventions, "inferred_parameters": inferred_parameters, + "solver_method": self.extra.solver_method, + "solver_options": solver_options, **extra_options, } From 436a23cd01ee5c4bfdf1ef493748baf3c5e474e7 Mon Sep 17 00:00:00 2001 From: Tom Szendrey Date: Tue, 30 Jul 2024 09:22:28 -0400 Subject: [PATCH 2/8] Adding solver step size for calibrate --- service/models/operations/calibrate.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/service/models/operations/calibrate.py b/service/models/operations/calibrate.py index bb9ddd6..1f7ca90 100644 --- a/service/models/operations/calibrate.py +++ b/service/models/operations/calibrate.py @@ -38,6 +38,12 @@ class CalibrateExtra(BaseModel): solver_method: str = Field( "dopri5", description="Optional field for CIEMSS calibration", example="dopri5" ) + # https://github.com/ciemss/pyciemss/blob/main/pyciemss/integration_utils/interface_checks.py + solver_step_size: float = Field( + None, + description="Step size required if solver method is euler.", + example=1.0, + ) class Calibrate(OperationRequest): @@ -74,6 +80,11 @@ def hook(progress, _loss): logging.info(f"Calibration is {progress}% complete") return None + extra_options = self.extra.dict() + solver_options = {} + if self.solver_step_size is not None: + solver_options = {"step_size": self.solver_step_size} + return { "model_path_or_json": amr_path, "start_time": self.timespan.start, @@ -82,8 +93,10 @@ def hook(progress, _loss): "data_path": dataset_path, "static_parameter_interventions": static_interventions, "progress_hook": hook, + "solver_method": self.extra.solver_method, + "solver_options": solver_options, # "visual_options": True, - **self.extra.dict(), + **extra_options, } class Config: From 193809b3b0db343b8ca85319ef5021fb38668ce3 Mon Sep 17 00:00:00 2001 From: Tom Szendrey Date: Tue, 30 Jul 2024 09:23:04 -0400 Subject: [PATCH 3/8] desc update --- service/models/operations/simulate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/service/models/operations/simulate.py b/service/models/operations/simulate.py index 24066cd..c992f6a 100644 --- a/service/models/operations/simulate.py +++ b/service/models/operations/simulate.py @@ -29,7 +29,7 @@ class SimulateExtra(BaseModel): # https://github.com/ciemss/pyciemss/blob/main/pyciemss/integration_utils/interface_checks.py solver_step_size: float = Field( None, - description="id from a previous calibration", + description="Step size required if solver method is euler.", example=1.0, ) From aff8a567ca1d203e348e09a74d485687a71724e8 Mon Sep 17 00:00:00 2001 From: Tom Szendrey Date: Tue, 30 Jul 2024 09:47:45 -0400 Subject: [PATCH 4/8] check for solver method too --- service/models/operations/calibrate.py | 2 +- service/models/operations/simulate.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/service/models/operations/calibrate.py b/service/models/operations/calibrate.py index 1f7ca90..f7f2995 100644 --- a/service/models/operations/calibrate.py +++ b/service/models/operations/calibrate.py @@ -82,7 +82,7 @@ def hook(progress, _loss): extra_options = self.extra.dict() solver_options = {} - if self.solver_step_size is not None: + if self.solver_step_size is not None and self.extra.solver_method == "euler": solver_options = {"step_size": self.solver_step_size} return { diff --git a/service/models/operations/simulate.py b/service/models/operations/simulate.py index c992f6a..dc6cfa3 100644 --- a/service/models/operations/simulate.py +++ b/service/models/operations/simulate.py @@ -63,7 +63,10 @@ def gen_pyciemss_args(self, job_id): ) solver_options = {} - if self.extra.solver_step_size is not None: + if ( + self.extra.solver_step_size is not None + and self.extra.solver_method == "euler" + ): solver_options = {"step_size": self.extra.solver_step_size} return { From db19dba7515fa47cab055c86827f354454c1140c Mon Sep 17 00:00:00 2001 From: Tom Szendrey Date: Tue, 30 Jul 2024 09:54:40 -0400 Subject: [PATCH 5/8] always pop step size out of extras. --- service/models/operations/calibrate.py | 5 +++-- service/models/operations/simulate.py | 8 +++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/service/models/operations/calibrate.py b/service/models/operations/calibrate.py index f7f2995..6ee861c 100644 --- a/service/models/operations/calibrate.py +++ b/service/models/operations/calibrate.py @@ -82,8 +82,9 @@ def hook(progress, _loss): extra_options = self.extra.dict() solver_options = {} - if self.solver_step_size is not None and self.extra.solver_method == "euler": - solver_options = {"step_size": self.solver_step_size} + step_size = self.extra.pop("solver_step_size") # Need to pop this out of extra. + if step_size is not None and self.extra.solver_method == "euler": + solver_options = {"step_size": step_size} return { "model_path_or_json": amr_path, diff --git a/service/models/operations/simulate.py b/service/models/operations/simulate.py index dc6cfa3..743123a 100644 --- a/service/models/operations/simulate.py +++ b/service/models/operations/simulate.py @@ -63,11 +63,9 @@ def gen_pyciemss_args(self, job_id): ) solver_options = {} - if ( - self.extra.solver_step_size is not None - and self.extra.solver_method == "euler" - ): - solver_options = {"step_size": self.extra.solver_step_size} + step_size = self.extra.pop("solver_step_size") # Need to pop this out of extra. + if step_size is not None and self.extra.solver_method == "euler": + solver_options = {"step_size": step_size} return { "model_path_or_json": amr_path, From 2244703c50c25740c5f417d9451c36212f0e5af3 Mon Sep 17 00:00:00 2001 From: Tom Szendrey Date: Tue, 30 Jul 2024 10:01:59 -0400 Subject: [PATCH 6/8] extra_options --- service/models/operations/calibrate.py | 4 +++- service/models/operations/simulate.py | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/service/models/operations/calibrate.py b/service/models/operations/calibrate.py index 6ee861c..3fca33b 100644 --- a/service/models/operations/calibrate.py +++ b/service/models/operations/calibrate.py @@ -82,7 +82,9 @@ def hook(progress, _loss): extra_options = self.extra.dict() solver_options = {} - step_size = self.extra.pop("solver_step_size") # Need to pop this out of extra. + step_size = extra_options.pop( + "solver_step_size" + ) # Need to pop this out of extra. if step_size is not None and self.extra.solver_method == "euler": solver_options = {"step_size": step_size} diff --git a/service/models/operations/simulate.py b/service/models/operations/simulate.py index 743123a..2b8f015 100644 --- a/service/models/operations/simulate.py +++ b/service/models/operations/simulate.py @@ -63,7 +63,9 @@ def gen_pyciemss_args(self, job_id): ) solver_options = {} - step_size = self.extra.pop("solver_step_size") # Need to pop this out of extra. + step_size = extra_options.pop( + "solver_step_size" + ) # Need to pop this out of extra. if step_size is not None and self.extra.solver_method == "euler": solver_options = {"step_size": step_size} From 0c5e78561a072e7fe89b0286c58252ed5d0dbdac Mon Sep 17 00:00:00 2001 From: Tom Szendrey Date: Tue, 30 Jul 2024 10:45:26 -0400 Subject: [PATCH 7/8] extras suck. unrequired but dont double send. --- service/models/operations/calibrate.py | 5 +++-- service/models/operations/simulate.py | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/service/models/operations/calibrate.py b/service/models/operations/calibrate.py index 3fca33b..3d15c01 100644 --- a/service/models/operations/calibrate.py +++ b/service/models/operations/calibrate.py @@ -85,7 +85,8 @@ def hook(progress, _loss): step_size = extra_options.pop( "solver_step_size" ) # Need to pop this out of extra. - if step_size is not None and self.extra.solver_method == "euler": + solver_method = extra_options.pop("solver_method") + if step_size is not None and solver_method == "euler": solver_options = {"step_size": step_size} return { @@ -96,7 +97,7 @@ def hook(progress, _loss): "data_path": dataset_path, "static_parameter_interventions": static_interventions, "progress_hook": hook, - "solver_method": self.extra.solver_method, + "solver_method": solver_method, "solver_options": solver_options, # "visual_options": True, **extra_options, diff --git a/service/models/operations/simulate.py b/service/models/operations/simulate.py index 2b8f015..39f51de 100644 --- a/service/models/operations/simulate.py +++ b/service/models/operations/simulate.py @@ -66,7 +66,8 @@ def gen_pyciemss_args(self, job_id): step_size = extra_options.pop( "solver_step_size" ) # Need to pop this out of extra. - if step_size is not None and self.extra.solver_method == "euler": + solver_method = extra_options.pop("solver_method") + if step_size is not None and solver_method == "euler": solver_options = {"step_size": step_size} return { @@ -77,7 +78,7 @@ def gen_pyciemss_args(self, job_id): "static_parameter_interventions": static_interventions, "dynamic_parameter_interventions": dynamic_interventions, "inferred_parameters": inferred_parameters, - "solver_method": self.extra.solver_method, + "solver_method": solver_method, "solver_options": solver_options, **extra_options, } From 1bedfe23da2fc3843dc8502c3e1940242961d54e Mon Sep 17 00:00:00 2001 From: Tom Szendrey Date: Tue, 30 Jul 2024 11:57:24 -0400 Subject: [PATCH 8/8] good call Dan --- service/models/operations/calibrate.py | 2 +- service/models/operations/simulate.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/service/models/operations/calibrate.py b/service/models/operations/calibrate.py index 3d15c01..c49fe90 100644 --- a/service/models/operations/calibrate.py +++ b/service/models/operations/calibrate.py @@ -87,7 +87,7 @@ def hook(progress, _loss): ) # Need to pop this out of extra. solver_method = extra_options.pop("solver_method") if step_size is not None and solver_method == "euler": - solver_options = {"step_size": step_size} + solver_options["step_size"] = step_size return { "model_path_or_json": amr_path, diff --git a/service/models/operations/simulate.py b/service/models/operations/simulate.py index 39f51de..5e3ca60 100644 --- a/service/models/operations/simulate.py +++ b/service/models/operations/simulate.py @@ -68,7 +68,7 @@ def gen_pyciemss_args(self, job_id): ) # Need to pop this out of extra. solver_method = extra_options.pop("solver_method") if step_size is not None and solver_method == "euler": - solver_options = {"step_size": step_size} + solver_options["step_size"] = step_size return { "model_path_or_json": amr_path,