qnty 0.0.9__py3-none-any.whl → 0.1.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. qnty/__init__.py +2 -3
  2. qnty/constants/__init__.py +10 -0
  3. qnty/constants/numerical.py +18 -0
  4. qnty/constants/solvers.py +6 -0
  5. qnty/constants/tests.py +6 -0
  6. qnty/dimensions/__init__.py +23 -0
  7. qnty/dimensions/base.py +97 -0
  8. qnty/dimensions/field_dims.py +126 -0
  9. qnty/dimensions/field_dims.pyi +128 -0
  10. qnty/dimensions/signature.py +111 -0
  11. qnty/equations/__init__.py +1 -1
  12. qnty/equations/equation.py +118 -155
  13. qnty/equations/system.py +68 -65
  14. qnty/expressions/__init__.py +25 -46
  15. qnty/expressions/formatter.py +188 -0
  16. qnty/expressions/functions.py +46 -68
  17. qnty/expressions/nodes.py +540 -384
  18. qnty/expressions/types.py +70 -0
  19. qnty/problems/__init__.py +145 -0
  20. qnty/problems/composition.py +1101 -0
  21. qnty/problems/problem.py +737 -0
  22. qnty/problems/rules.py +145 -0
  23. qnty/problems/solving.py +1216 -0
  24. qnty/problems/validation.py +127 -0
  25. qnty/quantities/__init__.py +28 -5
  26. qnty/quantities/base_qnty.py +677 -0
  27. qnty/quantities/field_converters.py +24004 -0
  28. qnty/quantities/field_qnty.py +1012 -0
  29. qnty/{generated/setters.py → quantities/field_setter.py} +3071 -2961
  30. qnty/{generated/quantities.py → quantities/field_vars.py} +829 -444
  31. qnty/{generated/quantities.pyi → quantities/field_vars.pyi} +1289 -1290
  32. qnty/solving/manager.py +50 -44
  33. qnty/solving/order.py +181 -133
  34. qnty/solving/solvers/__init__.py +2 -9
  35. qnty/solving/solvers/base.py +27 -37
  36. qnty/solving/solvers/iterative.py +115 -135
  37. qnty/solving/solvers/simultaneous.py +93 -165
  38. qnty/units/__init__.py +1 -0
  39. qnty/{generated/units.py → units/field_units.py} +1700 -991
  40. qnty/units/field_units.pyi +2461 -0
  41. qnty/units/prefixes.py +58 -105
  42. qnty/units/registry.py +76 -89
  43. qnty/utils/__init__.py +16 -0
  44. qnty/utils/caching/__init__.py +23 -0
  45. qnty/utils/caching/manager.py +401 -0
  46. qnty/utils/error_handling/__init__.py +66 -0
  47. qnty/utils/error_handling/context.py +39 -0
  48. qnty/utils/error_handling/exceptions.py +96 -0
  49. qnty/utils/error_handling/handlers.py +171 -0
  50. qnty/utils/logging.py +4 -4
  51. qnty/utils/protocols.py +164 -0
  52. qnty/utils/scope_discovery.py +420 -0
  53. {qnty-0.0.9.dist-info → qnty-0.1.1.dist-info}/METADATA +1 -1
  54. qnty-0.1.1.dist-info/RECORD +60 -0
  55. qnty/_backup/problem_original.py +0 -1251
  56. qnty/_backup/quantity.py +0 -63
  57. qnty/codegen/cli.py +0 -125
  58. qnty/codegen/generators/data/unit_data.json +0 -8807
  59. qnty/codegen/generators/data_processor.py +0 -345
  60. qnty/codegen/generators/dimensions_gen.py +0 -434
  61. qnty/codegen/generators/doc_generator.py +0 -141
  62. qnty/codegen/generators/out/dimension_mapping.json +0 -974
  63. qnty/codegen/generators/out/dimension_metadata.json +0 -123
  64. qnty/codegen/generators/out/units_metadata.json +0 -223
  65. qnty/codegen/generators/quantities_gen.py +0 -159
  66. qnty/codegen/generators/setters_gen.py +0 -178
  67. qnty/codegen/generators/stubs_gen.py +0 -167
  68. qnty/codegen/generators/units_gen.py +0 -295
  69. qnty/expressions/cache.py +0 -94
  70. qnty/generated/dimensions.py +0 -514
  71. qnty/problem/__init__.py +0 -91
  72. qnty/problem/base.py +0 -142
  73. qnty/problem/composition.py +0 -385
  74. qnty/problem/composition_mixin.py +0 -382
  75. qnty/problem/equations.py +0 -413
  76. qnty/problem/metaclass.py +0 -302
  77. qnty/problem/reconstruction.py +0 -1016
  78. qnty/problem/solving.py +0 -180
  79. qnty/problem/validation.py +0 -64
  80. qnty/problem/variables.py +0 -239
  81. qnty/quantities/expression_quantity.py +0 -314
  82. qnty/quantities/quantity.py +0 -428
  83. qnty/quantities/typed_quantity.py +0 -215
  84. qnty/validation/__init__.py +0 -0
  85. qnty/validation/registry.py +0 -0
  86. qnty/validation/rules.py +0 -167
  87. qnty-0.0.9.dist-info/RECORD +0 -63
  88. /qnty/{codegen → extensions}/__init__.py +0 -0
  89. /qnty/{codegen/generators → extensions/integration}/__init__.py +0 -0
  90. /qnty/{codegen/generators/utils → extensions/plotting}/__init__.py +0 -0
  91. /qnty/{generated → extensions/reporting}/__init__.py +0 -0
  92. {qnty-0.0.9.dist-info → qnty-0.1.1.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 .generated.quantities import (
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."""
@@ -0,0 +1,6 @@
1
+ # Solver defaults
2
+ SOLVER_DEFAULT_TOLERANCE = 1e-10
3
+ """Default numerical tolerance for equation solving convergence."""
4
+
5
+ SOLVER_DEFAULT_MAX_ITERATIONS = 100
6
+ """Default maximum iterations for iterative solvers."""
@@ -0,0 +1,6 @@
1
+ # Test tolerances
2
+ TEST_PRECISION_TOLERANCE = 1e-6
3
+ """Tolerance used in tests for validating calculated results."""
4
+
5
+ TEST_DIMENSION_TOLERANCE = 1e-10
6
+ """Tolerance used in tests for dimensional signature comparisons."""
@@ -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
+ )
@@ -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)
@@ -1,4 +1,4 @@
1
1
  from .equation import Equation
2
2
  from .system import EquationSystem
3
3
 
4
- __all__ = ['Equation', 'EquationSystem']
4
+ __all__ = ["Equation", "EquationSystem"]