odeanalysis 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. odeanalysis/__init__.py +296 -0
  2. odeanalysis/_api_policy.py +179 -0
  3. odeanalysis/_assumptions.py +89 -0
  4. odeanalysis/_block_common.py +106 -0
  5. odeanalysis/_formal_gauge.py +115 -0
  6. odeanalysis/_local.py +166 -0
  7. odeanalysis/_moser.py +271 -0
  8. odeanalysis/_power_simplify.py +32 -0
  9. odeanalysis/_spectral.py +215 -0
  10. odeanalysis/_symbolic_compare.py +16 -0
  11. odeanalysis/_symbolic_errors.py +19 -0
  12. odeanalysis/_zero.py +28 -0
  13. odeanalysis/analytic_continuation.py +343 -0
  14. odeanalysis/bell.py +87 -0
  15. odeanalysis/block_decomposition.py +1144 -0
  16. odeanalysis/canonical.py +471 -0
  17. odeanalysis/certified_continuation.py +160 -0
  18. odeanalysis/diagnostics.py +17 -0
  19. odeanalysis/dominance.py +134 -0
  20. odeanalysis/factorization.py +88 -0
  21. odeanalysis/formal.py +1028 -0
  22. odeanalysis/formal_basis.py +1009 -0
  23. odeanalysis/frobenius.py +349 -0
  24. odeanalysis/fuchsian.py +400 -0
  25. odeanalysis/interchange.py +604 -0
  26. odeanalysis/interoperability.py +143 -0
  27. odeanalysis/irregular.py +250 -0
  28. odeanalysis/kovacic.py +478 -0
  29. odeanalysis/levelt.py +679 -0
  30. odeanalysis/local_analysis.py +386 -0
  31. odeanalysis/local_structure.py +290 -0
  32. odeanalysis/matrix_series.py +357 -0
  33. odeanalysis/newton.py +501 -0
  34. odeanalysis/operator.py +193 -0
  35. odeanalysis/parameter_wkb.py +92 -0
  36. odeanalysis/py.typed +0 -0
  37. odeanalysis/series.py +199 -0
  38. odeanalysis/singularities.py +279 -0
  39. odeanalysis/stokes.py +782 -0
  40. odeanalysis/system.py +347 -0
  41. odeanalysis/system_analysis.py +615 -0
  42. odeanalysis/transition_loci.py +302 -0
  43. odeanalysis/turning.py +516 -0
  44. odeanalysis/wronskian.py +110 -0
  45. odeanalysis-0.1.0.dist-info/METADATA +180 -0
  46. odeanalysis-0.1.0.dist-info/RECORD +49 -0
  47. odeanalysis-0.1.0.dist-info/WHEEL +5 -0
  48. odeanalysis-0.1.0.dist-info/licenses/LICENSE +677 -0
  49. odeanalysis-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,180 @@
