SciML / ModelingToolkit.jl

An acausal modeling framework for automatically parallelized scientific machine learning (SciML) in Julia. A computer algebra system for integrated symbolics for physics-informed machine learning and automated transformations of differential equations
https://mtk.sciml.ai/dev/
Other
1.43k stars 207 forks source link

System can't structural_simplify when using multiple SampledData blocks #2475

Closed aditya-sengupta closed 8 months ago

aditya-sengupta commented 8 months ago

Describe the bug 🐞

I'm trying to create a system that uses SampledData blocks, so I can run many ODE solves in parallel with slightly different input data (like a parameter sweep but vectorial). When I try to do this as is done in the SampledData docs with more than one SampledData block, I get an error in structural_simplify.

Expected behavior

I expected structural_simplify to run correctly and return a model with fewer equations. This is what happens with one SampledData block.

Minimal Reproducible Example 👇

using Symbolics
using ModelingToolkit
using ModelingToolkitStandardLibrary.Blocks

@variables z
@variables T(z) P(z) # "background" physical variables: want to use a SampledData block for them
# so we can swap out what physics scenario we're looking at easily/without recompiling the system.
@variables qt(z) # physical variable we're solving for
Dz = Differential(z)

# making data using SampledData blocks
z_range = 8e8
num_steps = 101
dz_val = z_range / (num_steps - 1)
z_val = collect(0:dz_val:8e8)
sdata_P = SampledData(1e8 * exp.(-z_val / 8e7), dz_val; name=:P)

@named model_one_data = ODESystem([
        P ~ sdata_P.output.u,
        Dz(qt) ~ min(0.0, min(qt, 8.29e7 / P) - qt),
    ], z, [qt, P], [];
    systems = [sdata_P]
)
s = structural_simplify(model_one_data) # works

sdata_T = SampledData(2e3 * ones(Int(num_steps)), dz_val; name=:T)

@named model_two_data = ODESystem([
        T ~ sdata_T.output.u,
        P ~ sdata_P.output.u,
        Dz(qt) ~ min(0.0, min(qt, 10^(13.61 - 11382.0 / T) / P) - qt),
    ], z, [qt, T, P], [];
    systems = [sdata_T, sdata_P]
)
structural_simplify(model_two_data) # fails

Error & Stacktrace ⚠️

ERROR: BoundsError: attempt to access 4-element Vector{Union{ModelingToolkit.BipartiteGraphs.Unassigned, ModelingToolkit.StructuralTransformations.SelectedState, Int64}} at index [5]
Stacktrace:
  [1] getindex
    @ ./essentials.jl:13 [inlined]
  [2] getindex
    @ ~/.julia/packages/ModelingToolkit/Gpzyo/src/bipartite_graph.jl:60 [inlined]
  [3] tearing_reassemble(state::TearingState{…}, var_eq_matching::ModelingToolkit.BipartiteGraphs.Matching{…}; simplify::Bool, mm::ModelingToolkit.SparseMatrixCLIL{…})
    @ ModelingToolkit.StructuralTransformations ~/.julia/packages/ModelingToolkit/Gpzyo/src/structural_transformation/symbolics_tearing.jl:433
  [4] tearing_reassemble
    @ ~/.julia/packages/ModelingToolkit/Gpzyo/src/structural_transformation/symbolics_tearing.jl:220 [inlined]
  [5] #dummy_derivative#132
    @ ~/.julia/packages/ModelingToolkit/Gpzyo/src/structural_transformation/symbolics_tearing.jl:635 [inlined]
  [6] _structural_simplify!(state::TearingState{…}, io::Nothing; simplify::Bool, check_consistency::Bool, fully_determined::Bool, kwargs::@Kwargs{})
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/Gpzyo/src/systems/systemstructure.jl:0
  [7] _structural_simplify!
    @ ~/.julia/packages/ModelingToolkit/Gpzyo/src/systems/systemstructure.jl:597 [inlined]
  [8] structural_simplify!(state::TearingState{…}, io::Nothing; simplify::Bool, check_consistency::Bool, fully_determined::Bool, kwargs::@Kwargs{})
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/Gpzyo/src/systems/systemstructure.jl:563
  [9] __structural_simplify(sys::ODESystem, io::Nothing; simplify::Bool, kwargs::@Kwargs{})
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/Gpzyo/src/systems/systems.jl:0
 [10] __structural_simplify
    @ ~/.julia/packages/ModelingToolkit/Gpzyo/src/systems/systems.jl:36 [inlined]
 [11] structural_simplify(sys::ODESystem, io::Nothing; simplify::Bool, kwargs::@Kwargs{})
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/Gpzyo/src/systems/systems.jl:21
 [12] structural_simplify
    @ ~/.julia/packages/ModelingToolkit/Gpzyo/src/systems/systems.jl:19 [inlined]
 [13] structural_simplify(sys::ODESystem)
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/Gpzyo/src/systems/systems.jl:19
 [14] top-level scope
    @ ~/projects/test_mtk/mtk_mwe.jl:35
