Skip to content

Commit 77f7b50

Browse files
committed
fix: fixed results of simulations with initial time != 0
1 parent bbda8c3 commit 77f7b50

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

biosimulators_copasi/core.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,9 @@ def exec_sed_task(task, variables, log=None):
263263
for i_step in range(number_of_recorded_points):
264264
step_values = copasi_data_handler.getNthRow(i_step)
265265
for variable, value in zip(variables, step_values):
266+
if variable.symbol == Symbol.time.value:
267+
value += sim.initial_time
268+
266269
variable_results[variable.id][i_step] = value
267270

268271
if sim.output_end_time == sim.output_start_time and sim.output_start_time == sim.initial_time:

tests/test_core_main.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,29 +212,74 @@ def test_exec_sed_task_correct_time_course_attrs(self):
212212
task.simulation.output_end_time = 20.
213213
task.simulation.number_of_points = 20
214214
full_variable_results, _ = exec_sed_task(task, variables)
215+
numpy.testing.assert_allclose(
216+
full_variable_results['time'],
217+
numpy.linspace(task.simulation.output_start_time, task.simulation.output_end_time, task.simulation.number_of_points + 1),
218+
rtol=1e-4)
215219

216220
task.simulation.initial_time = 0.
217221
task.simulation.output_start_time = 10.
218222
task.simulation.output_end_time = 20.
219223
task.simulation.number_of_points = 10
220224
second_half_variable_results, _ = exec_sed_task(task, variables)
225+
numpy.testing.assert_allclose(
226+
second_half_variable_results['time'],
227+
numpy.linspace(task.simulation.output_start_time, task.simulation.output_end_time, task.simulation.number_of_points + 1),
228+
rtol=1e-4)
221229
numpy.testing.assert_allclose(second_half_variable_results['A'], full_variable_results['A'][10:], rtol=1e-4)
222230

223231
task.simulation.initial_time = 5.
224232
task.simulation.output_start_time = 5.
225233
task.simulation.output_end_time = 25.
226234
task.simulation.number_of_points = 20
227235
offset_full_variable_results, _ = exec_sed_task(task, variables)
236+
numpy.testing.assert_allclose(
237+
offset_full_variable_results['time'],
238+
numpy.linspace(task.simulation.output_start_time, task.simulation.output_end_time, task.simulation.number_of_points + 1),
239+
rtol=1e-4)
228240
numpy.testing.assert_allclose(offset_full_variable_results['A'], full_variable_results['A'], rtol=1e-4)
229241

230242
task.simulation.initial_time = 5.
231243
task.simulation.output_start_time = 15.
232244
task.simulation.output_end_time = 25.
233245
task.simulation.number_of_points = 10
234246
offset_second_half_variable_results, _ = exec_sed_task(task, variables)
247+
numpy.testing.assert_allclose(
248+
offset_second_half_variable_results['time'],
249+
numpy.linspace(task.simulation.output_start_time, task.simulation.output_end_time, task.simulation.number_of_points + 1),
250+
rtol=1e-4)
235251
numpy.testing.assert_allclose(offset_second_half_variable_results['A'], offset_full_variable_results['A'][10:], rtol=1e-4)
236252
numpy.testing.assert_allclose(offset_second_half_variable_results['A'], second_half_variable_results['A'], rtol=1e-4)
237253

254+
def test_exec_sed_task_correct_time_course_attrs_2(self):
255+
# test that initial time, output start time, output end time, number of points are correctly interpreted
256+
task = sedml_data_model.Task(
257+
model=sedml_data_model.Model(
258+
source=os.path.join('tests', 'fixtures', 'model.xml'),
259+
language=sedml_data_model.ModelLanguage.SBML.value,
260+
),
261+
simulation=sedml_data_model.UniformTimeCourseSimulation(
262+
algorithm=sedml_data_model.Algorithm(
263+
kisao_id='KISAO_0000560',
264+
),
265+
initial_time=0.4,
266+
output_start_time=0.4,
267+
output_end_time=0.8,
268+
number_of_points=5,
269+
),
270+
)
271+
272+
variables = [
273+
sedml_data_model.Variable(
274+
id='time',
275+
symbol=sedml_data_model.Symbol.time,
276+
task=task),
277+
]
278+
279+
results, _ = exec_sed_task(task, variables)
280+
281+
numpy.testing.assert_allclose(results['time'], numpy.linspace(0.4, 0.8, 5 + 1))
282+
238283
def test_hybrid_rk45_partitioning(self):
239284
task = sedml_data_model.Task(
240285
model=sedml_data_model.Model(

0 commit comments

Comments
 (0)