funcprops 0.1.0__tar.gz → 0.2.0__tar.gz

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 (131) hide show
  1. funcprops-0.2.0/PKG-INFO +212 -0
  2. funcprops-0.2.0/README.md +183 -0
  3. {funcprops-0.1.0 → funcprops-0.2.0}/pyproject.toml +5 -4
  4. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/__init__.py +146 -2
  5. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/_semialg.py +2 -2
  6. funcprops-0.2.0/src/funcprops/api.py +389 -0
  7. funcprops-0.2.0/src/funcprops/assumption_normalization.py +72 -0
  8. funcprops-0.2.0/src/funcprops/assumptions.py +297 -0
  9. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/branchcuts/computation.py +184 -15
  10. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/branchcuts/post_simplify.py +5 -1
  11. funcprops-0.2.0/src/funcprops/cache_control.py +58 -0
  12. funcprops-0.2.0/src/funcprops/conditional.py +50 -0
  13. funcprops-0.2.0/src/funcprops/data/registry_capabilities.json +77 -0
  14. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/engine.py +9 -8
  15. funcprops-0.2.0/src/funcprops/exactness.py +69 -0
  16. funcprops-0.2.0/src/funcprops/geometry.py +471 -0
  17. funcprops-0.2.0/src/funcprops/native_registry.py +297 -0
  18. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/proof_cache.py +10 -63
  19. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/real_analysis/__init__.py +14 -0
  20. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/real_analysis/advanced_convexity.py +6 -6
  21. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/real_analysis/boundedness.py +2 -2
  22. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/real_analysis/common.py +48 -12
  23. funcprops-0.2.0/src/funcprops/real_analysis/complete_monotonicity.py +129 -0
  24. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/real_analysis/convexity.py +291 -187
  25. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/real_analysis/differentiability.py +12 -5
  26. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/real_analysis/mapping.py +19 -13
  27. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/real_analysis/monotonic_certificates.py +68 -10
  28. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/real_analysis/monotonicity.py +258 -137
  29. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/real_analysis/oscillation.py +26 -12
  30. funcprops-0.2.0/src/funcprops/real_analysis/piecewise.py +408 -0
  31. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/real_analysis/range.py +65 -18
  32. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/real_analysis/sign.py +20 -16
  33. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/real_analysis/smoothness.py +202 -36
  34. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/real_analysis/special_functions.py +261 -9
  35. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/real_analysis/structural_properties.py +27 -35
  36. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/real_analysis/zeros.py +61 -4
  37. funcprops-0.2.0/src/funcprops/registry.py +597 -0
  38. funcprops-0.2.0/src/funcprops/registry_derivatives.py +529 -0
  39. funcprops-0.2.0/src/funcprops/registry_transport.py +524 -0
  40. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/results.py +87 -4
  41. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/singularities.py +1312 -230
  42. funcprops-0.2.0/src/funcprops/statistical_special_functions.py +132 -0
  43. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/stratification.py +59 -13
  44. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/transcendental/analytic.py +5 -3
  45. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/transcendental/extrema.py +11 -9
  46. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/transcendental/periodic.py +2 -1
  47. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/transcendental/proof.py +2 -1
  48. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/transcendental/real_sign.py +2 -1
  49. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/transcendental/roots.py +8 -7
  50. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/transcendental/zero_geometry.py +6 -5
  51. funcprops-0.2.0/src/funcprops/transformation.py +417 -0
  52. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/verification.py +75 -30
  53. funcprops-0.2.0/src/funcprops.egg-info/PKG-INFO +212 -0
  54. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops.egg-info/SOURCES.txt +30 -1
  55. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops.egg-info/requires.txt +2 -1
  56. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_api_contract.py +10 -10
  57. funcprops-0.2.0/tests/test_boundary_and_attainment_geometry.py +124 -0
  58. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_branchcut_core.py +44 -0
  59. funcprops-0.2.0/tests/test_conditional_expression_inputs.py +28 -0
  60. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_conditional_singularity_analysis.py +29 -17
  61. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_dlmf_stratification.py +1 -1
  62. funcprops-0.2.0/tests/test_exactness_boundary.py +44 -0
  63. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_exported_helpers_and_replay.py +75 -5
  64. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_monotonicity_and_singularities.py +7 -3
  65. funcprops-0.2.0/tests/test_multivariate_singularity_loci.py +208 -0
  66. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_native_property_regressions.py +2 -2
  67. funcprops-0.2.0/tests/test_piecewise_certified_analysis.py +80 -0
  68. funcprops-0.2.0/tests/test_public_assumptions_contract.py +89 -0
  69. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_public_option_semantics.py +2 -2
  70. funcprops-0.2.0/tests/test_registry_derivative_certificates.py +91 -0
  71. funcprops-0.2.0/tests/test_registry_localization.py +154 -0
  72. funcprops-0.2.0/tests/test_registry_multiargument_paths.py +138 -0
  73. funcprops-0.2.0/tests/test_registry_multivariate_transport.py +122 -0
  74. funcprops-0.2.0/tests/test_registry_native_families.py +93 -0
  75. funcprops-0.2.0/tests/test_registry_scalar_transport.py +71 -0
  76. funcprops-0.2.0/tests/test_result_and_cache_management.py +44 -0
  77. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_semialg_delegation.py +4 -4
  78. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_shared_monotonic_partition.py +19 -9
  79. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_shared_proof_cache.py +3 -1
  80. funcprops-0.2.0/tests/test_singularity_locus_api.py +68 -0
  81. funcprops-0.2.0/tests/test_statistical_special_functions.py +235 -0
  82. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_structural_properties.py +11 -11
  83. funcprops-0.2.0/tests/test_transformation_geometry.py +134 -0
  84. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_zeros_mapping_and_smoothness.py +4 -2
  85. funcprops-0.1.0/PKG-INFO +0 -208
  86. funcprops-0.1.0/README.md +0 -180
  87. funcprops-0.1.0/src/funcprops/api.py +0 -70
  88. funcprops-0.1.0/src/funcprops/real_analysis/piecewise.py +0 -174
  89. funcprops-0.1.0/src/funcprops/registry.py +0 -274
  90. funcprops-0.1.0/src/funcprops.egg-info/PKG-INFO +0 -208
  91. {funcprops-0.1.0 → funcprops-0.2.0}/LICENSE +0 -0
  92. {funcprops-0.1.0 → funcprops-0.2.0}/setup.cfg +0 -0
  93. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/branchcuts/__init__.py +0 -0
  94. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/branchcuts/core.py +0 -0
  95. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/conditions.py +0 -0
  96. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/data/catalogue.json +0 -0
  97. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/data/dlmf_audit.json +0 -0
  98. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/dlmf.py +0 -0
  99. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/exceptions.py +0 -0
  100. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/real_analysis/domain.py +0 -0
  101. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/sympy_compare.py +0 -0
  102. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/transcendental/__init__.py +0 -0
  103. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/transcendental/algebraize.py +0 -0
  104. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/transcendental/complex_roots.py +0 -0
  105. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/transcendental/exp_fourier.py +0 -0
  106. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/transcendental/real_interval.py +0 -0
  107. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops/transcendental/reduce.py +0 -0
  108. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops.egg-info/dependency_links.txt +0 -0
  109. {funcprops-0.1.0 → funcprops-0.2.0}/src/funcprops.egg-info/top_level.txt +0 -0
  110. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_advanced_convexity.py +0 -0
  111. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_branchcut_input_validation.py +0 -0
  112. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_branchcut_post_simplify.py +0 -0
  113. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_branchcut_restrictions.py +0 -0
  114. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_branchcuts_integration.py +0 -0
  115. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_cache_input_validation.py +0 -0
  116. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_certified_real_root_isolation.py +0 -0
  117. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_complex_root_isolation.py +0 -0
  118. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_derivative_cache.py +0 -0
  119. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_dlmf_formula_audit.py +0 -0
  120. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_domain_cell_root_isolation.py +0 -0
  121. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_extremum_ordering.py +0 -0
  122. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_indexed_extrema.py +0 -0
  123. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_indexed_tail_brackets.py +0 -0
  124. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_indexed_tail_inversion.py +0 -0
  125. /funcprops-0.1.0/tests/test_completed_real_root_pipeline.py → /funcprops-0.2.0/tests/test_real_root_pipeline.py +0 -0
  126. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_registry.py +0 -0
  127. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_transcendental_algebraization.py +0 -0
  128. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_transcendental_certification.py +0 -0
  129. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_transcendental_real_analysis.py +0 -0
  130. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_vocabulary.py +0 -0
  131. {funcprops-0.1.0 → funcprops-0.2.0}/tests/test_zero_geometry.py +0 -0
