Skip to content

Analyser/Generator: use full precision for Euler's number and π - #1484

Merged
hsorby merged 3 commits into
cellml:mainfrom
agarny:issue1483
Oct 14, 2026
Merged

hsorby merged 3 commits into
cellml:mainfrom
agarny:issue1483

Conversation

@agarny

@agarny agarny commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

Fixes #1483.

Copilot AI balanced review requested due to automatic review settings October 1, 2026 20:12

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟢 Approval recommended

The precision changes, profile metadata, hashes, tests, and generated fixtures are consistent with the linked issue.

Review effort: Balanced
Findings: None

What changed in this PR

Updates analyser and generator constants to full double precision, resolving #1483.

Changes:

  • Uses M_E in analyser exponent evaluation.
  • Emits 17-significant-digit Euler’s number and π literals.
  • Updates profile hashes, tests, generated versions, and fixtures.
File Description
src/​analyser.cpp Uses M_E for Euler’s number.
src/​generatorprofile.cpp Updates constants and profile version.
src/​generatorprofilesha1values.h Refreshes profile hashes.
tests/​generator/​generatorprofile.cpp Updates C++ expectations.
tests/​bindings/​python/​test_generator_profile.py Updates Python expectations.
tests/​resources/​coverage/​generator/​model.c Refreshes generated precision/version.
tests/​resources/​coverage/​generator/​model.modified.profile.c Refreshes generated precision/version.
tests/​resources/​coverage/​generator/​model.modified.profile.py Refreshes generated precision/version.
tests/​resources/​coverage/​generator/​model.no.tracking.c Refreshes generated precision/version.
tests/​resources/​coverage/​generator/​model.py Refreshes generated precision/version.
tests/​resources/​coverage/​generator/​model.implementation.out Updates expected constants.
tests/​resources/​generator/​algebraic_eqn_computed_var_on_rhs/​model.c Refreshes generated version.
tests/​resources/​generator/​algebraic_eqn_computed_var_on_rhs/​model.external.c Refreshes generated version.
tests/​resources/​generator/​algebraic_eqn_computed_var_on_rhs/​model.external.py Refreshes generated version.
tests/​resources/​generator/​algebraic_eqn_computed_var_on_rhs/​model.py Refreshes generated version.
tests/​resources/​generator/​algebraic_eqn_const_var_on_rhs/​model.c Refreshes generated version.
tests/​resources/​generator/​algebraic_eqn_const_var_on_rhs/​model.py Refreshes generated version.
tests/​resources/​generator/​algebraic_eqn_constant_on_rhs/​model.c Refreshes generated version.
tests/​resources/​generator/​algebraic_eqn_constant_on_rhs/​model.py Refreshes generated version.
tests/​resources/​generator/​algebraic_eqn_derivative_on_rhs/​model.c Refreshes generated version.
tests/​resources/​generator/​algebraic_eqn_derivative_on_rhs/​model.py Refreshes generated version.
tests/​resources/​generator/​algebraic_eqn_derivative_on_rhs_one_component/​model.c Refreshes generated version.
tests/​resources/​generator/​algebraic_eqn_derivative_on_rhs_one_component/​model.py Refreshes generated version.
tests/​resources/​generator/​algebraic_eqn_state_var_on_rhs/​model.c Refreshes generated version.
tests/​resources/​generator/​algebraic_eqn_state_var_on_rhs/​model.py Refreshes generated version.
tests/​resources/​generator/​algebraic_eqn_state_var_on_rhs_one_component/​model.c Refreshes generated version.
tests/​resources/​generator/​algebraic_eqn_state_var_on_rhs_one_component/​model.py Refreshes generated version.
tests/​resources/​generator/​algebraic_eqn_with_one_non_isolated_unknown/​model.c Refreshes generated version.
tests/​resources/​generator/​algebraic_eqn_with_one_non_isolated_unknown/​model.external.c Refreshes generated version.
tests/​resources/​generator/​algebraic_eqn_with_one_non_isolated_unknown/​model.external.py Refreshes generated version.
tests/​resources/​generator/​algebraic_eqn_with_one_non_isolated_unknown/​model.py Refreshes generated version.
tests/​resources/​generator/​algebraic_system_with_three_linked_unknowns/​model.c Refreshes generated version.
tests/​resources/​generator/​algebraic_system_with_three_linked_unknowns/​model.external.c Refreshes generated version.
tests/​resources/​generator/​algebraic_system_with_three_linked_unknowns/​model.external.py Refreshes generated version.
tests/​resources/​generator/​algebraic_system_with_three_linked_unknowns/​model.py Refreshes generated version.
tests/​resources/​generator/​algebraic_system_with_various_dependencies/​model.not.ordered.c Refreshes generated version.
tests/​resources/​generator/​algebraic_system_with_various_dependencies/​model.not.ordered.py Refreshes generated version.
tests/​resources/​generator/​algebraic_system_with_various_dependencies/​model.ordered.c Refreshes generated version.
tests/​resources/​generator/​algebraic_system_with_various_dependencies/​model.ordered.py Refreshes generated version.
tests/​resources/​generator/​algebraic_unknown_var_on_rhs/​model.c Refreshes generated version.
tests/​resources/​generator/​algebraic_unknown_var_on_rhs/​model.py Refreshes generated version.
tests/​resources/​generator/​cell_geometry_model/​model.c Refreshes generated version.
tests/​resources/​generator/​cell_geometry_model/​model.external.c Refreshes generated version.
tests/​resources/​generator/​cell_geometry_model/​model.external.py Refreshes generated version.
tests/​resources/​generator/​cell_geometry_model/​model.py Refreshes generated version.
tests/​resources/​generator/​cellml_mappings_and_encapsulations/​model.c Refreshes generated version.
tests/​resources/​generator/​cellml_mappings_and_encapsulations/​model.py Refreshes generated version.
tests/​resources/​generator/​cellml_slc_example/​model.py Refreshes generated version.
tests/​resources/​generator/​cellml_state_initialised_using_variable/​model.c Refreshes generated version.
tests/​resources/​generator/​cellml_state_initialised_using_variable/​model.py Refreshes generated version.
tests/​resources/​generator/​cellml_unit_scaling_constant/​model.c Refreshes generated version.
tests/​resources/​generator/​cellml_unit_scaling_constant/​model.py Refreshes generated version.
tests/​resources/​generator/​cellml_unit_scaling_rate/​model.c Refreshes generated version.
tests/​resources/​generator/​cellml_unit_scaling_rate/​model.py Refreshes generated version.
tests/​resources/​generator/​cellml_unit_scaling_state/​model.c Refreshes generated version.
tests/​resources/​generator/​cellml_unit_scaling_state/​model.py Refreshes generated version.
tests/​resources/​generator/​cellml_unit_scaling_state_initialised_using_constant/​model.c Refreshes generated version.
tests/​resources/​generator/​cellml_unit_scaling_state_initialised_using_constant/​model.py Refreshes generated version.
tests/​resources/​generator/​cellml_unit_scaling_state_initialised_using_variable/​model.c Refreshes generated version.
tests/​resources/​generator/​cellml_unit_scaling_state_initialised_using_variable/​model.py Refreshes generated version.
tests/​resources/​generator/​cellml_unit_scaling_voi_direct/​model.c Refreshes generated version.
tests/​resources/​generator/​cellml_unit_scaling_voi_direct/​model.py Refreshes generated version.
tests/​resources/​generator/​cellml_unit_scaling_voi_indirect/​model.c Refreshes generated version.
tests/​resources/​generator/​cellml_unit_scaling_voi_indirect/​model.py Refreshes generated version.
tests/​resources/​generator/​dae_cellml_1_1_model/​model.c Refreshes generated version.
tests/​resources/​generator/​dae_cellml_1_1_model/​model.py Refreshes generated version.
tests/​resources/​generator/​dependent_eqns/​model.c Refreshes generated version.
tests/​resources/​generator/​dependent_eqns/​model.py Refreshes generated version.
tests/​resources/​generator/​fabbri_fantini_wilders_severi_human_san_model_2017/​model.c Updates π precision and version.
tests/​resources/​generator/​fabbri_fantini_wilders_severi_human_san_model_2017/​model.py Updates π precision and version.
tests/​resources/​generator/​garny_kohl_hunter_boyett_noble_rabbit_san_model_2003/​model.c Refreshes generated version.
tests/​resources/​generator/​garny_kohl_hunter_boyett_noble_rabbit_san_model_2003/​model.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.algebraic.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.algebraic.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.computed.constant.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.computed.constant.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.constant.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.constant.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dae.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dae.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dae.external.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dae.external.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dae.for.tracking.control.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dae.for.tracking.control.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dae.for.tracking.control.with.externals.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dae.for.tracking.control.with.externals.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dae.for.tracking.untracked.algebraic.variables.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dae.for.tracking.untracked.algebraic.variables.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dae.for.tracking.untracked.algebraic.variables.with.externals.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dae.for.tracking.untracked.algebraic.variables.with.externals.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dae.for.tracking.untracked.computed.constants.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dae.for.tracking.untracked.computed.constants.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dae.for.tracking.untracked.computed.constants.with.externals.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dae.for.tracking.untracked.computed.constants.with.externals.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dae.for.tracking.untracked.constants.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dae.for.tracking.untracked.constants.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dae.for.tracking.untracked.constants.with.externals.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dae.for.tracking.untracked.constants.with.externals.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dae.for.tracking.untracked.variables.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dae.for.tracking.untracked.variables.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dae.for.tracking.untracked.variables.with.externals.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dae.for.tracking.untracked.variables.with.externals.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dependent.algebraic.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dependent.algebraic.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dependent.computed.constant.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dependent.computed.constant.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dependent.constant.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dependent.constant.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dependent.state.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.dependent.state.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.external.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.external.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.state.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.state.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.untracked.algebraic.variables.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.untracked.algebraic.variables.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.untracked.algebraic.variables.with.externals.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.untracked.algebraic.variables.with.externals.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.untracked.computed.constants.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.untracked.computed.constants.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.untracked.computed.constants.with.externals.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.untracked.computed.constants.with.externals.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.untracked.constants.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.untracked.constants.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.untracked.constants.with.externals.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.untracked.constants.with.externals.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.untracked.variables.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.untracked.variables.py Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.untracked.variables.with.externals.c Refreshes generated version.
tests/​resources/​generator/​hodgkin_huxley_squid_axon_model_1952/​model.untracked.variables.with.externals.py Refreshes generated version.
tests/​resources/​generator/​noble_model_1962/​model.c Refreshes generated version.
tests/​resources/​generator/​noble_model_1962/​model.py Refreshes generated version.
tests/​resources/​generator/​ode_computed_var_on_rhs/​model.c Refreshes generated version.
tests/​resources/​generator/​ode_computed_var_on_rhs/​model.py Refreshes generated version.
tests/​resources/​generator/​ode_computed_var_on_rhs_one_component/​model.c Refreshes generated version.
tests/​resources/​generator/​ode_computed_var_on_rhs_one_component/​model.py Refreshes generated version.
tests/​resources/​generator/​ode_const_var_on_rhs/​model.c Refreshes generated version.
tests/​resources/​generator/​ode_const_var_on_rhs/​model.py Refreshes generated version.
tests/​resources/​generator/​ode_const_var_on_rhs_one_component/​model.c Refreshes generated version.
tests/​resources/​generator/​ode_const_var_on_rhs_one_component/​model.py Refreshes generated version.
tests/​resources/​generator/​ode_constant_on_rhs/​model.c Refreshes generated version.
tests/​resources/​generator/​ode_constant_on_rhs/​model.py Refreshes generated version.
tests/​resources/​generator/​ode_constant_on_rhs_one_component/​model.c Refreshes generated version.
tests/​resources/​generator/​ode_constant_on_rhs_one_component/​model.py Refreshes generated version.
tests/​resources/​generator/​ode_multiple_dependent_odes/​model.c Refreshes generated version.
tests/​resources/​generator/​ode_multiple_dependent_odes/​model.py Refreshes generated version.
tests/​resources/​generator/​ode_multiple_dependent_odes_one_component/​model.c Refreshes generated version.
tests/​resources/​generator/​ode_multiple_dependent_odes_one_component/​model.py Refreshes generated version.
tests/​resources/​generator/​ode_multiple_odes_with_same_name/​model.c Refreshes generated version.
tests/​resources/​generator/​ode_multiple_odes_with_same_name/​model.py Refreshes generated version.
tests/​resources/​generator/​ode_unknown_var_on_rhs/​model.c Refreshes generated version.
tests/​resources/​generator/​ode_unknown_var_on_rhs/​model.py Refreshes generated version.
tests/​resources/​generator/​robertson_model_1966/​model.dae.c Refreshes generated version.
tests/​resources/​generator/​robertson_model_1966/​model.dae.py Refreshes generated version.
tests/​resources/​generator/​robertson_model_1966/​model.ode.c Refreshes generated version.
tests/​resources/​generator/​robertson_model_1966/​model.ode.py Refreshes generated version.
tests/​resources/​generator/​sine_model_imports/​model.c Updates π precision and version.
tests/​resources/​generator/​sine_model_imports/​model.py Updates π precision and version.
tests/​resources/​generator/​unknown_variable_as_external_variable/​model.c Refreshes generated version.
tests/​resources/​generator/​unknown_variable_as_external_variable/​model.py Refreshes generated version.
tests/​resources/​generator/​variable_initialised_using_another_variable/​model.c Refreshes generated version.
tests/​resources/​generator/​variable_initialised_using_another_variable/​model.py Refreshes generated version.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@agarny
agarny requested review from hsorby and nickerso October 1, 2026 20:15
@hsorby hsorby added the Analyser label Oct 2, 2026
@hsorby hsorby added Generator and removed Analyser labels Oct 2, 2026

@jmdowrick jmdowrick left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good. I wonder if there's a way we can avoid needing to manually update all these test resources whenever the format version changes, though?

@agarny

agarny commented Oct 14, 2026

Copy link
Copy Markdown
Contributor Author

Looks good. I wonder if there's a way we can avoid needing to manually update all these test resources whenever the format version changes, though?

I don't think whether we can or not is relevant here. What matters is that we changed the C/Python profiles, so now the generator generates different code (when Euler's number or π are involved), which means that we must bump up the implementation version which, in turn, means updating all of our code-generation-related test files.

@hsorby

hsorby commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

Looks good. I wonder if there's a way we can avoid needing to manually update all these test resources whenever the format version changes, though?

I have been thinking about this and I think maybe adding an ignore line feature may be what is wanted for the test output comparison. But certainly a different issue, pull request combo.

@hsorby
hsorby merged commit 7dc7616 into cellml:main Oct 14, 2026
28 checks passed
@agarny
agarny deleted the issue1483 branch October 14, 2026 22:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Analyser/Generator: use full precision for Euler's number and π

4 participants