From 61c3327a98ba8415614895cbdd48d865f61c49b0 Mon Sep 17 00:00:00 2001 From: Katha-BP Date: Fri, 6 Feb 2026 17:46:19 +0000 Subject: [PATCH 1/7] Fix for serialization/deserialization mismatch --- ecoli/library/serialize.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ecoli/library/serialize.py b/ecoli/library/serialize.py index 353459380..25cf5e071 100644 --- a/ecoli/library/serialize.py +++ b/ecoli/library/serialize.py @@ -77,12 +77,17 @@ def can_deserialize(self, data): return bool(self.regex_for_serialized.fullmatch(data)) def deserialize(self, data): + import ast + matched_regex = self.regex_for_serialized.fullmatch(data) if matched_regex: data = matched_regex.group(1) - data = orjson.loads(data) + if data.startswith("("): + data = ast.literal_eval(data) + else: + data = orjson.loads(data) rng = np.random.RandomState() - rng.set_state(data) + rng.set_state(tuple(data)) return rng From 2b2c68394092c93977702b29713a19f2411a625f Mon Sep 17 00:00:00 2001 From: Katha-BP Date: Fri, 6 Feb 2026 17:47:52 +0000 Subject: [PATCH 2/7] Fix for unsupported types (pint.Quantity) --- ecoli/library/parquet_emitter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecoli/library/parquet_emitter.py b/ecoli/library/parquet_emitter.py index 67af7f61e..ceac5fcea 100644 --- a/ecoli/library/parquet_emitter.py +++ b/ecoli/library/parquet_emitter.py @@ -1100,7 +1100,7 @@ def emit(self, data: dict[str, Any]): :emit_idx ].tolist() + [None] * (self.batch_size - emit_idx) # Fall back Polars serialization - v = pl.Series([v]) + v = pl.Series([str(v)]) # Ensure type consistency curr_type = self.pl_types.setdefault(k, pl.Null) if v.dtype != curr_type: From 08cfe412185b9279341ae8cb53cd205936cbcc67 Mon Sep 17 00:00:00 2001 From: Katha-BP Date: Fri, 6 Feb 2026 17:49:13 +0000 Subject: [PATCH 3/7] Fix for emit_config not passing --- ecoli/experiments/ecoli_engine_process.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ecoli/experiments/ecoli_engine_process.py b/ecoli/experiments/ecoli_engine_process.py index 5f8dd54ca..c3155fe83 100644 --- a/ecoli/experiments/ecoli_engine_process.py +++ b/ecoli/experiments/ecoli_engine_process.py @@ -467,6 +467,7 @@ def run_simulation(config): topology=composite.topology, initial_state=initial_state, experiment_id=experiment_id, + emit_config=config.get("emit_config", False), emitter=emitter_config, progress_bar=config["progress_bar"], metadata=metadata, From 233dec36db6bf890f5f6ea2756e35b0124daf8db Mon Sep 17 00:00:00 2001 From: Ningyuan Xu <85104243+katha815@users.noreply.github.com> Date: Thu, 12 Feb 2026 16:49:54 +0000 Subject: [PATCH 4/7] Move import of 'ast' to the top --- ecoli/library/serialize.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ecoli/library/serialize.py b/ecoli/library/serialize.py index 25cf5e071..ab89b048f 100644 --- a/ecoli/library/serialize.py +++ b/ecoli/library/serialize.py @@ -1,6 +1,7 @@ import numpy as np import orjson import re +import ast from unum import Unum from vivarium.core.registry import Serializer from vivarium.library.topology import convert_path_style, normalize_path @@ -77,8 +78,6 @@ def can_deserialize(self, data): return bool(self.regex_for_serialized.fullmatch(data)) def deserialize(self, data): - import ast - matched_regex = self.regex_for_serialized.fullmatch(data) if matched_regex: data = matched_regex.group(1) From e92d91b9b21656259414854ae99caeba6ad0f956 Mon Sep 17 00:00:00 2001 From: Ningyuan Xu <85104243+katha815@users.noreply.github.com> Date: Thu, 12 Feb 2026 17:32:48 +0000 Subject: [PATCH 5/7] Add configuration options to support all vivarium-core Engine features --- ecoli/experiments/ecoli_engine_process.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ecoli/experiments/ecoli_engine_process.py b/ecoli/experiments/ecoli_engine_process.py index c3155fe83..0c3bd6ef3 100644 --- a/ecoli/experiments/ecoli_engine_process.py +++ b/ecoli/experiments/ecoli_engine_process.py @@ -473,6 +473,14 @@ def run_simulation(config): metadata=metadata, profile=config["profile"], initial_global_time=config.get("start_time", 0.0), + emit_topology=config.get("emit_topology", True), + emit_processes=config.get("emit_processes", False), + emit_step=config.get("emit_step", 1), + display_info=config.get("display_info", True), + global_time_precision=config.get("global_time_precision", None), + store_schema=config.get("store_schema", None), + description=config.get("description", ""), + experiment_name=config.get("experiment_name", None), ) # Unnecessary reference to initial_state engine.initial_state = None From 70b730b083e736d4a636000fa13153a4dbd5c88d Mon Sep 17 00:00:00 2001 From: Ningyuan Xu <85104243+katha815@users.noreply.github.com> Date: Thu, 12 Feb 2026 17:45:05 +0000 Subject: [PATCH 6/7] Change reversed since it doesn't tackle the real problem Change serialization to preserve original value type. --- ecoli/library/parquet_emitter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecoli/library/parquet_emitter.py b/ecoli/library/parquet_emitter.py index ceac5fcea..67af7f61e 100644 --- a/ecoli/library/parquet_emitter.py +++ b/ecoli/library/parquet_emitter.py @@ -1100,7 +1100,7 @@ def emit(self, data: dict[str, Any]): :emit_idx ].tolist() + [None] * (self.batch_size - emit_idx) # Fall back Polars serialization - v = pl.Series([str(v)]) + v = pl.Series([v]) # Ensure type consistency curr_type = self.pl_types.setdefault(k, pl.Null) if v.dtype != curr_type: From 3c5e80a8bce443434d08e17ba0964f172889186f Mon Sep 17 00:00:00 2001 From: Ningyuan Xu <85104243+katha815@users.noreply.github.com> Date: Thu, 12 Feb 2026 17:51:02 +0000 Subject: [PATCH 7/7] Serialize metadata in ecoli_engine_process.py Serialize metadata using serialize_value as recommended. --- ecoli/experiments/ecoli_engine_process.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ecoli/experiments/ecoli_engine_process.py b/ecoli/experiments/ecoli_engine_process.py index 0c3bd6ef3..ab9a83ca5 100644 --- a/ecoli/experiments/ecoli_engine_process.py +++ b/ecoli/experiments/ecoli_engine_process.py @@ -452,6 +452,7 @@ def run_simulation(config): metadata.pop("initial_state", None) metadata["git_hash"] = get_git_revision_hash() metadata["git_diff"] = get_git_diff() + metadata = serialize_value(metadata) # Since unique numpy updater is an class method, internal # deepcopying in vivarium-core causes this warning to appear