1
+ Metadata-Version: 2.4
2
+ Name: odeanalysis
3
+ Version: 0.1.0
4
+ Summary: Symbolic formal and structural analysis of ODEs and differential systems
5
+ Author-email: Bhuvanesh Bhatt <bhuvaneshbhatt@gmail.com>
6
+ License-Expression: GPL-3.0-only
7
+ Project-URL: Homepage, https://github.com/BhuvaneshBhatt/odeanalysis
8
+ Project-URL: Documentation, https://github.com/BhuvaneshBhatt/odeanalysis/tree/main/docs
9
+ Project-URL: Repository, https://github.com/BhuvaneshBhatt/odeanalysis
10
+ Project-URL: Issues, https://github.com/BhuvaneshBhatt/odeanalysis/issues
11
+ Keywords: ordinary differential equations,symbolic computation,asymptotics,singularities,monodromy,Stokes phenomena
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Intended Audience :: Science/Research
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Topic :: Scientific/Engineering :: Mathematics
19
+ Requires-Python: >=3.11
20
+ Description-Content-Type: text/markdown
21
+ License-File: LICENSE
22
+ Requires-Dist: sympy>=1.12
23
+ Requires-Dist: funcprops>=0.3.0
24
+ Requires-Dist: semialg>=1.3.0
25
+ Provides-Extra: test
26
+ Requires-Dist: pytest>=8; extra == "test"
27
+ Requires-Dist: hypothesis>=6; extra == "test"
28
+ Provides-Extra: asymptotic
29
+ Requires-Dist: asymptotic>=0.2.0; extra == "asymptotic"
30
+ Provides-Extra: certified
31
+ Requires-Dist: python-flint>=0.9.0; extra == "certified"
32
+ Provides-Extra: dev
33
+ Requires-Dist: build>=1.2; extra == "dev"
34
+ Requires-Dist: ruff>=0.16; extra == "dev"
35
+ Requires-Dist: twine>=6; extra == "dev"
36
+ Dynamic: license-file
37
+
38
+ # odeanalysis
39
+
40
+ `odeanalysis` is a SymPy-based package for exact symbolic, formal, structural,
41
+ and certified analysis of **scalar linear ODEs** and **first-order linear
42
+ differential systems**. It is designed for structural questions—singularities,
43
+ Frobenius/Levelt data, Newton and Levelt--Turrittin structure, Stokes geometry,
44
+ turning points, parameter transitions, exact continuation in selected families,
45
+ and rigorously enclosed numerical transport—not as a generic nonlinear ODE
46
+ solver.
47
+
48
+ The package distinguishes exact, certified-formal, certified-semialgebraic,
49
+ certified-numerical, structural, and incomplete results. See the
50
+ [certification model](./docs/certification-model.md) before interpreting a
51
+ `complete`, `certified`, or `structural_only` field.
52
+
53
+ ## Choose a workflow
54
+
55
+ | Starting point | First guide | Typical public entry points |
56
+ | --- | --- | --- |
57
+ | Scalar equation/operator | [Scalar workflow](./docs/scalar-workflow.md) | `analyze_ode_singularities`, `frobenius_analysis`, `differential_newton_polygon` |
58
+ | `Y' = A(x)Y+b(x)` | [System workflow](./docs/system-workflow.md) | `analyze_system_singularity`, `formal_system_analysis`, `system_stokes_geometry` |
59
+ | Symbolic parameters | [Parameter workflow](./docs/parameter-workflow.md) | `local_parameter_analysis`, `system_formal_type_stratification`, `parameterized_turning_analysis` |
60
+ | Rigorous numerical transport | [Certified continuation](./docs/certified-continuation.md) | `certified_system_continuation` |
61
+
62
+ The [documentation index](./docs/index.md) gives the complete map.
63
+
64
+ ## Capability overview
65
+
66
+ | Capability | Scalar | Systems | Parameters | Evidence |
67
+ | --- | --- | --- | --- | --- |
68
+ | Local singularity classification | Yes | Yes | Yes | Exact where valuations decide |
69
+ | Frobenius / residue-Levelt structure | Yes | Yes | Yes | Exact / bounded formal |
70
+ | Irregular formal analysis | Yes | Yes | Yes | Exact formal within stated bounds |
71
+ | Ramification and exponential parts | Yes | Yes | Yes | Verified formal reduction |
72
+ | Structural Stokes geometry | Yes | Yes | Yes | Structural, not generic analytic constants |
73
+ | Turning points / uniform WKB | Yes | Via scalarization/model-specific paths | Yes | Exact local structure + formal models |
74
+ | Scalar ↔ system interoperability | Companion form | Cyclic scalarization | Bounded by cyclicity proof | Exact transformation replay |
75
+ | Canonical recognition | Selected families | Via scalarization where applicable | Partial | Exact pullback verification |
76
+ | Exact continuation | Selected canonical families | Selected inherited cases | Partial | Exact formulas |
77
+ | Certified numerical continuation | — | Constant homogeneous systems | — | Arb complex-ball enclosure |
78
+ | Generic analytic Stokes matrices | No | No | No | Requires stronger global analytic certification |
79
+ | Nonlinear ODEs | No | No | No | Outside scope |
80
+
81
+ The theorem-level boundary is in [capabilities and limitations](./docs/capabilities.md).
82
+
83
+ ## Installation
84
+
85
+ ```bash
86
+ python -m pip install odeanalysis
87
+ ```
88
+
89
+ Python 3.11+ is required. Core dependencies are SymPy, `funcprops`, and
90
+ `semialg`. Rigorous ball continuation uses:
91
+
92
+ ```bash
93
+ python -m pip install "odeanalysis[certified]"
94
+ ```
95
+
96
+ ## Scalar quick start
97
+
98
+ ```python
99
+ import sympy as sp
100
+ from odeanalysis import analyze_ode_singularities, frobenius_analysis
101
+
102
+ x = sp.symbols("x")
103
+ y = sp.Function("y")
104
+ ode = x**2*sp.diff(y(x), x, 2) + x*sp.diff(y(x), x) + (x**2-1)*y(x)
105
+
106
+ singularities = analyze_ode_singularities(ode, y, x)
107
+ frobenius = frobenius_analysis(ode, y, x, point=0, terms=6)
108
+ ```
109
+
110
+ Continue with [local analysis](./docs/local-analysis.md),
111
+ [Fuchsian analysis](./docs/fuchsian-analysis.md), [Newton invariants](./docs/newton-invariants.md),
112
+ [formal asymptotics](./docs/formal-asymptotics.md), [turning points](./docs/turning-points.md),
113
+ [canonical equations](./docs/canonical-equations.md), and
114
+ [analytic continuation](./docs/analytic-continuation.md).
115
+
116
+ ## System quick start
117
+
118
+ ```python
119
+ import sympy as sp
120
+ from odeanalysis import FirstOrderSystem, analyze_system_singularity, formal_system_analysis, system_stokes_geometry
121
+
122
+ x = sp.symbols("x")
123
+ system = FirstOrderSystem(x, sp.ImmutableMatrix.diag(x**-2, -x**-2))
124
+ local = analyze_system_singularity(system, 0)
125
+ formal = formal_system_analysis(system, 0, adaptive=True)
126
+ stokes = system_stokes_geometry(formal)
127
+ assert formal.certificate.verified
128
+ ```
129
+
130
+ The system guides are [singularities](./docs/system-singularities.md),
131
+ [formal reduction](./docs/system-formal-analysis.md), [Stokes geometry](./docs/system-stokes.md),
132
+ and [parameter stratification](./docs/system-parameters.md). The overview remains in
133
+ [systems](./docs/systems.md) and the deeper reducer reference is
134
+ [Levelt--Turrittin](./docs/levelt-turrittin.md).
135
+
136
+ ## Parameter quick start
137
+
138
+ ```python
139
+ from odeanalysis import system_formal_type_stratification
140
+
141
+ a = sp.symbols("a", real=True)
142
+ family = FirstOrderSystem(x, sp.ImmutableMatrix.diag(a/x, -a/x))
143
+ strata = system_formal_type_stratification(family, (a,), max_resonance_order=2)
144
+ ```
145
+
146
+ A formal-type stratum certifies a **discrete bounded signature**: singularity
147
+ kind, leading rank, spectral multiplicity pattern, resonance orders within the
148
+ configured bound, ramification, block dimensions, exponential-block data, and
149
+ structural Stokes combinatorics. Continuously varying exponent values are not
150
+ claimed to be constant merely because a cell is open.
151
+
152
+ ## Certified numerical continuation
153
+
154
+ ```python
155
+ from odeanalysis import certified_system_continuation
156
+
157
+ constant = FirstOrderSystem(x, sp.ImmutableMatrix([[0, 1], [0, 0]]))
158
+ transport = certified_system_continuation(constant, 0, 2, precision_bits=192)
159
+ ```
160
+
161
+ The current certified backend is deliberately narrow: for constant homogeneous
162
+ systems it encloses `exp((b-a)A)` with Arb complex balls. Variable-coefficient
163
+ validated integration is refused rather than replaced by tolerance-only
164
+ floating-point integration. See [certified continuation](./docs/certified-continuation.md).
165
+
166
+ ## Examples, verification, and boundaries
167
+
168
+ Start with the [example gallery](./docs/example-gallery.md) and
169
+ [worked failures](./docs/worked-failures.md). The older compact
170
+ [examples reference](./docs/examples.md) is retained for API-oriented snippets.
171
+
172
+ For evidence semantics and conventions see [verification](./docs/verification.md),
173
+ [mathematical conventions](./docs/conventions.md), [API classification](./docs/api-classification.md), [public API index](./docs/api-reference.md),
174
+ [architecture](./docs/architecture.md), and [traceability](./docs/traceability.md).
175
+ [Dominance](./docs/dominance.md) documents sector ordering, and the
176
+ [user guide](./docs/user-guide.md) remains a broad reference.
177
+
178
+ ## License
179
+
180
+ GPL-3.0-only. See `LICENSE`.
@@ -0,0 +1,49 @@
1
+ odeanalysis/__init__.py,sha256=LSFREgi8ArCMdGXqOg7HNNRq_fKxLv4GkfXiRvNHDQA,8066
2
+ odeanalysis/_api_policy.py,sha256=4yUWxUYpEJtogHzK7sFrNDp5vJJQ0USHTLH-3qiMlW8,7893
3
+ odeanalysis/_assumptions.py,sha256=AsQ5xY-nOi5XaPq0bv5kE5p9_CTV4kGYWeVYzqsJglw,3362
4
+ odeanalysis/_block_common.py,sha256=vwZQCzMu5-uH79_PoTJ_EKKDNYWej4WQE8dLvmHbBVM,3311
5
+ odeanalysis/_formal_gauge.py,sha256=JKi-w2tE1w1dPIUNIeFdvCdl5h2zRLVDIan7whO9fDM,4076
6
+ odeanalysis/_local.py,sha256=1QAceK4eFmgnEemyZv-Rrzye3UMGB67OK9BJdHy40sA,5515
7
+ odeanalysis/_moser.py,sha256=x1iuGKLLp39Af_D5xbqaIxGgW1ayvHuCEKXb0Oc4gkU,9192
8
+ odeanalysis/_power_simplify.py,sha256=tWvWitpe0AtMrVQ0F69FRQv4C-F8O_i48n0FlHUyWUU,1145
9
+ odeanalysis/_spectral.py,sha256=zNJr9aBNgln0ZLiPaEjQxAVp7P_Odgx13ccueocctdk,7523
10
+ odeanalysis/_symbolic_compare.py,sha256=oMZu5jpwP4nBq4TrJhv2nM5zZiVFpzfjg8xgUbzla3Q,446
11
+ odeanalysis/_symbolic_errors.py,sha256=sn5HDzgAHpFw0fp85zKsxAeFK_NGtOimbrMnyvR0WYI,511
12
+ odeanalysis/_zero.py,sha256=2Cygkzno1yKnTSnTcu2IIkhjCE1iZQ2DkUnRSjMC5uc,800
13
+ odeanalysis/analytic_continuation.py,sha256=LCNdUZZ-40SNbM9ojAx0ANkfww4FpynbADVNE1zVquc,12498
14
+ odeanalysis/bell.py,sha256=H2c0P8nfW-fnNqvZf4IJrabQOHhLx1nCLE5b_2z5EMs,2760
15
+ odeanalysis/block_decomposition.py,sha256=oJB08q4bpcTuDBvbtWu7ri3wn87KRF0f1Xv2VZ24lzA,41532
16
+ odeanalysis/canonical.py,sha256=IMkgVFD9fvSfwGqV5BB-RyjKtg2LQtJH3eeHbWudtvg,16808
17
+ odeanalysis/certified_continuation.py,sha256=iEm_2rg00oNGxnqehzAYkJDd-tLU3aM8jL-oM50pAe4,5184
18
+ odeanalysis/diagnostics.py,sha256=1KcRtZ1PUmYRYm9U3zE2UKNlAl1s3msalgpqH3xJ9Jk,408
19
+ odeanalysis/dominance.py,sha256=iLAGmm585o2mSLIIjiNIFdr1zhf5xZ9DgjnW-PEyY90,4408
20
+ odeanalysis/factorization.py,sha256=uATx1LurIzEwK11aa26d_DdaQj2TV2f1ydQoUkvxa10,3093
21
+ odeanalysis/formal.py,sha256=2ZLMyR1xk2xcEMYdWp7bgENt-1HueThXpHNXow5LvNU,36807
22
+ odeanalysis/formal_basis.py,sha256=b5PkjReSKNz9L-B4d6ewgCY6qwmPPOfa9yjuGDLXHhE,36796
23
+ odeanalysis/frobenius.py,sha256=5oHDcxyD9tE1KO-AUPdqVhHmxoRB172c2B651gRHjNg,11593
24
+ odeanalysis/fuchsian.py,sha256=RiDPDv8XoQZZsQSF9WvuJJAdv8zS345VKZMbOObazgM,13314
25
+ odeanalysis/interchange.py,sha256=3iSnKKcyuZaLMA730oWSVH9f2H3PID5wj73O8VUxyT4,22498
26
+ odeanalysis/interoperability.py,sha256=bMZPHiz9fsN1MIwHd-Fx4atmgAairVcvIPtBU-EORiA,4922
27
+ odeanalysis/irregular.py,sha256=8i1_2e1gtXjWRUFk_ZO5T0uUx5KOw4uN0QD-C6YhPUA,8667
28
+ odeanalysis/kovacic.py,sha256=TwFiKxI0_JjAD4vUDDzggi5rVkui8czRYAEcf7k--_w,16481
29
+ odeanalysis/levelt.py,sha256=coO-xyifd208JZI8Uq9k8j5Wn0yFJ-iaqwLwpBv_tIM,24686
30
+ odeanalysis/local_analysis.py,sha256=ZDMPxqVbLUBXpxqVBejfde5pZFnu5NjH5t13tdXB4lk,13841
31
+ odeanalysis/local_structure.py,sha256=jBpc3ZbLFPBBrZyaLM1EGEKc3GS873CAr3hU2ePH7KA,10528
32
+ odeanalysis/matrix_series.py,sha256=6Y0EBeMgiM6PqIH1RXgalRCCvZua5_GNhLT36I8E-7I,12983
33
+ odeanalysis/newton.py,sha256=HxBvZ4Gop0qrXhlKiPff0kqeVFneXGgo54-Tryvko14,16750
34
+ odeanalysis/operator.py,sha256=l7pWUVZw_kMJEtvgYfOo_v9m7MR-enpsrAC40gwddn0,7148
35
+ odeanalysis/parameter_wkb.py,sha256=o4zE3FdzTbeJtLkQc-DpkY7hW4HBsb_iFEtVNiKegMA,3247
36
+ odeanalysis/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
+ odeanalysis/series.py,sha256=hh2zH4GOPHqw62OEv9CZzWyYOnFo7uDIiOoHByezyvI,6824
38
+ odeanalysis/singularities.py,sha256=kTWFAYbe5PV1VV1NFIwyMzWPsxsnYcGcjkv_5XGlIhQ,8909
39
+ odeanalysis/stokes.py,sha256=WmYTWcQ00ki_UW6QBAa-zd3n2gvrXZ6yC9E_q1x2Pbc,29491
40
+ odeanalysis/system.py,sha256=ZcC3DbKALRj6ff-ZktoM-tzEhLl24p2JhlMCpeM5AHs,12683
41
+ odeanalysis/system_analysis.py,sha256=wq7x1o_YiSx085p1b59M2oEFR3ZmW8RbGyom7Nr26XY,21828
42
+ odeanalysis/transition_loci.py,sha256=tmceFYTJysGpuS_lIEIEgGq1IzkjtDOkFhgZ7MQ8Mp8,11721
43
+ odeanalysis/turning.py,sha256=erjz-H30kx-PNxfpOEqOO9oRkYefZ8WnNhm1L5VXpnk,18243
44
+ odeanalysis/wronskian.py,sha256=fs0CcgqhB6FVbJdQxnJoPkbVeaOAnzD9vyNZBs_sG4E,3937
45
+ odeanalysis-0.1.0.dist-info/licenses/LICENSE,sha256=sK9DawbJdOPTZI-T1wvMZR7bQVXC_DaJ3qYOK_rrXyU,35223
46
+ odeanalysis-0.1.0.dist-info/METADATA,sha256=tOcYcHzY9OkQSzyWuQwBDeXi3D7sC-cmk6zweDABg5s,8300
47
+ odeanalysis-0.1.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
48
+ odeanalysis-0.1.0.dist-info/top_level.txt,sha256=X7hf1HCGLf3CxoCWtt1ML8af5JoAnN15avwZHbmTfGo,12
49
+ odeanalysis-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+