@@ -0,0 +1,212 @@
1
+ Metadata-Version: 2.4
2
+ Name: funcprops
3
+ Version: 0.2.0
4
+ Summary: Symbolic global function properties backed by SymPy
5
+ Author-email: Bhuvanesh Bhatt <bhuvaneshbhatt@gmail.com>
6
+ License-Expression: GPL-3.0-only
7
+ Project-URL: Homepage, https://github.com/BhuvaneshBhatt/funcprops
8
+ Project-URL: Documentation, https://github.com/BhuvaneshBhatt/funcprops#readme
9
+ Project-URL: Repository, https://github.com/BhuvaneshBhatt/funcprops
10
+ Keywords: sympy,symbolic mathematics,symbolic computation,function analysis,function properties,real analysis,complex analysis,domains,ranges,zeros,root isolation,monotonicity,convexity,continuity,differentiability,smoothness,singularities,branch cuts,injectivity,surjectivity,bijectivity,sign analysis,semialgebraic,certified computation,exact computation
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3 :: Only
13
+ Classifier: Topic :: Scientific/Engineering :: Mathematics
14
+ Requires-Python: >=3.11
15
+ Description-Content-Type: text/markdown
16
+ License-File: LICENSE
17
+ Requires-Dist: sympy>=1.14
18
+ Requires-Dist: mpmath>=1.3
19
+ Requires-Dist: semialg>=1.2.0
20
+ Requires-Dist: exprtest>=0.1.0
21
+ Provides-Extra: test
22
+ Requires-Dist: pytest>=8; extra == "test"
23
+ Requires-Dist: hypothesis>=6; extra == "test"
24
+ Provides-Extra: dev
25
+ Requires-Dist: pytest>=8; extra == "dev"
26
+ Requires-Dist: hypothesis>=6; extra == "dev"
27
+ Requires-Dist: ruff>=0.8; extra == "dev"
28
+ Dynamic: license-file
29
+
30
+ # funcprops
31
+
32
+ `funcprops` is a SymPy-backed package for global mathematical properties of real, complex, and multivariate functions — including domains, ranges, zeros, monotonicity, convexity, regularity, singularities, extrema, mapping properties, and transformation geometry —while supporting assumptions, parameter-dependent answers, and replayable proof certificates. It combines a conditional function property registry, exact semialgebraic reasoning from the semialgebraic geometry package `semialg`, transcendental interval analysis, special-function zero geometry, and branch-cut/singularity analysis.
33
+
34
+ ## Installation
35
+
36
+ ```bash
37
+ pip install funcprops
38
+ ```
39
+
40
+ The runtime requires Python 3.11+, SymPy 1.14+, mpmath 1.3+, semialg 1.2.0+ and exprtest 0.1.0+.
41
+
42
+ ## Quick start
43
+
44
+ ```python
45
+ import sympy as sp
46
+ import funcprops as fp
47
+
48
+ x, y = sp.symbols("x y", real=True)
49
+ z = sp.Symbol("z")
50
+
51
+ fp.function_domain(sp.sqrt(x - 1), x)
52
+ # x >= 1
53
+
54
+ fp.function_range(x**2, x, y)
55
+ # y >= 0
56
+
57
+ fp.function_monotonicity(sp.exp(x), x)
58
+ # Monotonicity.STRICTLY_INCREASING
59
+
60
+ fp.function_convexity(x**2, x)
61
+ # Convexity.STRONGLY_CONVEX
62
+
63
+ fp.function_complete_monotonicity(sp.exp(-x), x, domain=sp.Interval(0, sp.oo))
64
+ # TruthValue.TRUE
65
+
66
+ fp.function_periodicity(sp.sin(2*x) + sp.cos(3*x), x, return_result=True).period
67
+ # 2*pi
68
+
69
+ fp.function_branchcuts(sp.log(1 - z), z)
70
+ # structural pullback of the principal logarithm cut
71
+
72
+ fp.function_geometry(x**2, x).minimum_exists.exists
73
+ # True
74
+
75
+ fp.function_jacobian((2*x + y, x - y), (x, y))
76
+ # Matrix([[2, 1], [1, -1]])
77
+
78
+ fp.function_change_of_variables((2*x + y, x - y), (x, y)).volume_factor
79
+ # 3
80
+ ```
81
+
82
+ ## Property model
83
+
84
+ The package preserves parameter conditions, analyzes piecewise branches on their effective domains, never upgrades incomplete numerical searches into exact proofs, and represents undecidable symbolic questions as unknown or conditional results.
85
+
86
+ API functions `function_*` return exact classifications when the available proof machinery is sufficient. `PropertyResult` and `ConditionalExpression` retain parameter strata instead of collapsing unresolved guards into one answer, and `PropertyResult.as_piecewise()` provides a Piecewise-style view when that's useful.
87
+
88
+ Proof-oriented code uses three-valued reasoning. An undecidable set relation, domain implication, branch-locus intersection, or symbolic comparison is not silently treated as false.
89
+
90
+ ## Real-domain analysis
91
+
92
+ `funcprops` owns the public property vocabulary. For semialgebraic functions on semialgebraic real domains it delegates exact domain, range, sign, monotonicity, convexity, smoothness, and mapping problems to `semialg`, while retaining stronger `funcprops` certificates when they are already available.
93
+
94
+ The main real-analysis queries are:
95
+
96
+ - `function_domain()` and `function_range()`;
97
+ - `function_sign()` and `function_boundedness()`;
98
+ - `function_monotonicity()` and `function_oscillation()`;
99
+ - `function_convexity()` and `function_complete_monotonicity()`;
100
+ - `function_injective()`, `function_surjective()`, and `function_bijective()`;
101
+ - `function_continuous()`, `function_differentiability()`,
102
+ `function_smoothness()`, and `function_analytic()`;
103
+ - `function_periodicity()`, `function_symmetry()`, and
104
+ `function_homogeneity()`.
105
+
106
+ Mixed variable/parameter domains are split by the shared stratification layer and analyzed branch by branch. Finite `Piecewise` expressions use the same effective branch representation, with each property adding only the interface conditions it requires.
107
+
108
+ ## Monotonic partitions, inverse solving, and real roots
109
+
110
+ `MonotonicPartition` is the shared exact interval representation used by monotonicity, range, injectivity, inverse solving, oscillation, and extrema. Finite partitions retain exact critical points and endpoint behavior; infinite oscillatory partitions retain indexed zero geometry without truncating an infinite sequence.
111
+
112
+ `solve_monotonic_inverse()` and `certified_monotonic_inverse()` reuse those cells to isolate inverse solutions. Real-root isolation is domain-cell aware: poles, logarithmic boundaries, radical boundaries, Piecewise switch points, and other exact exclusions split the problem before interval certificates are constructed. Identically-zero interval cells remain part of the mathematical zero set.
113
+
114
+ For supported exponential polynomials, `exponential_fourier_count()` provides a restricted derivative-sequence root counter. Exact endpoint and critical-point signs then certify the number of distinct roots on an interval.
115
+
116
+ ## Zero geometry and oscillatory extrema
117
+
118
+ Special-function zeros are represented symbolically when closed forms are not available:`IndexedZero`, `ZeroOrdering`, `ZeroInterlacing`, and `ZeroGeometryCertificate` encode support, simplicity, ordering, interlacing, and completeness.
119
+
120
+ `IndexedExtremumValue`, `ExtremumEnvelope`, and indexed-tail inversion extend the same representation to infinite extremum families. Supported Airy, Bessel, and classical orthogonal-polynomial families can therefore participate in range, boundedness, and inverse reasoning without numerical truncation.
121
+
122
+ ## Singularities, branch cuts, and complex zeros
123
+
124
+ `function_singularity_analysis()` performs condition-aware structural traversal of poles, removable and essential singularities, branch points, branch cuts, definition cuts, and discontinuities. Multivariate loci retain their joint conditions instead of being projected onto an artificial scalar coordinate.
125
+
126
+ `function_branchcuts()` provides inexpensive structural pullback of principal cuts; boundary-value and jump computations are available under `funcprops.branchcuts`. Real analyticity, complex holomorphy, and meromorphicity remain distinct concepts.
127
+
128
+ `function_complex_zeros()` isolates zeros in finite complex rectangles. It uses exact complex solving when available and otherwise a validated argument-principle contour with structural holomorphy checks, complex-interval boundary enclosures, winding-number counting, and count-preserving rational subdivision. Uncertified numerical winding estimates remain diagnostic only.
129
+
130
+ ## Function geometry and attainment
131
+
132
+ `function_geometry()` combines regularity, singularity, convexity, boundary escape, level-boundedness, and structural mode-existence information in one summary. Related focused queries are:
133
+
134
+ - `function_boundary_behavior()` for certified limits at unbounded boundaries;
135
+ - `function_level_boundedness()` for a compact coercivity classification, with certificates via `return_result=True`;
136
+ - `function_mode_existence()` for compact structural minimum/maximum attainment, with proof metadata via `return_result=True`.
137
+
138
+ The attainment machinery is implication-based. Failure to establish continuity, closedness, or level-boundedness will yield an unresolved result.
139
+
140
+ ## Transformation geometry
141
+
142
+ For an explicit coordinate map, `funcprops` can compute and certify:
143
+
144
+ - `function_jacobian()` — exact Jacobian matrices by default, with derivative certificates via `return_result=True`;
145
+ - `function_determinant_nonvanishing()` — domain-wide nonvanishing of `det J`;
146
+ - `function_local_invertibility()` — inverse-function-theorem certificates;
147
+ - `function_change_of_variables()` — the local volume factor `Abs(det J)`;
148
+ - `function_transformation_geometry()` — a combined transformation summary.
149
+
150
+ A nonzero Jacobian determinant proves local invertibility, not global injectivity. The API keeps those claims separate so change-of-variables reasoning does not silently overstate a local theorem.
151
+
152
+ ## Statistical special functions
153
+
154
+ The theorem registry includes probability- and statistics-oriented facts for `loggamma`, digamma/polygamma, incomplete and regularized Gamma/Beta functions, `erf`/`erfc`, modified Bessel families, and generalized Marcum Q.
155
+
156
+ For statistical functions not represented by the supported SymPy release,
157
+ `funcprops` provides lightweight symbolic heads:
158
+
159
+ - `OwenT(h, a)`;
160
+ - `MittagLefflerE(alpha, z)` and `MittagLefflerE(alpha, beta, z)`;
161
+ - `RegularizedGammaP(a, x)` and `RegularizedGammaQ(a, x)`.
162
+
163
+ These heads are simply symbolic theorem carriers, not replacements for numerical special-function libraries. Parameter-sensitive statements are guarded: outside a certified parameter/domain stratum the property engine returns a conditional or unknown result. Complete-monotonicity support includes elementary exponential kernels, Pollard-type Mittag-Leffler results, and supported Bessel-K regimes.
164
+
165
+ See [Statistical special functions](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/statistical_special_functions.md) for the
166
+ current theorem coverage and provenance notes.
167
+
168
+ ## Special-function registry and provenance
169
+
170
+ The conditional registry (which needs to be expanded) stores audited special-function metadata and exact parameter guards in deterministic SymPy constructor syntax. Concrete overloads are matched before guards are instantiated, and more-specific rules take precedence over generic ones.
171
+
172
+ Selected identities and real-variable facts are cross-checked against the NIST Digital Library of Mathematical Functions (DLMF). The machine-readable audit manifest is `src/funcprops/data/dlmf_audit.json`; see [the DLMF audit methodology](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/dlmf_audit.md).
173
+
174
+ ## Proof cache and certificate replay
175
+
176
+ Reusable proof primitives are coordinated through lazy `PropertyProofContext` objects. Independent bounded caches hold derivatives, natural domains, sign results, endpoint limits, zero geometry, singularity analyses, and monotonic partitions. Cache-key normalization is syntactic and avoids expensive proof work merely to construct a key.
177
+
178
+ Proof objects can be replayed with `verify_certificate()` and specialized verifiers. Replay is conservative: an undecidable comparison never counts as a successful verification.
179
+
180
+ ## Documentation and examples
181
+
182
+ - [Function property reference](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/properties/index.md) — one canonical page for every public `function_*` query.
183
+ - [Working with results, assumptions, certificates, and caches](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/using-results.md).
184
+ - [Executable tutorial notebook](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/notebooks/function-properties-tour.ipynb) — generated from the same canonical example corpus used by the reference pages.
185
+ - [Statistical special functions](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/statistical_special_functions.md).
186
+ - [Architecture](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/architecture.md).
187
+ - [DLMF audit methodology](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/dlmf_audit.md).
188
+
189
+ The canonical examples live in `examples/property_examples.py`. Documentation specification tests execute those examples and verify that the reference and notebook stay synchronized with the public API.
190
+
191
+ ## Development
192
+
193
+ Run the source-tree tests with:
194
+
195
+ ```bash
196
+ PYTHONPATH=src:. pytest
197
+ ```
198
+
199
+ Run the static gates with:
200
+
201
+ ```bash
202
+ ruff format --check src tests examples tools
203
+ ruff check src tests examples tools
204
+ python -m compileall -q src tests examples tools
205
+ ```
206
+
207
+ The package keeps exact fast paths ahead of heavier partition, root-isolation, or semalgebraic machinery. Structural refactors should preserve that ordering unless a benchmark and correctness argument justify changing it.
208
+
209
+ ## License
210
+
211
+ funcprops is licensed under the GNU General Public License version 3 only
212
+ (`GPL-3.0-only`). See [LICENSE](https://github.com/BhuvaneshBhatt/funcprops/blob/main/LICENSE).
@@ -0,0 +1,183 @@
1
+ # funcprops
2
+
3
+ `funcprops` is a SymPy-backed package for global mathematical properties of real, complex, and multivariate functions — including domains, ranges, zeros, monotonicity, convexity, regularity, singularities, extrema, mapping properties, and transformation geometry —while supporting assumptions, parameter-dependent answers, and replayable proof certificates. It combines a conditional function property registry, exact semialgebraic reasoning from the semialgebraic geometry package `semialg`, transcendental interval analysis, special-function zero geometry, and branch-cut/singularity analysis.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ pip install funcprops
9
+ ```
10
+
11
+ The runtime requires Python 3.11+, SymPy 1.14+, mpmath 1.3+, semialg 1.2.0+ and exprtest 0.1.0+.
12
+
13
+ ## Quick start
14
+
15
+ ```python
16
+ import sympy as sp
17
+ import funcprops as fp
18
+
19
+ x, y = sp.symbols("x y", real=True)
20
+ z = sp.Symbol("z")
21
+
22
+ fp.function_domain(sp.sqrt(x - 1), x)
23
+ # x >= 1
24
+
25
+ fp.function_range(x**2, x, y)
26
+ # y >= 0
27
+
28
+ fp.function_monotonicity(sp.exp(x), x)
29
+ # Monotonicity.STRICTLY_INCREASING
30
+
31
+ fp.function_convexity(x**2, x)
32
+ # Convexity.STRONGLY_CONVEX
33
+
34
+ fp.function_complete_monotonicity(sp.exp(-x), x, domain=sp.Interval(0, sp.oo))
35
+ # TruthValue.TRUE
36
+
37
+ fp.function_periodicity(sp.sin(2*x) + sp.cos(3*x), x, return_result=True).period
38
+ # 2*pi
39
+
40
+ fp.function_branchcuts(sp.log(1 - z), z)
41
+ # structural pullback of the principal logarithm cut
42
+
43
+ fp.function_geometry(x**2, x).minimum_exists.exists
44
+ # True
45
+
46
+ fp.function_jacobian((2*x + y, x - y), (x, y))
47
+ # Matrix([[2, 1], [1, -1]])
48
+
49
+ fp.function_change_of_variables((2*x + y, x - y), (x, y)).volume_factor
50
+ # 3
51
+ ```
52
+
53
+ ## Property model
54
+
55
+ The package preserves parameter conditions, analyzes piecewise branches on their effective domains, never upgrades incomplete numerical searches into exact proofs, and represents undecidable symbolic questions as unknown or conditional results.
56
+
57
+ API functions `function_*` return exact classifications when the available proof machinery is sufficient. `PropertyResult` and `ConditionalExpression` retain parameter strata instead of collapsing unresolved guards into one answer, and `PropertyResult.as_piecewise()` provides a Piecewise-style view when that's useful.
58
+
59
+ Proof-oriented code uses three-valued reasoning. An undecidable set relation, domain implication, branch-locus intersection, or symbolic comparison is not silently treated as false.
60
+
61
+ ## Real-domain analysis
62
+
63
+ `funcprops` owns the public property vocabulary. For semialgebraic functions on semialgebraic real domains it delegates exact domain, range, sign, monotonicity, convexity, smoothness, and mapping problems to `semialg`, while retaining stronger `funcprops` certificates when they are already available.
64
+
65
+ The main real-analysis queries are:
66
+
67
+ - `function_domain()` and `function_range()`;
68
+ - `function_sign()` and `function_boundedness()`;
69
+ - `function_monotonicity()` and `function_oscillation()`;
70
+ - `function_convexity()` and `function_complete_monotonicity()`;
71
+ - `function_injective()`, `function_surjective()`, and `function_bijective()`;
72
+ - `function_continuous()`, `function_differentiability()`,
73
+ `function_smoothness()`, and `function_analytic()`;
74
+ - `function_periodicity()`, `function_symmetry()`, and
75
+ `function_homogeneity()`.
76
+
77
+ Mixed variable/parameter domains are split by the shared stratification layer and analyzed branch by branch. Finite `Piecewise` expressions use the same effective branch representation, with each property adding only the interface conditions it requires.
78
+
79
+ ## Monotonic partitions, inverse solving, and real roots
80
+
81
+ `MonotonicPartition` is the shared exact interval representation used by monotonicity, range, injectivity, inverse solving, oscillation, and extrema. Finite partitions retain exact critical points and endpoint behavior; infinite oscillatory partitions retain indexed zero geometry without truncating an infinite sequence.
82
+
83
+ `solve_monotonic_inverse()` and `certified_monotonic_inverse()` reuse those cells to isolate inverse solutions. Real-root isolation is domain-cell aware: poles, logarithmic boundaries, radical boundaries, Piecewise switch points, and other exact exclusions split the problem before interval certificates are constructed. Identically-zero interval cells remain part of the mathematical zero set.
84
+
85
+ For supported exponential polynomials, `exponential_fourier_count()` provides a restricted derivative-sequence root counter. Exact endpoint and critical-point signs then certify the number of distinct roots on an interval.
86
+
87
+ ## Zero geometry and oscillatory extrema
88
+
89
+ Special-function zeros are represented symbolically when closed forms are not available:`IndexedZero`, `ZeroOrdering`, `ZeroInterlacing`, and `ZeroGeometryCertificate` encode support, simplicity, ordering, interlacing, and completeness.
90
+
91
+ `IndexedExtremumValue`, `ExtremumEnvelope`, and indexed-tail inversion extend the same representation to infinite extremum families. Supported Airy, Bessel, and classical orthogonal-polynomial families can therefore participate in range, boundedness, and inverse reasoning without numerical truncation.
92
+
93
+ ## Singularities, branch cuts, and complex zeros
94
+
95
+ `function_singularity_analysis()` performs condition-aware structural traversal of poles, removable and essential singularities, branch points, branch cuts, definition cuts, and discontinuities. Multivariate loci retain their joint conditions instead of being projected onto an artificial scalar coordinate.
96
+
97
+ `function_branchcuts()` provides inexpensive structural pullback of principal cuts; boundary-value and jump computations are available under `funcprops.branchcuts`. Real analyticity, complex holomorphy, and meromorphicity remain distinct concepts.
98
+
99
+ `function_complex_zeros()` isolates zeros in finite complex rectangles. It uses exact complex solving when available and otherwise a validated argument-principle contour with structural holomorphy checks, complex-interval boundary enclosures, winding-number counting, and count-preserving rational subdivision. Uncertified numerical winding estimates remain diagnostic only.
100
+
101
+ ## Function geometry and attainment
102
+
103
+ `function_geometry()` combines regularity, singularity, convexity, boundary escape, level-boundedness, and structural mode-existence information in one summary. Related focused queries are:
104
+
105
+ - `function_boundary_behavior()` for certified limits at unbounded boundaries;
106
+ - `function_level_boundedness()` for a compact coercivity classification, with certificates via `return_result=True`;
107
+ - `function_mode_existence()` for compact structural minimum/maximum attainment, with proof metadata via `return_result=True`.
108
+
109
+ The attainment machinery is implication-based. Failure to establish continuity, closedness, or level-boundedness will yield an unresolved result.
110
+
111
+ ## Transformation geometry
112
+
113
+ For an explicit coordinate map, `funcprops` can compute and certify:
114
+
115
+ - `function_jacobian()` — exact Jacobian matrices by default, with derivative certificates via `return_result=True`;
116
+ - `function_determinant_nonvanishing()` — domain-wide nonvanishing of `det J`;
117
+ - `function_local_invertibility()` — inverse-function-theorem certificates;
118
+ - `function_change_of_variables()` — the local volume factor `Abs(det J)`;
119
+ - `function_transformation_geometry()` — a combined transformation summary.
120
+
121
+ A nonzero Jacobian determinant proves local invertibility, not global injectivity. The API keeps those claims separate so change-of-variables reasoning does not silently overstate a local theorem.
122
+
123
+ ## Statistical special functions
124
+
125
+ The theorem registry includes probability- and statistics-oriented facts for `loggamma`, digamma/polygamma, incomplete and regularized Gamma/Beta functions, `erf`/`erfc`, modified Bessel families, and generalized Marcum Q.
126
+
127
+ For statistical functions not represented by the supported SymPy release,
128
+ `funcprops` provides lightweight symbolic heads:
129
+
130
+ - `OwenT(h, a)`;
131
+ - `MittagLefflerE(alpha, z)` and `MittagLefflerE(alpha, beta, z)`;
132
+ - `RegularizedGammaP(a, x)` and `RegularizedGammaQ(a, x)`.
133
+
134
+ These heads are simply symbolic theorem carriers, not replacements for numerical special-function libraries. Parameter-sensitive statements are guarded: outside a certified parameter/domain stratum the property engine returns a conditional or unknown result. Complete-monotonicity support includes elementary exponential kernels, Pollard-type Mittag-Leffler results, and supported Bessel-K regimes.
135
+
136
+ See [Statistical special functions](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/statistical_special_functions.md) for the
137
+ current theorem coverage and provenance notes.
138
+
139
+ ## Special-function registry and provenance
140
+
141
+ The conditional registry (which needs to be expanded) stores audited special-function metadata and exact parameter guards in deterministic SymPy constructor syntax. Concrete overloads are matched before guards are instantiated, and more-specific rules take precedence over generic ones.
142
+
143
+ Selected identities and real-variable facts are cross-checked against the NIST Digital Library of Mathematical Functions (DLMF). The machine-readable audit manifest is `src/funcprops/data/dlmf_audit.json`; see [the DLMF audit methodology](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/dlmf_audit.md).
144
+
145
+ ## Proof cache and certificate replay
146
+
147
+ Reusable proof primitives are coordinated through lazy `PropertyProofContext` objects. Independent bounded caches hold derivatives, natural domains, sign results, endpoint limits, zero geometry, singularity analyses, and monotonic partitions. Cache-key normalization is syntactic and avoids expensive proof work merely to construct a key.
148
+
149
+ Proof objects can be replayed with `verify_certificate()` and specialized verifiers. Replay is conservative: an undecidable comparison never counts as a successful verification.
150
+
151
+ ## Documentation and examples
152
+
153
+ - [Function property reference](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/properties/index.md) — one canonical page for every public `function_*` query.
154
+ - [Working with results, assumptions, certificates, and caches](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/using-results.md).
155
+ - [Executable tutorial notebook](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/notebooks/function-properties-tour.ipynb) — generated from the same canonical example corpus used by the reference pages.
156
+ - [Statistical special functions](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/statistical_special_functions.md).
157
+ - [Architecture](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/architecture.md).
158
+ - [DLMF audit methodology](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/dlmf_audit.md).
159
+
160
+ The canonical examples live in `examples/property_examples.py`. Documentation specification tests execute those examples and verify that the reference and notebook stay synchronized with the public API.
161
+
162
+ ## Development
163
+
164
+ Run the source-tree tests with:
165
+
166
+ ```bash
167
+ PYTHONPATH=src:. pytest
168
+ ```
169
+
170
+ Run the static gates with:
171
+
172
+ ```bash
173
+ ruff format --check src tests examples tools
174
+ ruff check src tests examples tools
175
+ python -m compileall -q src tests examples tools
176
+ ```
177
+
178
+ The package keeps exact fast paths ahead of heavier partition, root-isolation, or semalgebraic machinery. Structural refactors should preserve that ordering unless a benchmark and correctness argument justify changing it.
179
+
180
+ ## License
181
+
182
+ funcprops is licensed under the GNU General Public License version 3 only
183
+ (`GPL-3.0-only`). See [LICENSE](https://github.com/BhuvaneshBhatt/funcprops/blob/main/LICENSE).
@@ -4,16 +4,17 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "funcprops"
7
- version = "0.1.0"
7
+ version = "0.2.0"
8
8
  description = "Symbolic global function properties backed by SymPy"
9
9
  readme = "README.md"
10
- requires-python = ">=3.10"
10
+ requires-python = ">=3.11"
11
11
  license = "GPL-3.0-only"
12
12
  authors = [{name = "Bhuvanesh Bhatt", email = "bhuvaneshbhatt@gmail.com"}]
13
13
  dependencies = [
14
14
  "sympy>=1.14",
15
15
  "mpmath>=1.3",
16
- "semialg>=1.0.0",
16
+ "semialg>=1.2.0",
17
+ "exprtest>=0.1.0",
17
18
  ]
18
19
  keywords = [
19
20
  "sympy",
@@ -73,7 +74,7 @@ addopts = "-q"
73
74
  markers = ["slow: numerical seam-validation tests"]
74
75
 
75
76
  [tool.ruff]
76
- target-version = "py310"
77
+ target-version = "py311"
77
78
  line-length = 88
78
79
 
79
80
  [tool.ruff.lint]
@@ -3,18 +3,27 @@
3
3
  from .api import (
4
4
  function_analytic,
5
5
  function_bijective,
6
+ function_boundary_behavior,
6
7
  function_boundedness,
7
8
  function_branchcuts,
8
9
  function_branchpoints,
10
+ function_change_of_variables,
11
+ function_complete_monotonicity,
9
12
  function_complex_zeros,
10
13
  function_continuous,
11
14
  function_convexity,
15
+ function_determinant_nonvanishing,
12
16
  function_differentiability,
13
17
  function_discontinuities,
14
18
  function_domain,
19
+ function_geometry,
15
20
  function_homogeneity,
16
21
  function_injective,
22
+ function_jacobian,
23
+ function_level_boundedness,
24
+ function_local_invertibility,
17
25
  function_meromorphic,
26
+ function_mode_existence,
18
27
  function_monotonicity,
19
28
  function_oscillation,
20
29
  function_periodicity,
@@ -26,10 +35,31 @@ from .api import (
26
35
  function_smoothness,
27
36
  function_surjective,
28
37
  function_symmetry,
38
+ function_transformation_geometry,
29
39
  function_zeros,
30
40
  )
41
+ from .assumptions import (
42
+ PropertyDecision,
43
+ PropertyEnforcementError,
44
+ PropertyKnowledge,
45
+ PropertyProvenance,
46
+ clear_entailment_cache,
47
+ decide,
48
+ entails,
49
+ normalize_assumptions,
50
+ require_decision,
51
+ )
52
+ from .cache_control import cache_info, clear_caches
31
53
  from .dlmf import DLMFFact, dlmf_audit_report, dlmf_facts
54
+ from .geometry import (
55
+ BoundaryBehavior,
56
+ BoundaryLimit,
57
+ FunctionGeometry,
58
+ LevelBoundednessCertificate,
59
+ ModeExistenceCertificate,
60
+ )
32
61
  from .real_analysis.advanced_convexity import ConvexityCertificate
62
+ from .real_analysis.complete_monotonicity import CompleteMonotonicityCertificate
33
63
  from .real_analysis.monotonic_certificates import (
34
64
  IndexedMonotonicPartition,
35
65
  InverseSolutionCertificate,
@@ -47,15 +77,62 @@ from .real_analysis.monotonic_certificates import (
47
77
  solve_monotonic_inverse,
48
78
  )
49
79
  from .real_analysis.oscillation import OscillationCertificate
80
+ from .real_analysis.piecewise import (
81
+ PiecewiseBoundary,
82
+ PiecewiseBoundaryCertificate,
83
+ PiecewiseBranch,
84
+ PiecewiseDecomposition,
85
+ certify_piecewise_boundaries,
86
+ piecewise_decomposition,
87
+ )
50
88
  from .real_analysis.smoothness import SmoothnessResult
51
89
  from .real_analysis.structural_properties import (
52
90
  HomogeneityResult,
53
91
  PeriodicityResult,
54
92
  SymmetryResult,
55
93
  )
56
- from .registry import Family, FunctionRegistry, RuleCase, registry
94
+ from .registry import (
95
+ Family,
96
+ FunctionRegistry,
97
+ FunctionSlot,
98
+ InstantiatedPropertyRule,
99
+ PropertyRule,
100
+ RuleCase,
101
+ registry,
102
+ )
103
+ from .registry_derivatives import (
104
+ ChainRuleCertificate,
105
+ ChainRuleTerm,
106
+ DerivativeRule,
107
+ GradientCertificate,
108
+ GradientComponent,
109
+ HessianCertificate,
110
+ IdentityRule,
111
+ InstantiatedDerivativeRule,
112
+ InstantiatedIdentityRule,
113
+ JacobianCertificate,
114
+ MultivariateChainRuleCertificate,
115
+ registry_derivative,
116
+ registry_gradient,
117
+ registry_hessian,
118
+ registry_jacobian,
119
+ registry_multivariate_chain_rule,
120
+ rewrite_with_registry,
121
+ )
122
+ from .registry_transport import (
123
+ AnalysisSubject,
124
+ SubjectMap,
125
+ TransportedPropertyRule,
126
+ transport_instantiated_rule,
127
+ )
57
128
  from .results import *
58
129
  from .singularities import SingularityAnalysis
130
+ from .statistical_special_functions import (
131
+ MittagLefflerE,
132
+ OwenT,
133
+ RegularizedGammaP,
134
+ RegularizedGammaQ,
135
+ )
59
136
  from .transcendental import (
60
137
  AlgebraizationResult,
61
138
  AnalyticNeighborhoodCertificate,
@@ -105,6 +182,12 @@ from .transcendental import (
105
182
  zero_geometry,
106
183
  zero_ordering_bounds,
107
184
  )
185
+ from .transformation import (
186
+ ChangeOfVariablesCertificate,
187
+ DeterminantNonvanishingCertificate,
188
+ LocalInvertibilityCertificate,
189
+ TransformationGeometry,
190
+ )
108
191
  from .verification import (
109
192
  verify_certificate,
110
193
  verify_convexity_certificate,
@@ -119,6 +202,10 @@ from .verification import (
119
202
  verify_zero_geometry,
120
203
  )
121
204
 
205
+ from importlib.metadata import version
206
+
207
+ __version__ = version("funcprops")
208
+
122
209
  __all__ = [
123
210
  name
124
211
  for name in globals()
@@ -129,6 +216,30 @@ __all__ = [
129
216
  "FunctionRegistry",
130
217
  "Family",
131
218
  "RuleCase",
219
+ "FunctionSlot",
220
+ "PropertyRule",
221
+ "InstantiatedPropertyRule",
222
+ "AnalysisSubject",
223
+ "SubjectMap",
224
+ "TransportedPropertyRule",
225
+ "transport_instantiated_rule",
226
+ "IdentityRule",
227
+ "DerivativeRule",
228
+ "InstantiatedIdentityRule",
229
+ "InstantiatedDerivativeRule",
230
+ "GradientComponent",
231
+ "GradientCertificate",
232
+ "JacobianCertificate",
233
+ "HessianCertificate",
234
+ "MultivariateChainRuleCertificate",
235
+ "ChainRuleTerm",
236
+ "ChainRuleCertificate",
237
+ "registry_gradient",
238
+ "registry_derivative",
239
+ "registry_jacobian",
240
+ "registry_hessian",
241
+ "registry_multivariate_chain_rule",
242
+ "rewrite_with_registry",
132
243
  "Analyticity",
133
244
  "Meromorphicity",
134
245
  "Monotonicity",
@@ -145,8 +256,21 @@ __all__ = [
145
256
  "DetailedPropertyResult",
146
257
  "SupportsDetailedPropertyResult",
147
258
  "as_detailed_result",
148
- "ConditionalValue",
259
+ "ConditionalExpression",
260
+ "PropertyDecision",
261
+ "PropertyEnforcementError",
262
+ "PropertyKnowledge",
263
+ "PropertyProvenance",
264
+ "clear_entailment_cache",
265
+ "cache_info",
266
+ "clear_caches",
267
+ "explain_result",
268
+ "decide",
269
+ "entails",
270
+ "normalize_assumptions",
271
+ "require_decision",
149
272
  "Singularity",
273
+ "SingularityResult",
150
274
  "SingularityKind",
151
275
  "SingularityAnalysis",
152
276
  "PeriodicSet",
@@ -191,6 +315,12 @@ __all__ = [
191
315
  "InverseSolutionCertificate",
192
316
  "PartitionRange",
193
317
  "OscillationCertificate",
318
+ "certify_piecewise_boundaries",
319
+ "piecewise_decomposition",
320
+ "PiecewiseDecomposition",
321
+ "PiecewiseBoundaryCertificate",
322
+ "PiecewiseBoundary",
323
+ "PiecewiseBranch",
194
324
  "monotonic_decomposition",
195
325
  "monotonic_partition",
196
326
  "solve_monotonic_inverse",
@@ -205,6 +335,20 @@ __all__ = [
205
335
  "indexed_tail_integer_bracket",
206
336
  "SmoothnessResult",
207
337
  "ConvexityCertificate",
338
+ "CompleteMonotonicityCertificate",
339
+ "OwenT",
340
+ "MittagLefflerE",
341
+ "RegularizedGammaP",
342
+ "RegularizedGammaQ",
343
+ "BoundaryBehavior",
344
+ "BoundaryLimit",
345
+ "FunctionGeometry",
346
+ "LevelBoundednessCertificate",
347
+ "ModeExistenceCertificate",
348
+ "ChangeOfVariablesCertificate",
349
+ "DeterminantNonvanishingCertificate",
350
+ "LocalInvertibilityCertificate",
351
+ "TransformationGeometry",
208
352
  "DLMFFact",
209
353
  "dlmf_facts",
210
354
  "dlmf_audit_report",
@@ -27,14 +27,14 @@ def _public_function(name: str) -> Callable:
27
27
  import semialg
28
28
  except ImportError as exc:
29
29
  raise SemialgUnavailable(
30
- "funcprops real-analysis queries require semialg>=1.1.0"
30
+ "funcprops real-analysis queries require semialg>=1.2.0"
31
31
  ) from exc
32
32
 
33
33
  try:
34
34
  function = getattr(semialg, name)
35
35
  except AttributeError as exc:
36
36
  raise SemialgUnavailable(
37
- f"semialg>=1.1.0 does not provide the required public function {name!r}"
37
+ f"semialg>=1.2.0 does not provide the required public function {name!r}"
38
38
  ) from exc
39
39
  if not callable(function):
40
40
  raise SemialgUnavailable(f"semialg public attribute {name!r} is not callable")