luminarycloud 0.22.1__py3-none-any.whl → 0.22.3__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 (78) hide show
  1. luminarycloud/_client/client.py +5 -3
  2. luminarycloud/_client/retry_interceptor.py +13 -2
  3. luminarycloud/_helpers/__init__.py +9 -0
  4. luminarycloud/_helpers/_inference_jobs.py +227 -0
  5. luminarycloud/_helpers/_parse_iso_datetime.py +54 -0
  6. luminarycloud/_helpers/proto_decorator.py +38 -7
  7. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.py +45 -25
  8. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.pyi +30 -0
  9. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.py +34 -0
  10. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.pyi +12 -0
  11. luminarycloud/_proto/api/v0/luminarycloud/named_variable_set/named_variable_set_pb2.py +25 -3
  12. luminarycloud/_proto/api/v0/luminarycloud/named_variable_set/named_variable_set_pb2.pyi +30 -0
  13. luminarycloud/_proto/api/v0/luminarycloud/named_variable_set/named_variable_set_pb2_grpc.py +34 -0
  14. luminarycloud/_proto/api/v0/luminarycloud/named_variable_set/named_variable_set_pb2_grpc.pyi +12 -0
  15. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.py +140 -45
  16. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.pyi +322 -8
  17. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2_grpc.py +68 -0
  18. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2_grpc.pyi +24 -0
  19. luminarycloud/_proto/api/v0/luminarycloud/physicsaiinference/physicsaiinference_pb2.py +93 -33
  20. luminarycloud/_proto/api/v0/luminarycloud/physicsaiinference/physicsaiinference_pb2.pyi +105 -0
  21. luminarycloud/_proto/api/v0/luminarycloud/physicsaiinference/physicsaiinference_pb2_grpc.py +70 -0
  22. luminarycloud/_proto/api/v0/luminarycloud/physicsaiinference/physicsaiinference_pb2_grpc.pyi +29 -0
  23. luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2.py +29 -7
  24. luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2.pyi +39 -0
  25. luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2_grpc.py +36 -0
  26. luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2_grpc.pyi +18 -0
  27. luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2.py +70 -70
  28. luminarycloud/_proto/api/v0/luminarycloud/thirdpartyintegration/onshape/onshape_pb2.pyi +5 -5
  29. luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.py +163 -153
  30. luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.pyi +37 -3
  31. luminarycloud/_proto/client/simulation_pb2.py +356 -337
  32. luminarycloud/_proto/client/simulation_pb2.pyi +89 -3
  33. luminarycloud/_proto/lcstatus/details/geometry/geometry_pb2.py +256 -0
  34. luminarycloud/_proto/lcstatus/details/geometry/geometry_pb2.pyi +472 -0
  35. luminarycloud/_proto/physicsaiinferenceservice/physicsaiinferenceservice_pb2.py +9 -4
  36. luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2.py +6 -3
  37. luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2_grpc.py +68 -0
  38. luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2_grpc.pyi +24 -0
  39. luminarycloud/_proto/quantity/quantity_pb2.pyi +1 -1
  40. luminarycloud/_wrapper.py +53 -7
  41. luminarycloud/feature_modification.py +25 -32
  42. luminarycloud/geometry.py +6 -6
  43. luminarycloud/outputs/__init__.py +2 -0
  44. luminarycloud/outputs/output_definitions.py +3 -3
  45. luminarycloud/outputs/stopping_conditions.py +94 -0
  46. luminarycloud/params/enum/_enum_wrappers.py +16 -0
  47. luminarycloud/params/geometry/shapes.py +33 -33
  48. luminarycloud/params/simulation/adaptive_mesh_refinement/__init__.py +1 -0
  49. luminarycloud/params/simulation/adaptive_mesh_refinement/active_region_.py +83 -0
  50. luminarycloud/params/simulation/adaptive_mesh_refinement/boundary_layer_profile_.py +1 -1
  51. luminarycloud/params/simulation/adaptive_mesh_refinement_.py +8 -1
  52. luminarycloud/physics_ai/__init__.py +15 -0
  53. luminarycloud/physics_ai/architectures.py +1 -1
  54. luminarycloud/physics_ai/datasets.py +246 -0
  55. luminarycloud/physics_ai/inference.py +166 -199
  56. luminarycloud/physics_ai/models.py +22 -0
  57. luminarycloud/pipelines/__init__.py +11 -0
  58. luminarycloud/pipelines/api.py +106 -9
  59. luminarycloud/pipelines/core.py +358 -45
  60. luminarycloud/pipelines/flowables.py +138 -0
  61. luminarycloud/pipelines/stages.py +7 -31
  62. luminarycloud/project.py +56 -2
  63. luminarycloud/simulation.py +25 -0
  64. luminarycloud/types/__init__.py +2 -0
  65. luminarycloud/types/ids.py +2 -0
  66. luminarycloud/vis/__init__.py +1 -0
  67. luminarycloud/vis/filters.py +97 -0
  68. luminarycloud/vis/visualization.py +3 -0
  69. luminarycloud/volume_selection.py +6 -6
  70. luminarycloud/workflow_utils.py +149 -0
  71. {luminarycloud-0.22.1.dist-info → luminarycloud-0.22.3.dist-info}/METADATA +1 -1
  72. {luminarycloud-0.22.1.dist-info → luminarycloud-0.22.3.dist-info}/RECORD +73 -70
  73. luminarycloud/_proto/api/v0/luminarycloud/inference/inference_pb2.py +0 -61
  74. luminarycloud/_proto/api/v0/luminarycloud/inference/inference_pb2.pyi +0 -85
  75. luminarycloud/_proto/api/v0/luminarycloud/inference/inference_pb2_grpc.py +0 -67
  76. luminarycloud/_proto/api/v0/luminarycloud/inference/inference_pb2_grpc.pyi +0 -26
  77. luminarycloud/_proto/inferenceservice/inferenceservice_pb2.py +0 -69
  78. {luminarycloud-0.22.1.dist-info → luminarycloud-0.22.3.dist-info}/WHEEL +0 -0