Some type information was truncated. Use `show(err)` to see complete types.

Environment (please complete the following information):

Status `~/projects/test_mtk/Project.toml`
  [82cc6244] DataInterpolations v4.6.0
  [961ee093] ModelingToolkit v8.75.0
  [16a59e39] ModelingToolkitStandardLibrary v2.3.4
  [1dea7af3] OrdinaryDiffEq v6.71.0
  [0c5d862f] Symbolics v5.19.1
Status `~/projects/test_mtk/Manifest.toml`
  [47edcb42] ADTypes v0.2.6
  [1520ce14] AbstractTrees v0.4.5
  [79e6a3ab] Adapt v4.0.1
⌅ [ec485272] ArnoldiMethod v0.2.0
  [4fba245c] ArrayInterface v7.7.1
  [4c555306] ArrayLayouts v1.6.0
  [e2ed5e7c] Bijections v0.1.6
  [62783981] BitTwiddlingConvenienceFunctions v0.1.5
  [2a0fbf3d] CPUSummary v0.2.4
  [00ebfdb7] CSTParser v3.4.1
  [49dc2e85] Calculus v0.5.1
  [d360d2e6] ChainRulesCore v1.22.0
  [fb6a15b2] CloseOpenIntervals v0.1.12
  [861a8166] Combinatorics v1.0.2
  [a80b9123] CommonMark v0.8.12
  [38540f10] CommonSolve v0.2.4
  [bbf7d656] CommonSubexpressions v0.3.0
  [34da2185] Compat v4.13.0
  [b152e2b5] CompositeTypes v0.1.3
  [2569d6c7] ConcreteStructs v0.2.3
  [187b0558] ConstructionBase v1.5.4
  [adafc99b] CpuId v0.3.1
  [a8cc5b0e] Crayons v4.1.1
  [9a962f9c] DataAPI v1.16.0
  [82cc6244] DataInterpolations v4.6.0
  [864edb3b] DataStructures v0.18.17
  [e2d170a0] DataValueInterfaces v1.0.0
  [2b5f629d] DiffEqBase v6.147.0
  [459566f4] DiffEqCallbacks v2.37.0
  [163ba53b] DiffResults v1.1.0
  [b552c78f] DiffRules v1.15.1
  [b4f34e82] Distances v0.10.11
  [31c24e10] Distributions v0.25.107
  [ffbed154] DocStringExtensions v0.9.3
