qnty 0.0.9__py3-none-any.whl → 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qnty/__init__.py +2 -3
- qnty/constants/__init__.py +10 -0
- qnty/constants/numerical.py +18 -0
- qnty/constants/solvers.py +6 -0
- qnty/constants/tests.py +6 -0
- qnty/dimensions/__init__.py +23 -0
- qnty/dimensions/base.py +97 -0
- qnty/dimensions/field_dims.py +126 -0
- qnty/dimensions/field_dims.pyi +128 -0
- qnty/dimensions/signature.py +111 -0
- qnty/equations/__init__.py +1 -1
- qnty/equations/equation.py +118 -155
- qnty/equations/system.py +68 -65
- qnty/expressions/__init__.py +25 -46
- qnty/expressions/formatter.py +188 -0
- qnty/expressions/functions.py +46 -68
- qnty/expressions/nodes.py +539 -384
- qnty/expressions/types.py +70 -0
- qnty/problems/__init__.py +145 -0
- qnty/problems/composition.py +1031 -0
- qnty/problems/problem.py +695 -0
- qnty/problems/rules.py +145 -0
- qnty/problems/solving.py +1216 -0
- qnty/problems/validation.py +127 -0
- qnty/quantities/__init__.py +28 -5
- qnty/quantities/base_qnty.py +677 -0
- qnty/quantities/field_converters.py +24004 -0
- qnty/quantities/field_qnty.py +1012 -0
- qnty/{generated/setters.py → quantities/field_setter.py} +3071 -2961
- qnty/{generated/quantities.py → quantities/field_vars.py} +754 -432
- qnty/{generated/quantities.pyi → quantities/field_vars.pyi} +1289 -1290
- qnty/solving/manager.py +50 -44
- qnty/solving/order.py +181 -133
- qnty/solving/solvers/__init__.py +2 -9
- qnty/solving/solvers/base.py +27 -37
- qnty/solving/solvers/iterative.py +115 -135
- qnty/solving/solvers/simultaneous.py +93 -165
- qnty/units/__init__.py +1 -0
- qnty/{generated/units.py → units/field_units.py} +1700 -991
- qnty/units/field_units.pyi +2461 -0
- qnty/units/prefixes.py +58 -105
- qnty/units/registry.py +76 -89
- qnty/utils/__init__.py +16 -0
- qnty/utils/caching/__init__.py +23 -0
- qnty/utils/caching/manager.py +401 -0
- qnty/utils/error_handling/__init__.py +66 -0
- qnty/utils/error_handling/context.py +39 -0
- qnty/utils/error_handling/exceptions.py +96 -0
- qnty/utils/error_handling/handlers.py +171 -0
- qnty/utils/logging.py +4 -4
- qnty/utils/protocols.py +164 -0
- qnty/utils/scope_discovery.py +420 -0
- {qnty-0.0.9.dist-info → qnty-0.1.0.dist-info}/METADATA +1 -1
- qnty-0.1.0.dist-info/RECORD +60 -0
- qnty/_backup/problem_original.py +0 -1251
- qnty/_backup/quantity.py +0 -63
- qnty/codegen/cli.py +0 -125
- qnty/codegen/generators/data/unit_data.json +0 -8807
- qnty/codegen/generators/data_processor.py +0 -345
- qnty/codegen/generators/dimensions_gen.py +0 -434
- qnty/codegen/generators/doc_generator.py +0 -141
- qnty/codegen/generators/out/dimension_mapping.json +0 -974
- qnty/codegen/generators/out/dimension_metadata.json +0 -123
- qnty/codegen/generators/out/units_metadata.json +0 -223
- qnty/codegen/generators/quantities_gen.py +0 -159
- qnty/codegen/generators/setters_gen.py +0 -178
- qnty/codegen/generators/stubs_gen.py +0 -167
- qnty/codegen/generators/units_gen.py +0 -295
- qnty/expressions/cache.py +0 -94
- qnty/generated/dimensions.py +0 -514
- qnty/problem/__init__.py +0 -91
- qnty/problem/base.py +0 -142
- qnty/problem/composition.py +0 -385
- qnty/problem/composition_mixin.py +0 -382
- qnty/problem/equations.py +0 -413
- qnty/problem/metaclass.py +0 -302
- qnty/problem/reconstruction.py +0 -1016
- qnty/problem/solving.py +0 -180
- qnty/problem/validation.py +0 -64
- qnty/problem/variables.py +0 -239
- qnty/quantities/expression_quantity.py +0 -314
- qnty/quantities/quantity.py +0 -428
- qnty/quantities/typed_quantity.py +0 -215
- qnty/validation/__init__.py +0 -0
- qnty/validation/registry.py +0 -0
- qnty/validation/rules.py +0 -167
- qnty-0.0.9.dist-info/RECORD +0 -63
- /qnty/{codegen → extensions}/__init__.py +0 -0
- /qnty/{codegen/generators → extensions/integration}/__init__.py +0 -0
- /qnty/{codegen/generators/utils → extensions/plotting}/__init__.py +0 -0
- /qnty/{generated → extensions/reporting}/__init__.py +0 -0
- {qnty-0.0.9.dist-info → qnty-0.1.0.dist-info}/WHEEL +0 -0
qnty/__init__.py
CHANGED
@@ -20,7 +20,8 @@ from .expressions import (
|
|
20
20
|
sqrt,
|
21
21
|
tan,
|
22
22
|
)
|
23
|
-
from .
|
23
|
+
from .problems import Problem
|
24
|
+
from .quantities.field_vars import (
|
24
25
|
AbsorbedDose,
|
25
26
|
Acceleration,
|
26
27
|
ActivationEnergy,
|
@@ -129,7 +130,6 @@ from .generated.quantities import (
|
|
129
130
|
VolumetricMassFlowRate,
|
130
131
|
Wavenumber,
|
131
132
|
)
|
132
|
-
from .problem import Problem
|
133
133
|
|
134
134
|
# Define public API
|
135
135
|
__all__ = [
|
@@ -253,4 +253,3 @@ __all__ = [
|
|
253
253
|
"VolumetricMassFlowRate",
|
254
254
|
"Wavenumber",
|
255
255
|
]
|
256
|
-
|
@@ -0,0 +1,10 @@
|
|
1
|
+
"""
|
2
|
+
Mathematical and numerical constants used throughout the qnty library.
|
3
|
+
|
4
|
+
This module centralizes magic numbers and tolerances to improve maintainability
|
5
|
+
and consistency across the codebase.
|
6
|
+
"""
|
7
|
+
|
8
|
+
from .numerical import *
|
9
|
+
from .solvers import *
|
10
|
+
from .tests import *
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# Numerical tolerances for floating point comparisons
|
2
|
+
FLOAT_EQUALITY_TOLERANCE = 1e-10
|
3
|
+
"""Default tolerance for floating point equality comparisons."""
|
4
|
+
|
5
|
+
DIVISION_BY_ZERO_THRESHOLD = 1e-15
|
6
|
+
"""Threshold below which a value is considered effectively zero for division."""
|
7
|
+
|
8
|
+
CONDITION_EVALUATION_THRESHOLD = 1e-10
|
9
|
+
"""Threshold for evaluating conditional expressions as true/false."""
|
10
|
+
|
11
|
+
DIMENSIONAL_PRECISION_TOLERANCE = 1e-10
|
12
|
+
"""Tolerance for dimensional signature comparisons."""
|
13
|
+
|
14
|
+
PREFIX_LOOKUP_TOLERANCE = 1e-10
|
15
|
+
"""Default tolerance for SI prefix factor lookup."""
|
16
|
+
|
17
|
+
PREFIX_LOOKUP_MIN_TOLERANCE = 1e-15
|
18
|
+
"""Minimum tolerance for SI prefix factor lookup to avoid expensive searches."""
|
qnty/constants/tests.py
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
"""
|
2
|
+
Core Dimensions Module
|
3
|
+
======================
|
4
|
+
|
5
|
+
Core dimensional analysis components providing compile-time type safety.
|
6
|
+
|
7
|
+
This module provides the fundamental building blocks for qnty's dimensional analysis system:
|
8
|
+
- BaseDimension: Prime-number-encoded base dimensions
|
9
|
+
- DimensionSignature: Ultra-fast dimensional compatibility checking
|
10
|
+
"""
|
11
|
+
|
12
|
+
from .base import BASE_DIMENSIONS, DIMENSION_SYMBOLS, PRIME_MAP, BaseDimension, DimensionConfig
|
13
|
+
from .field_dims import * # noqa: F403
|
14
|
+
from .signature import DimensionSignature
|
15
|
+
|
16
|
+
__all__ = (
|
17
|
+
"BaseDimension",
|
18
|
+
"DimensionSignature",
|
19
|
+
"DimensionConfig",
|
20
|
+
"BASE_DIMENSIONS",
|
21
|
+
"DIMENSION_SYMBOLS",
|
22
|
+
"PRIME_MAP"
|
23
|
+
)
|
qnty/dimensions/base.py
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
"""
|
2
|
+
Base Dimensions
|
3
|
+
===============
|
4
|
+
|
5
|
+
Core base dimensions using prime number encoding for efficient dimensional analysis.
|
6
|
+
|
7
|
+
This file contains the fundamental dimensional primitives for the qnty system.
|
8
|
+
"""
|
9
|
+
|
10
|
+
from dataclasses import dataclass
|
11
|
+
from enum import IntEnum
|
12
|
+
from types import MappingProxyType
|
13
|
+
|
14
|
+
|
15
|
+
class BaseDimension(IntEnum):
|
16
|
+
"""Base dimensions as prime numbers for efficient bit operations."""
|
17
|
+
|
18
|
+
DIMENSIONLESS = 1 # Must be 1 to act as identity
|
19
|
+
LENGTH = 2
|
20
|
+
MASS = 3
|
21
|
+
TIME = 5
|
22
|
+
CURRENT = 7
|
23
|
+
TEMPERATURE = 11
|
24
|
+
AMOUNT = 13
|
25
|
+
LUMINOSITY = 17
|
26
|
+
|
27
|
+
|
28
|
+
@dataclass(frozen=True)
|
29
|
+
class DimensionConfig:
|
30
|
+
"""Immutable configuration for a base dimension."""
|
31
|
+
prime: BaseDimension
|
32
|
+
params: MappingProxyType[str, int]
|
33
|
+
|
34
|
+
|
35
|
+
# Immutable dimension symbols for display
|
36
|
+
DIMENSION_SYMBOLS: MappingProxyType[str, str] = MappingProxyType(
|
37
|
+
{
|
38
|
+
"length": "L",
|
39
|
+
"mass": "M",
|
40
|
+
"time": "T",
|
41
|
+
"current": "A",
|
42
|
+
"temp": "Θ",
|
43
|
+
"amount": "N",
|
44
|
+
"luminosity": "J",
|
45
|
+
}
|
46
|
+
)
|
47
|
+
|
48
|
+
# Immutable base dimensions configuration for generators
|
49
|
+
BASE_DIMENSIONS: MappingProxyType[str, DimensionConfig] = MappingProxyType(
|
50
|
+
{
|
51
|
+
"LENGTH": DimensionConfig(
|
52
|
+
BaseDimension.LENGTH,
|
53
|
+
MappingProxyType({"length": 1})
|
54
|
+
),
|
55
|
+
"MASS": DimensionConfig(
|
56
|
+
BaseDimension.MASS,
|
57
|
+
MappingProxyType({"mass": 1})
|
58
|
+
),
|
59
|
+
"TIME": DimensionConfig(
|
60
|
+
BaseDimension.TIME,
|
61
|
+
MappingProxyType({"time": 1})
|
62
|
+
),
|
63
|
+
"CURRENT": DimensionConfig(
|
64
|
+
BaseDimension.CURRENT,
|
65
|
+
MappingProxyType({"current": 1})
|
66
|
+
),
|
67
|
+
"TEMPERATURE": DimensionConfig(
|
68
|
+
BaseDimension.TEMPERATURE,
|
69
|
+
MappingProxyType({"temp": 1})
|
70
|
+
),
|
71
|
+
"AMOUNT": DimensionConfig(
|
72
|
+
BaseDimension.AMOUNT,
|
73
|
+
MappingProxyType({"amount": 1})
|
74
|
+
),
|
75
|
+
"LUMINOSITY": DimensionConfig(
|
76
|
+
BaseDimension.LUMINOSITY,
|
77
|
+
MappingProxyType({"luminosity": 1})
|
78
|
+
),
|
79
|
+
"DIMENSIONLESS": DimensionConfig(
|
80
|
+
BaseDimension.DIMENSIONLESS,
|
81
|
+
MappingProxyType({})
|
82
|
+
),
|
83
|
+
}
|
84
|
+
)
|
85
|
+
|
86
|
+
# Immutable prime mapping for signature calculations
|
87
|
+
PRIME_MAP: MappingProxyType[str, BaseDimension] = MappingProxyType(
|
88
|
+
{
|
89
|
+
"length": BaseDimension.LENGTH,
|
90
|
+
"mass": BaseDimension.MASS,
|
91
|
+
"time": BaseDimension.TIME,
|
92
|
+
"current": BaseDimension.CURRENT,
|
93
|
+
"temp": BaseDimension.TEMPERATURE,
|
94
|
+
"amount": BaseDimension.AMOUNT,
|
95
|
+
"luminosity": BaseDimension.LUMINOSITY,
|
96
|
+
}
|
97
|
+
)
|
@@ -0,0 +1,126 @@
|
|
1
|
+
"""
|
2
|
+
Dimension System
|
3
|
+
================
|
4
|
+
|
5
|
+
Compile-time dimensional analysis using type system for ultra-fast operations.
|
6
|
+
|
7
|
+
This file contains dimension constants for all engineering fields.
|
8
|
+
"""
|
9
|
+
|
10
|
+
from .signature import DimensionSignature
|
11
|
+
|
12
|
+
# Dimension signature constants - computed from prime factorization
|
13
|
+
_SIGNATURES: dict[str, int | float] = {
|
14
|
+
"ABSORBED_DOSE": 0.16, # L^2 T^-2
|
15
|
+
"ACCELERATION": 0.08, # L T^-2
|
16
|
+
"ACTIVATION_ENERGY": 0.01230769231, # N^-1 L^2 T^-2
|
17
|
+
"AMOUNT_OF_SUBSTANCE": 13, # N
|
18
|
+
"ANGLE_PLANE": 1, # Dimensionless
|
19
|
+
"ANGLE_SOLID": 1, # Dimensionless
|
20
|
+
"ANGULAR_ACCELERATION": 0.04, # T^-2
|
21
|
+
"ANGULAR_MOMENTUM": 2.4, # L^2 M T^-1
|
22
|
+
"AREA": 4, # L^2
|
23
|
+
"AREA_PER_UNIT_VOLUME": 0.5, # L^-1
|
24
|
+
"ATOMIC_WEIGHT": 0.2307692308, # N^-1 M
|
25
|
+
"CONCENTRATION": 0.375, # L^-3 M
|
26
|
+
"DIMENSIONLESS": 1, # Dimensionless
|
27
|
+
"DYNAMIC_FLUIDITY": 3.333333333, # L M^-1 T
|
28
|
+
"ELECTRIC_CAPACITANCE": 2552.083333, # A^2 L^-2 M^-1 T^4
|
29
|
+
"ELECTRIC_CHARGE": 2.692307692, # N^-1 A T
|
30
|
+
"ELECTRIC_CURRENT_INTENSITY": 7, # A
|
31
|
+
"ELECTRIC_DIPOLE_MOMENT": 70, # A L T
|
32
|
+
"ELECTRIC_FIELD_STRENGTH": 0.006857142857, # A^-1 L M T^-3
|
33
|
+
"ELECTRIC_INDUCTANCE": 0.009795918367, # A^-2 L^2 M T^-2
|
34
|
+
"ELECTRIC_POTENTIAL": 0.01371428571, # A^-1 L^2 M T^-3
|
35
|
+
"ELECTRIC_RESISTANCE": 0.001959183673, # A^-2 L^2 M T^-3
|
36
|
+
"ELECTRICAL_CONDUCTANCE": 510.4166667, # A^2 L^-2 M^-1 T^3
|
37
|
+
"ELECTRICAL_PERMITTIVITY": 1276.041667, # A^2 L^-3 M^-1 T^4
|
38
|
+
"ELECTRICAL_RESISTIVITY": 0.003918367347, # A^-2 L^3 M T^-3
|
39
|
+
"ENERGY_FLUX": 0.024, # M T^-3
|
40
|
+
"ENERGY_HEAT_WORK": 0.48, # L^2 M T^-2
|
41
|
+
"ENERGY_PER_UNIT_AREA": 0.12, # M T^-2
|
42
|
+
"FORCE": 0.24, # L M T^-2
|
43
|
+
"FORCE_BODY": 0.03, # L^-2 M T^-2
|
44
|
+
"FORCE_PER_UNIT_MASS": 0.08, # L T^-2
|
45
|
+
"FREQUENCY_VOLTAGE_RATIO": 72.91666667, # A L^-2 M^-1 T^3
|
46
|
+
"FUEL_CONSUMPTION": 0.25, # L^-2
|
47
|
+
"HEAT_OF_COMBUSTION": 0.16, # L^2 T^-2
|
48
|
+
"HEAT_OF_FUSION": 0.16, # L^2 T^-2
|
49
|
+
"HEAT_OF_VAPORIZATION": 0.16, # L^2 T^-2
|
50
|
+
"HEAT_TRANSFER_COEFFICIENT": 0.002181818182, # M Θ^-1 T^-3
|
51
|
+
"ILLUMINANCE": 0.25, # L^-2 L
|
52
|
+
"KINETIC_ENERGY_OF_TURBULENCE": 0.16, # L^2 T^-2
|
53
|
+
"LENGTH": 2, # L
|
54
|
+
"LINEAR_MASS_DENSITY": 1.5, # L^-1 M
|
55
|
+
"LINEAR_MOMENTUM": 1.2, # L M T^-1
|
56
|
+
"LUMINANCE_SELF": 0.25, # L^-2 L
|
57
|
+
"LUMINOUS_FLUX": 1, # L
|
58
|
+
"LUMINOUS_INTENSITY": 1, # L
|
59
|
+
"MAGNETIC_FIELD": 3.5, # A L^-1
|
60
|
+
"MAGNETIC_FLUX": 0.06857142857, # A^-1 L^2 M T^-2
|
61
|
+
"MAGNETIC_INDUCTION_FIELD_STRENGTH": 0.01714285714, # A^-1 M T^-2
|
62
|
+
"MAGNETIC_MOMENT": 28, # A L^2
|
63
|
+
"MAGNETIC_PERMEABILITY": 0.009795918367, # A^-2 L^2 M T^-2
|
64
|
+
"MAGNETOMOTIVE_FORCE": 7, # A
|
65
|
+
"MASS": 3, # M
|
66
|
+
"MASS_DENSITY": 0.375, # L^-3 M
|
67
|
+
"MASS_FLOW_RATE": 0.6, # M T^-1
|
68
|
+
"MASS_FLUX": 0.15, # L^-2 M T^-1
|
69
|
+
"MASS_FRACTION_OF_I": 1, # Dimensionless
|
70
|
+
"MASS_TRANSFER_COEFFICIENT": 0.15, # L^-2 M T^-1
|
71
|
+
"MOLALITY_OF_SOLUTE_I": 4.333333333, # N M^-1
|
72
|
+
"MOLAR_CONCENTRATION_BY_MASS": 13, # N
|
73
|
+
"MOLAR_FLOW_RATE": 2.6, # N T^-1
|
74
|
+
"MOLAR_FLUX": 0.65, # N L^-2 T^-1
|
75
|
+
"MOLAR_HEAT_CAPACITY": 0.001118881119, # N^-1 L^2 Θ^-1 T^-2
|
76
|
+
"MOLARITY_OF_I": 1.625, # N L^-3
|
77
|
+
"MOLE_FRACTION_OF_I": 1, # Dimensionless
|
78
|
+
"MOMENT_OF_INERTIA": 12, # L^2 M
|
79
|
+
"MOMENTUM_FLOW_RATE": 0.24, # L M T^-2
|
80
|
+
"MOMENTUM_FLUX": 0.06, # L^-1 M T^-2
|
81
|
+
"NORMALITY_OF_SOLUTION": 1.625, # N L^-3
|
82
|
+
"PARTICLE_DENSITY": 0.125, # L^-3
|
83
|
+
"PERCENT": 1, # Dimensionless
|
84
|
+
"PERMEABILITY": 4, # L^2
|
85
|
+
"PHOTON_EMISSION_RATE": 0.05, # L^-2 T^-1
|
86
|
+
"POWER_PER_UNIT_MASS": 0.032, # L^2 T^-3
|
87
|
+
"POWER_PER_UNIT_VOLUME": 0.012, # L^-1 M T^-3
|
88
|
+
"POWER_THERMAL_DUTY": 0.096, # L^2 M T^-3
|
89
|
+
"PRESSURE": 0.06, # L^-1 M T^-2
|
90
|
+
"RADIATION_DOSE_EQUIVALENT": 0.16, # L^2 T^-2
|
91
|
+
"RADIATION_EXPOSURE": 11.66666667, # A M^-1 T
|
92
|
+
"RADIOACTIVITY": 0.2, # T^-1
|
93
|
+
"SECOND_MOMENT_OF_AREA": 16, # L^4
|
94
|
+
"SECOND_RADIATION_CONSTANT_PLANCK": 22, # L Θ
|
95
|
+
"SPECIFIC_ENTHALPY": 0.16, # L^2 T^-2
|
96
|
+
"SPECIFIC_GRAVITY": 1, # Dimensionless
|
97
|
+
"SPECIFIC_HEAT_CAPACITY_CONSTANT_PRESSURE": 0.04363636364, # L^2 M Θ^-1 T^-2
|
98
|
+
"SPECIFIC_LENGTH": 0.6666666667, # L M^-1
|
99
|
+
"SPECIFIC_SURFACE": 1.333333333, # L^2 M^-1
|
100
|
+
"SPECIFIC_VOLUME": 2.666666667, # L^3 M^-1
|
101
|
+
"STRESS": 0.06, # L^-1 M T^-2
|
102
|
+
"SURFACE_MASS_DENSITY": 0.75, # L^-2 M
|
103
|
+
"SURFACE_TENSION": 0.12, # M T^-2
|
104
|
+
"TEMPERATURE": 11, # Θ
|
105
|
+
"THERMAL_CONDUCTIVITY": 0.528, # L M Θ T^-3
|
106
|
+
"TIME": 5, # T
|
107
|
+
"TORQUE": 0.48, # L^2 M T^-2
|
108
|
+
"TURBULENCE_ENERGY_DISSIPATION_RATE": 0.032, # L^2 T^-3
|
109
|
+
"VELOCITY_ANGULAR": 0.2, # T^-1
|
110
|
+
"VELOCITY_LINEAR": 0.4, # L T^-1
|
111
|
+
"VISCOSITY_DYNAMIC": 0.3, # L^-1 M T^-1
|
112
|
+
"VISCOSITY_KINEMATIC": 0.8, # L^2 T^-1
|
113
|
+
"VOLUME": 8, # L^3
|
114
|
+
"VOLUME_FRACTION_OF_I": 1, # Dimensionless
|
115
|
+
"VOLUMETRIC_CALORIFIC_HEATING_VALUE": 0.06, # L^-1 M T^-2
|
116
|
+
"VOLUMETRIC_COEFFICIENT_OF_EXPANSION": 0.03409090909, # L^-3 M Θ^-1
|
117
|
+
"VOLUMETRIC_FLOW_RATE": 1.6, # L^3 T^-1
|
118
|
+
"VOLUMETRIC_FLUX": 0.4, # L T^-1
|
119
|
+
"VOLUMETRIC_MASS_FLOW_RATE": 0.075, # L^-3 M T^-1
|
120
|
+
"WAVENUMBER": 0.5, # L^-1
|
121
|
+
}
|
122
|
+
|
123
|
+
# Generate all dimension constants programmatically to avoid duplication
|
124
|
+
for _name, _signature in _SIGNATURES.items():
|
125
|
+
globals()[_name] = DimensionSignature(_signature)
|
126
|
+
|
@@ -0,0 +1,128 @@
|
|
1
|
+
"""
|
2
|
+
Type stubs for field_dims module.
|
3
|
+
|
4
|
+
This file provides type information for the dynamically generated dimension constants.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from .signature import DimensionSignature
|
8
|
+
|
9
|
+
# Dimension signature constants lookup
|
10
|
+
_SIGNATURES: dict[str, int | float]
|
11
|
+
|
12
|
+
# Lazy loading cache
|
13
|
+
_dimension_cache: dict[str, DimensionSignature]
|
14
|
+
|
15
|
+
# Module attribute access function
|
16
|
+
def __getattr__(name: str) -> DimensionSignature: ...
|
17
|
+
|
18
|
+
# All dynamically generated dimension constants
|
19
|
+
ABSORBED_DOSE: DimensionSignature
|
20
|
+
ACCELERATION: DimensionSignature
|
21
|
+
ACTIVATION_ENERGY: DimensionSignature
|
22
|
+
AMOUNT_OF_SUBSTANCE: DimensionSignature
|
23
|
+
ANGLE_PLANE: DimensionSignature
|
24
|
+
ANGLE_SOLID: DimensionSignature
|
25
|
+
ANGULAR_ACCELERATION: DimensionSignature
|
26
|
+
ANGULAR_MOMENTUM: DimensionSignature
|
27
|
+
AREA: DimensionSignature
|
28
|
+
AREA_PER_UNIT_VOLUME: DimensionSignature
|
29
|
+
ATOMIC_WEIGHT: DimensionSignature
|
30
|
+
CONCENTRATION: DimensionSignature
|
31
|
+
DIMENSIONLESS: DimensionSignature
|
32
|
+
DYNAMIC_FLUIDITY: DimensionSignature
|
33
|
+
ELECTRIC_CAPACITANCE: DimensionSignature
|
34
|
+
ELECTRIC_CHARGE: DimensionSignature
|
35
|
+
ELECTRIC_CURRENT_INTENSITY: DimensionSignature
|
36
|
+
ELECTRIC_DIPOLE_MOMENT: DimensionSignature
|
37
|
+
ELECTRIC_FIELD_STRENGTH: DimensionSignature
|
38
|
+
ELECTRIC_INDUCTANCE: DimensionSignature
|
39
|
+
ELECTRIC_POTENTIAL: DimensionSignature
|
40
|
+
ELECTRIC_RESISTANCE: DimensionSignature
|
41
|
+
ELECTRICAL_CONDUCTANCE: DimensionSignature
|
42
|
+
ELECTRICAL_PERMITTIVITY: DimensionSignature
|
43
|
+
ELECTRICAL_RESISTIVITY: DimensionSignature
|
44
|
+
ENERGY_FLUX: DimensionSignature
|
45
|
+
ENERGY_HEAT_WORK: DimensionSignature
|
46
|
+
ENERGY_PER_UNIT_AREA: DimensionSignature
|
47
|
+
FORCE: DimensionSignature
|
48
|
+
FORCE_BODY: DimensionSignature
|
49
|
+
FORCE_PER_UNIT_MASS: DimensionSignature
|
50
|
+
FREQUENCY_VOLTAGE_RATIO: DimensionSignature
|
51
|
+
FUEL_CONSUMPTION: DimensionSignature
|
52
|
+
HEAT_OF_COMBUSTION: DimensionSignature
|
53
|
+
HEAT_OF_FUSION: DimensionSignature
|
54
|
+
HEAT_OF_VAPORIZATION: DimensionSignature
|
55
|
+
HEAT_TRANSFER_COEFFICIENT: DimensionSignature
|
56
|
+
ILLUMINANCE: DimensionSignature
|
57
|
+
KINETIC_ENERGY_OF_TURBULENCE: DimensionSignature
|
58
|
+
LENGTH: DimensionSignature
|
59
|
+
LINEAR_MASS_DENSITY: DimensionSignature
|
60
|
+
LINEAR_MOMENTUM: DimensionSignature
|
61
|
+
LUMINANCE_SELF: DimensionSignature
|
62
|
+
LUMINOUS_FLUX: DimensionSignature
|
63
|
+
LUMINOUS_INTENSITY: DimensionSignature
|
64
|
+
MAGNETIC_FIELD: DimensionSignature
|
65
|
+
MAGNETIC_FLUX: DimensionSignature
|
66
|
+
MAGNETIC_INDUCTION_FIELD_STRENGTH: DimensionSignature
|
67
|
+
MAGNETIC_MOMENT: DimensionSignature
|
68
|
+
MAGNETIC_PERMEABILITY: DimensionSignature
|
69
|
+
MAGNETOMOTIVE_FORCE: DimensionSignature
|
70
|
+
MASS: DimensionSignature
|
71
|
+
MASS_DENSITY: DimensionSignature
|
72
|
+
MASS_FLOW_RATE: DimensionSignature
|
73
|
+
MASS_FLUX: DimensionSignature
|
74
|
+
MASS_FRACTION_OF_I: DimensionSignature
|
75
|
+
MASS_TRANSFER_COEFFICIENT: DimensionSignature
|
76
|
+
MOLALITY_OF_SOLUTE_I: DimensionSignature
|
77
|
+
MOLAR_CONCENTRATION_BY_MASS: DimensionSignature
|
78
|
+
MOLAR_FLOW_RATE: DimensionSignature
|
79
|
+
MOLAR_FLUX: DimensionSignature
|
80
|
+
MOLAR_HEAT_CAPACITY: DimensionSignature
|
81
|
+
MOLARITY_OF_I: DimensionSignature
|
82
|
+
MOLE_FRACTION_OF_I: DimensionSignature
|
83
|
+
MOMENT_OF_INERTIA: DimensionSignature
|
84
|
+
MOMENTUM_FLOW_RATE: DimensionSignature
|
85
|
+
MOMENTUM_FLUX: DimensionSignature
|
86
|
+
NORMALITY_OF_SOLUTION: DimensionSignature
|
87
|
+
PARTICLE_DENSITY: DimensionSignature
|
88
|
+
PERCENT: DimensionSignature
|
89
|
+
PERMEABILITY: DimensionSignature
|
90
|
+
PHOTON_EMISSION_RATE: DimensionSignature
|
91
|
+
POWER_PER_UNIT_MASS: DimensionSignature
|
92
|
+
POWER_PER_UNIT_VOLUME: DimensionSignature
|
93
|
+
POWER_THERMAL_DUTY: DimensionSignature
|
94
|
+
PRESSURE: DimensionSignature
|
95
|
+
RADIATION_DOSE_EQUIVALENT: DimensionSignature
|
96
|
+
RADIATION_EXPOSURE: DimensionSignature
|
97
|
+
RADIOACTIVITY: DimensionSignature
|
98
|
+
SECOND_MOMENT_OF_AREA: DimensionSignature
|
99
|
+
SECOND_RADIATION_CONSTANT_PLANCK: DimensionSignature
|
100
|
+
SPECIFIC_ENTHALPY: DimensionSignature
|
101
|
+
SPECIFIC_GRAVITY: DimensionSignature
|
102
|
+
SPECIFIC_HEAT_CAPACITY_CONSTANT_PRESSURE: DimensionSignature
|
103
|
+
SPECIFIC_LENGTH: DimensionSignature
|
104
|
+
SPECIFIC_SURFACE: DimensionSignature
|
105
|
+
SPECIFIC_VOLUME: DimensionSignature
|
106
|
+
STRESS: DimensionSignature
|
107
|
+
SURFACE_MASS_DENSITY: DimensionSignature
|
108
|
+
SURFACE_TENSION: DimensionSignature
|
109
|
+
TEMPERATURE: DimensionSignature
|
110
|
+
THERMAL_CONDUCTIVITY: DimensionSignature
|
111
|
+
TIME: DimensionSignature
|
112
|
+
TORQUE: DimensionSignature
|
113
|
+
TURBULENCE_ENERGY_DISSIPATION_RATE: DimensionSignature
|
114
|
+
VELOCITY_ANGULAR: DimensionSignature
|
115
|
+
VELOCITY_LINEAR: DimensionSignature
|
116
|
+
VISCOSITY_DYNAMIC: DimensionSignature
|
117
|
+
VISCOSITY_KINEMATIC: DimensionSignature
|
118
|
+
VOLUME: DimensionSignature
|
119
|
+
VOLUME_FRACTION_OF_I: DimensionSignature
|
120
|
+
VOLUMETRIC_CALORIFIC_HEATING_VALUE: DimensionSignature
|
121
|
+
VOLUMETRIC_COEFFICIENT_OF_EXPANSION: DimensionSignature
|
122
|
+
VOLUMETRIC_FLOW_RATE: DimensionSignature
|
123
|
+
VOLUMETRIC_FLUX: DimensionSignature
|
124
|
+
VOLUMETRIC_MASS_FLOW_RATE: DimensionSignature
|
125
|
+
WAVENUMBER: DimensionSignature
|
126
|
+
|
127
|
+
# Module exports
|
128
|
+
__all__: list[str]
|
@@ -0,0 +1,111 @@
|
|
1
|
+
"""
|
2
|
+
Dimension Signatures
|
3
|
+
====================
|
4
|
+
|
5
|
+
Immutable dimension signatures for ultra-fast dimensional analysis using prime number encoding.
|
6
|
+
|
7
|
+
This file contains the core DimensionSignature class that provides zero-cost dimensional
|
8
|
+
compatibility checking through compile-time type system integration.
|
9
|
+
"""
|
10
|
+
|
11
|
+
from dataclasses import dataclass
|
12
|
+
from typing import ClassVar, final
|
13
|
+
|
14
|
+
from .base import BaseDimension
|
15
|
+
|
16
|
+
|
17
|
+
@final
|
18
|
+
@dataclass(frozen=True, slots=True)
|
19
|
+
class DimensionSignature:
|
20
|
+
"""Immutable dimension signature for zero-cost dimensional analysis."""
|
21
|
+
|
22
|
+
# Store as bit pattern for ultra-fast comparison
|
23
|
+
_signature: int | float = 1
|
24
|
+
|
25
|
+
# Instance cache for interning common dimensions
|
26
|
+
_INSTANCE_CACHE: ClassVar[dict[int | float, "DimensionSignature"]] = {}
|
27
|
+
|
28
|
+
# Maximum cache size to prevent memory issues
|
29
|
+
_MAX_CACHE_SIZE: ClassVar[int] = 100
|
30
|
+
|
31
|
+
def __new__(cls, signature: int | float = 1):
|
32
|
+
"""Optimized constructor with instance interning and validation."""
|
33
|
+
# Input validation
|
34
|
+
if not isinstance(signature, int | float):
|
35
|
+
raise TypeError(f"Signature must be int or float, got {type(signature)}")
|
36
|
+
if signature <= 0:
|
37
|
+
raise ValueError(f"Signature must be positive, got {signature}")
|
38
|
+
|
39
|
+
if signature in cls._INSTANCE_CACHE:
|
40
|
+
return cls._INSTANCE_CACHE[signature]
|
41
|
+
|
42
|
+
instance = object.__new__(cls)
|
43
|
+
|
44
|
+
# Cache common signatures with size limit
|
45
|
+
if len(cls._INSTANCE_CACHE) < cls._MAX_CACHE_SIZE:
|
46
|
+
cls._INSTANCE_CACHE[signature] = instance
|
47
|
+
|
48
|
+
return instance
|
49
|
+
|
50
|
+
@classmethod
|
51
|
+
def create(cls, length: int = 0, mass: int = 0, time: int = 0, current: int = 0, temp: int = 0, amount: int = 0, luminosity: int = 0):
|
52
|
+
"""Create dimension from exponents with efficient computation."""
|
53
|
+
# Fast path for dimensionless
|
54
|
+
if not any([length, mass, time, current, temp, amount, luminosity]):
|
55
|
+
return cls(1)
|
56
|
+
|
57
|
+
# Compute signature using tuple of (base, exponent) pairs for efficiency
|
58
|
+
signature = 1.0
|
59
|
+
dimensions = [
|
60
|
+
(BaseDimension.LENGTH, length),
|
61
|
+
(BaseDimension.MASS, mass),
|
62
|
+
(BaseDimension.TIME, time),
|
63
|
+
(BaseDimension.CURRENT, current),
|
64
|
+
(BaseDimension.TEMPERATURE, temp),
|
65
|
+
(BaseDimension.AMOUNT, amount),
|
66
|
+
(BaseDimension.LUMINOSITY, luminosity),
|
67
|
+
]
|
68
|
+
|
69
|
+
for base, exponent in dimensions:
|
70
|
+
if exponent != 0:
|
71
|
+
signature *= base**exponent
|
72
|
+
|
73
|
+
return cls(signature)
|
74
|
+
|
75
|
+
def __mul__(self, other: "DimensionSignature") -> "DimensionSignature":
|
76
|
+
"""Multiply dimensions."""
|
77
|
+
if not isinstance(other, DimensionSignature):
|
78
|
+
raise TypeError(f"Cannot multiply DimensionSignature with {type(other)}")
|
79
|
+
return DimensionSignature(self._signature * other._signature)
|
80
|
+
|
81
|
+
def __truediv__(self, other: "DimensionSignature") -> "DimensionSignature":
|
82
|
+
"""Divide dimensions."""
|
83
|
+
if not isinstance(other, DimensionSignature):
|
84
|
+
raise TypeError(f"Cannot divide DimensionSignature by {type(other)}")
|
85
|
+
return DimensionSignature(self._signature / other._signature)
|
86
|
+
|
87
|
+
def __pow__(self, power: int | float) -> "DimensionSignature":
|
88
|
+
"""Raise dimension to a power."""
|
89
|
+
if not isinstance(power, int | float):
|
90
|
+
raise TypeError(f"Power must be int or float, got {type(power)}")
|
91
|
+
if power == 1:
|
92
|
+
return self
|
93
|
+
if power == 0:
|
94
|
+
return DimensionSignature(1)
|
95
|
+
return DimensionSignature(self._signature**power)
|
96
|
+
|
97
|
+
def is_compatible(self, other: "DimensionSignature") -> bool:
|
98
|
+
"""Check dimensional compatibility."""
|
99
|
+
if not isinstance(other, DimensionSignature):
|
100
|
+
return False
|
101
|
+
return self._signature == other._signature
|
102
|
+
|
103
|
+
def __eq__(self, other: object) -> bool:
|
104
|
+
"""Check equality."""
|
105
|
+
if self is other:
|
106
|
+
return True
|
107
|
+
return isinstance(other, DimensionSignature) and self._signature == other._signature
|
108
|
+
|
109
|
+
def __hash__(self) -> int:
|
110
|
+
"""Hash based on signature."""
|
111
|
+
return hash(self._signature)
|
qnty/equations/__init__.py
CHANGED