Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 15 additions & 13 deletions src/python/pathsim_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ def make_global_variables(global_vars):
return global_namespace


def make_solver_params(solver_prms, eval_namespace=None):
def make_solver_params(solver_prms: dict, eval_namespace=None):
"""
Process and validate solver parameters from the graph data.

Expand All @@ -266,25 +266,27 @@ def make_solver_params(solver_prms, eval_namespace=None):
Raises:
ValueError: If invalid parameter values are provided or if solver type is unknown.
"""
extra_params = solver_prms.pop("extra_params", "")
prms = solver_prms.copy()
extra_params = prms.pop("extra_params", "")
if extra_params == "":
extra_params = {}
else:
extra_params = eval(extra_params, eval_namespace)
assert isinstance(extra_params, dict), "extra_params must be a dictionary"

for k, v in solver_prms.items():
for k, v in prms.items():
if k not in ["Solver", "log"]:
if v == "":
# TODO get the default from pathsim._constants
solver_prms[k] = None
prms[k] = None
else:
solver_prms[k] = eval(v, eval_namespace)
print(v, type(v))
prms[k] = eval(v, eval_namespace)
elif k == "log":
if v == "true":
solver_prms[k] = True
prms[k] = True
elif v == "false":
solver_prms[k] = False
prms[k] = False
else:
raise ValueError(
f"Invalid value for {k}: {v}. Must be 'true' or 'false'."
Expand All @@ -294,14 +296,14 @@ def make_solver_params(solver_prms, eval_namespace=None):
raise ValueError(
f"Invalid solver: {v}. Must be one of {list(NAME_TO_SOLVER.keys())}."
)
solver_prms[k] = NAME_TO_SOLVER[v]
prms[k] = NAME_TO_SOLVER[v]

# remove solver duration from solver parameters
duration = float(solver_prms.pop("simulation_duration"))
duration = float(prms.pop("simulation_duration"))

assert not isinstance(solver_prms["Solver"], str), solver_prms["Solver"]
assert not isinstance(prms["Solver"], str), prms["Solver"]

return solver_prms, extra_params, duration
return prms, extra_params, duration


def auto_block_construction(node: dict, eval_namespace: dict = None) -> Block:
Expand Down Expand Up @@ -522,7 +524,7 @@ def get_input_index(block: Block, edge: dict, block_to_input_index: dict) -> int
if isinstance(block, Adder):
if block.operations:
return int(edge["targetHandle"].replace("target-", ""))

# make sure that the target block has only one input port (ie. that targetHandle is None)
assert edge["targetHandle"] is None, (
f"Target block {block.id} has multiple input ports, "
Expand Down Expand Up @@ -566,7 +568,7 @@ def get_output_index(block: Block, edge: dict) -> int:
# Function and ODE outputs are always in order, so we can use the handle directly
assert edge["sourceHandle"], edge
return int(edge["sourceHandle"].replace("source-", ""))

# make sure that the source block has only one output port (ie. that sourceHandle is None)
assert edge["sourceHandle"] is None, (
f"Source block {block.id} has multiple output ports, "
Expand Down
Loading