⌅ [5b8099bc] DomainSets v0.6.7
  [fa6b7ba4] DualNumbers v0.6.8
  [7c1d4256] DynamicPolynomials v0.5.5
  [4e289a0a] EnumX v1.0.4
  [f151be2c] EnzymeCore v0.6.5
  [d4d017d3] ExponentialUtilities v1.26.1
  [e2ba6199] ExprTools v0.1.10
  [7034ab61] FastBroadcast v0.2.8
  [9aa1b823] FastClosures v0.3.2
  [29a986be] FastLapackInterface v2.0.1
  [1a297f60] FillArrays v1.9.3
  [6a86dc24] FiniteDiff v2.22.0
  [59287772] Formatting v0.4.2
  [f6369f11] ForwardDiff v0.10.36
  [069b7b12] FunctionWrappers v1.1.3
  [77dc65aa] FunctionWrappersWrappers v0.1.3
  [d9f16b24] Functors v0.4.7
  [46192b85] GPUArraysCore v0.1.6
  [c145ed77] GenericSchur v0.5.3
  [c27321d9] Glob v1.3.1
  [86223c79] Graphs v1.9.0
  [3e5b6fbb] HostCPUFeatures v0.1.16
  [34004b35] HypergeometricFunctions v0.3.23
  [615f187c] IfElse v0.1.1
  [d25df0c9] Inflate v0.1.4
  [8197267c] IntervalSets v0.7.10
  [92d709cd] IrrationalConstants v0.2.2
  [82899510] IteratorInterfaceExtensions v1.0.0
  [692b3bcd] JLLWrappers v1.5.0
  [682c06a0] JSON v0.21.4
  [98e50ef6] JuliaFormatter v1.0.50
  [ccbc3e58] JumpProcesses v9.10.1
  [ef3ab10e] KLU v0.5.0
  [ba0b0d4f] Krylov v0.9.5
  [b964fa9f] LaTeXStrings v1.3.1
  [2ee39098] LabelledArrays v1.15.1
  [984bce1d] LambertW v0.4.6
  [23fbe1c1] Latexify v0.16.1
  [10f19ff3] LayoutPointers v0.1.15
  [50d2b5c4] Lazy v0.15.1
  [5078a376] LazyArrays v1.8.3
  [d3d80556] LineSearches v7.2.0
  [7ed4a6bd] LinearSolve v2.23.4
  [2ab3a3ac] LogExpFunctions v0.3.27
  [bdcacae8] LoopVectorization v0.12.166
  [d8e11817] MLStyle v0.4.17
  [1914dd2f] MacroTools v0.5.13
  [d125e4d3] ManualMemory v0.1.8
  [a3b82374] MatrixFactorizations v2.1.0
  [bb5d69b7] MaybeInplace v0.1.1
  [e1d29d7a] Missings v1.1.0
  [961ee093] ModelingToolkit v8.75.0
  [16a59e39] ModelingToolkitStandardLibrary v2.3.4
  [46d2c3a1] MuladdMacro v0.2.4
  [102ac46a] MultivariatePolynomials v0.5.4
  [d8a4904e] MutableArithmetics v1.4.1
  [d41bc354] NLSolversBase v7.8.3
  [2774e3e8] NLsolve v4.5.1
  [77ba4419] NaNMath v1.0.2
  [8913a72c] NonlinearSolve v3.6.0
  [6fe1bfb0] OffsetArrays v1.13.0
  [bac558e1] OrderedCollections v1.6.3
  [1dea7af3] OrdinaryDiffEq v6.71.0
  [90014a1f] PDMats v0.11.31
  [65ce6f38] PackageExtensionCompat v1.0.2
  [d96e819e] Parameters v0.12.3
  [69de0a69] Parsers v2.8.1
  [e409e4f3] PoissonRandom v0.4.4
  [f517fe37] Polyester v0.7.9
  [1d0040c9] PolyesterWeave v0.2.1
  [d236fae5] PreallocationTools v0.4.20
  [aea7be01] PrecompileTools v1.2.0
  [21216c6a] Preferences v1.4.1
  [08abe8d2] PrettyTables v2.3.1
  [1fd47b50] QuadGK v2.9.4
  [e6cf234a] RandomNumbers v1.5.3
  [3cdcf5f2] RecipesBase v1.3.4
  [731186ca] RecursiveArrayTools v3.8.1
  [f2c3362d] RecursiveFactorization v0.2.21
  [189a3867] Reexport v1.2.2
  [ae029012] Requires v1.3.0
  [79098fc4] Rmath v0.7.1
  [7e49a35a] RuntimeGeneratedFunctions v0.5.12
  [94e857df] SIMDTypes v0.1.0
  [476501e8] SLEEFPirates v0.6.42
  [0bca4576] SciMLBase v2.26.1
  [c0aeaf25] SciMLOperators v0.3.7
  [efcf1570] Setfield v1.1.1
  [727e6d20] SimpleNonlinearSolve v1.5.0
  [699a6c99] SimpleTraits v0.9.4
  [ce78b400] SimpleUnPack v1.1.0
  [a2af1166] SortingAlgorithms v1.2.1
  [47a9eef4] SparseDiffTools v2.17.0
  [e56a9233] Sparspak v0.3.9
  [276daf66] SpecialFunctions v2.3.1
  [aedffcd0] Static v0.8.10
  [0d7ed370] StaticArrayInterface v1.5.0
  [90137ffa] StaticArrays v1.9.2
  [1e83bf80] StaticArraysCore v1.4.2
  [82ae8749] StatsAPI v1.7.0
  [2913bbd2] StatsBase v0.34.2
  [4c63d2b9] StatsFuns v1.3.1
  [7792a7ef] StrideArraysCore v0.5.2
  [892a3eda] StringManipulation v0.3.4
  [2efcf032] SymbolicIndexingInterface v0.3.6
  [d1185830] SymbolicUtils v1.5.0
  [0c5d862f] Symbolics v5.19.1
  [3783bdb8] TableTraits v1.0.1
  [bd369af6] Tables v1.11.1
  [8290d209] ThreadingUtilities v0.5.2
  [a759f4b9] TimerOutputs v0.5.23
  [0796e94c] Tokenize v0.5.28
  [d5829a12] TriangularSolve v0.1.20
  [410a4b4d] Tricks v0.1.8
  [781d530d] TruncatedStacktraces v1.4.0
  [5c2747f8] URIs v1.5.1
  [3a884ed6] UnPack v1.0.2
  [1986cc42] Unitful v1.19.0
  [a7c27f48] Unityper v0.1.6
  [3d5dd08c] VectorizationBase v0.21.65
  [19fa3120] VertexSafeGraphs v0.2.0
  [1d5cc7b8] IntelOpenMP_jll v2024.0.2+0
  [856f044c] MKL_jll v2024.0.0+0
  [efe28fd5] OpenSpecFun_jll v0.5.5+0
  [f50d1b31] Rmath_jll v0.4.0+0
  [0dad84c5] ArgTools v1.1.1
  [56f22d72] Artifacts
  [2a0f44e3] Base64
  [ade2ca70] Dates
  [8ba89e20] Distributed
  [f43a241f] Downloads v1.6.0
  [7b1f6079] FileWatching
  [9fa8497b] Future
  [b77e0a4c] InteractiveUtils
  [4af54fe1] LazyArtifacts
  [b27032c2] LibCURL v0.6.4
  [76f85450] LibGit2
  [8f399da3] Libdl
  [37e2e46d] LinearAlgebra
  [56ddb016] Logging
  [d6f4376e] Markdown
  [a63ad114] Mmap
  [ca575930] NetworkOptions v1.2.0
  [44cfe95a] Pkg v1.10.0
  [de0858da] Printf
  [3fa0cd96] REPL
  [9a3f8284] Random
  [ea8e919c] SHA v0.7.0
  [9e88b42a] Serialization
  [1a1011a3] SharedArrays
  [6462fe0b] Sockets
  [2f01184e] SparseArrays v1.10.0
  [10745b16] Statistics v1.10.0
  [4607b0f0] SuiteSparse
  [fa267f1f] TOML v1.0.3
  [a4e569a6] Tar v1.10.0
  [8dfed614] Test
  [cf7118a7] UUIDs
  [4ec0a83e] Unicode
  [e66e0078] CompilerSupportLibraries_jll v1.1.0+0
  [deac9b47] LibCURL_jll v8.4.0+0
  [e37daf67] LibGit2_jll v1.6.4+0
  [29816b5a] LibSSH2_jll v1.11.0+1
  [c8ffd9c3] MbedTLS_jll v2.28.2+1
  [14a3606d] MozillaCACerts_jll v2023.1.10
  [4536629a] OpenBLAS_jll v0.3.23+4
  [05823500] OpenLibm_jll v0.8.1+2
  [bea87d4a] SuiteSparse_jll v7.2.1+1
  [83775a58] Zlib_jll v1.2.13+1
  [8e850b90] libblastrampoline_jll v5.8.0+1
  [8e850ede] nghttp2_jll v1.52.0+1
  [3f19e933] p7zip_jll v17.4.0+2
