feat: extend stall timeout and remove sample cap
This commit is contained in:
1 parent
27f9f4add8
commit
eb6ea70e19
9 files changed
+105
-45
No files matched your search
@@ -4,6 +4,7 @@ from collections.abc import Callable
|
||||
from dataclasses import dataclass, replace
|
||||
from math import floor, isfinite
|
||||
import os
|
||||
from sys import maxsize
|
||||
from typing import Literal
|
||||
|
||||
from app.simulation.core.base import Component, DynamicComponent
|
||||
@@ -312,14 +313,7 @@ def simulation_preparation_issues(
|
||||
def simulation_sample_times(
|
||||
config: SolveIVPConfig,
|
||||
step: float,
|
||||
*,
|
||||
max_points: int = 10001,
|
||||
) -> list[float]:
|
||||
if max_points < 2:
|
||||
raise SimulationSampleTimeError(
|
||||
"SIMULATION_SAMPLE_LIMIT_INVALID",
|
||||
"Simulation sample limit must allow at least two points.",
|
||||
)
|
||||
t_start = float(config.t_start)
|
||||
t_stop = float(config.t_stop)
|
||||
if not isfinite(t_start) or not isfinite(t_stop):
|
||||
@@ -344,33 +338,31 @@ def simulation_sample_times(
|
||||
"Simulation stop time must be greater than start time.",
|
||||
)
|
||||
|
||||
# Bound the grid before dividing by a potentially tiny step or allocating
|
||||
# the result list. This avoids both float-to-int overflow and an OOM-sized
|
||||
# ``range``/list when input comes from an external System XML document.
|
||||
maximum_interval_count = max_points - 1
|
||||
if step < duration / maximum_interval_count:
|
||||
raise SimulationSampleTimeError(
|
||||
"SIMULATION_SAMPLE_COUNT_EXCEEDED",
|
||||
f"Simulation sample count exceeds the limit of {max_points}; "
|
||||
"increase sampleStep.",
|
||||
)
|
||||
|
||||
ratio = duration / step
|
||||
if not isfinite(ratio):
|
||||
raise SimulationSampleTimeError(
|
||||
"SIMULATION_SAMPLE_COUNT_EXCEEDED",
|
||||
f"Simulation sample count exceeds the limit of {max_points}; "
|
||||
"SIMULATION_SAMPLE_COUNT_UNREPRESENTABLE",
|
||||
"Simulation sample count cannot be represented by this runtime; "
|
||||
"increase sampleStep.",
|
||||
)
|
||||
interval_count = floor(ratio)
|
||||
# There is no product-level point cap. Still reject a collection that the
|
||||
# Python runtime cannot index before multiplying by the potentially huge
|
||||
# interval count or allocating the output grid.
|
||||
if interval_count > maxsize - 2:
|
||||
raise SimulationSampleTimeError(
|
||||
"SIMULATION_SAMPLE_COUNT_UNREPRESENTABLE",
|
||||
"Simulation sample count cannot be represented by this runtime; "
|
||||
"increase sampleStep.",
|
||||
)
|
||||
interval_count = int(floor(ratio))
|
||||
last_regular_time = t_start + interval_count * step
|
||||
append_stop = last_regular_time < t_stop
|
||||
requested_point_count = interval_count + 1 + int(append_stop)
|
||||
if requested_point_count > max_points:
|
||||
if requested_point_count > maxsize:
|
||||
raise SimulationSampleTimeError(
|
||||
"SIMULATION_SAMPLE_COUNT_EXCEEDED",
|
||||
f"Simulation requests {requested_point_count} samples; "
|
||||
f"the limit is {max_points}.",
|
||||
"SIMULATION_SAMPLE_COUNT_UNREPRESENTABLE",
|
||||
"Simulation sample count cannot be represented by this runtime; "
|
||||
"increase sampleStep.",
|
||||
)
|
||||
|
||||
times = [t_start]
|
||||
|
||||
Reference in new issue
Block a user