@@ -0,0 +1,472 @@
1
+ """
2
+ @generated by mypy-protobuf. Do not edit manually!
3
+ isort:skip_file
4
+ """
5
+ import builtins
6
+ import collections.abc
7
+ import google.protobuf.descriptor
8
+ import google.protobuf.internal.containers
9
+ import google.protobuf.message
10
+ import luminarycloud._proto.base.base_pb2
11
+ import sys
12
+
13
+ if sys.version_info >= (3, 8):
14
+ import typing as typing_extensions
15
+ else:
16
+ import typing_extensions
17
+
18
+ DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
19
+
20
+ class Vertex(google.protobuf.message.Message):
21
+ """Geometric information about a vertex."""
22
+
23
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
24
+
25
+ ADJACENT_SURFACES_FIELD_NUMBER: builtins.int
26
+ COORDS_FIELD_NUMBER: builtins.int
27
+ ID_FIELD_NUMBER: builtins.int
28
+ @property
29
+ def adjacent_surfaces(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
30
+ """A list of surfaces next to the vertex."""
31
+ @property
32
+ def coords(self) -> luminarycloud._proto.base.base_pb2.Vector3:
33
+ """The location of the vertex."""
34
+ id: builtins.str
35
+ """The actual vertex ID."""
36
+ def __init__(
37
+ self,
38
+ *,
39
+ adjacent_surfaces: collections.abc.Iterable[builtins.str] | None = ...,
40
+ coords: luminarycloud._proto.base.base_pb2.Vector3 | None = ...,
41
+ id: builtins.str = ...,
42
+ ) -> None: ...
43
+ def HasField(self, field_name: typing_extensions.Literal["coords", b"coords"]) -> builtins.bool: ...
44
+ def ClearField(self, field_name: typing_extensions.Literal["adjacent_surfaces", b"adjacent_surfaces", "coords", b"coords", "id", b"id"]) -> None: ...
45
+
46
+ global___Vertex = Vertex
47
+
48
+ class Edge(google.protobuf.message.Message):
49
+ """Geometric information about an edge."""
50
+
51
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
52
+
53
+ ADJACENT_SURFACES_FIELD_NUMBER: builtins.int
54
+ ID_FIELD_NUMBER: builtins.int
55
+ @property
56
+ def adjacent_surfaces(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
57
+ """A list of surfaces next to the edge."""
58
+ id: builtins.str
59
+ """The actual edge ID."""
60
+ def __init__(
61
+ self,
62
+ *,
63
+ adjacent_surfaces: collections.abc.Iterable[builtins.str] | None = ...,
64
+ id: builtins.str = ...,
65
+ ) -> None: ...
66
+ def ClearField(self, field_name: typing_extensions.Literal["adjacent_surfaces", b"adjacent_surfaces", "id", b"id"]) -> None: ...
67
+
68
+ global___Edge = Edge
69
+
70
+ class GeoVertexDuplicateDetails(google.protobuf.message.Message):
71
+ """Details for code GEO_VERTEX_DUPLICATE"""
72
+
73
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
74
+
75
+ VERTEX_1_FIELD_NUMBER: builtins.int
76
+ VERTEX_2_FIELD_NUMBER: builtins.int
77
+ @property
78
+ def vertex_1(self) -> global___Vertex:
79
+ """First vertex."""
80
+ @property
81
+ def vertex_2(self) -> global___Vertex:
82
+ """Second vertex."""
83
+ def __init__(
84
+ self,
85
+ *,
86
+ vertex_1: global___Vertex | None = ...,
87
+ vertex_2: global___Vertex | None = ...,
88
+ ) -> None: ...
89
+ def HasField(self, field_name: typing_extensions.Literal["vertex_1", b"vertex_1", "vertex_2", b"vertex_2"]) -> builtins.bool: ...
90
+ def ClearField(self, field_name: typing_extensions.Literal["vertex_1", b"vertex_1", "vertex_2", b"vertex_2"]) -> None: ...
91
+
92
+ global___GeoVertexDuplicateDetails = GeoVertexDuplicateDetails
93
+
94
+ class GeoEdgeUnmeshableDetails(google.protobuf.message.Message):
95
+ """Details for code GEO_EDGE_UNMESHABLE"""
96
+
97
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
98
+
99
+ EDGE_FIELD_NUMBER: builtins.int
100
+ @property
101
+ def edge(self) -> global___Edge:
102
+ """The edge."""
103
+ def __init__(
104
+ self,
105
+ *,
106
+ edge: global___Edge | None = ...,
107
+ ) -> None: ...
108
+ def HasField(self, field_name: typing_extensions.Literal["edge", b"edge"]) -> builtins.bool: ...
109
+ def ClearField(self, field_name: typing_extensions.Literal["edge", b"edge"]) -> None: ...
110
+
111
+ global___GeoEdgeUnmeshableDetails = GeoEdgeUnmeshableDetails
112
+
113
+ class GeoEdgeNotSmoothDetails(google.protobuf.message.Message):
114
+ """Details for code GEO_EDGE_NOT_SMOOTH"""
115
+
116
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
117
+
118
+ EDGE_FIELD_NUMBER: builtins.int
119
+ @property
120
+ def edge(self) -> global___Edge:
121
+ """The edge."""
122
+ def __init__(
123
+ self,
124
+ *,
125
+ edge: global___Edge | None = ...,
126
+ ) -> None: ...
127
+ def HasField(self, field_name: typing_extensions.Literal["edge", b"edge"]) -> builtins.bool: ...
128
+ def ClearField(self, field_name: typing_extensions.Literal["edge", b"edge"]) -> None: ...
129
+
130
+ global___GeoEdgeNotSmoothDetails = GeoEdgeNotSmoothDetails
131
+
132
+ class GeoEdgeLargeToleranceDetails(google.protobuf.message.Message):
133
+ """Details for code GEO_EDGE_LARGE_TOLERANCE"""
134
+
135
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
136
+
137
+ EDGE_FIELD_NUMBER: builtins.int
138
+ TOLERANCE_FIELD_NUMBER: builtins.int
139
+ @property
140
+ def edge(self) -> global___Edge:
141
+ """The edge."""
142
+ tolerance: builtins.float
143
+ """Tolerance."""
144
+ def __init__(
145
+ self,
146
+ *,
147
+ edge: global___Edge | None = ...,
148
+ tolerance: builtins.float = ...,
149
+ ) -> None: ...
150
+ def HasField(self, field_name: typing_extensions.Literal["edge", b"edge"]) -> builtins.bool: ...
151
+ def ClearField(self, field_name: typing_extensions.Literal["edge", b"edge", "tolerance", b"tolerance"]) -> None: ...
152
+
153
+ global___GeoEdgeLargeToleranceDetails = GeoEdgeLargeToleranceDetails
154
+
155
+ class GeoFaceUnmeshableDetails(google.protobuf.message.Message):
156
+ """Details for code GEO_FACE_UNMESHABLE"""
157
+
158
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
159
+
160
+ SURFACE_ID_FIELD_NUMBER: builtins.int
161
+ surface_id: builtins.str
162
+ """Surface string ID."""
163
+ def __init__(
164
+ self,
165
+ *,
166
+ surface_id: builtins.str = ...,
167
+ ) -> None: ...
168
+ def ClearField(self, field_name: typing_extensions.Literal["surface_id", b"surface_id"]) -> None: ...
169
+
170
+ global___GeoFaceUnmeshableDetails = GeoFaceUnmeshableDetails
171
+
172
+ class GeoFaceEdgesTooCloseDetails(google.protobuf.message.Message):
173
+ """Details for code GEO_FACE_EDGES_TOO_CLOSE"""
174
+
175
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
176
+
177
+ SURFACE_ID_FIELD_NUMBER: builtins.int
178
+ ASPECT_RATIO_FIELD_NUMBER: builtins.int
179
+ surface_id: builtins.str
180
+ """Surface string ID."""
181
+ aspect_ratio: builtins.float
182
+ """Approximate aspect ratio: should be > 0.
183
+ Backward compatibility: values of 0 should be ignored.
184
+ """
185
+ def __init__(
186
+ self,
187
+ *,
188
+ surface_id: builtins.str = ...,
189
+ aspect_ratio: builtins.float = ...,
190
+ ) -> None: ...
191
+ def ClearField(self, field_name: typing_extensions.Literal["aspect_ratio", b"aspect_ratio", "surface_id", b"surface_id"]) -> None: ...
192
+
193
+ global___GeoFaceEdgesTooCloseDetails = GeoFaceEdgesTooCloseDetails
194
+
195
+ class GeoFaceEdgeTooSmallDetails(google.protobuf.message.Message):
196
+ """Details for code GEO_FACE_EDGE_TOO_SMALL"""
197
+
198
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
199
+
200
+ SURFACE_ID_FIELD_NUMBER: builtins.int
201
+ surface_id: builtins.str
202
+ """Surface string ID."""
203
+ def __init__(
204
+ self,
205
+ *,
206
+ surface_id: builtins.str = ...,
207
+ ) -> None: ...
208
+ def ClearField(self, field_name: typing_extensions.Literal["surface_id", b"surface_id"]) -> None: ...
209
+
210
+ global___GeoFaceEdgeTooSmallDetails = GeoFaceEdgeTooSmallDetails
211
+
212
+ class GeoFaceFaceIntersectionDetails(google.protobuf.message.Message):
213
+ """Details for code GEO_FACE_FACE_INTERSECTION"""
214
+
215
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
216
+
217
+ SURFACE_1_ID_FIELD_NUMBER: builtins.int
218
+ SURFACE_2_ID_FIELD_NUMBER: builtins.int
219
+ surface_1_id: builtins.str
220
+ """First surface string ID."""
221
+ surface_2_id: builtins.str
222
+ """Second surface string ID."""
223
+ def __init__(
224
+ self,
225
+ *,
226
+ surface_1_id: builtins.str = ...,
227
+ surface_2_id: builtins.str = ...,
228
+ ) -> None: ...
229
+ def ClearField(self, field_name: typing_extensions.Literal["surface_1_id", b"surface_1_id", "surface_2_id", b"surface_2_id"]) -> None: ...
230
+
231
+ global___GeoFaceFaceIntersectionDetails = GeoFaceFaceIntersectionDetails
232
+
233
+ class GeoFaceSelfIntersectionDetails(google.protobuf.message.Message):
234
+ """Details for code GEO_FACE_SELF_INTERSECTION"""
235
+
236
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
237
+
238
+ SURFACE_ID_FIELD_NUMBER: builtins.int
239
+ surface_id: builtins.str
240
+ """Surface string ID."""
241
+ def __init__(
242
+ self,
243
+ *,
244
+ surface_id: builtins.str = ...,
245
+ ) -> None: ...
246
+ def ClearField(self, field_name: typing_extensions.Literal["surface_id", b"surface_id"]) -> None: ...
247
+
248
+ global___GeoFaceSelfIntersectionDetails = GeoFaceSelfIntersectionDetails
249
+
250
+ class GeoFaceNotSmoothDetails(google.protobuf.message.Message):
251
+ """Details for code GEO_FACE_NOT_SMOOTH"""
252
+
253
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
254
+
255
+ SURFACE_ID_FIELD_NUMBER: builtins.int
256
+ surface_id: builtins.str
257
+ """Surface string ID."""
258
+ def __init__(
259
+ self,
260
+ *,
261
+ surface_id: builtins.str = ...,
262
+ ) -> None: ...
263
+ def ClearField(self, field_name: typing_extensions.Literal["surface_id", b"surface_id"]) -> None: ...
264
+
265
+ global___GeoFaceNotSmoothDetails = GeoFaceNotSmoothDetails
266
+
267
+ class GeoFaceLargeToleranceDetails(google.protobuf.message.Message):
268
+ """Details for code GEO_FACE_LARGE_TOLERANCE"""
269
+
270
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
271
+
272
+ SURFACE_ID_FIELD_NUMBER: builtins.int
273
+ TOLERANCE_FIELD_NUMBER: builtins.int
274
+ surface_id: builtins.str
275
+ """Surface string ID."""
276
+ tolerance: builtins.float
277
+ """Tolerance."""
278
+ def __init__(
279
+ self,
280
+ *,
281
+ surface_id: builtins.str = ...,
282
+ tolerance: builtins.float = ...,
283
+ ) -> None: ...
284
+ def ClearField(self, field_name: typing_extensions.Literal["surface_id", b"surface_id", "tolerance", b"tolerance"]) -> None: ...
285
+
286
+ global___GeoFaceLargeToleranceDetails = GeoFaceLargeToleranceDetails
287
+
288
+ class GeoFaceEdgeCrossDetails(google.protobuf.message.Message):
289
+ """Details for code GEO_FACE_EDGE_CROSS"""
290
+
291
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
292
+
293
+ SURFACE_ID_FIELD_NUMBER: builtins.int
294
+ EDGE_1_FIELD_NUMBER: builtins.int
295
+ EDGE_2_FIELD_NUMBER: builtins.int
296
+ surface_id: builtins.str
297
+ """Surface string ID."""
298
+ @property
299
+ def edge_1(self) -> global___Edge:
300
+ """First crossing edge."""
301
+ @property
302
+ def edge_2(self) -> global___Edge:
303
+ """Second crossing edge."""
304
+ def __init__(
305
+ self,
306
+ *,
307
+ surface_id: builtins.str = ...,
308
+ edge_1: global___Edge | None = ...,
309
+ edge_2: global___Edge | None = ...,
310
+ ) -> None: ...
311
+ def HasField(self, field_name: typing_extensions.Literal["edge_1", b"edge_1", "edge_2", b"edge_2"]) -> builtins.bool: ...
312
+ def ClearField(self, field_name: typing_extensions.Literal["edge_1", b"edge_1", "edge_2", b"edge_2", "surface_id", b"surface_id"]) -> None: ...
313
+
314
+ global___GeoFaceEdgeCrossDetails = GeoFaceEdgeCrossDetails
315
+
316
+ class GeoFaceNeedsImprintDetails(google.protobuf.message.Message):
317
+ """Details for code GEO_FACE_NEEDS_IMPRINT"""
318
+
319
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
320
+
321
+ SURFACE_ID_FIELD_NUMBER: builtins.int
322
+ surface_id: builtins.str
323
+ """Surface string ID."""
324
+ def __init__(
325
+ self,
326
+ *,
327
+ surface_id: builtins.str = ...,
328
+ ) -> None: ...
329
+ def ClearField(self, field_name: typing_extensions.Literal["surface_id", b"surface_id"]) -> None: ...
330
+
331
+ global___GeoFaceNeedsImprintDetails = GeoFaceNeedsImprintDetails
332
+
333
+ class GeoContactNeedsImprintDetails(google.protobuf.message.Message):
334
+ """Details for code GEO_CONTACT_NEEDS_IMPRINT"""
335
+
336
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
337
+
338
+ GEOMETRY_CONTACT_ID_FIELD_NUMBER: builtins.int
339
+ geometry_contact_id: builtins.str
340
+ """Geometry contact ID provided by the operator."""
341
+ def __init__(
342
+ self,
343
+ *,
344
+ geometry_contact_id: builtins.str = ...,
345
+ ) -> None: ...
346
+ def ClearField(self, field_name: typing_extensions.Literal["geometry_contact_id", b"geometry_contact_id"]) -> None: ...
347
+
348
+ global___GeoContactNeedsImprintDetails = GeoContactNeedsImprintDetails
349
+
350
+ class GeoFacePoorApproxDetails(google.protobuf.message.Message):
351
+ """Details for code GEO_FACE_POOR_APPROX"""
352
+
353
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
354
+
355
+ SURFACE_ID_FIELD_NUMBER: builtins.int
356
+ APPROX_FIELD_NUMBER: builtins.int
357
+ surface_id: builtins.str
358
+ """Surface string ID."""
359
+ approx: builtins.float
360
+ """Approximation: from -1 (bad) to 1 (good), with 2 (unknown)."""
361
+ def __init__(
362
+ self,
363
+ *,
364
+ surface_id: builtins.str = ...,
365
+ approx: builtins.float = ...,
366
+ ) -> None: ...
367
+ def ClearField(self, field_name: typing_extensions.Literal["approx", b"approx", "surface_id", b"surface_id"]) -> None: ...
368
+
369
+ global___GeoFacePoorApproxDetails = GeoFacePoorApproxDetails
370
+
371
+ class GeoVolumeOpenDetails(google.protobuf.message.Message):
372
+ """Details for code GEO_VOLUME_OPEN"""
373
+
374
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
375
+
376
+ VOLUMES_ID_FIELD_NUMBER: builtins.int
377
+ OPEN_EDGES_FIELD_NUMBER: builtins.int
378
+ volumes_id: builtins.int
379
+ """Volume integer ID."""
380
+ @property
381
+ def open_edges(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Edge]:
382
+ """The list of open edges, i.e., they only have one adjacent face."""
383
+ def __init__(
384
+ self,
385
+ *,
386
+ volumes_id: builtins.int = ...,
387
+ open_edges: collections.abc.Iterable[global___Edge] | None = ...,
388
+ ) -> None: ...
389
+ def ClearField(self, field_name: typing_extensions.Literal["open_edges", b"open_edges", "volumes_id", b"volumes_id"]) -> None: ...
390
+
391
+ global___GeoVolumeOpenDetails = GeoVolumeOpenDetails
392
+
393
+ class GeoVolumeNonManifoldDetails(google.protobuf.message.Message):
394
+ """Details for code GEO_VOLUME_NON_MANIFOLD"""
395
+
396
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
397
+
398
+ VOLUME_ID_FIELD_NUMBER: builtins.int
399
+ NON_MANIFOLD_EDGES_FIELD_NUMBER: builtins.int
400
+ volume_id: builtins.int
401
+ """Volume integer ID."""
402
+ @property
403
+ def non_manifold_edges(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Edge]:
404
+ """The list of non-manifold edges, i.e., they have more than two adjacent faces."""
405
+ def __init__(
406
+ self,
407
+ *,
408
+ volume_id: builtins.int = ...,
409
+ non_manifold_edges: collections.abc.Iterable[global___Edge] | None = ...,
410
+ ) -> None: ...
411
+ def ClearField(self, field_name: typing_extensions.Literal["non_manifold_edges", b"non_manifold_edges", "volume_id", b"volume_id"]) -> None: ...
412
+
413
+ global___GeoVolumeNonManifoldDetails = GeoVolumeNonManifoldDetails
414
+
415
+ class GeoVolumeUnmeshableDetails(google.protobuf.message.Message):
416
+ """Details for code GEO_VOLUME_UNMESHABLE"""
417
+
418
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
419
+
420
+ VOLUME_ID_FIELD_NUMBER: builtins.int
421
+ volume_id: builtins.int
422
+ """Volume integer ID."""
423
+ def __init__(
424
+ self,
425
+ *,
426
+ volume_id: builtins.int = ...,
427
+ ) -> None: ...
428
+ def ClearField(self, field_name: typing_extensions.Literal["volume_id", b"volume_id"]) -> None: ...
429
+
430
+ global___GeoVolumeUnmeshableDetails = GeoVolumeUnmeshableDetails
431
+
432
+ class GeoFeatureUnknownErrorDetails(google.protobuf.message.Message):
433
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
434
+
435
+ MESSAGE_FIELD_NUMBER: builtins.int
436
+ message: builtins.str
437
+ def __init__(
438
+ self,
439
+ *,
440
+ message: builtins.str = ...,
441
+ ) -> None: ...
442
+ def ClearField(self, field_name: typing_extensions.Literal["message", b"message"]) -> None: ...
443
+
444
+ global___GeoFeatureUnknownErrorDetails = GeoFeatureUnknownErrorDetails
445
+
446
+ class GeoFeatureOnshapeWarningDetails(google.protobuf.message.Message):
447
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
448
+
449
+ MESSAGE_FIELD_NUMBER: builtins.int
450
+ message: builtins.str
451
+ def __init__(
452
+ self,
453
+ *,
454
+ message: builtins.str = ...,
455
+ ) -> None: ...
456
+ def ClearField(self, field_name: typing_extensions.Literal["message", b"message"]) -> None: ...
457
+
458
+ global___GeoFeatureOnshapeWarningDetails = GeoFeatureOnshapeWarningDetails
459
+
460
+ class GeoWorkerInvalidRequestDetails(google.protobuf.message.Message):
461
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
462
+
463
+ MESSAGE_FIELD_NUMBER: builtins.int
464
+ message: builtins.str
465
+ def __init__(
466
+ self,
467
+ *,
468
+ message: builtins.str = ...,
469
+ ) -> None: ...
470
+ def ClearField(self, field_name: typing_extensions.Literal["message", b"message"]) -> None: ...
471
+
472
+ global___GeoWorkerInvalidRequestDetails = GeoWorkerInvalidRequestDetails
@@ -12,11 +12,12 @@ from google.protobuf import symbol_database as _symbol_database
12
12
  _sym_db = _symbol_database.Default()
13
13
 
14
14
 
15
- from luminarycloud._proto.base import base_pb2 as proto_dot_base_dot_base__pb2
15
+ from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
16
16
  from luminarycloud._proto.api.v0.luminarycloud.physicsaiinference import physicsaiinference_pb2 as proto_dot_api_dot_v0_dot_luminarycloud_dot_physicsaiinference_dot_physicsaiinference__pb2
17
+ from luminarycloud._proto.ratelimit import ratelimit_pb2 as proto_dot_ratelimit_dot_ratelimit__pb2
17
18
 
18
19
 
19
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n?proto/physicsaiinferenceservice/physicsaiinferenceservice.proto\x12(luminary.proto.physicsaiinferenceservice\x1a\x15proto/base/base.proto\x1a\x46proto/api/v0/luminarycloud/physicsaiinference/physicsaiinference.proto2\xda\x06\n\x19PhysicsAiInferenceService\x12\xcd\x01\n\x19\x43reateInferenceServiceJob\x12X.luminary.proto.api.v0.luminarycloud.physicsaiinference.CreateInferenceServiceJobRequest\x1aV.luminary.proto.api.v0.luminarycloud.physicsaiinference.GetInferenceServiceJobResponse\x12\xd2\x01\n\x1e\x43reateInferenceServiceJobAsync\x12X.luminary.proto.api.v0.luminarycloud.physicsaiinference.CreateInferenceServiceJobRequest\x1aV.luminary.proto.api.v0.luminarycloud.physicsaiinference.GetInferenceServiceJobResponse\x12\xc7\x01\n\x16GetInferenceServiceJob\x12U.luminary.proto.api.v0.luminarycloud.physicsaiinference.GetInferenceServiceJobRequest\x1aV.luminary.proto.api.v0.luminarycloud.physicsaiinference.GetInferenceServiceJobResponse\x12\xcd\x01\n\x18ListInferenceServiceJobs\x12W.luminary.proto.api.v0.luminarycloud.physicsaiinference.ListInferenceServiceJobsRequest\x1aX.luminary.proto.api.v0.luminarycloud.physicsaiinference.ListInferenceServiceJobsResponseB8Z6luminarycloud.com/core/proto/physicsaiinferenceserviceb\x06proto3')
20
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n?proto/physicsaiinferenceservice/physicsaiinferenceservice.proto\x12(luminary.proto.physicsaiinferenceservice\x1a\x1bgoogle/protobuf/empty.proto\x1a\x46proto/api/v0/luminarycloud/physicsaiinference/physicsaiinference.proto\x1a\x1fproto/ratelimit/ratelimit.proto2\xb1\t\n\x19PhysicsAiInferenceService\x12\xd9\x01\n\x19\x43reateInferenceServiceJob\x12X.luminary.proto.api.v0.luminarycloud.physicsaiinference.CreateInferenceServiceJobRequest\x1aV.luminary.proto.api.v0.luminarycloud.physicsaiinference.GetInferenceServiceJobResponse\"\n\x8a\xb5\x18\x06\x08\n\x12\x02\x08\x01\x12\xde\x01\n\x1e\x43reateInferenceServiceJobAsync\x12X.luminary.proto.api.v0.luminarycloud.physicsaiinference.CreateInferenceServiceJobRequest\x1aV.luminary.proto.api.v0.luminarycloud.physicsaiinference.GetInferenceServiceJobResponse\"\n\x8a\xb5\x18\x06\x08\n\x12\x02\x08\x01\x12\xbb\x01\n\x12GetInferenceFields\x12Q.luminary.proto.api.v0.luminarycloud.physicsaiinference.GetInferenceFieldsRequest\x1aR.luminary.proto.api.v0.luminarycloud.physicsaiinference.GetInferenceFieldsResponse\x12\xc7\x01\n\x16GetInferenceServiceJob\x12U.luminary.proto.api.v0.luminarycloud.physicsaiinference.GetInferenceServiceJobRequest\x1aV.luminary.proto.api.v0.luminarycloud.physicsaiinference.GetInferenceServiceJobResponse\x12\xcd\x01\n\x18ListInferenceServiceJobs\x12W.luminary.proto.api.v0.luminarycloud.physicsaiinference.ListInferenceServiceJobsRequest\x1aX.luminary.proto.api.v0.luminarycloud.physicsaiinference.ListInferenceServiceJobsResponse\x12\x7f\n\x12\x44\x65leteInferenceJob\x12Q.luminary.proto.api.v0.luminarycloud.physicsaiinference.DeleteInferenceJobRequest\x1a\x16.google.protobuf.EmptyB8Z6luminarycloud.com/core/proto/physicsaiinferenceserviceb\x06proto3')
20
21
 
21
22
 
22
23
 
@@ -25,6 +26,10 @@ if _descriptor._USE_C_DESCRIPTORS == False:
25
26
 
26
27
  DESCRIPTOR._options = None
27
28
  DESCRIPTOR._serialized_options = b'Z6luminarycloud.com/core/proto/physicsaiinferenceservice'
28
- _PHYSICSAIINFERENCESERVICE._serialized_start=205
29
- _PHYSICSAIINFERENCESERVICE._serialized_end=1063
29
+ _PHYSICSAIINFERENCESERVICE.methods_by_name['CreateInferenceServiceJob']._options = None
30
+ _PHYSICSAIINFERENCESERVICE.methods_by_name['CreateInferenceServiceJob']._serialized_options = b'\212\265\030\006\010\n\022\002\010\001'
31
+ _PHYSICSAIINFERENCESERVICE.methods_by_name['CreateInferenceServiceJobAsync']._options = None
32
+ _PHYSICSAIINFERENCESERVICE.methods_by_name['CreateInferenceServiceJobAsync']._serialized_options = b'\212\265\030\006\010\n\022\002\010\001'
33
+ _PHYSICSAIINFERENCESERVICE._serialized_start=244
34
+ _PHYSICSAIINFERENCESERVICE._serialized_end=1445
30
35
  # @@protoc_insertion_point(module_scope)
@@ -13,9 +13,10 @@ _sym_db = _symbol_database.Default()
13
13
 
14
14
 
15
15
  from luminarycloud._proto.api.v0.luminarycloud.physics_ai import physics_ai_pb2 as proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2
16
+ from luminarycloud._proto.ratelimit import ratelimit_pb2 as proto_dot_ratelimit_dot_ratelimit__pb2
16
17
 
17
18
 
18
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n=proto/physicsaitrainingservice/physicsaitrainingservice.proto\x12\'luminary.proto.physicsaitrainingservice\x1a\x36proto/api/v0/luminarycloud/physics_ai/physics_ai.proto2\xf4\x02\n\x18PhysicsAiTrainingService\x12\xaa\x01\n\x11SubmitTrainingJob\x12H.luminary.proto.api.v0.luminarycloud.physics_ai.SubmitTrainingJobRequest\x1aI.luminary.proto.api.v0.luminarycloud.physics_ai.SubmitTrainingJobResponse\"\x00\x12\xaa\x01\n\x11\x43\x61ncelTrainingJob\x12H.luminary.proto.api.v0.luminarycloud.physics_ai.CancelTrainingJobRequest\x1aI.luminary.proto.api.v0.luminarycloud.physics_ai.CancelTrainingJobResponse\"\x00\x42\x37Z5luminarycloud.com/core/proto/physicsaitrainingserviceb\x06proto3')
19
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n=proto/physicsaitrainingservice/physicsaitrainingservice.proto\x12\'luminary.proto.physicsaitrainingservice\x1a\x36proto/api/v0/luminarycloud/physics_ai/physics_ai.proto\x1a\x1fproto/ratelimit/ratelimit.proto2\xbd\x05\n\x18PhysicsAiTrainingService\x12\x9e\x01\n\rCreateDataset\x12\x44.luminary.proto.api.v0.luminarycloud.physics_ai.CreateDatasetRequest\x1a\x45.luminary.proto.api.v0.luminarycloud.physics_ai.CreateDatasetResponse\"\x00\x12\x9b\x01\n\x0cListDatasets\x12\x43.luminary.proto.api.v0.luminarycloud.physics_ai.ListDatasetsRequest\x1a\x44.luminary.proto.api.v0.luminarycloud.physics_ai.ListDatasetsResponse\"\x00\x12\xb4\x01\n\x11SubmitTrainingJob\x12H.luminary.proto.api.v0.luminarycloud.physics_ai.SubmitTrainingJobRequest\x1aI.luminary.proto.api.v0.luminarycloud.physics_ai.SubmitTrainingJobResponse\"\n\x8a\xb5\x18\x06\x08\x05\x12\x02\x08\x01\x12\xaa\x01\n\x11\x43\x61ncelTrainingJob\x12H.luminary.proto.api.v0.luminarycloud.physics_ai.CancelTrainingJobRequest\x1aI.luminary.proto.api.v0.luminarycloud.physics_ai.CancelTrainingJobResponse\"\x00\x42\x37Z5luminarycloud.com/core/proto/physicsaitrainingserviceb\x06proto3')
19
20
 
20
21
 
21
22
 
@@ -24,6 +25,8 @@ if _descriptor._USE_C_DESCRIPTORS == False:
24
25
 
25
26
  DESCRIPTOR._options = None
26
27
  DESCRIPTOR._serialized_options = b'Z5luminarycloud.com/core/proto/physicsaitrainingservice'
27
- _PHYSICSAITRAININGSERVICE._serialized_start=163
28
- _PHYSICSAITRAININGSERVICE._serialized_end=535
28
+ _PHYSICSAITRAININGSERVICE.methods_by_name['SubmitTrainingJob']._options = None
29
+ _PHYSICSAITRAININGSERVICE.methods_by_name['SubmitTrainingJob']._serialized_options = b'\212\265\030\006\010\005\022\002\010\001'
30
+ _PHYSICSAITRAININGSERVICE._serialized_start=196
31
+ _PHYSICSAITRAININGSERVICE._serialized_end=897
29
32
  # @@protoc_insertion_point(module_scope)
@@ -15,6 +15,16 @@ class PhysicsAiTrainingServiceStub(object):
15
15
  Args:
16
16
  channel: A grpc.Channel.
17
17
  """
18
+ self.CreateDataset = channel.unary_unary(
19
+ '/luminary.proto.physicsaitrainingservice.PhysicsAiTrainingService/CreateDataset',
20
+ request_serializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.CreateDatasetRequest.SerializeToString,
21
+ response_deserializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.CreateDatasetResponse.FromString,
22
+ )
23
+ self.ListDatasets = channel.unary_unary(
24
+ '/luminary.proto.physicsaitrainingservice.PhysicsAiTrainingService/ListDatasets',
25
+ request_serializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.ListDatasetsRequest.SerializeToString,
26
+ response_deserializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.ListDatasetsResponse.FromString,
27
+ )
18
28
  self.SubmitTrainingJob = channel.unary_unary(
19
29
  '/luminary.proto.physicsaitrainingservice.PhysicsAiTrainingService/SubmitTrainingJob',
20
30
  request_serializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.SubmitTrainingJobRequest.SerializeToString,
@@ -31,6 +41,20 @@ class PhysicsAiTrainingServiceServicer(object):
31
41
  """PhysicsAiTrainingService provides training functionality for Physics AI
32
42
  """
33
43
 
44
+ def CreateDataset(self, request, context):
45
+ """Create a Physics AI dataset
46
+ """
47
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
48
+ context.set_details('Method not implemented!')
49
+ raise NotImplementedError('Method not implemented!')
50
+
51
+ def ListDatasets(self, request, context):
52
+ """List Physics AI datasets for the current user
53
+ """
54
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
55
+ context.set_details('Method not implemented!')
56
+ raise NotImplementedError('Method not implemented!')
57
+
34
58
  def SubmitTrainingJob(self, request, context):
35
59
  """Submit a physics AI training job
36
60
  """
@@ -48,6 +72,16 @@ class PhysicsAiTrainingServiceServicer(object):
48
72
 
49
73
  def add_PhysicsAiTrainingServiceServicer_to_server(servicer, server):
50
74
  rpc_method_handlers = {
75
+ 'CreateDataset': grpc.unary_unary_rpc_method_handler(
76
+ servicer.CreateDataset,
77
+ request_deserializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.CreateDatasetRequest.FromString,
78
+ response_serializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.CreateDatasetResponse.SerializeToString,
79
+ ),
80
+ 'ListDatasets': grpc.unary_unary_rpc_method_handler(
81
+ servicer.ListDatasets,
82
+ request_deserializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.ListDatasetsRequest.FromString,
83
+ response_serializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.ListDatasetsResponse.SerializeToString,
84
+ ),
51
85
  'SubmitTrainingJob': grpc.unary_unary_rpc_method_handler(
52
86
  servicer.SubmitTrainingJob,
53
87
  request_deserializer=proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.SubmitTrainingJobRequest.FromString,
@@ -69,6 +103,40 @@ class PhysicsAiTrainingService(object):
69
103
  """PhysicsAiTrainingService provides training functionality for Physics AI
70
104
  """
71
105
 
106
+ @staticmethod
107
+ def CreateDataset(request,
108
+ target,
109
+ options=(),
110
+ channel_credentials=None,
111
+ call_credentials=None,
112
+ insecure=False,
113
+ compression=None,
114
+ wait_for_ready=None,
115
+ timeout=None,
116
+ metadata=None):
117
+ return grpc.experimental.unary_unary(request, target, '/luminary.proto.physicsaitrainingservice.PhysicsAiTrainingService/CreateDataset',
118
+ proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.CreateDatasetRequest.SerializeToString,
119
+ proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.CreateDatasetResponse.FromString,
120
+ options, channel_credentials,
121
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
122
+
123
+ @staticmethod
124
+ def ListDatasets(request,
125
+ target,
126
+ options=(),
127
+ channel_credentials=None,
128
+ call_credentials=None,
129
+ insecure=False,
130
+ compression=None,
131
+ wait_for_ready=None,
132
+ timeout=None,
133
+ metadata=None):
134
+ return grpc.experimental.unary_unary(request, target, '/luminary.proto.physicsaitrainingservice.PhysicsAiTrainingService/ListDatasets',
135
+ proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.ListDatasetsRequest.SerializeToString,
136
+ proto_dot_api_dot_v0_dot_luminarycloud_dot_physics__ai_dot_physics__ai__pb2.ListDatasetsResponse.FromString,
137
+ options, channel_credentials,
138
+ insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
139
+
72
140
  @staticmethod
73
141
  def SubmitTrainingJob(request,
74
142
  target,
@@ -10,6 +10,16 @@ class PhysicsAiTrainingServiceStub:
10
10
  """PhysicsAiTrainingService provides training functionality for Physics AI"""
11
11
 
12
12
  def __init__(self, channel: grpc.Channel) -> None: ...
13
+ CreateDataset: grpc.UnaryUnaryMultiCallable[
14
+ luminarycloud._proto.api.v0.luminarycloud.physics_ai.physics_ai_pb2.CreateDatasetRequest,
15
+ luminarycloud._proto.api.v0.luminarycloud.physics_ai.physics_ai_pb2.CreateDatasetResponse,
16
+ ]
17
+ """Create a Physics AI dataset"""
18
+ ListDatasets: grpc.UnaryUnaryMultiCallable[
19
+ luminarycloud._proto.api.v0.luminarycloud.physics_ai.physics_ai_pb2.ListDatasetsRequest,
20
+ luminarycloud._proto.api.v0.luminarycloud.physics_ai.physics_ai_pb2.ListDatasetsResponse,
21
+ ]
22
+ """List Physics AI datasets for the current user"""
13
23
  SubmitTrainingJob: grpc.UnaryUnaryMultiCallable[
14
24
  luminarycloud._proto.api.v0.luminarycloud.physics_ai.physics_ai_pb2.SubmitTrainingJobRequest,
15
25
  luminarycloud._proto.api.v0.luminarycloud.physics_ai.physics_ai_pb2.SubmitTrainingJobResponse,
@@ -24,6 +34,20 @@ class PhysicsAiTrainingServiceStub:
24
34
  class PhysicsAiTrainingServiceServicer(metaclass=abc.ABCMeta):
25
35
  """PhysicsAiTrainingService provides training functionality for Physics AI"""
26
36
 
37
+ @abc.abstractmethod
38
+ def CreateDataset(
39
+ self,
40
+ request: luminarycloud._proto.api.v0.luminarycloud.physics_ai.physics_ai_pb2.CreateDatasetRequest,
41
+ context: grpc.ServicerContext,
42
+ ) -> luminarycloud._proto.api.v0.luminarycloud.physics_ai.physics_ai_pb2.CreateDatasetResponse:
43
+ """Create a Physics AI dataset"""
44
+ @abc.abstractmethod
45
+ def ListDatasets(
46
+ self,
47
+ request: luminarycloud._proto.api.v0.luminarycloud.physics_ai.physics_ai_pb2.ListDatasetsRequest,
48
+ context: grpc.ServicerContext,
49
+ ) -> luminarycloud._proto.api.v0.luminarycloud.physics_ai.physics_ai_pb2.ListDatasetsResponse:
50
+ """List Physics AI datasets for the current user"""
27
51
  @abc.abstractmethod
28
52
  def SubmitTrainingJob(
29
53
  self,
@@ -1,7 +1,7 @@
1
1
  """
2
2
  @generated by mypy-protobuf. Do not edit manually!
3
3
  isort:skip_file
4
- Copyright 2025 Luminary Cloud, Inc. All Rights Reserved.
4
+ Copyright 2025-2026 Luminary Cloud, Inc. All Rights Reserved.
5
5
  Generated by quantities.py. DO NOT EDIT
6
6
  """
7
7
  import builtins