Info Packages marked with ⌅ have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated -m`
Julia Version 1.10.1
Commit 7790d6f0641 (2024-02-13 20:41 UTC)
Build Info:
  Official https://julialang.org/ release
Platform Info:
  OS: macOS (arm64-apple-darwin22.4.0)
  CPU: 10 × Apple M1 Pro
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-15.0.7 (ORCJIT, apple-m1)
Threads: 8 default, 0 interactive, 4 GC (on 8 virtual cores)
Environment:
  JULIA_NUM_THREADS = 8
  LD_LIBRARY_PATH = :/Users/adityasengupta/scetre/DAOROOT/lib:/Users/adityasengupta/scetre/DAOROOT/lib64:/opt/homebrew/lib
  JULIA_EDITOR = code

Additional context

I tried rebuilding this example based on the SampledData docs, but those don't seem to run correctly now; I'll open a separate issue for this on the ModelingToolkitStandardLibrary github. This seems like an MTK issue more than a standard library one because it relates to the internal functioning of structural_simplify.

ChrisRackauckas commented 8 months ago

This is completely changing with the v9 so after the update please rerun this and it should be fixed. @AayushSabharwal make note.

AayushSabharwal commented 8 months ago

This works with v9, once https://github.com/SciML/ModelingToolkitStandardLibrary.jl/pull/271 is merged and the common defintion of t is used instead of z

aditya-sengupta commented 8 months ago

Is it necessary to use the common definition of t specifically, or can I still declare my own independent variable?

On Thu, 22 Feb 2024, 04:33 Aayush Sabharwal, @.***> wrote:

This works with v9, once SciML/ModelingToolkitStandardLibrary.jl#271 https://github.com/SciML/ModelingToolkitStandardLibrary.jl/pull/271 is merged and the common defintion of t is used instead of z

— Reply to this email directly, view it on GitHub https://github.com/SciML/ModelingToolkit.jl/issues/2475#issuecomment-1959365685, or unsubscribe https://github.com/notifications/unsubscribe-auth/AIK476QNCOI5RDT6DCC3LVTYU43KBAVCNFSM6AAAAABDSBXMGOVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTSNJZGM3DKNRYGU . You are receiving this because you authored the thread.Message ID: @.***>

ChrisRackauckas commented 8 months ago

All equations must use the same independent variable. For the standard library, its equations are all defined using the common definition of t (and actually one with units!)

aditya-sengupta commented 8 months ago

If I'm solving an ODE over space instead of time (also with units) is there a recommended way to swap this out? t doesn't conflict with anything but I'm interested in steady-state solutions so it's also not as useful as the v8 SampledData.

In any case, thanks for the help, I'll close this after I've got v9 and confirmed this.

AayushSabharwal commented 8 months ago

I don't think there's a way to swap this out. With the v8 standard library, it doesn't really matter since t is unitless, but we'll soon have one with units. This could also be separated out into a math block that the source then relies on. That said, you could probably get something working immediately using DataInterpolations.jl and Blocks.StaticNonLinearity from the standard library

aditya-sengupta commented 8 months ago

What would be the issue with letting the user pass in the independent variable and letting that have whatever dimensions make sense? Locking users in to just integrating along time feels restrictive - could you elaborate on "a math block that the source then relies on"?

aditya-sengupta commented 8 months ago

I'm also not sure about this, but I think StaticNonLinearity + DataInterpolations would run into a similar issue to what I had initially, where swapping out the data needs the system to be remade. Is that accurate, or would this way work the same as SampledData?

AayushSabharwal commented 8 months ago

could you elaborate on "a math block that the source then relies on"?

Math blocks (src/Blocks/math.jl) are unitless transformations where the input and output can be connected to. Source blocks (src/Blocks/source.jl) are somewhat similar, except the input is always time. The standard library could likely be updated so the source blocks use the corresponding math blocks.

I just looked a bit deeper into the source code and realized this doesn't solve your problem, though 😅 since math blocks also have time-dependent inputs and outputs.

The StaticNonLinearity + DataInterpolations would also run into this issue I guess. The standard library Blocks need to support swapping out the independent variable for your case to work, which they don't currently.

aditya-sengupta commented 8 months ago

Based on looking at the SampledData source, I think I'd be able to make a component that's almost the same but using my library's z instead, by switching out t in a few places like this: https://github.com/SciML/ModelingToolkitStandardLibrary.jl/blob/2da69d3a953bc3f291321d0abce09bdd8594a342/src/Blocks/sources.jl#L670 Sounds like it'd be hard to make this work as a standard library solution immediately, but as a workaround for me does that sound right?

AayushSabharwal commented 8 months ago

That should work

AayushSabharwal commented 8 months ago

Can this issue be closed now?

ChrisRackauckas commented 8 months ago

Reopen if there's something that comes up and has a reproducer, indeed this is completed to our knowledge.

aditya-sengupta commented 8 months ago

This persists when using z instead of t and my version of SampledData. I modified the SampledData functions by changing them to SampledDataZ and changing each z to t, here: https://pastebin.com/rzMndnw4 If I use t and D from ModelingToolkit as the independent variable and derivative, and the SampledData block from the standard library, it works (https://pastebin.com/qMsFyu8f), but if I use SampledDataZ and my own independent variables (@variables z, Dz = Differential(z)) it throws the same error as before.

I've inspected both the version with t and with z and it seems to do the same thing, so structural_simplify must be treating t in a unique way. But I can't find where in the source it could be doing that, since this seems to be happening somewhere deep in the tearing logic.

using Symbolics
using ModelingToolkit
using ModelingToolkitStandardLibrary
using ModelingToolkitStandardLibrary.Blocks: SampledData
using MTKCompat # where SampledDataZ, z, Dz live

@variables T(z) P(z) # "background" physical variables: want to use a SampledData block for them
# so we can swap out what physics scenario we're looking at easily/without recompiling the system.
@variables qt(z) # physical variable we're solving for

# making data using SampledData blocks
z_range = 8e8
num_steps = 101
dz_val = z_range / (num_steps - 1)
z_val = collect(0:dz_val:8e8)
sdata_P = SampledDataZ(1e8 * exp.(-z_val / 8e7), dz_val; name=:P)

@named model_one_data = ODESystem([
        P ~ sdata_P.output.u,
        Dz(qt) ~ min(0.0, min(qt, 8.29e7 / P) - qt),
    ], z, [qt, P], [];
    systems = [sdata_P]
)
s = structural_simplify(model_one_data) # works

sdata_T = SampledDataZ(2e3 * ones(Int(num_steps)), dz_val; name=:T)

@named model_two_data = ODESystem([
        T ~ sdata_T.output.u,
        P ~ sdata_P.output.u,
        Dz(qt) ~ min(0.0, min(qt, 10^(13.61 - 11382.0 / T) / P) - qt),
    ], z, [qt, T, P], [];
    systems = [sdata_T, sdata_P]
)
structural_simplify(model_two_data) # fails
ERROR: BoundsError: attempt to access 4-element Vector{Union{ModelingToolkit.BipartiteGraphs.Unassigned, ModelingToolkit.StructuralTransformations.SelectedState, Int64}} at index [5]
Stacktrace:
  [1] getindex
    @ ./essentials.jl:13 [inlined]
  [2] getindex
    @ ~/.julia/packages/ModelingToolkit/32WwH/src/bipartite_graph.jl:60 [inlined]
  [3] tearing_reassemble(state::TearingState{…}, var_eq_matching::ModelingToolkit.BipartiteGraphs.Matching{…}; simplify::Bool, mm::ModelingToolkit.SparseMatrixCLIL{…})
    @ ModelingToolkit.StructuralTransformations ~/.julia/packages/ModelingToolkit/32WwH/src/structural_transformation/symbolics_tearing.jl:433
  [4] tearing_reassemble
    @ ~/.julia/packages/ModelingToolkit/32WwH/src/structural_transformation/symbolics_tearing.jl:220 [inlined]
  [5] #dummy_derivative#132
    @ ~/.julia/packages/ModelingToolkit/32WwH/src/structural_transformation/symbolics_tearing.jl:637 [inlined]
  [6] _structural_simplify!(state::TearingState{…}, io::Nothing; simplify::Bool, check_consistency::Bool, fully_determined::Bool, kwargs::@Kwargs{})
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/32WwH/src/systems/systemstructure.jl:0
  [7] _structural_simplify!
    @ ~/.julia/packages/ModelingToolkit/32WwH/src/systems/systemstructure.jl:617 [inlined]
  [8] structural_simplify!(state::TearingState{…}, io::Nothing; simplify::Bool, check_consistency::Bool, fully_determined::Bool, kwargs::@Kwargs{})
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/32WwH/src/systems/systemstructure.jl:580
  [9] __structural_simplify(sys::ODESystem, io::Nothing; simplify::Bool, kwargs::@Kwargs{})
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/32WwH/src/systems/systems.jl:0
 [10] __structural_simplify
    @ ~/.julia/packages/ModelingToolkit/32WwH/src/systems/systems.jl:38 [inlined]
 [11] structural_simplify(sys::ODESystem, io::Nothing; simplify::Bool, split::Bool, kwargs::@Kwargs{})
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/32WwH/src/systems/systems.jl:22
 [12] structural_simplify
    @ ~/.julia/packages/ModelingToolkit/32WwH/src/systems/systems.jl:19 [inlined]
 [13] structural_simplify(sys::ODESystem)
    @ ModelingToolkit ~/.julia/packages/ModelingToolkit/32WwH/src/systems/systems.jl:19
 [14] top-level scope
    @ ~/projects/test_mtk/mtk_test.jl:35
Some type information was truncated. Use `show(err)` to see complete types.
aditya-sengupta commented 8 months ago

Found a workaround: RealOutput also uses t, so replacing that with an equivalent RealOutputZ worked. Leaving this closed but keeping these comments up in case anyone else needs this hack.