Skip to content

Refactor ODE analyses to build models in the theory of signed polynomial ODE systems - #1363

Draft
tim-at-topos wants to merge 70 commits into
mainfrom
tim/mass-action-polynomial-ode-system
Draft

Refactor ODE analyses to build models in the theory of signed polynomial ODE systems#1363
tim-at-topos wants to merge 70 commits into
mainfrom
tim/mass-action-polynomial-ode-system

Conversation

@tim-at-topos

@tim-at-topos tim-at-topos commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

For some arcane GitHub reason, #1251 was automatically closed and I cannot reopen it. This is a clone with #1319 merged in. I'll repeat both of the original PR descriptions below for the sake of the reader.


This PR includes a massive redesign of the way that we handle ODE semantics, which has the bonus of introducing some new capabilities (#1177) as well as (hopefully) making adding new ODE semantics in the future considerably simpler.

For those reading (or reviewing) this code, my suggested reading order would be:

  1. ode::polynomial_ode::build_system_custom_parameters to see how we interpret models of th_signed_polynomial_ode_system as systems of polynomial ODEs
  2. ode::lotka_volterra to see an example of the main chunk of defining an ODE semantics: giving an implementation for ODESemanticsAnalysis
  3. ode::ode_semantics to see where all the actual new code is
  4. ode::mass_action to see where things are still messy and need some extra finessing
  5. The comments that contain the string FEEDBACK, where I have some specific questions / highlight specific problems with this design.

p.s. I know this PR adds quite a lot of code for something called a "refactor", but (a) I added a lot of documentation and some new tests, and (b) subsequent PRs focussing on the front-end parts should now be possible, allowing for much more code removal.


Now that more ODE analyses have LaTeX equations, we should be stricter about the use of fmt::Display only for debugging.

This PR introduces some new types and traits (Latex, ToLatex, ToLatexWithMap) for dealing with LaTeX expressions and rendering object/morphism names nicely in the frontend. It also includes a bunch of tests for ODE semantics in the wasm layer. Finally, as a bonus, it removes a lot of repetitive code from catlog-wasm::src::analyses by defining ode_semantics_simulation and ode_semantics_equations, enabled by #1251, as well as removing some unnecessary types introduced there (such as LotkaVolterraEquationsData, which is just null).

Again, this refactor adds a lot of lines, but that's almost entirely due to how many nice new tests it adds 👼

As a bonus, this PR fixes the following issues:


Although further refactoring is possible (e.g. lotka_volterra.tsx and linear_ode.tsx share a lot of code), I think that the "correct" solution to this would be to start looking at generating that code from the definitions of the analyses rather than manually refactoring it. But this is now a much larger, rather separate project, so I think it's a bit out of scope.

With that in mind, I would suggest that this PR finally completes the last item in #1177 , and thus closes the RFC-0001 parent issue #1098.

tim-at-topos and others added 30 commits June 11, 2026 00:09
WIP: Rethinking traits

WIP: Some tests only half failing

WIP: Tests passing; time to tidy

ENH: Build derived model of th_signed_polynomial_ode_system in mass_action

ENH: Mass-action for stock-flow; DEL: Mass-action for signed stock-flow

ENH: struct for transition / flow interfaces

WIP: Starting on Lotka-Volterra

WIP: Failing tests

FIX: Lotka-Volterra tests passing

FIX: Working analysis (frontend)

ENH: Lotka-Volterra equations

ENH: Linear ODE refactor

ENH: Linear ODE equations

WIP: Starting on ODESemantics

WIP: lotka_volterra_semantics()

WIP: build_system_from_ode_semantics

WIP: DblModelForODESemantics

WIP: ODESemanticsAnalysis and ODESemanticsProblemData

WIP: ODESemantics trait

WIP: Documentation

WIP: ODESemantics for mass-action

WIP: Cleaning up types, but mass-action still frustrating

WIP: Big reshuffle (moving functions out from a struct)

WIP: Fixing mass-action again

WIP: terrible code

WIP: Changed from ObGen to Ob

WIP: Stock-flow mass-action

FIX: Passing catlog tests

Rename LinearODE -> LCC

FIX: Documentation

TODO: Redesign
tim-at-topos and others added 22 commits June 25, 2026 19:17
WIP: Rethinking traits

WIP: Some tests only half failing

WIP: Tests passing; time to tidy

ENH: Build derived model of th_signed_polynomial_ode_system in mass_action

ENH: Mass-action for stock-flow; DEL: Mass-action for signed stock-flow

ENH: struct for transition / flow interfaces

WIP: Starting on Lotka-Volterra

WIP: Failing tests

FIX: Lotka-Volterra tests passing

FIX: Working analysis (frontend)

ENH: Lotka-Volterra equations

ENH: Linear ODE refactor

ENH: Linear ODE equations

WIP: Starting on ODESemantics

WIP: lotka_volterra_semantics()

WIP: build_system_from_ode_semantics

WIP: DblModelForODESemantics

WIP: ODESemanticsAnalysis and ODESemanticsProblemData

WIP: ODESemantics trait

WIP: Documentation

WIP: ODESemantics for mass-action

WIP: Cleaning up types, but mass-action still frustrating

WIP: Big reshuffle (moving functions out from a struct)

WIP: Fixing mass-action again

WIP: terrible code

WIP: Changed from ObGen to Ob

WIP: Stock-flow mass-action

FIX: Passing catlog tests

Rename LinearODE -> LCC

FIX: Documentation

TODO: Redesign
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant