From f58e161a63e24edd80da0e94cdbaae3a7d9670c5 Mon Sep 17 00:00:00 2001 From: momchil Date: Tue, 31 Oct 2023 16:28:10 -0700 Subject: [PATCH] Setting internal json indent to None, and splitting json string in hdf5 --- CHANGELOG.md | 3 ++ tests/sims/simulation_2_5_0rc2.h5 | Bin 374808 -> 449568 bytes tests/test_components/test_IO.py | 18 +++++++--- tests/test_web/test_webapi.py | 2 +- tests/test_web/test_webapi_heat.py | 2 +- tidy3d/components/base.py | 40 +++++++++++++++++----- tidy3d/plugins/adjoint/components/base.py | 7 ++-- tidy3d/web/core/file_util.py | 22 ++++++++++-- tidy3d/web/core/task_core.py | 15 ++------ 9 files changed, 74 insertions(+), 35 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 605f4243b..4e60db699 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,10 +8,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added ### Changed +- Indent for the json string of Tidy3D models has been changed to `None` when used internally; kept as `indent=4` for writing to `json` and `yaml` files. ### Fixed - Fixed the duplication of log messages in Jupyter when `set_logging_file` is used. - If input to circular filters in adjoint have size smaller than the diameter, instead of erroring, warn user and truncate the filter kernel accordingly. +- When writing the json string of a model to an `hdf5` file, the string is split into chunks if it has more than a set (very large) number of characters. This fixes potential error if the string size is more than 4GB. + ## [2.5.0rc2] - 2023-10-30 diff --git a/tests/sims/simulation_2_5_0rc2.h5 b/tests/sims/simulation_2_5_0rc2.h5 index 6897bbaa28dd5de7b133f07842bd378d5fa94367..1e92efab402c2754e3c720a4c94749b0c33212f7 100644 GIT binary patch literal 449568 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 None: ------- >>> simulation.to_json(fname='folder/sim.json') # doctest: +SKIP """ - json_string = self._json_string + json_string = self._json(indent=INDENT_JSON_FILE) self._warn_if_contains_data(json_string) with open(fname, "w", encoding="utf-8") as file_handle: file_handle.write(json_string) @@ -375,7 +379,7 @@ def to_yaml(self, fname: str) -> None: self._warn_if_contains_data(json_string) model_dict = json.loads(json_string) with open(fname, "w+", encoding="utf-8") as file_handle: - yaml.dump(model_dict, file_handle, indent=INDENT) + yaml.dump(model_dict, file_handle, indent=INDENT_JSON_FILE) @staticmethod def _warn_if_contains_data(json_str: str) -> None: @@ -430,6 +434,23 @@ def get_sub_model(cls, group_path: str, model_dict: dict | list) -> dict: model_dict = model_dict[key] return model_dict + @staticmethod + def _json_string_key(index: int) -> str: + """Get json string key for string chunk number ``index``.""" + if index: + return f"{JSON_TAG}_{index}" + return JSON_TAG + + @classmethod + def _json_string_from_hdf5(cls, fname: str) -> str: + """Load the model json string from an hdf5 file.""" + with h5py.File(fname, "r") as f_handle: + num_string_parts = len([key for key in f_handle.keys() if JSON_TAG in key]) + json_string = b"" + for ind in range(num_string_parts): + json_string += f_handle[cls._json_string_key(ind)][()] + return json_string + @classmethod def dict_from_hdf5( cls, fname: str, group_path: str = "", custom_decoders: List[Callable] = None @@ -501,10 +522,7 @@ def load_data_from_file(model_dict: dict, group_path: str = "") -> None: elif isinstance(value, dict): load_data_from_file(model_dict=value, group_path=subpath) - with h5py.File(fname, "r") as f_handle: - json_string = f_handle[JSON_TAG][()] - model_dict = json.loads(json_string) - + model_dict = json.loads(cls._json_string_from_hdf5(fname=fname)) group_path = cls._construct_group_path(group_path) model_dict = cls.get_sub_model(group_path=group_path, model_dict=model_dict) load_data_from_file(model_dict=model_dict, group_path=group_path) @@ -563,7 +581,11 @@ def to_hdf5(self, fname: str, custom_encoders: List[Callable] = None) -> None: with h5py.File(fname, "w") as f_handle: - f_handle[JSON_TAG] = self._json_string + json_str = self._json_string + for ind in range(ceil(len(json_str) / MAX_STRING_LENGTH)): + ind_start = int(ind * MAX_STRING_LENGTH) + ind_stop = min(int(ind + 1) * MAX_STRING_LENGTH, len(json_str)) + f_handle[self._json_string_key(ind)] = json_str[ind_start:ind_stop] def add_data_to_file(data_dict: dict, group_path: str = "") -> None: """For every DataArray item in dictionary, write path of hdf5 group as value.""" diff --git a/tidy3d/plugins/adjoint/components/base.py b/tidy3d/plugins/adjoint/components/base.py index 459b49e7a..f45d6bc98 100644 --- a/tidy3d/plugins/adjoint/components/base.py +++ b/tidy3d/plugins/adjoint/components/base.py @@ -9,7 +9,7 @@ from jax.tree_util import tree_flatten as jax_tree_flatten from jax.tree_util import tree_unflatten as jax_tree_unflatten -from ....components.base import Tidy3dBaseModel, cached_property +from ....components.base import Tidy3dBaseModel from .data.data_array import JaxDataArray, JAX_DATA_ARRAY_TAG @@ -93,11 +93,10 @@ def from_tidy3d(cls, tidy3d_obj: Tidy3dBaseModel) -> JaxObject: """ IO """ - @cached_property - def _json_string(self) -> str: + def _json(self, *args, **kwargs) -> str: """Overwritten method to get the json string to store in the files.""" - json_string_og = super()._json_string + json_string_og = super()._json(*args, **kwargs) json_dict = json.loads(json_string_og) def strip_data_array(sub_dict: dict) -> None: diff --git a/tidy3d/web/core/file_util.py b/tidy3d/web/core/file_util.py index bd3bbdc9b..9305eaab1 100644 --- a/tidy3d/web/core/file_util.py +++ b/tidy3d/web/core/file_util.py @@ -49,12 +49,28 @@ def read_simulation_from_hdf5_gz(file_name: str) -> str: return json_str +"""TODO: _json_string_key and read_simulation_from_hdf5 are duplicated functions that also exist +as methods in Tidy3dBaseModel. For consistency it would be best if this duplication is avoided.""" + + +def _json_string_key(index): + """Get json string key for string chunk number ``index``.""" + if index: + return f"{JSON_TAG}_{index}" + return JSON_TAG + + def read_simulation_from_hdf5(file_name: str) -> str: """read simulation str from hdf5""" - with h5py.File(file_name, "r") as f_handle: - json_string = f_handle[JSON_TAG][()] - return json_string + num_string_parts = len([key for key in f_handle.keys() if JSON_TAG in key]) + json_string = b"" + for ind in range(num_string_parts): + json_string += f_handle[_json_string_key(ind)][()] + return json_string + + +"""End TODO""" def read_simulation_from_json(file_name: str) -> str: diff --git a/tidy3d/web/core/task_core.py b/tidy3d/web/core/task_core.py index a37533987..f44cff153 100644 --- a/tidy3d/web/core/task_core.py +++ b/tidy3d/web/core/task_core.py @@ -8,7 +8,6 @@ from typing import List, Optional, Callable, Tuple import pydantic.v1 as pd from pydantic.v1 import Extra, Field, parse_obj_as -import h5py from . import http_util from .core_config import get_logger_console @@ -22,16 +21,8 @@ from .types import Tidy3DResource -from .constants import SIM_FILE_HDF5_GZ, SIMULATION_DATA_HDF5, SIM_LOG_FILE, JSON_TAG -from .file_util import extract_gzip_file - - -def _read_simulation_from_hdf5(file_name: str): - """read simulation str from hdf5""" - - with h5py.File(file_name, "r") as f_handle: - json_string = f_handle[JSON_TAG][()] - return json_string +from .constants import SIM_FILE_HDF5_GZ, SIMULATION_DATA_HDF5, SIM_LOG_FILE +from .file_util import extract_gzip_file, read_simulation_from_hdf5 class Folder(Tidy3DResource, Queryable, extra=Extra.allow): @@ -313,7 +304,7 @@ def get_simulation_json(self, to_file: str, verbose: bool = True) -> pathlib.Pat try: self.get_simulation_hdf5(hdf5_file_path) if os.path.exists(hdf5_file_path): - json_string = _read_simulation_from_hdf5(hdf5_file_path) + json_string = read_simulation_from_hdf5(hdf5_file_path) with open(to_file, "w") as file: # Write the string to the file file.write(json_string.decode("utf-8"))