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.
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 +539 -384
  18. qnty/expressions/types.py +70 -0
  19. qnty/problems/__init__.py +145 -0
  20. qnty/problems/composition.py +1031 -0
  21. qnty/problems/problem.py +695 -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} +754 -432
  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.0.dist-info}/METADATA +1 -1
  54. qnty-0.1.0.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.0.dist-info}/WHEEL +0 -0
@@ -1,514 +0,0 @@
1
- """
2
- Dimension System
3
- ================
4
-
5
- Compile-time dimensional analysis using type system for ultra-fast operations.
6
-
7
- This file is auto-generated by codegen/generators/dimensions_gen.py
8
- DO NOT EDIT MANUALLY - changes will be overwritten.
9
- """
10
-
11
- from dataclasses import dataclass
12
- from enum import IntEnum
13
- from typing import ClassVar, final
14
-
15
-
16
- class BaseDimension(IntEnum):
17
- """Base dimensions as prime numbers for efficient bit operations."""
18
- LENGTH = 2
19
- MASS = 3
20
- TIME = 5
21
- CURRENT = 7
22
- TEMPERATURE = 11
23
- AMOUNT = 13
24
- LUMINOSITY = 17
25
- DIMENSIONLESS = 1 # Must be 1 to act as multiplicative identity
26
-
27
-
28
- @final
29
- @dataclass(frozen=True, slots=True)
30
- class DimensionSignature:
31
- """Immutable dimension signature for zero-cost dimensional analysis."""
32
-
33
- # Store as bit pattern for ultra-fast comparison
34
- _signature: int | float = 1
35
-
36
- # Pre-computed signature cache for common dimensions
37
- _COMMON_SIGNATURES: ClassVar[dict[tuple[int, ...], int | float]] = {
38
- (0, 0, 0, 0, 0, 0, 0): 1, # Dimensionless
39
- (-1, 0, 0, 0, 0, 0, 0): 0.5, # L^-1
40
- (0, 0, -1, 0, 0, 0, 0): 0.2, # T^-1
41
- (0, 0, 0, 0, 0, 0, 1): 17, # J
42
- (0, 0, 0, 0, 0, 1, 0): 13, # N
43
- (0, 0, 0, 0, 1, 0, 0): 11, # Θ
44
- (0, 0, 0, 1, 0, 0, 0): 7, # A
45
- (0, 0, 1, 0, 0, 0, 0): 5, # T
46
- (0, 1, 0, 0, 0, 0, 0): 3, # M
47
- (1, 0, 0, 0, 0, 0, 0): 2, # L
48
- (-2, 0, 0, 0, 0, 0, 0): 0.25, # L^-2 L
49
- (-1, 0, 0, 1, 0, 0, 0): 3.5, # A L^-1
50
- (-1, 1, 0, 0, 0, 0, 0): 1.5, # L^-1 M
51
- (0, -1, 0, 0, 0, 1, 0): 4.333333333, # N M^-1
52
- (0, 0, -2, 0, 0, 0, 0): 0.04, # T^-2
53
- (0, 0, -1, 0, 0, 1, 0): 2.6, # N T^-1
54
- (0, 1, -1, 0, 0, 0, 0): 0.6, # M T^-1
55
- (0, 1, 0, 0, 0, -1, 0): 0.2307692308, # N^-1 M
56
- (1, -1, 0, 0, 0, 0, 0): 0.6666666667, # L M^-1
57
- (1, 0, -1, 0, 0, 0, 0): 0.4, # L T^-1
58
- (1, 0, 0, 0, 1, 0, 0): 22, # L Θ
59
- (2, 0, 0, 0, 0, 0, 0): 4, # L^2
60
- (-3, 0, 0, 0, 0, 0, 0): 0.125, # L^-3
61
- (-2, 0, -1, 0, 0, 0, 0): 0.05, # L^-2 T^-1
62
- (-2, 1, 0, 0, 0, 0, 0): 0.75, # L^-2 M
63
- (-1, 1, -1, 0, 0, 0, 0): 0.3, # L^-1 M T^-1
64
- (0, -1, 1, 1, 0, 0, 0): 11.66666667, # A M^-1 T
65
- (0, 0, 1, 1, 0, -1, 0): 2.692307692, # N^-1 A T
66
- (0, 1, -2, 0, 0, 0, 0): 0.12, # M T^-2
67
- (1, -1, 1, 0, 0, 0, 0): 3.333333333, # L M^-1 T
68
- (1, 0, -2, 0, 0, 0, 0): 0.08, # L T^-2
69
- (1, 0, 1, 1, 0, 0, 0): 70, # A L T
70
- (1, 1, -1, 0, 0, 0, 0): 1.2, # L M T^-1
71
- (2, -1, 0, 0, 0, 0, 0): 1.333333333, # L^2 M^-1
72
- (2, 0, -1, 0, 0, 0, 0): 0.8, # L^2 T^-1
73
- (2, 0, 0, 1, 0, 0, 0): 28, # A L^2
74
- (2, 1, 0, 0, 0, 0, 0): 12, # L^2 M
75
- (3, 0, 0, 0, 0, 0, 0): 8, # L^3
76
- (-3, 0, 0, 0, 0, 1, 0): 1.625, # N L^-3
77
- (-3, 1, 0, 0, 0, 0, 0): 0.375, # L^-3 M
78
- (-2, 0, -1, 0, 0, 1, 0): 0.65, # N L^-2 T^-1
79
- (-2, 1, -1, 0, 0, 0, 0): 0.15, # L^-2 M T^-1
80
- (-1, 1, -2, 0, 0, 0, 0): 0.06, # L^-1 M T^-2
81
- (0, 1, -3, 0, 0, 0, 0): 0.024, # M T^-3
82
- (0, 1, -2, -1, 0, 0, 0): 0.01714285714, # A^-1 M T^-2
83
- (1, 1, -2, 0, 0, 0, 0): 0.24, # L M T^-2
84
- (2, 0, -2, 0, 0, 0, 0): 0.16, # L^2 T^-2
85
- (2, 1, -1, 0, 0, 0, 0): 2.4, # L^2 M T^-1
86
- (3, -1, 0, 0, 0, 0, 0): 2.666666667, # L^3 M^-1
87
- (3, 0, -1, 0, 0, 0, 0): 1.6, # L^3 T^-1
88
- }
89
-
90
- # Instance cache for interning common dimensions
91
- _INSTANCE_CACHE: ClassVar[dict[int | float, "DimensionSignature"]] = {}
92
-
93
- def __new__(cls, signature: int | float = 1):
94
- """Optimized constructor with instance interning."""
95
- if signature in cls._INSTANCE_CACHE:
96
- return cls._INSTANCE_CACHE[signature]
97
-
98
- instance = object.__new__(cls)
99
-
100
- # Cache common signatures
101
- if len(cls._INSTANCE_CACHE) < 100: # Limit cache size
102
- cls._INSTANCE_CACHE[signature] = instance
103
-
104
- return instance
105
-
106
- @classmethod
107
- def create(cls, length=0, mass=0, time=0, current=0, temp=0, amount=0, luminosity=0):
108
- """Create dimension from exponents with optimized lookup."""
109
- # Check cache first
110
- key = (length, mass, time, current, temp, amount, luminosity)
111
- if key in cls._COMMON_SIGNATURES:
112
- return cls(cls._COMMON_SIGNATURES[key])
113
-
114
- # Fast path for dimensionless
115
- if not any([length, mass, time, current, temp, amount, luminosity]):
116
- return cls(1)
117
-
118
- # Compute signature
119
- signature = 1
120
- if length != 0:
121
- signature *= BaseDimension.LENGTH ** length
122
- if mass != 0:
123
- signature *= BaseDimension.MASS ** mass
124
- if time != 0:
125
- signature *= BaseDimension.TIME ** time
126
- if current != 0:
127
- signature *= BaseDimension.CURRENT ** current
128
- if temp != 0:
129
- signature *= BaseDimension.TEMPERATURE ** temp
130
- if amount != 0:
131
- signature *= BaseDimension.AMOUNT ** amount
132
- if luminosity != 0:
133
- signature *= BaseDimension.LUMINOSITY ** luminosity
134
-
135
- return cls(signature)
136
-
137
- def __mul__(self, other):
138
- """Multiply dimensions."""
139
- return DimensionSignature(self._signature * other._signature)
140
-
141
- def __truediv__(self, other):
142
- """Divide dimensions."""
143
- return DimensionSignature(self._signature / other._signature)
144
-
145
- def __pow__(self, power):
146
- """Raise dimension to a power."""
147
- if power == 1:
148
- return self
149
- if power == 0:
150
- return DimensionSignature(1)
151
- return DimensionSignature(self._signature ** power)
152
-
153
- def is_compatible(self, other):
154
- """Check dimensional compatibility."""
155
- return self._signature == other._signature
156
-
157
- def __eq__(self, other):
158
- """Check equality."""
159
- if self is other:
160
- return True
161
- return isinstance(other, DimensionSignature) and self._signature == other._signature
162
-
163
- def __hash__(self):
164
- """Hash based on signature."""
165
- return hash(self._signature)
166
-
167
-
168
- # Pre-computed dimension signatures for all dimensions
169
- _DIMENSION_SIGNATURES = {
170
- "ABSORBED_DOSE": 0.16, # L^2 T^-2
171
- "ACCELERATION": 0.08, # L T^-2
172
- "ACTIVATION_ENERGY": 0.01230769231, # N^-1 L^2 T^-2
173
- "AMOUNT": 13, # N
174
- "AMOUNT_OF_SUBSTANCE": 13, # N
175
- "ANGLE_PLANE": 1, # Dimensionless
176
- "ANGLE_SOLID": 1, # Dimensionless
177
- "ANGULAR_ACCELERATION": 0.04, # T^-2
178
- "ANGULAR_MOMENTUM": 2.4, # L^2 M T^-1
179
- "AREA": 4, # L^2
180
- "AREA_PER_UNIT_VOLUME": 0.5, # L^-1
181
- "ATOMIC_WEIGHT": 0.2307692308, # N^-1 M
182
- "CONCENTRATION": 0.375, # L^-3 M
183
- "CURRENT": 7, # A
184
- "DIMENSIONLESS": 1, # Dimensionless
185
- "DYNAMIC_FLUIDITY": 3.333333333, # L M^-1 T
186
- "ELECTRICAL_CONDUCTANCE": 510.4166667, # A^2 L^-2 M^-1 T^3
187
- "ELECTRICAL_PERMITTIVITY": 1276.041667, # A^2 L^-3 M^-1 T^4
188
- "ELECTRICAL_RESISTIVITY": 0.003918367347, # A^-2 L^3 M T^-3
189
- "ELECTRIC_CAPACITANCE": 2552.083333, # A^2 L^-2 M^-1 T^4
190
- "ELECTRIC_CHARGE": 2.692307692, # N^-1 A T
191
- "ELECTRIC_CURRENT_INTENSITY": 7, # A
192
- "ELECTRIC_DIPOLE_MOMENT": 70, # A L T
193
- "ELECTRIC_FIELD_STRENGTH": 0.006857142857, # A^-1 L M T^-3
194
- "ELECTRIC_INDUCTANCE": 0.009795918367, # A^-2 L^2 M T^-2
195
- "ELECTRIC_POTENTIAL": 0.01371428571, # A^-1 L^2 M T^-3
196
- "ELECTRIC_RESISTANCE": 0.001959183673, # A^-2 L^2 M T^-3
197
- "ENERGY_FLUX": 0.024, # M T^-3
198
- "ENERGY_HEAT_WORK": 0.48, # L^2 M T^-2
199
- "ENERGY_PER_UNIT_AREA": 0.12, # M T^-2
200
- "FORCE": 0.24, # L M T^-2
201
- "FORCE_BODY": 0.03, # L^-2 M T^-2
202
- "FORCE_PER_UNIT_MASS": 0.08, # L T^-2
203
- "FREQUENCY_VOLTAGE_RATIO": 72.91666667, # A L^-2 M^-1 T^3
204
- "FUEL_CONSUMPTION": 0.25, # L^-2
205
- "HEAT_OF_COMBUSTION": 0.16, # L^2 T^-2
206
- "HEAT_OF_FUSION": 0.16, # L^2 T^-2
207
- "HEAT_OF_VAPORIZATION": 0.16, # L^2 T^-2
208
- "HEAT_TRANSFER_COEFFICIENT": 0.002181818182, # M Θ^-1 T^-3
209
- "ILLUMINANCE": 0.25, # L^-2 L
210
- "KINETIC_ENERGY_OF_TURBULENCE": 0.16, # L^2 T^-2
211
- "LENGTH": 2, # L
212
- "LINEAR_MASS_DENSITY": 1.5, # L^-1 M
213
- "LINEAR_MOMENTUM": 1.2, # L M T^-1
214
- "LUMINANCE_SELF": 0.25, # L^-2 L
215
- "LUMINOSITY": 17, # J
216
- "LUMINOUS_FLUX": 1, # L
217
- "LUMINOUS_INTENSITY": 1, # L
218
- "MAGNETIC_FIELD": 3.5, # A L^-1
219
- "MAGNETIC_FLUX": 0.06857142857, # A^-1 L^2 M T^-2
220
- "MAGNETIC_INDUCTION_FIELD_STRENGTH": 0.01714285714, # A^-1 M T^-2
221
- "MAGNETIC_MOMENT": 28, # A L^2
222
- "MAGNETIC_PERMEABILITY": 0.009795918367, # A^-2 L^2 M T^-2
223
- "MAGNETOMOTIVE_FORCE": 7, # A
224
- "MASS": 3, # M
225
- "MASS_DENSITY": 0.375, # L^-3 M
226
- "MASS_FLOW_RATE": 0.6, # M T^-1
227
- "MASS_FLUX": 0.15, # L^-2 M T^-1
228
- "MASS_FRACTION_OF_I": 1, # Dimensionless
229
- "MASS_TRANSFER_COEFFICIENT": 0.15, # L^-2 M T^-1
230
- "MOLALITY_OF_SOLUTE_I": 4.333333333, # N M^-1
231
- "MOLARITY_OF_I": 1.625, # N L^-3
232
- "MOLAR_CONCENTRATION_BY_MASS": 13, # N
233
- "MOLAR_FLOW_RATE": 2.6, # N T^-1
234
- "MOLAR_FLUX": 0.65, # N L^-2 T^-1
235
- "MOLAR_HEAT_CAPACITY": 0.001118881119, # N^-1 L^2 Θ^-1 T^-2
236
- "MOLE_FRACTION_OF_I": 1, # Dimensionless
237
- "MOMENTUM_FLOW_RATE": 0.24, # L M T^-2
238
- "MOMENTUM_FLUX": 0.06, # L^-1 M T^-2
239
- "MOMENT_OF_INERTIA": 12, # L^2 M
240
- "NORMALITY_OF_SOLUTION": 1.625, # N L^-3
241
- "PARTICLE_DENSITY": 0.125, # L^-3
242
- "PERCENT": 1, # Dimensionless
243
- "PERMEABILITY": 4, # L^2
244
- "PHOTON_EMISSION_RATE": 0.05, # L^-2 T^-1
245
- "POWER_PER_UNIT_MASS": 0.032, # L^2 T^-3
246
- "POWER_PER_UNIT_VOLUME": 0.012, # L^-1 M T^-3
247
- "POWER_THERMAL_DUTY": 0.096, # L^2 M T^-3
248
- "PRESSURE": 0.06, # L^-1 M T^-2
249
- "RADIATION_DOSE_EQUIVALENT": 0.16, # L^2 T^-2
250
- "RADIATION_EXPOSURE": 11.66666667, # A M^-1 T
251
- "RADIOACTIVITY": 0.2, # T^-1
252
- "SECOND_MOMENT_OF_AREA": 16, # L^4
253
- "SECOND_RADIATION_CONSTANT_PLANCK": 22, # L Θ
254
- "SPECIFIC_ENTHALPY": 0.16, # L^2 T^-2
255
- "SPECIFIC_GRAVITY": 1, # Dimensionless
256
- "SPECIFIC_HEAT_CAPACITY_CONSTANT_PRESSURE": 0.04363636364, # L^2 M Θ^-1 T^-2
257
- "SPECIFIC_LENGTH": 0.6666666667, # L M^-1
258
- "SPECIFIC_SURFACE": 1.333333333, # L^2 M^-1
259
- "SPECIFIC_VOLUME": 2.666666667, # L^3 M^-1
260
- "STRESS": 0.06, # L^-1 M T^-2
261
- "SURFACE_MASS_DENSITY": 0.75, # L^-2 M
262
- "SURFACE_TENSION": 0.12, # M T^-2
263
- "TEMPERATURE": 11, # Θ
264
- "THERMAL_CONDUCTIVITY": 0.528, # L M Θ T^-3
265
- "TIME": 5, # T
266
- "TORQUE": 0.48, # L^2 M T^-2
267
- "TURBULENCE_ENERGY_DISSIPATION_RATE": 0.032, # L^2 T^-3
268
- "VELOCITY_ANGULAR": 0.2, # T^-1
269
- "VELOCITY_LINEAR": 0.4, # L T^-1
270
- "VISCOSITY_DYNAMIC": 0.3, # L^-1 M T^-1
271
- "VISCOSITY_KINEMATIC": 0.8, # L^2 T^-1
272
- "VOLUME": 8, # L^3
273
- "VOLUMETRIC_CALORIFIC_HEATING_VALUE": 0.06, # L^-1 M T^-2
274
- "VOLUMETRIC_COEFFICIENT_OF_EXPANSION": 0.03409090909, # L^-3 M Θ^-1
275
- "VOLUMETRIC_FLOW_RATE": 1.6, # L^3 T^-1
276
- "VOLUMETRIC_FLUX": 0.4, # L T^-1
277
- "VOLUMETRIC_MASS_FLOW_RATE": 0.075, # L^-3 M T^-1
278
- "VOLUME_FRACTION_OF_I": 1, # Dimensionless
279
- "WAVENUMBER": 0.5, # L^-1
280
- }
281
-
282
- # Lazy loading cache
283
- _dimension_cache: dict[str, DimensionSignature] = {}
284
-
285
- def __getattr__(name: str) -> DimensionSignature:
286
- """Lazy load dimension constants."""
287
- if name in _DIMENSION_SIGNATURES:
288
- if name not in _dimension_cache:
289
- _dimension_cache[name] = DimensionSignature(_DIMENSION_SIGNATURES[name])
290
- return _dimension_cache[name]
291
- raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
292
-
293
- # All dimension constants generated from unit data
294
- ABSORBED_DOSE = DimensionSignature(0.16) # L^2 T^-2
295
- ACCELERATION = DimensionSignature(0.08) # L T^-2
296
- ACTIVATION_ENERGY = DimensionSignature(0.01230769231) # N^-1 L^2 T^-2
297
- AMOUNT_OF_SUBSTANCE = DimensionSignature(13) # N
298
- ANGLE_PLANE = DimensionSignature(1) # Dimensionless
299
- ANGLE_SOLID = DimensionSignature(1) # Dimensionless
300
- ANGULAR_ACCELERATION = DimensionSignature(0.04) # T^-2
301
- ANGULAR_MOMENTUM = DimensionSignature(2.4) # L^2 M T^-1
302
- AREA = DimensionSignature(4) # L^2
303
- AREA_PER_UNIT_VOLUME = DimensionSignature(0.5) # L^-1
304
- ATOMIC_WEIGHT = DimensionSignature(0.2307692308) # N^-1 M
305
- CONCENTRATION = DimensionSignature(0.375) # L^-3 M
306
- DIMENSIONLESS = DimensionSignature(1) # Dimensionless
307
- DYNAMIC_FLUIDITY = DimensionSignature(3.333333333) # L M^-1 T
308
- ELECTRIC_CAPACITANCE = DimensionSignature(2552.083333) # A^2 L^-2 M^-1 T^4
309
- ELECTRIC_CHARGE = DimensionSignature(2.692307692) # N^-1 A T
310
- ELECTRIC_CURRENT_INTENSITY = DimensionSignature(7) # A
311
- ELECTRIC_DIPOLE_MOMENT = DimensionSignature(70) # A L T
312
- ELECTRIC_FIELD_STRENGTH = DimensionSignature(0.006857142857) # A^-1 L M T^-3
313
- ELECTRIC_INDUCTANCE = DimensionSignature(0.009795918367) # A^-2 L^2 M T^-2
314
- ELECTRIC_POTENTIAL = DimensionSignature(0.01371428571) # A^-1 L^2 M T^-3
315
- ELECTRIC_RESISTANCE = DimensionSignature(0.001959183673) # A^-2 L^2 M T^-3
316
- ELECTRICAL_CONDUCTANCE = DimensionSignature(510.4166667) # A^2 L^-2 M^-1 T^3
317
- ELECTRICAL_PERMITTIVITY = DimensionSignature(1276.041667) # A^2 L^-3 M^-1 T^4
318
- ELECTRICAL_RESISTIVITY = DimensionSignature(0.003918367347) # A^-2 L^3 M T^-3
319
- ENERGY_FLUX = DimensionSignature(0.024) # M T^-3
320
- ENERGY_HEAT_WORK = DimensionSignature(0.48) # L^2 M T^-2
321
- ENERGY_PER_UNIT_AREA = DimensionSignature(0.12) # M T^-2
322
- FORCE = DimensionSignature(0.24) # L M T^-2
323
- FORCE_BODY = DimensionSignature(0.03) # L^-2 M T^-2
324
- FORCE_PER_UNIT_MASS = DimensionSignature(0.08) # L T^-2
325
- FREQUENCY_VOLTAGE_RATIO = DimensionSignature(72.91666667) # A L^-2 M^-1 T^3
326
- FUEL_CONSUMPTION = DimensionSignature(0.25) # L^-2
327
- HEAT_OF_COMBUSTION = DimensionSignature(0.16) # L^2 T^-2
328
- HEAT_OF_FUSION = DimensionSignature(0.16) # L^2 T^-2
329
- HEAT_OF_VAPORIZATION = DimensionSignature(0.16) # L^2 T^-2
330
- HEAT_TRANSFER_COEFFICIENT = DimensionSignature(0.002181818182) # M Θ^-1 T^-3
331
- ILLUMINANCE = DimensionSignature(0.25) # L^-2 L
332
- KINETIC_ENERGY_OF_TURBULENCE = DimensionSignature(0.16) # L^2 T^-2
333
- LENGTH = DimensionSignature(2) # L
334
- LINEAR_MASS_DENSITY = DimensionSignature(1.5) # L^-1 M
335
- LINEAR_MOMENTUM = DimensionSignature(1.2) # L M T^-1
336
- LUMINANCE_SELF = DimensionSignature(0.25) # L^-2 L
337
- LUMINOUS_FLUX = DimensionSignature(1) # L
338
- LUMINOUS_INTENSITY = DimensionSignature(1) # L
339
- MAGNETIC_FIELD = DimensionSignature(3.5) # A L^-1
340
- MAGNETIC_FLUX = DimensionSignature(0.06857142857) # A^-1 L^2 M T^-2
341
- MAGNETIC_INDUCTION_FIELD_STRENGTH = DimensionSignature(0.01714285714) # A^-1 M T^-2
342
- MAGNETIC_MOMENT = DimensionSignature(28) # A L^2
343
- MAGNETIC_PERMEABILITY = DimensionSignature(0.009795918367) # A^-2 L^2 M T^-2
344
- MAGNETOMOTIVE_FORCE = DimensionSignature(7) # A
345
- MASS = DimensionSignature(3) # M
346
- MASS_DENSITY = DimensionSignature(0.375) # L^-3 M
347
- MASS_FLOW_RATE = DimensionSignature(0.6) # M T^-1
348
- MASS_FLUX = DimensionSignature(0.15) # L^-2 M T^-1
349
- MASS_FRACTION_OF_I = DimensionSignature(1) # Dimensionless
350
- MASS_TRANSFER_COEFFICIENT = DimensionSignature(0.15) # L^-2 M T^-1
351
- MOLALITY_OF_SOLUTE_I = DimensionSignature(4.333333333) # N M^-1
352
- MOLAR_CONCENTRATION_BY_MASS = DimensionSignature(13) # N
353
- MOLAR_FLOW_RATE = DimensionSignature(2.6) # N T^-1
354
- MOLAR_FLUX = DimensionSignature(0.65) # N L^-2 T^-1
355
- MOLAR_HEAT_CAPACITY = DimensionSignature(0.001118881119) # N^-1 L^2 Θ^-1 T^-2
356
- MOLARITY_OF_I = DimensionSignature(1.625) # N L^-3
357
- MOLE_FRACTION_OF_I = DimensionSignature(1) # Dimensionless
358
- MOMENT_OF_INERTIA = DimensionSignature(12) # L^2 M
359
- MOMENTUM_FLOW_RATE = DimensionSignature(0.24) # L M T^-2
360
- MOMENTUM_FLUX = DimensionSignature(0.06) # L^-1 M T^-2
361
- NORMALITY_OF_SOLUTION = DimensionSignature(1.625) # N L^-3
362
- PARTICLE_DENSITY = DimensionSignature(0.125) # L^-3
363
- PERCENT = DimensionSignature(1) # Dimensionless
364
- PERMEABILITY = DimensionSignature(4) # L^2
365
- PHOTON_EMISSION_RATE = DimensionSignature(0.05) # L^-2 T^-1
366
- POWER_PER_UNIT_MASS = DimensionSignature(0.032) # L^2 T^-3
367
- POWER_PER_UNIT_VOLUME = DimensionSignature(0.012) # L^-1 M T^-3
368
- POWER_THERMAL_DUTY = DimensionSignature(0.096) # L^2 M T^-3
369
- PRESSURE = DimensionSignature(0.06) # L^-1 M T^-2
370
- RADIATION_DOSE_EQUIVALENT = DimensionSignature(0.16) # L^2 T^-2
371
- RADIATION_EXPOSURE = DimensionSignature(11.66666667) # A M^-1 T
372
- RADIOACTIVITY = DimensionSignature(0.2) # T^-1
373
- SECOND_MOMENT_OF_AREA = DimensionSignature(16) # L^4
374
- SECOND_RADIATION_CONSTANT_PLANCK = DimensionSignature(22) # L Θ
375
- SPECIFIC_ENTHALPY = DimensionSignature(0.16) # L^2 T^-2
376
- SPECIFIC_GRAVITY = DimensionSignature(1) # Dimensionless
377
- SPECIFIC_HEAT_CAPACITY_CONSTANT_PRESSURE = DimensionSignature(0.04363636364) # L^2 M Θ^-1 T^-2
378
- SPECIFIC_LENGTH = DimensionSignature(0.6666666667) # L M^-1
379
- SPECIFIC_SURFACE = DimensionSignature(1.333333333) # L^2 M^-1
380
- SPECIFIC_VOLUME = DimensionSignature(2.666666667) # L^3 M^-1
381
- STRESS = DimensionSignature(0.06) # L^-1 M T^-2
382
- SURFACE_MASS_DENSITY = DimensionSignature(0.75) # L^-2 M
383
- SURFACE_TENSION = DimensionSignature(0.12) # M T^-2
384
- TEMPERATURE = DimensionSignature(11) # Θ
385
- THERMAL_CONDUCTIVITY = DimensionSignature(0.528) # L M Θ T^-3
386
- TIME = DimensionSignature(5) # T
387
- TORQUE = DimensionSignature(0.48) # L^2 M T^-2
388
- TURBULENCE_ENERGY_DISSIPATION_RATE = DimensionSignature(0.032) # L^2 T^-3
389
- VELOCITY_ANGULAR = DimensionSignature(0.2) # T^-1
390
- VELOCITY_LINEAR = DimensionSignature(0.4) # L T^-1
391
- VISCOSITY_DYNAMIC = DimensionSignature(0.3) # L^-1 M T^-1
392
- VISCOSITY_KINEMATIC = DimensionSignature(0.8) # L^2 T^-1
393
- VOLUME = DimensionSignature(8) # L^3
394
- VOLUME_FRACTION_OF_I = DimensionSignature(1) # Dimensionless
395
- VOLUMETRIC_CALORIFIC_HEATING_VALUE = DimensionSignature(0.06) # L^-1 M T^-2
396
- VOLUMETRIC_COEFFICIENT_OF_EXPANSION = DimensionSignature(0.03409090909) # L^-3 M Θ^-1
397
- VOLUMETRIC_FLOW_RATE = DimensionSignature(1.6) # L^3 T^-1
398
- VOLUMETRIC_FLUX = DimensionSignature(0.4) # L T^-1
399
- VOLUMETRIC_MASS_FLOW_RATE = DimensionSignature(0.075) # L^-3 M T^-1
400
- WAVENUMBER = DimensionSignature(0.5) # L^-1
401
-
402
- # Module exports
403
- __all__ = [
404
- "BaseDimension",
405
- "DimensionSignature",
406
- "ABSORBED_DOSE",
407
- "ACCELERATION",
408
- "ACTIVATION_ENERGY",
409
- "AMOUNT_OF_SUBSTANCE",
410
- "ANGLE_PLANE",
411
- "ANGLE_SOLID",
412
- "ANGULAR_ACCELERATION",
413
- "ANGULAR_MOMENTUM",
414
- "AREA",
415
- "AREA_PER_UNIT_VOLUME",
416
- "ATOMIC_WEIGHT",
417
- "CONCENTRATION",
418
- "DIMENSIONLESS",
419
- "DYNAMIC_FLUIDITY",
420
- "ELECTRIC_CAPACITANCE",
421
- "ELECTRIC_CHARGE",
422
- "ELECTRIC_CURRENT_INTENSITY",
423
- "ELECTRIC_DIPOLE_MOMENT",
424
- "ELECTRIC_FIELD_STRENGTH",
425
- "ELECTRIC_INDUCTANCE",
426
- "ELECTRIC_POTENTIAL",
427
- "ELECTRIC_RESISTANCE",
428
- "ELECTRICAL_CONDUCTANCE",
429
- "ELECTRICAL_PERMITTIVITY",
430
- "ELECTRICAL_RESISTIVITY",
431
- "ENERGY_FLUX",
432
- "ENERGY_HEAT_WORK",
433
- "ENERGY_PER_UNIT_AREA",
434
- "FORCE",
435
- "FORCE_BODY",
436
- "FORCE_PER_UNIT_MASS",
437
- "FREQUENCY_VOLTAGE_RATIO",
438
- "FUEL_CONSUMPTION",
439
- "HEAT_OF_COMBUSTION",
440
- "HEAT_OF_FUSION",
441
- "HEAT_OF_VAPORIZATION",
442
- "HEAT_TRANSFER_COEFFICIENT",
443
- "ILLUMINANCE",
444
- "KINETIC_ENERGY_OF_TURBULENCE",
445
- "LENGTH",
446
- "LINEAR_MASS_DENSITY",
447
- "LINEAR_MOMENTUM",
448
- "LUMINANCE_SELF",
449
- "LUMINOUS_FLUX",
450
- "LUMINOUS_INTENSITY",
451
- "MAGNETIC_FIELD",
452
- "MAGNETIC_FLUX",
453
- "MAGNETIC_INDUCTION_FIELD_STRENGTH",
454
- "MAGNETIC_MOMENT",
455
- "MAGNETIC_PERMEABILITY",
456
- "MAGNETOMOTIVE_FORCE",
457
- "MASS",
458
- "MASS_DENSITY",
459
- "MASS_FLOW_RATE",
460
- "MASS_FLUX",
461
- "MASS_FRACTION_OF_I",
462
- "MASS_TRANSFER_COEFFICIENT",
463
- "MOLALITY_OF_SOLUTE_I",
464
- "MOLAR_CONCENTRATION_BY_MASS",
465
- "MOLAR_FLOW_RATE",
466
- "MOLAR_FLUX",
467
- "MOLAR_HEAT_CAPACITY",
468
- "MOLARITY_OF_I",
469
- "MOLE_FRACTION_OF_I",
470
- "MOMENT_OF_INERTIA",
471
- "MOMENTUM_FLOW_RATE",
472
- "MOMENTUM_FLUX",
473
- "NORMALITY_OF_SOLUTION",
474
- "PARTICLE_DENSITY",
475
- "PERCENT",
476
- "PERMEABILITY",
477
- "PHOTON_EMISSION_RATE",
478
- "POWER_PER_UNIT_MASS",
479
- "POWER_PER_UNIT_VOLUME",
480
- "POWER_THERMAL_DUTY",
481
- "PRESSURE",
482
- "RADIATION_DOSE_EQUIVALENT",
483
- "RADIATION_EXPOSURE",
484
- "RADIOACTIVITY",
485
- "SECOND_MOMENT_OF_AREA",
486
- "SECOND_RADIATION_CONSTANT_PLANCK",
487
- "SPECIFIC_ENTHALPY",
488
- "SPECIFIC_GRAVITY",
489
- "SPECIFIC_HEAT_CAPACITY_CONSTANT_PRESSURE",
490
- "SPECIFIC_LENGTH",
491
- "SPECIFIC_SURFACE",
492
- "SPECIFIC_VOLUME",
493
- "STRESS",
494
- "SURFACE_MASS_DENSITY",
495
- "SURFACE_TENSION",
496
- "TEMPERATURE",
497
- "THERMAL_CONDUCTIVITY",
498
- "TIME",
499
- "TORQUE",
500
- "TURBULENCE_ENERGY_DISSIPATION_RATE",
501
- "VELOCITY_ANGULAR",
502
- "VELOCITY_LINEAR",
503
- "VISCOSITY_DYNAMIC",
504
- "VISCOSITY_KINEMATIC",
505
- "VOLUME",
506
- "VOLUME_FRACTION_OF_I",
507
- "VOLUMETRIC_CALORIFIC_HEATING_VALUE",
508
- "VOLUMETRIC_COEFFICIENT_OF_EXPANSION",
509
- "VOLUMETRIC_FLOW_RATE",
510
- "VOLUMETRIC_FLUX",
511
- "VOLUMETRIC_MASS_FLOW_RATE",
512
- "WAVENUMBER",
513
- ]
514
-
qnty/problem/__init__.py DELETED
@@ -1,91 +0,0 @@
1
- """
2
- Reassembled Problem class from focused modules.
3
-
4
- This module combines all the decomposed functionality back into a single
5
- Problem class that maintains the same public API.
6
- """
7
-
8
- from .base import ProblemBase
9
- from .variables import VariablesMixin
10
- from .equations import EquationsMixin
11
- from .solving import SolvingMixin
12
- from .validation import ValidationMixin
13
- from .composition_mixin import CompositionMixin
14
- from .metaclass import ProblemMeta
15
-
16
- # Re-export exceptions for compatibility
17
- from .variables import VariableNotFoundError
18
- from .equations import EquationValidationError
19
- from .solving import SolverError
20
-
21
-
22
- class Problem(
23
- ProblemBase,
24
- VariablesMixin,
25
- EquationsMixin,
26
- SolvingMixin,
27
- ValidationMixin,
28
- CompositionMixin,
29
- metaclass=ProblemMeta
30
- ):
31
- """
32
- Main container class for engineering problems.
33
-
34
- This class coordinates all aspects of engineering problem definition, solving, and analysis.
35
- It supports both programmatic problem construction and class-level inheritance patterns
36
- for defining domain-specific engineering problems.
37
-
38
- Key Features:
39
- - Automatic dependency graph construction and topological solving order
40
- - Dual solving approach: SymPy symbolic solving with numerical fallback
41
- - Sub-problem composition with automatic variable namespacing
42
- - Comprehensive validation and error handling
43
- - Professional report generation capabilities
44
-
45
- Usage Patterns:
46
- 1. Inheritance Pattern (Recommended for domain problems):
47
- class MyProblem(Problem):
48
- x = Variable("x", Qty(5.0, length))
49
- y = Variable("y", Qty(0.0, length), is_known=False)
50
- eq = y.equals(x * 2)
51
-
52
- 2. Programmatic Pattern (For dynamic problems):
53
- problem = Problem("Dynamic Problem")
54
- problem.add_variables(x, y)
55
- problem.add_equation(y.equals(x * 2))
56
-
57
- 3. Composition Pattern (For reusable sub-problems):
58
- class ComposedProblem(Problem):
59
- sub1 = create_sub_problem()
60
- sub2 = create_sub_problem()
61
- # Equations can reference sub1.variable, sub2.variable
62
-
63
- Attributes:
64
- name (str): Human-readable name for the problem
65
- description (str): Detailed description of the problem
66
- variables (dict[str, Variable]): All variables in the problem
67
- equations (list[Equation]): All equations in the problem
68
- is_solved (bool): Whether the problem has been successfully solved
69
- solution (dict[str, Variable]): Solved variable values
70
- sub_problems (dict[str, Problem]): Integrated sub-problems
71
- """
72
-
73
- def __init__(self, name: str | None = None, description: str = ""):
74
- # Initialize the base class
75
- super().__init__(name, description)
76
-
77
- # Auto-populate from class-level variables and equations (subclass pattern)
78
- self._extract_from_class_variables()
79
-
80
-
81
- # Alias for backward compatibility
82
- EngineeringProblem = Problem
83
-
84
- # Export all relevant classes and exceptions
85
- __all__ = [
86
- 'Problem',
87
- 'EngineeringProblem',
88
- 'VariableNotFoundError',
89
- 'EquationValidationError',
90
- 'SolverError'
91
- ]