Source code for caustics.sims.simulator
# mypy: disable-error-code="import-untyped,var-annotated"
from typing import Annotated, Optional, Union, TextIO
from inspect import signature
from caskade import Module
import yaml
import caustics
__all__ = ("NameType", "build_simulator")
NameType = Annotated[Optional[str], "Name of the simulator"]
[docs]
def build_simulator(config: Union[str, TextIO]) -> Module:
if isinstance(config, str):
with open(config, "r") as f:
config_dict = yaml.safe_load(f)
else:
config_dict = yaml.safe_load(config)
modules = {}
for name, obj in config_dict.items():
kwargs = obj.get("init_kwargs", {})
for kwarg in kwargs:
for subname, subobj in config_dict.items():
if subname == name: # only look at previous objects
break
if subobj == kwargs[kwarg] and isinstance(kwargs[kwarg], dict):
# fill already constructed object
kwargs[kwarg] = modules[subname]
# Get the caustics object, using a "." path if given
base = caustics
for part in obj["kind"].split("."):
base = getattr(base, part)
if "name" in signature(base).parameters: # type: ignore[arg-type]
kwargs["name"] = name
# Instantiate the caustics object
modules[name] = base(**kwargs) # type: ignore[operator]
# return the last object
return modules[tuple(modules.keys())[-1]]