funcprops 0.2.0__tar.gz → 0.3.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.
- funcprops-0.3.0/PKG-INFO +258 -0
- funcprops-0.3.0/README.md +221 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/pyproject.toml +32 -28
- funcprops-0.3.0/src/funcprops/__init__.py +485 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/_semialg.py +10 -14
- funcprops-0.3.0/src/funcprops/api.py +606 -0
- funcprops-0.3.0/src/funcprops/assumption_closure.py +67 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/assumptions.py +30 -2
- funcprops-0.3.0/src/funcprops/asymptotic_tails.py +131 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/branchcuts/__init__.py +2 -1
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/branchcuts/computation.py +1 -1
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/branchcuts/core.py +84 -84
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/branchcuts/post_simplify.py +10 -2
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/cache_control.py +4 -2
- funcprops-0.3.0/src/funcprops/certified_balls.py +61 -0
- funcprops-0.3.0/src/funcprops/certified_inequalities.py +86 -0
- funcprops-0.3.0/src/funcprops/certified_operations.py +769 -0
- funcprops-0.3.0/src/funcprops/certified_optimization.py +96 -0
- funcprops-0.3.0/src/funcprops/complex_certification.py +179 -0
- funcprops-0.3.0/src/funcprops/derivative_inequalities.py +48 -0
- funcprops-0.3.0/src/funcprops/diagnostics.py +23 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/engine.py +18 -1
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/exactness.py +31 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/exceptions.py +1 -1
- funcprops-0.3.0/src/funcprops/explanations.py +46 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/geometry.py +23 -22
- funcprops-0.3.0/src/funcprops/global_analysis.py +48 -0
- funcprops-0.3.0/src/funcprops/global_multivariate.py +116 -0
- funcprops-0.3.0/src/funcprops/infinite_root_families.py +94 -0
- funcprops-0.3.0/src/funcprops/integration.py +508 -0
- funcprops-0.3.0/src/funcprops/meromorphic_contours.py +83 -0
- funcprops-0.3.0/src/funcprops/multivariate_intervals.py +164 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/native_registry.py +28 -28
- funcprops-0.3.0/src/funcprops/parameter_cells.py +140 -0
- funcprops-0.3.0/src/funcprops/parameter_discriminants.py +91 -0
- funcprops-0.3.0/src/funcprops/proof_budget.py +50 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/proof_cache.py +3 -6
- funcprops-0.3.0/src/funcprops/proof_explanations.py +50 -0
- funcprops-0.3.0/src/funcprops/proof_telemetry.py +33 -0
- funcprops-0.3.0/src/funcprops/property_composition.py +128 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/real_analysis/__init__.py +24 -26
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/real_analysis/advanced_convexity.py +22 -21
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/real_analysis/boundedness.py +50 -17
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/real_analysis/common.py +44 -5
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/real_analysis/complete_monotonicity.py +3 -3
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/real_analysis/convexity.py +29 -24
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/real_analysis/differentiability.py +3 -3
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/real_analysis/domain.py +3 -3
- funcprops-0.3.0/src/funcprops/real_analysis/integrability.py +102 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/real_analysis/mapping.py +23 -21
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/real_analysis/monotonic_certificates.py +6 -15
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/real_analysis/monotonicity.py +41 -37
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/real_analysis/oscillation.py +7 -9
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/real_analysis/piecewise.py +19 -22
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/real_analysis/range.py +26 -29
- funcprops-0.3.0/src/funcprops/real_analysis/regularity_extensions.py +182 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/real_analysis/sign.py +38 -17
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/real_analysis/smoothness.py +45 -21
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/real_analysis/special_functions.py +71 -1
- funcprops-0.3.0/src/funcprops/real_analysis/staging.py +6 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/real_analysis/structural_properties.py +44 -25
- funcprops-0.3.0/src/funcprops/real_analysis/variation.py +81 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/real_analysis/zeros.py +4 -6
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/registry_derivatives.py +2 -2
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/registry_transport.py +29 -24
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/results.py +70 -11
- funcprops-0.3.0/src/funcprops/singularities/__init__.py +145 -0
- funcprops-0.3.0/src/funcprops/singularities/analysis.py +342 -0
- funcprops-0.3.0/src/funcprops/singularities/geometry.py +655 -0
- funcprops-0.3.0/src/funcprops/singularities/records.py +1071 -0
- funcprops-0.3.0/src/funcprops/singularities/regularity.py +925 -0
- funcprops-0.3.0/src/funcprops/special_theorems.py +152 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/stratification.py +1 -1
- funcprops-0.3.0/src/funcprops/taylor_models.py +89 -0
- funcprops-0.3.0/src/funcprops/theorem_closure.py +34 -0
- funcprops-0.3.0/src/funcprops/theorem_registry.py +86 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/transcendental/__init__.py +2 -2
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/transcendental/algebraize.py +1 -1
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/transcendental/analytic.py +2 -17
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/transcendental/complex_roots.py +5 -18
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/transcendental/periodic.py +2 -3
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/transcendental/real_interval.py +5 -4
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/transcendental/real_sign.py +1 -1
- funcprops-0.3.0/src/funcprops/transcendental/root_geometry.py +79 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/transcendental/roots.py +6 -6
- funcprops-0.3.0/src/funcprops/transcendental/unified_real.py +54 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/transcendental/zero_geometry.py +12 -2
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/transformation.py +10 -12
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/verification.py +70 -33
- funcprops-0.3.0/src/funcprops/verified_roots.py +61 -0
- funcprops-0.3.0/src/funcprops.egg-info/PKG-INFO +258 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops.egg-info/SOURCES.txt +53 -1
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops.egg-info/requires.txt +1 -1
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_advanced_convexity.py +13 -11
- funcprops-0.3.0/tests/test_advanced_property_families.py +86 -0
- funcprops-0.3.0/tests/test_api_contract.py +130 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_boundary_and_attainment_geometry.py +25 -25
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_branchcut_post_simplify.py +3 -3
- funcprops-0.3.0/tests/test_branchcuts_integration.py +53 -0
- funcprops-0.3.0/tests/test_certified_global_analysis.py +30 -0
- funcprops-0.3.0/tests/test_certified_numerical_analysis.py +56 -0
- funcprops-0.3.0/tests/test_certified_operations.py +123 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_certified_real_root_isolation.py +4 -4
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_complex_root_isolation.py +2 -2
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_conditional_expression_inputs.py +4 -4
- funcprops-0.3.0/tests/test_conditional_singularity_analysis.py +189 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_derivative_cache.py +2 -2
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_dlmf_formula_audit.py +12 -12
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_dlmf_stratification.py +19 -15
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_domain_cell_root_isolation.py +11 -11
- funcprops-0.3.0/tests/test_domain_inverse_branch_contracts.py +57 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_exported_helpers_and_replay.py +87 -100
- funcprops-0.3.0/tests/test_extended_regularity_integrability.py +40 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_extremum_ordering.py +3 -3
- funcprops-0.3.0/tests/test_global_property_extensions.py +55 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_indexed_extrema.py +8 -10
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_indexed_tail_inversion.py +4 -4
- funcprops-0.3.0/tests/test_integration_parametric_contours.py +101 -0
- funcprops-0.3.0/tests/test_mathematical_soundness_regressions.py +58 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_monotonicity_and_singularities.py +7 -8
- funcprops-0.3.0/tests/test_multivariate_certification.py +31 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_multivariate_singularity_loci.py +19 -25
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_native_property_regressions.py +18 -24
- funcprops-0.3.0/tests/test_parameter_prerequisite_soundness.py +84 -0
- funcprops-0.3.0/tests/test_parameterized_property_extensions.py +38 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_piecewise_certified_analysis.py +10 -13
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_public_assumptions_contract.py +7 -7
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_public_option_semantics.py +12 -16
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_real_root_pipeline.py +6 -6
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_registry_localization.py +1 -1
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_registry_multivariate_transport.py +3 -7
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_result_and_cache_management.py +5 -5
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_semialg_delegation.py +29 -35
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_shared_monotonic_partition.py +14 -20
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_shared_proof_cache.py +10 -10
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_singularity_locus_api.py +6 -6
- funcprops-0.3.0/tests/test_singularity_soundness_regressions.py +47 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_statistical_special_functions.py +34 -58
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_structural_properties.py +69 -34
- funcprops-0.3.0/tests/test_symbolic_property_families.py +104 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_transcendental_algebraization.py +8 -11
- funcprops-0.3.0/tests/test_transcendental_real_analysis.py +71 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_transformation_geometry.py +26 -30
- funcprops-0.3.0/tests/test_user_friendly_root_api.py +115 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_zero_geometry.py +13 -9
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_zeros_mapping_and_smoothness.py +31 -33
- funcprops-0.2.0/PKG-INFO +0 -212
- funcprops-0.2.0/README.md +0 -183
- funcprops-0.2.0/src/funcprops/__init__.py +0 -378
- funcprops-0.2.0/src/funcprops/api.py +0 -389
- funcprops-0.2.0/src/funcprops/singularities.py +0 -2849
- funcprops-0.2.0/src/funcprops.egg-info/PKG-INFO +0 -212
- funcprops-0.2.0/tests/test_api_contract.py +0 -122
- funcprops-0.2.0/tests/test_branchcuts_integration.py +0 -32
- funcprops-0.2.0/tests/test_conditional_singularity_analysis.py +0 -167
- funcprops-0.2.0/tests/test_transcendental_real_analysis.py +0 -76
- {funcprops-0.2.0 → funcprops-0.3.0}/LICENSE +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/setup.cfg +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/assumption_normalization.py +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/conditional.py +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/conditions.py +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/data/catalogue.json +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/data/dlmf_audit.json +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/data/registry_capabilities.json +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/dlmf.py +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/registry.py +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/statistical_special_functions.py +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/sympy_compare.py +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/transcendental/exp_fourier.py +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/transcendental/extrema.py +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/transcendental/proof.py +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops/transcendental/reduce.py +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops.egg-info/dependency_links.txt +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/src/funcprops.egg-info/top_level.txt +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_branchcut_core.py +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_branchcut_input_validation.py +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_branchcut_restrictions.py +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_cache_input_validation.py +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_exactness_boundary.py +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_indexed_tail_brackets.py +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_registry.py +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_registry_derivative_certificates.py +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_registry_multiargument_paths.py +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_registry_native_families.py +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_registry_scalar_transport.py +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_transcendental_certification.py +0 -0
- {funcprops-0.2.0 → funcprops-0.3.0}/tests/test_vocabulary.py +0 -0
funcprops-0.3.0/PKG-INFO
ADDED
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: funcprops
|
|
3
|
+
Version: 0.3.0
|
|
4
|
+
Summary: Symbolic analysis of real, complex, and multivariate function properties for 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
|
+
Project-URL: Issues, https://github.com/BhuvaneshBhatt/funcprops/issues
|
|
11
|
+
Project-URL: Changelog, https://github.com/BhuvaneshBhatt/funcprops/blob/main/CHANGELOG.md
|
|
12
|
+
Keywords: sympy,symbolic mathematics,symbolic computation,function analysis,function properties,real analysis,complex analysis,domains,ranges,zeros,root isolation,monotonicity,convexity,smoothness,singularities,branch cuts,mapping properties,sign analysis,semialgebraic,certified computation,exact computation
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Intended Audience :: Science/Research
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Programming Language :: Python :: 3
|
|
20
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
21
|
+
Classifier: Topic :: Scientific/Engineering :: Mathematics
|
|
22
|
+
Requires-Python: >=3.11
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
License-File: LICENSE
|
|
25
|
+
Requires-Dist: sympy>=1.14
|
|
26
|
+
Requires-Dist: mpmath>=1.3
|
|
27
|
+
Requires-Dist: semialg>=1.3.0
|
|
28
|
+
Requires-Dist: exprtest>=0.1.0
|
|
29
|
+
Provides-Extra: test
|
|
30
|
+
Requires-Dist: pytest>=8; extra == "test"
|
|
31
|
+
Requires-Dist: hypothesis>=6; extra == "test"
|
|
32
|
+
Provides-Extra: dev
|
|
33
|
+
Requires-Dist: pytest>=8; extra == "dev"
|
|
34
|
+
Requires-Dist: hypothesis>=6; extra == "dev"
|
|
35
|
+
Requires-Dist: ruff>=0.8; extra == "dev"
|
|
36
|
+
Dynamic: license-file
|
|
37
|
+
|
|
38
|
+
# funcprops
|
|
39
|
+
|
|
40
|
+
`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.
|
|
41
|
+
|
|
42
|
+
When a result cannot be established by the available symbolic, semialgebraic, theorem-based, or validated numerical methods, `funcprops` preserves unresolved conditions or returns "unknown" for the result.
|
|
43
|
+
|
|
44
|
+
## Installation
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
pip install funcprops
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
The runtime requires Python 3.11+, SymPy 1.14+, mpmath 1.3+, semialg 1.3+ and exprtest 0.1.0+.
|
|
51
|
+
|
|
52
|
+
## Quick start
|
|
53
|
+
|
|
54
|
+
```python
|
|
55
|
+
import sympy as sp
|
|
56
|
+
import funcprops as fp
|
|
57
|
+
|
|
58
|
+
x, y = sp.symbols("x y", real=True)
|
|
59
|
+
z = sp.Symbol("z")
|
|
60
|
+
|
|
61
|
+
fp.domain(sp.sqrt(x - 1), x)
|
|
62
|
+
# x >= 1
|
|
63
|
+
|
|
64
|
+
fp.range(x**2, x, y)
|
|
65
|
+
# y >= 0
|
|
66
|
+
|
|
67
|
+
fp.monotonicity(sp.exp(x), x)
|
|
68
|
+
# Monotonicity.STRICTLY_INCREASING
|
|
69
|
+
|
|
70
|
+
fp.convexity(x**2, x)
|
|
71
|
+
# Convexity.STRONGLY_CONVEX
|
|
72
|
+
|
|
73
|
+
fp.complete_monotonicity(sp.exp(-x), x, domain=sp.Interval(0, sp.oo))
|
|
74
|
+
# TruthValue.TRUE
|
|
75
|
+
|
|
76
|
+
fp.periodicity(sp.sin(2*x) + sp.cos(3*x), x, return_result=True).period
|
|
77
|
+
# 2*pi
|
|
78
|
+
|
|
79
|
+
fp.branch_cuts(sp.log(1 - z), z)
|
|
80
|
+
# (z > 1,)
|
|
81
|
+
|
|
82
|
+
fp.geometry(x**2, x).minimum_exists.exists
|
|
83
|
+
# True
|
|
84
|
+
|
|
85
|
+
fp.jacobian((2*x + y, x - y), (x, y))
|
|
86
|
+
# Matrix([[2, 1], [1, -1]])
|
|
87
|
+
|
|
88
|
+
fp.change_of_variables((2*x + y, x - y), (x, y)).volume_factor
|
|
89
|
+
# 3
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
All root-level property queries use the same public conventions: scalar analysis variables are named `variable`, multivariate variables are named `variables`, `assumptions=` carries symbolic assumptions, and `return_result=True` requests the detailed result/proof view (without changing the default mathematical answer).
|
|
93
|
+
|
|
94
|
+
```python
|
|
95
|
+
a = sp.symbols("a", real=True)
|
|
96
|
+
|
|
97
|
+
fp.injective(a*x, x)
|
|
98
|
+
# parameter-stratified answer: a != 0 -> true; a = 0 -> false
|
|
99
|
+
|
|
100
|
+
detail = fp.convexity(x**2, x, return_result=True)
|
|
101
|
+
print(fp.explain_result(detail))
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
To discover supported high-level properties interactively:
|
|
105
|
+
|
|
106
|
+
```python
|
|
107
|
+
fp.properties()
|
|
108
|
+
fp.properties(category="mapping")
|
|
109
|
+
fp.properties(category="regularity")
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Property model
|
|
113
|
+
|
|
114
|
+
Root-level property queries 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 useful.
|
|
115
|
+
|
|
116
|
+
## Result conventions
|
|
117
|
+
|
|
118
|
+
Mathematical values are the default. Boolean-style properties use `TruthValue.TRUE`, `TruthValue.FALSE`, and `TruthValue.UNKNOWN`; categorical properties use their corresponding enum with an `UNKNOWN` member. Parameter dependence is represented explicitly by `PropertyResult` rather than guessed away.
|
|
119
|
+
|
|
120
|
+
Detailed results are opt-in (via the option return_result=True) and consistent across the root API:
|
|
121
|
+
|
|
122
|
+
```python
|
|
123
|
+
result = fp.monotonicity(a*x, x, return_result=True)
|
|
124
|
+
print(result)
|
|
125
|
+
print(fp.explain_result(result))
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
In notebooks, conditional and detailed results render as compact tables so the mathematical answer is prominent and proof metadata remains secondary.
|
|
129
|
+
|
|
130
|
+
## Real-domain analysis
|
|
131
|
+
|
|
132
|
+
`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.
|
|
133
|
+
|
|
134
|
+
The main real-analysis queries are:
|
|
135
|
+
|
|
136
|
+
- `domain()` and `range()`;
|
|
137
|
+
- `sign()` and `boundedness()`;
|
|
138
|
+
- `monotonicity()` and `oscillation()`;
|
|
139
|
+
- `convexity()` and `complete_monotonicity()`;
|
|
140
|
+
- `injective()`, `surjective()`, and `bijective()`;
|
|
141
|
+
- `continuous()`, `differentiability()`,
|
|
142
|
+
`smoothness()`, and `analytic()`;
|
|
143
|
+
- `periodicity()`, `symmetry()`, and
|
|
144
|
+
`homogeneity()`.
|
|
145
|
+
|
|
146
|
+
Mixed variable/parameter domains are split by 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.
|
|
147
|
+
|
|
148
|
+
## Monotonic partitions, inverse solving, and real roots
|
|
149
|
+
|
|
150
|
+
`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.
|
|
151
|
+
|
|
152
|
+
`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.
|
|
153
|
+
|
|
154
|
+
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.
|
|
155
|
+
|
|
156
|
+
## Zero geometry and oscillatory extrema
|
|
157
|
+
|
|
158
|
+
Special-function zeros are represented symbolically when closed forms are not available. `IndexedZero`, `ZeroOrdering`, `ZeroInterlacing`, and `ZeroGeometryCertificate` encode support, simplicity, ordering, interlacing, and completeness.
|
|
159
|
+
|
|
160
|
+
`IndexedExtremumValue`, `ExtremumEnvelope`, and indexed-tail inversion extend the same exact 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.
|
|
161
|
+
|
|
162
|
+
## Singularities, branch cuts, and complex zeros
|
|
163
|
+
|
|
164
|
+
`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.
|
|
165
|
+
|
|
166
|
+
`branch_cuts()` provides inexpensive structural pullback of principal cuts; boundary-value and jump computations are available under `funcprops.branchcuts`.
|
|
167
|
+
|
|
168
|
+
`complex_zeros()` isolates zeros in finite complex rectangles. It uses exact complex solving when available, 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 only diagnostic.
|
|
169
|
+
|
|
170
|
+
## Function geometry and attainment
|
|
171
|
+
|
|
172
|
+
`geometry()` combines regularity, singularity, convexity, boundary escape, level-boundedness, and structural mode-existence information in one summary. Related focussed queries are:
|
|
173
|
+
|
|
174
|
+
- `boundary_behavior()` for certified limits at unbounded boundaries;
|
|
175
|
+
- `level_boundedness()` for a compact coercivity classification, with certificates via `return_result=True`;
|
|
176
|
+
- `mode_existence()` for compact structural minimum/maximum attainment, with proof metadata via `return_result=True`.
|
|
177
|
+
|
|
178
|
+
The attainment machinery is implication-based. Failure to establish continuity, closedness, or level-boundedness yields an unresolved result.
|
|
179
|
+
|
|
180
|
+
## Transformation geometry
|
|
181
|
+
|
|
182
|
+
For an explicit coordinate map, `funcprops` can compute and certify:
|
|
183
|
+
|
|
184
|
+
- `jacobian()` — exact Jacobian matrices by default, with derivative certificates via `return_result=True`;
|
|
185
|
+
- `determinant_nonvanishing()` — domain-wide nonvanishing of `det J`;
|
|
186
|
+
- `local_invertibility()` — inverse-function-theorem certificates;
|
|
187
|
+
- `change_of_variables()` — the local volume factor `Abs(det J)`;
|
|
188
|
+
- `transformation_geometry()` — combined transformation summary.
|
|
189
|
+
|
|
190
|
+
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.
|
|
191
|
+
|
|
192
|
+
## Statistical special functions
|
|
193
|
+
|
|
194
|
+
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.
|
|
195
|
+
|
|
196
|
+
For statistical functions not represented by the supported SymPy release, `funcprops` provides lightweight symbolic heads:
|
|
197
|
+
|
|
198
|
+
- `OwenT(h, a)`;
|
|
199
|
+
- `MittagLefflerE(alpha, z)` and `MittagLefflerE(alpha, beta, z)`;
|
|
200
|
+
- `RegularizedGammaP(a, x)` and `RegularizedGammaQ(a, x)`.
|
|
201
|
+
|
|
202
|
+
These heads are simply symbolic theorem carriers, not replacements for numerical 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.
|
|
203
|
+
|
|
204
|
+
See [Statistical special functions](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/statistical_special_functions.md) for the current theorem coverage and provenance notes.
|
|
205
|
+
|
|
206
|
+
## Special-function registry and provenance
|
|
207
|
+
|
|
208
|
+
The conditional registry 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.
|
|
209
|
+
|
|
210
|
+
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).
|
|
211
|
+
|
|
212
|
+
## Proof cache and certificate replay
|
|
213
|
+
|
|
214
|
+
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 to construct a key.
|
|
215
|
+
|
|
216
|
+
Proof objects can be "replayed" with `verify_certificate()` and specialized verifiers. For replay, an undecidable comparison never counts as a successful verification.
|
|
217
|
+
|
|
218
|
+
## Documentation and examples
|
|
219
|
+
|
|
220
|
+
- [Function property reference](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/properties/index.md) — canonical page for every public function property query.
|
|
221
|
+
- [Working with results, assumptions, certificates, and caches](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/using-results.md).
|
|
222
|
+
- [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.
|
|
223
|
+
- [Statistical special functions](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/statistical_special_functions.md).
|
|
224
|
+
- [Architecture](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/architecture.md).
|
|
225
|
+
- [Mathematical conventions](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/mathematical_conventions.md).
|
|
226
|
+
- [Certification model](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/certification.md)
|
|
227
|
+
- [Certified complex analysis](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/complex_analysis.md).
|
|
228
|
+
- [Homotopy and contour deformation](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/homotopy.md).
|
|
229
|
+
- [Capability matrix and limitations](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/capabilities.md).
|
|
230
|
+
- [Worked examples](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/examples.md).
|
|
231
|
+
- [DLMF audit methodology](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/dlmf_audit.md).
|
|
232
|
+
|
|
233
|
+
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.
|
|
234
|
+
|
|
235
|
+
## Development
|
|
236
|
+
|
|
237
|
+
Contributions – whether they are bug reports, suggestions, or code – are welcome!
|
|
238
|
+
|
|
239
|
+
Run the source-tree tests with:
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
PYTHONPATH=src:. pytest
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
Run the static gates with:
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
ruff format --check src tests examples tools
|
|
249
|
+
ruff check src tests examples tools
|
|
250
|
+
python -m compileall -q src tests examples tools
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
The package keeps exact fast paths ahead of heavier partition, root-isolation, or semialgebraic machinery. Structural refactors should preserve that ordering unless a benchmark and correctness argument justify changing it.
|
|
254
|
+
|
|
255
|
+
## License
|
|
256
|
+
|
|
257
|
+
`funcprops` is licensed under the GNU General Public License version 3 only
|
|
258
|
+
(GPL-3.0-only). See [LICENSE](https://github.com/BhuvaneshBhatt/funcprops/blob/main/LICENSE).
|
|
@@ -0,0 +1,221 @@
|
|
|
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
|
+
When a result cannot be established by the available symbolic, semialgebraic, theorem-based, or validated numerical methods, `funcprops` preserves unresolved conditions or returns "unknown" for the result.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pip install funcprops
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
The runtime requires Python 3.11+, SymPy 1.14+, mpmath 1.3+, semialg 1.3+ and exprtest 0.1.0+.
|
|
14
|
+
|
|
15
|
+
## Quick start
|
|
16
|
+
|
|
17
|
+
```python
|
|
18
|
+
import sympy as sp
|
|
19
|
+
import funcprops as fp
|
|
20
|
+
|
|
21
|
+
x, y = sp.symbols("x y", real=True)
|
|
22
|
+
z = sp.Symbol("z")
|
|
23
|
+
|
|
24
|
+
fp.domain(sp.sqrt(x - 1), x)
|
|
25
|
+
# x >= 1
|
|
26
|
+
|
|
27
|
+
fp.range(x**2, x, y)
|
|
28
|
+
# y >= 0
|
|
29
|
+
|
|
30
|
+
fp.monotonicity(sp.exp(x), x)
|
|
31
|
+
# Monotonicity.STRICTLY_INCREASING
|
|
32
|
+
|
|
33
|
+
fp.convexity(x**2, x)
|
|
34
|
+
# Convexity.STRONGLY_CONVEX
|
|
35
|
+
|
|
36
|
+
fp.complete_monotonicity(sp.exp(-x), x, domain=sp.Interval(0, sp.oo))
|
|
37
|
+
# TruthValue.TRUE
|
|
38
|
+
|
|
39
|
+
fp.periodicity(sp.sin(2*x) + sp.cos(3*x), x, return_result=True).period
|
|
40
|
+
# 2*pi
|
|
41
|
+
|
|
42
|
+
fp.branch_cuts(sp.log(1 - z), z)
|
|
43
|
+
# (z > 1,)
|
|
44
|
+
|
|
45
|
+
fp.geometry(x**2, x).minimum_exists.exists
|
|
46
|
+
# True
|
|
47
|
+
|
|
48
|
+
fp.jacobian((2*x + y, x - y), (x, y))
|
|
49
|
+
# Matrix([[2, 1], [1, -1]])
|
|
50
|
+
|
|
51
|
+
fp.change_of_variables((2*x + y, x - y), (x, y)).volume_factor
|
|
52
|
+
# 3
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
All root-level property queries use the same public conventions: scalar analysis variables are named `variable`, multivariate variables are named `variables`, `assumptions=` carries symbolic assumptions, and `return_result=True` requests the detailed result/proof view (without changing the default mathematical answer).
|
|
56
|
+
|
|
57
|
+
```python
|
|
58
|
+
a = sp.symbols("a", real=True)
|
|
59
|
+
|
|
60
|
+
fp.injective(a*x, x)
|
|
61
|
+
# parameter-stratified answer: a != 0 -> true; a = 0 -> false
|
|
62
|
+
|
|
63
|
+
detail = fp.convexity(x**2, x, return_result=True)
|
|
64
|
+
print(fp.explain_result(detail))
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
To discover supported high-level properties interactively:
|
|
68
|
+
|
|
69
|
+
```python
|
|
70
|
+
fp.properties()
|
|
71
|
+
fp.properties(category="mapping")
|
|
72
|
+
fp.properties(category="regularity")
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Property model
|
|
76
|
+
|
|
77
|
+
Root-level property queries 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 useful.
|
|
78
|
+
|
|
79
|
+
## Result conventions
|
|
80
|
+
|
|
81
|
+
Mathematical values are the default. Boolean-style properties use `TruthValue.TRUE`, `TruthValue.FALSE`, and `TruthValue.UNKNOWN`; categorical properties use their corresponding enum with an `UNKNOWN` member. Parameter dependence is represented explicitly by `PropertyResult` rather than guessed away.
|
|
82
|
+
|
|
83
|
+
Detailed results are opt-in (via the option return_result=True) and consistent across the root API:
|
|
84
|
+
|
|
85
|
+
```python
|
|
86
|
+
result = fp.monotonicity(a*x, x, return_result=True)
|
|
87
|
+
print(result)
|
|
88
|
+
print(fp.explain_result(result))
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
In notebooks, conditional and detailed results render as compact tables so the mathematical answer is prominent and proof metadata remains secondary.
|
|
92
|
+
|
|
93
|
+
## Real-domain analysis
|
|
94
|
+
|
|
95
|
+
`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.
|
|
96
|
+
|
|
97
|
+
The main real-analysis queries are:
|
|
98
|
+
|
|
99
|
+
- `domain()` and `range()`;
|
|
100
|
+
- `sign()` and `boundedness()`;
|
|
101
|
+
- `monotonicity()` and `oscillation()`;
|
|
102
|
+
- `convexity()` and `complete_monotonicity()`;
|
|
103
|
+
- `injective()`, `surjective()`, and `bijective()`;
|
|
104
|
+
- `continuous()`, `differentiability()`,
|
|
105
|
+
`smoothness()`, and `analytic()`;
|
|
106
|
+
- `periodicity()`, `symmetry()`, and
|
|
107
|
+
`homogeneity()`.
|
|
108
|
+
|
|
109
|
+
Mixed variable/parameter domains are split by 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.
|
|
110
|
+
|
|
111
|
+
## Monotonic partitions, inverse solving, and real roots
|
|
112
|
+
|
|
113
|
+
`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.
|
|
114
|
+
|
|
115
|
+
`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.
|
|
116
|
+
|
|
117
|
+
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.
|
|
118
|
+
|
|
119
|
+
## Zero geometry and oscillatory extrema
|
|
120
|
+
|
|
121
|
+
Special-function zeros are represented symbolically when closed forms are not available. `IndexedZero`, `ZeroOrdering`, `ZeroInterlacing`, and `ZeroGeometryCertificate` encode support, simplicity, ordering, interlacing, and completeness.
|
|
122
|
+
|
|
123
|
+
`IndexedExtremumValue`, `ExtremumEnvelope`, and indexed-tail inversion extend the same exact 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.
|
|
124
|
+
|
|
125
|
+
## Singularities, branch cuts, and complex zeros
|
|
126
|
+
|
|
127
|
+
`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.
|
|
128
|
+
|
|
129
|
+
`branch_cuts()` provides inexpensive structural pullback of principal cuts; boundary-value and jump computations are available under `funcprops.branchcuts`.
|
|
130
|
+
|
|
131
|
+
`complex_zeros()` isolates zeros in finite complex rectangles. It uses exact complex solving when available, 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 only diagnostic.
|
|
132
|
+
|
|
133
|
+
## Function geometry and attainment
|
|
134
|
+
|
|
135
|
+
`geometry()` combines regularity, singularity, convexity, boundary escape, level-boundedness, and structural mode-existence information in one summary. Related focussed queries are:
|
|
136
|
+
|
|
137
|
+
- `boundary_behavior()` for certified limits at unbounded boundaries;
|
|
138
|
+
- `level_boundedness()` for a compact coercivity classification, with certificates via `return_result=True`;
|
|
139
|
+
- `mode_existence()` for compact structural minimum/maximum attainment, with proof metadata via `return_result=True`.
|
|
140
|
+
|
|
141
|
+
The attainment machinery is implication-based. Failure to establish continuity, closedness, or level-boundedness yields an unresolved result.
|
|
142
|
+
|
|
143
|
+
## Transformation geometry
|
|
144
|
+
|
|
145
|
+
For an explicit coordinate map, `funcprops` can compute and certify:
|
|
146
|
+
|
|
147
|
+
- `jacobian()` — exact Jacobian matrices by default, with derivative certificates via `return_result=True`;
|
|
148
|
+
- `determinant_nonvanishing()` — domain-wide nonvanishing of `det J`;
|
|
149
|
+
- `local_invertibility()` — inverse-function-theorem certificates;
|
|
150
|
+
- `change_of_variables()` — the local volume factor `Abs(det J)`;
|
|
151
|
+
- `transformation_geometry()` — combined transformation summary.
|
|
152
|
+
|
|
153
|
+
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.
|
|
154
|
+
|
|
155
|
+
## Statistical special functions
|
|
156
|
+
|
|
157
|
+
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.
|
|
158
|
+
|
|
159
|
+
For statistical functions not represented by the supported SymPy release, `funcprops` provides lightweight symbolic heads:
|
|
160
|
+
|
|
161
|
+
- `OwenT(h, a)`;
|
|
162
|
+
- `MittagLefflerE(alpha, z)` and `MittagLefflerE(alpha, beta, z)`;
|
|
163
|
+
- `RegularizedGammaP(a, x)` and `RegularizedGammaQ(a, x)`.
|
|
164
|
+
|
|
165
|
+
These heads are simply symbolic theorem carriers, not replacements for numerical 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.
|
|
166
|
+
|
|
167
|
+
See [Statistical special functions](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/statistical_special_functions.md) for the current theorem coverage and provenance notes.
|
|
168
|
+
|
|
169
|
+
## Special-function registry and provenance
|
|
170
|
+
|
|
171
|
+
The conditional registry 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.
|
|
172
|
+
|
|
173
|
+
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).
|
|
174
|
+
|
|
175
|
+
## Proof cache and certificate replay
|
|
176
|
+
|
|
177
|
+
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 to construct a key.
|
|
178
|
+
|
|
179
|
+
Proof objects can be "replayed" with `verify_certificate()` and specialized verifiers. For replay, an undecidable comparison never counts as a successful verification.
|
|
180
|
+
|
|
181
|
+
## Documentation and examples
|
|
182
|
+
|
|
183
|
+
- [Function property reference](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/properties/index.md) — canonical page for every public function property query.
|
|
184
|
+
- [Working with results, assumptions, certificates, and caches](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/using-results.md).
|
|
185
|
+
- [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.
|
|
186
|
+
- [Statistical special functions](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/statistical_special_functions.md).
|
|
187
|
+
- [Architecture](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/architecture.md).
|
|
188
|
+
- [Mathematical conventions](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/mathematical_conventions.md).
|
|
189
|
+
- [Certification model](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/certification.md)
|
|
190
|
+
- [Certified complex analysis](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/complex_analysis.md).
|
|
191
|
+
- [Homotopy and contour deformation](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/homotopy.md).
|
|
192
|
+
- [Capability matrix and limitations](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/capabilities.md).
|
|
193
|
+
- [Worked examples](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/examples.md).
|
|
194
|
+
- [DLMF audit methodology](https://github.com/BhuvaneshBhatt/funcprops/blob/main/docs/dlmf_audit.md).
|
|
195
|
+
|
|
196
|
+
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.
|
|
197
|
+
|
|
198
|
+
## Development
|
|
199
|
+
|
|
200
|
+
Contributions – whether they are bug reports, suggestions, or code – are welcome!
|
|
201
|
+
|
|
202
|
+
Run the source-tree tests with:
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
PYTHONPATH=src:. pytest
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
Run the static gates with:
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
ruff format --check src tests examples tools
|
|
212
|
+
ruff check src tests examples tools
|
|
213
|
+
python -m compileall -q src tests examples tools
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
The package keeps exact fast paths ahead of heavier partition, root-isolation, or semialgebraic machinery. Structural refactors should preserve that ordering unless a benchmark and correctness argument justify changing it.
|
|
217
|
+
|
|
218
|
+
## License
|
|
219
|
+
|
|
220
|
+
`funcprops` is licensed under the GNU General Public License version 3 only
|
|
221
|
+
(GPL-3.0-only). See [LICENSE](https://github.com/BhuvaneshBhatt/funcprops/blob/main/LICENSE).
|
|
@@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "funcprops"
|
|
7
|
-
version = "0.
|
|
8
|
-
description = "Symbolic
|
|
7
|
+
version = "0.3.0"
|
|
8
|
+
description = "Symbolic analysis of real, complex, and multivariate function properties for SymPy"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
11
11
|
license = "GPL-3.0-only"
|
|
@@ -13,37 +13,39 @@ authors = [{name = "Bhuvanesh Bhatt", email = "bhuvaneshbhatt@gmail.com"}]
|
|
|
13
13
|
dependencies = [
|
|
14
14
|
"sympy>=1.14",
|
|
15
15
|
"mpmath>=1.3",
|
|
16
|
-
"semialg>=1.
|
|
16
|
+
"semialg>=1.3.0",
|
|
17
17
|
"exprtest>=0.1.0",
|
|
18
18
|
]
|
|
19
19
|
keywords = [
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
"sign analysis",
|
|
42
|
-
"semialgebraic",
|
|
43
|
-
"certified computation",
|
|
44
|
-
"exact computation",
|
|
20
|
+
"sympy",
|
|
21
|
+
"symbolic mathematics",
|
|
22
|
+
"symbolic computation",
|
|
23
|
+
"function analysis",
|
|
24
|
+
"function properties",
|
|
25
|
+
"real analysis",
|
|
26
|
+
"complex analysis",
|
|
27
|
+
"domains",
|
|
28
|
+
"ranges",
|
|
29
|
+
"zeros",
|
|
30
|
+
"root isolation",
|
|
31
|
+
"monotonicity",
|
|
32
|
+
"convexity",
|
|
33
|
+
"smoothness",
|
|
34
|
+
"singularities",
|
|
35
|
+
"branch cuts",
|
|
36
|
+
"mapping properties",
|
|
37
|
+
"sign analysis",
|
|
38
|
+
"semialgebraic",
|
|
39
|
+
"certified computation",
|
|
40
|
+
"exact computation",
|
|
45
41
|
]
|
|
46
42
|
classifiers = [
|
|
43
|
+
"Development Status :: 4 - Beta",
|
|
44
|
+
"Intended Audience :: Science/Research",
|
|
45
|
+
"Operating System :: OS Independent",
|
|
46
|
+
"Programming Language :: Python :: 3.11",
|
|
47
|
+
"Programming Language :: Python :: 3.12",
|
|
48
|
+
"Programming Language :: Python :: 3.13",
|
|
47
49
|
"Programming Language :: Python :: 3",
|
|
48
50
|
"Programming Language :: Python :: 3 :: Only",
|
|
49
51
|
"Topic :: Scientific/Engineering :: Mathematics",
|
|
@@ -54,6 +56,8 @@ classifiers = [
|
|
|
54
56
|
Homepage = "https://github.com/BhuvaneshBhatt/funcprops"
|
|
55
57
|
Documentation = "https://github.com/BhuvaneshBhatt/funcprops#readme"
|
|
56
58
|
Repository = "https://github.com/BhuvaneshBhatt/funcprops"
|
|
59
|
+
Issues = "https://github.com/BhuvaneshBhatt/funcprops/issues"
|
|
60
|
+
Changelog = "https://github.com/BhuvaneshBhatt/funcprops/blob/main/CHANGELOG.md"
|
|
57
61
|
|
|
58
62
|
[project.optional-dependencies]
|
|
59
63
|
test = ["pytest>=8", "hypothesis>=6"]
|