luminarycloud 0.19.0__py3-none-any.whl → 0.20.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.
- luminarycloud/_client/client.py +2 -0
- luminarycloud/_helpers/_wait_for_mesh.py +6 -5
- luminarycloud/_helpers/_wait_for_simulation.py +3 -3
- luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.py +83 -25
- luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.pyi +214 -0
- luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2_grpc.py +34 -0
- luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2_grpc.pyi +12 -0
- luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2.py +60 -60
- luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2.pyi +5 -1
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.py +77 -27
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.pyi +85 -0
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2_grpc.py +66 -0
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2_grpc.pyi +20 -0
- luminarycloud/_proto/client/simulation_pb2.py +342 -331
- luminarycloud/_proto/client/simulation_pb2.pyi +37 -3
- luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2.py +29 -0
- luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2.pyi +7 -0
- luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2_grpc.py +70 -0
- luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2_grpc.pyi +30 -0
- luminarycloud/exceptions.py +7 -1
- luminarycloud/geometry.py +3 -1
- luminarycloud/mesh.py +1 -2
- luminarycloud/params/enum/_enum_wrappers.py +25 -0
- luminarycloud/params/simulation/material/material_solid_.py +15 -1
- luminarycloud/physics_ai/architectures.py +58 -0
- luminarycloud/physics_ai/training_jobs.py +37 -0
- luminarycloud/pipelines/api.py +8 -12
- luminarycloud/simulation.py +3 -2
- luminarycloud/simulation_template.py +2 -1
- luminarycloud/vis/__init__.py +15 -0
- luminarycloud/vis/data_extraction.py +20 -4
- luminarycloud/vis/interactive_report.py +124 -0
- luminarycloud/vis/interactive_scene.py +29 -2
- luminarycloud/vis/report.py +98 -0
- luminarycloud/vis/visualization.py +67 -5
- {luminarycloud-0.19.0.dist-info → luminarycloud-0.20.0.dist-info}/METADATA +1 -1
- {luminarycloud-0.19.0.dist-info → luminarycloud-0.20.0.dist-info}/RECORD +38 -31
- {luminarycloud-0.19.0.dist-info → luminarycloud-0.20.0.dist-info}/WHEEL +0 -0
|
@@ -22,6 +22,7 @@ from luminarycloud.params.simulation.physics.fluid.boundary_conditions import Fa
|
|
|
22
22
|
from .._helpers._code_representation import CodeRepr
|
|
23
23
|
from ..types import SimulationID
|
|
24
24
|
from collections import defaultdict
|
|
25
|
+
import copy
|
|
25
26
|
|
|
26
27
|
|
|
27
28
|
logger = logging.getLogger(__name__)
|
|
@@ -227,14 +228,14 @@ class ExtractOutput:
|
|
|
227
228
|
extract_id: str,
|
|
228
229
|
project_id: str,
|
|
229
230
|
name: str,
|
|
230
|
-
|
|
231
|
+
description: str,
|
|
231
232
|
status: ExtractStatusType,
|
|
232
233
|
) -> None:
|
|
233
234
|
self._extract_id = extract_id
|
|
234
235
|
self._project_id = project_id
|
|
235
236
|
self.status = status
|
|
236
237
|
self.name = name
|
|
237
|
-
self.description =
|
|
238
|
+
self.description = description
|
|
238
239
|
|
|
239
240
|
def __repr__(self) -> str:
|
|
240
241
|
return f"ExtractOutput (Id: {self._extract_id} status: {self.status})"
|
|
@@ -563,7 +564,7 @@ class DataExtractor:
|
|
|
563
564
|
extract_id=res.extract.extract_id,
|
|
564
565
|
project_id=self._project_id,
|
|
565
566
|
name=name,
|
|
566
|
-
|
|
567
|
+
description=description,
|
|
567
568
|
status=ExtractStatusType(res.extract.status),
|
|
568
569
|
)
|
|
569
570
|
return extract_output
|
|
@@ -657,6 +658,21 @@ class DataExtractor:
|
|
|
657
658
|
|
|
658
659
|
return imports + code
|
|
659
660
|
|
|
661
|
+
def clone(self, solution: Solution) -> "DataExtractor":
|
|
662
|
+
"""
|
|
663
|
+
Clone this extract based on a new solution. This is a deep copy
|
|
664
|
+
operation. Both solution must be compatible with one another, meaning
|
|
665
|
+
they share tags or surfaces ids for extractors such as
|
|
666
|
+
IntersectionCurve.
|
|
667
|
+
"""
|
|
668
|
+
if not isinstance(solution, Solution):
|
|
669
|
+
raise TypeError("Expected a Solution object.")
|
|
670
|
+
cloned = DataExtractor(solution)
|
|
671
|
+
for extract in self._extracts:
|
|
672
|
+
copied_extract = copy.deepcopy(extract)
|
|
673
|
+
cloned.add_data_extract(copied_extract)
|
|
674
|
+
return cloned
|
|
675
|
+
|
|
660
676
|
|
|
661
677
|
def list_data_extracts(solution: Solution) -> list[ExtractOutput]:
|
|
662
678
|
"""
|
|
@@ -700,7 +716,7 @@ def list_data_extracts(solution: Solution) -> list[ExtractOutput]:
|
|
|
700
716
|
extract_id=extract.extract_id,
|
|
701
717
|
project_id=extract.project_id,
|
|
702
718
|
name=extract.name,
|
|
703
|
-
|
|
719
|
+
description=extract.description,
|
|
704
720
|
status=ExtractStatusType(extract.status),
|
|
705
721
|
)
|
|
706
722
|
# This need to be fixed on the backend, but manually refreshing works for now.
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import io
|
|
2
|
+
from . import ExtractOutput
|
|
3
|
+
from .vis_util import _InternalToken, _get_status
|
|
4
|
+
from .visualization import RenderOutput
|
|
5
|
+
from ..enum import ExtractStatusType
|
|
6
|
+
from .._client import get_default_client
|
|
7
|
+
from .._proto.api.v0.luminarycloud.vis import vis_pb2
|
|
8
|
+
|
|
9
|
+
try:
|
|
10
|
+
import luminarycloud_jupyter as lcj
|
|
11
|
+
except ImportError:
|
|
12
|
+
lcj = None
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
# TODO Will/Matt: this could be something like what we store in the DB
|
|
16
|
+
# A report can contain a list of report entries that reference post proc.
|
|
17
|
+
# extracts + styling info for how they should be displayed
|
|
18
|
+
class ReportEntry:
|
|
19
|
+
def __init__(
|
|
20
|
+
self, project_id: str, extract_ids: list[str] = [], metadata: dict[str, str | float] = {}
|
|
21
|
+
) -> None:
|
|
22
|
+
self._project_id = project_id
|
|
23
|
+
self._extract_ids = extract_ids
|
|
24
|
+
self._extracts: list[ExtractOutput | RenderOutput] = []
|
|
25
|
+
self._metadata = metadata
|
|
26
|
+
|
|
27
|
+
# Download all extracts for this report entry
|
|
28
|
+
def download_extracts(self) -> None:
|
|
29
|
+
self._extracts = []
|
|
30
|
+
for eid in self._extract_ids:
|
|
31
|
+
status = _get_status(self._project_id, eid)
|
|
32
|
+
if status != ExtractStatusType.COMPLETED:
|
|
33
|
+
raise Exception(f"Extract {eid} is not complete")
|
|
34
|
+
req = vis_pb2.DownloadExtractRequest()
|
|
35
|
+
req.extract_id = eid
|
|
36
|
+
req.project_id = self._project_id
|
|
37
|
+
# TODO: This is a bit awkward in that we download the extract to figure out what type
|
|
38
|
+
# it is, but this is just a temporary thing, later we'll have a report DB table that
|
|
39
|
+
# stores the extracts for a report and their types, etc.
|
|
40
|
+
res: vis_pb2.DownloadExtractResponse = get_default_client().DownloadExtract(req)
|
|
41
|
+
extract = (
|
|
42
|
+
ExtractOutput(_InternalToken())
|
|
43
|
+
if res.HasField("line_data")
|
|
44
|
+
else RenderOutput(_InternalToken())
|
|
45
|
+
)
|
|
46
|
+
extract._set_data(eid, self._project_id, eid, eid, status)
|
|
47
|
+
self._extracts.append(extract)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class InteractiveReport:
|
|
51
|
+
# TODO Will/Matt: this list of report entries could be how we store stuff in the DB
|
|
52
|
+
# for interactive reports, to reference the post proc. extracts. A report is essentially
|
|
53
|
+
# a bunch of extracts + metadata.
|
|
54
|
+
def __init__(self, entries: list[ReportEntry]) -> None:
|
|
55
|
+
if not lcj:
|
|
56
|
+
raise ImportError("InteractiveScene requires luminarycloud[jupyter] to be installed")
|
|
57
|
+
|
|
58
|
+
self.entries = entries
|
|
59
|
+
if len(self.entries) == 0:
|
|
60
|
+
raise ValueError("Invalid number of entries, must be > 0")
|
|
61
|
+
|
|
62
|
+
report_data = []
|
|
63
|
+
for row, re in enumerate(self.entries):
|
|
64
|
+
row_data = []
|
|
65
|
+
re.download_extracts()
|
|
66
|
+
for extract in re._extracts:
|
|
67
|
+
if isinstance(extract, RenderOutput):
|
|
68
|
+
image_and_label = extract.download_images()
|
|
69
|
+
row_data.extend([il[0] for il in image_and_label])
|
|
70
|
+
else:
|
|
71
|
+
plot_data = extract.download_data()
|
|
72
|
+
# Plot absolute pressure for each intersection curve we have
|
|
73
|
+
# TODO will: make these params of the extract/report entry
|
|
74
|
+
# We'll pick the first item that's not x/y/z coordinates to be the data we plot
|
|
75
|
+
x_axis = "x"
|
|
76
|
+
y_axis = [n for n in plot_data[0][0][0] if n != "x" and n != "y" and n != "z"][
|
|
77
|
+
0
|
|
78
|
+
]
|
|
79
|
+
scatter_plots = []
|
|
80
|
+
for p in plot_data:
|
|
81
|
+
data = p[0]
|
|
82
|
+
x_idx = data[0].index(x_axis)
|
|
83
|
+
y_idx = data[0].index(y_axis)
|
|
84
|
+
|
|
85
|
+
scatter_data = lcj.ScatterPlotData()
|
|
86
|
+
scatter_data.name = f"plot-{row}"
|
|
87
|
+
for r in data[1:]:
|
|
88
|
+
scatter_data.x.append(r[x_idx])
|
|
89
|
+
scatter_data.y.append(r[y_idx])
|
|
90
|
+
scatter_plots.append(scatter_data)
|
|
91
|
+
row_data.append(scatter_plots)
|
|
92
|
+
|
|
93
|
+
report_data.append(row_data)
|
|
94
|
+
|
|
95
|
+
# TODO Validate the grid configuration is valid, all report entries should have the
|
|
96
|
+
# same # of extract IDs and metadata keys
|
|
97
|
+
# maybe not needed, b/c this is something we'd control internally later?
|
|
98
|
+
nrows = len(report_data)
|
|
99
|
+
ncols = len(report_data[0]) if len(report_data) > 0 else 0
|
|
100
|
+
|
|
101
|
+
for i, r in enumerate(report_data):
|
|
102
|
+
if len(r) != ncols:
|
|
103
|
+
raise ValueError(
|
|
104
|
+
f"Invalid report configuration: row {i} does not have {ncols} columns"
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
self.widget = lcj.EnsembleWidget([re._metadata for re in self.entries], nrows, ncols)
|
|
108
|
+
for row, row_data in enumerate(report_data):
|
|
109
|
+
for col, col_data in enumerate(row_data):
|
|
110
|
+
if isinstance(col_data, list) and isinstance(col_data[0], lcj.ScatterPlotData):
|
|
111
|
+
x_axis = "x"
|
|
112
|
+
y_axis = "Absolute Pressure (Pa)"
|
|
113
|
+
self.widget.set_cell_scatter_plot(
|
|
114
|
+
row, col, f"{row} {y_axis} v {x_axis}", x_axis, y_axis, col_data
|
|
115
|
+
)
|
|
116
|
+
elif isinstance(col_data, io.BytesIO):
|
|
117
|
+
self.widget.set_cell_data(row, col, col_data.getvalue(), "jpg")
|
|
118
|
+
|
|
119
|
+
def _ipython_display_(self) -> None:
|
|
120
|
+
"""
|
|
121
|
+
When the InteractiveReport is shown in Jupyter we show the underlying widget
|
|
122
|
+
to run the widget's frontend code
|
|
123
|
+
"""
|
|
124
|
+
self.widget._ipython_display_()
|
|
@@ -18,7 +18,16 @@ try:
|
|
|
18
18
|
import luminarycloud_jupyter as lcj
|
|
19
19
|
|
|
20
20
|
if TYPE_CHECKING:
|
|
21
|
-
from luminarycloud_jupyter import
|
|
21
|
+
from luminarycloud_jupyter import (
|
|
22
|
+
InteractiveLCVisWidget,
|
|
23
|
+
LCVisPlaneWidget,
|
|
24
|
+
LCVisLineWidget,
|
|
25
|
+
LCVisBoxWidget,
|
|
26
|
+
LCVisCylinderWidget,
|
|
27
|
+
LCVisHalfSphereWidget,
|
|
28
|
+
LCVisSphereWidget,
|
|
29
|
+
LCVisFinitePlaneWidget,
|
|
30
|
+
)
|
|
22
31
|
except ImportError:
|
|
23
32
|
lcj = None
|
|
24
33
|
|
|
@@ -134,7 +143,7 @@ class InteractiveScene:
|
|
|
134
143
|
def set_surface_visibility(self, surface_id: str, visible: bool) -> None:
|
|
135
144
|
self.widget.set_surface_visibility(surface_id, visible)
|
|
136
145
|
|
|
137
|
-
def set_surface_color(self, surface_id: str, color: list[float]) -> None:
|
|
146
|
+
def set_surface_color(self, surface_id: str, color: "list[float]") -> None:
|
|
138
147
|
self.widget.set_surface_color(surface_id, color)
|
|
139
148
|
|
|
140
149
|
def set_display_attributes(self, object_id: str, attrs: DisplayAttributes) -> None:
|
|
@@ -199,6 +208,24 @@ class InteractiveScene:
|
|
|
199
208
|
def add_plane_widget(self) -> "LCVisPlaneWidget":
|
|
200
209
|
return self.widget.add_plane_widget()
|
|
201
210
|
|
|
211
|
+
def add_line_widget(self) -> "LCVisLineWidget":
|
|
212
|
+
return self.widget.add_line_widget()
|
|
213
|
+
|
|
214
|
+
def add_box_widget(self) -> "LCVisBoxWidget":
|
|
215
|
+
return self.widget.add_box_widget()
|
|
216
|
+
|
|
217
|
+
def add_cylinder_widget(self) -> "LCVisCylinderWidget":
|
|
218
|
+
return self.widget.add_cylinder_widget()
|
|
219
|
+
|
|
220
|
+
def add_half_sphere_widget(self) -> "LCVisHalfSphereWidget":
|
|
221
|
+
return self.widget.add_half_sphere_widget()
|
|
222
|
+
|
|
223
|
+
def add_finite_plane_widget(self) -> "LCVisFinitePlaneWidget":
|
|
224
|
+
return self.widget.add_finite_plane_widget()
|
|
225
|
+
|
|
226
|
+
def add_sphere_widget(self) -> "LCVisSphereWidget":
|
|
227
|
+
return self.widget.add_sphere_widget()
|
|
228
|
+
|
|
202
229
|
def delete_widget(self, widget: "InteractiveLCVisWidget") -> None:
|
|
203
230
|
self.widget.delete_widget(widget)
|
|
204
231
|
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
from .visualization import Scene, RenderOutput
|
|
2
|
+
from .data_extraction import DataExtractor, ExtractOutput
|
|
3
|
+
from ..enum import RenderStatusType, ExtractStatusType
|
|
4
|
+
from ..solution import Solution
|
|
5
|
+
from time import sleep
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
# Notes(matt): we need a good way to pass "legend" information to the report.
|
|
9
|
+
# The legend is list of scalar values that are associated with each solution in
|
|
10
|
+
# the report. Examples include outputs like lift or drag, scalar ranges in the
|
|
11
|
+
# solutions, or any user provided data. We could add a helper class to auto-produce
|
|
12
|
+
# the legend data for common use cases or the user could provide their own. The data
|
|
13
|
+
# would look like a csv file or a dictionary keyed on the solution/sim id, where each
|
|
14
|
+
# entry is a list of scalar values. We would also need a header to describe what the values
|
|
15
|
+
# are.
|
|
16
|
+
class Report:
|
|
17
|
+
def __init__(self, solutions: list[Solution]):
|
|
18
|
+
self._scenes: list[Scene] = []
|
|
19
|
+
self._data_extractors: list[DataExtractor] = []
|
|
20
|
+
self._solution: list[Solution] = solutions
|
|
21
|
+
# When we fire off requests we use these objects to track the progress.
|
|
22
|
+
self._extract_outputs: list[ExtractOutput] = []
|
|
23
|
+
self._render_outputs: list[RenderOutput] = []
|
|
24
|
+
for solution in solutions:
|
|
25
|
+
if not isinstance(solution, Solution):
|
|
26
|
+
raise TypeError("Expected a list of Solution objects.")
|
|
27
|
+
|
|
28
|
+
def add_scene(self, scene: Scene):
|
|
29
|
+
if not isinstance(scene, Scene):
|
|
30
|
+
raise TypeError("Expected a Scene object.")
|
|
31
|
+
self._scenes.append(scene)
|
|
32
|
+
|
|
33
|
+
def add_data_extractor(self, data_extractor: DataExtractor):
|
|
34
|
+
if not isinstance(data_extractor, DataExtractor):
|
|
35
|
+
raise TypeError("Expected a DataExtractor object.")
|
|
36
|
+
self._data_extractors.append(data_extractor)
|
|
37
|
+
|
|
38
|
+
def _check_status(self) -> bool:
|
|
39
|
+
"""Check the status of all render outputs and extract outputs."""
|
|
40
|
+
still_pending = False
|
|
41
|
+
print("\n" + "=" * 60)
|
|
42
|
+
print("STATUS CHECK".center(60))
|
|
43
|
+
print("=" * 60)
|
|
44
|
+
|
|
45
|
+
if not self._render_outputs and not self._extract_outputs:
|
|
46
|
+
raise RuntimeError("No render outputs or extract outputs to check status.")
|
|
47
|
+
|
|
48
|
+
# Check render outputs
|
|
49
|
+
if self._render_outputs:
|
|
50
|
+
print(f"{'Type':<8} | {'ID':<20} | {'Status':<15}")
|
|
51
|
+
print("-" * 60)
|
|
52
|
+
|
|
53
|
+
for output in self._render_outputs:
|
|
54
|
+
if (
|
|
55
|
+
output.status != RenderStatusType.COMPLETED
|
|
56
|
+
and output.status != RenderStatusType.FAILED
|
|
57
|
+
):
|
|
58
|
+
output.refresh()
|
|
59
|
+
still_pending = True
|
|
60
|
+
print(f"{'Render':<8} | {str(output._extract_id):<20} | {output.status.name:<15}")
|
|
61
|
+
|
|
62
|
+
# Check extract outputs
|
|
63
|
+
for output in self._extract_outputs:
|
|
64
|
+
if (
|
|
65
|
+
output.status != ExtractStatusType.COMPLETED
|
|
66
|
+
and output.status != ExtractStatusType.FAILED
|
|
67
|
+
):
|
|
68
|
+
output.refresh()
|
|
69
|
+
still_pending = True
|
|
70
|
+
print(f"{'Extract':<8} | {str(output._extract_id):<20} | {output.status.name:<15}")
|
|
71
|
+
|
|
72
|
+
print("=" * 60)
|
|
73
|
+
return still_pending
|
|
74
|
+
|
|
75
|
+
def create_report_data(self):
|
|
76
|
+
for solution in self._solution:
|
|
77
|
+
for scene in self._scenes:
|
|
78
|
+
sol_scene = scene.clone(solution)
|
|
79
|
+
self._render_outputs.append(
|
|
80
|
+
sol_scene.render_images(
|
|
81
|
+
name="Report Scene", description="Generated Report Scene"
|
|
82
|
+
)
|
|
83
|
+
)
|
|
84
|
+
for extractor in self._data_extractors:
|
|
85
|
+
sol_extractor = extractor.clone(solution)
|
|
86
|
+
self._extract_outputs.append(
|
|
87
|
+
sol_extractor.create_extracts(
|
|
88
|
+
name="Report Extract", description="Generated Report Extract"
|
|
89
|
+
)
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
def wait_for_completion(self):
|
|
93
|
+
"""Wait for all render and extract outputs to complete."""
|
|
94
|
+
if not self._render_outputs and not self._extract_outputs:
|
|
95
|
+
raise RuntimeError("No render outputs or extract outputs to wait for.")
|
|
96
|
+
while self._check_status():
|
|
97
|
+
sleep(5)
|
|
98
|
+
print("All render and extract outputs have completed.")
|
|
@@ -162,7 +162,7 @@ class LookAtCamera(CodeRepr):
|
|
|
162
162
|
self.projection = CameraProjection(static_ani.camera.projection)
|
|
163
163
|
|
|
164
164
|
def __repr__(self) -> str:
|
|
165
|
-
return self._to_code_helper(obj_name="camera")
|
|
165
|
+
return self._to_code_helper(obj_name="camera", hide_defaults=False)
|
|
166
166
|
|
|
167
167
|
|
|
168
168
|
class RenderOutput:
|
|
@@ -206,13 +206,18 @@ class RenderOutput:
|
|
|
206
206
|
self._deleted = False
|
|
207
207
|
|
|
208
208
|
def _set_data(
|
|
209
|
-
self,
|
|
209
|
+
self,
|
|
210
|
+
extract_id: str,
|
|
211
|
+
project_id: str,
|
|
212
|
+
name: str,
|
|
213
|
+
description: str,
|
|
214
|
+
status: RenderStatusType,
|
|
210
215
|
) -> None:
|
|
211
216
|
self._extract_id = extract_id
|
|
212
217
|
self._project_id = project_id
|
|
213
218
|
self.status = status
|
|
214
219
|
self.name = name
|
|
215
|
-
self.description =
|
|
220
|
+
self.description = description
|
|
216
221
|
|
|
217
222
|
def __repr__(self) -> str:
|
|
218
223
|
return f"RenderOutput(Id: {self._extract_id} status: {self.status})"
|
|
@@ -806,7 +811,7 @@ class Scene(CodeRepr):
|
|
|
806
811
|
extract_id=res.extract.extract_id,
|
|
807
812
|
project_id=self._project_id,
|
|
808
813
|
name=name,
|
|
809
|
-
|
|
814
|
+
description=description,
|
|
810
815
|
status=RenderStatusType(res.extract.status),
|
|
811
816
|
)
|
|
812
817
|
return render_output
|
|
@@ -1145,7 +1150,7 @@ def list_renders(entity: Geometry | Mesh | Solution) -> List[RenderOutput]:
|
|
|
1145
1150
|
extract_id=extract.extract_id,
|
|
1146
1151
|
project_id=extract.project_id,
|
|
1147
1152
|
name=extract.name,
|
|
1148
|
-
|
|
1153
|
+
description=extract.description,
|
|
1149
1154
|
status=RenderStatusType(extract.status),
|
|
1150
1155
|
)
|
|
1151
1156
|
# This need to be fixed on the backend, but manually refreshing works for now.
|
|
@@ -1315,3 +1320,60 @@ def _reconstruct(extract_id: str, project_id: str) -> Scene:
|
|
|
1315
1320
|
req.project_id = project_id
|
|
1316
1321
|
res: vis_pb2.GetExtractSpecResponse = get_default_client().GetExtractSpec(req)
|
|
1317
1322
|
return _spec_to_scene(res.spec)
|
|
1323
|
+
|
|
1324
|
+
|
|
1325
|
+
@dc.dataclass
|
|
1326
|
+
class CameraEntry:
|
|
1327
|
+
camera_id: int
|
|
1328
|
+
name: str
|
|
1329
|
+
|
|
1330
|
+
|
|
1331
|
+
def list_cameras(project_id: str = "") -> List[CameraEntry]:
|
|
1332
|
+
"""
|
|
1333
|
+
List all cameras in the specified project. If no project id is provided,
|
|
1334
|
+
global cameras are returned.
|
|
1335
|
+
"""
|
|
1336
|
+
req = vis_pb2.ListCamerasRequest()
|
|
1337
|
+
req.project_id = project_id
|
|
1338
|
+
res: vis_pb2.ListCamerasReply = get_default_client().ListCameras(req)
|
|
1339
|
+
return [CameraEntry(camera_id=c.camera_id, name=c.name) for c in res.camera]
|
|
1340
|
+
|
|
1341
|
+
|
|
1342
|
+
def get_camera(entry: CameraEntry, width: int, height: int) -> LookAtCamera:
|
|
1343
|
+
"""
|
|
1344
|
+
Instantiate a LookAt camera by its entry returned from list_cameras. The
|
|
1345
|
+
width and the height impact orthographic cameras. Most screens have a 16:9
|
|
1346
|
+
aspect ratio, so using the width = 1920 and height = 1080 is a good default
|
|
1347
|
+
to match cameras created in the UI, otherwise parts of the scene may be
|
|
1348
|
+
clipped.
|
|
1349
|
+
|
|
1350
|
+
.. warning:: This feature is experimental and may change or be removed in the future.
|
|
1351
|
+
|
|
1352
|
+
Parameters
|
|
1353
|
+
----------
|
|
1354
|
+
entry: CameraEntry, required
|
|
1355
|
+
A camera entry returned from list_cameras.
|
|
1356
|
+
width: int, required
|
|
1357
|
+
The target width of the camera.
|
|
1358
|
+
height: int, required
|
|
1359
|
+
The target height of the camera.
|
|
1360
|
+
"""
|
|
1361
|
+
req = vis_pb2.GetCameraRequest()
|
|
1362
|
+
req.camera_id = entry.camera_id
|
|
1363
|
+
req.resolution.width = width
|
|
1364
|
+
req.resolution.height = height
|
|
1365
|
+
res: vis_pb2.GetCameraReply = get_default_client().GetCamera(req)
|
|
1366
|
+
cam = LookAtCamera()
|
|
1367
|
+
cam.width = width
|
|
1368
|
+
cam.height = height
|
|
1369
|
+
cam.label = entry.name
|
|
1370
|
+
cam.up = Vector3()
|
|
1371
|
+
cam.up._from_proto(res.camera.look_at.up)
|
|
1372
|
+
cam.look_at = Vector3()
|
|
1373
|
+
cam.look_at._from_proto(res.camera.look_at.look_at)
|
|
1374
|
+
cam.position = Vector3()
|
|
1375
|
+
cam.position._from_proto(res.camera.look_at.position)
|
|
1376
|
+
cam.projection = CameraProjection(res.camera.projection)
|
|
1377
|
+
cam.pan_x = res.camera.look_at.pan.x
|
|
1378
|
+
cam.pan_y = res.camera.look_at.pan.y
|
|
1379
|
+
return cam
|
|
@@ -2,18 +2,18 @@ luminarycloud/__init__.py,sha256=mpNimnkWfQlpfQyo8Ugjx-gboUNug9hbsh-4m2A0JWY,331
|
|
|
2
2
|
luminarycloud/_patch.py,sha256=5m2_HUos6-NGPvrz-bOlVr5FsyJNJlCkmytyYJkj6Bc,1661
|
|
3
3
|
luminarycloud/_version.py,sha256=lOdK2s5vnq1K8KND-J-wO2A2MuUTouiYRhJwRwb6mcA,178
|
|
4
4
|
luminarycloud/_wrapper.py,sha256=PwTyxIVoYCF2z5arlV5UEgNfFDduxGE1KC2NaOpasWU,7796
|
|
5
|
-
luminarycloud/exceptions.py,sha256=
|
|
5
|
+
luminarycloud/exceptions.py,sha256=VVGtKREb8XcWea6TySVYh7dhGQpowafdhiTst1uN4EQ,1900
|
|
6
6
|
luminarycloud/feature_modification.py,sha256=Pe5bw8SlaNdd36az_OTFXKWEQI-0_wUIy5sRIqp9itM,30684
|
|
7
|
-
luminarycloud/geometry.py,sha256=
|
|
7
|
+
luminarycloud/geometry.py,sha256=tRPrdehQxFmST73BbpAnHHsvbK7kqe1gRYCgN3LpZTM,20790
|
|
8
8
|
luminarycloud/geometry_version.py,sha256=lP4oHotRpyt4fQkoYkwtfbNfpB0xSHFGEynFLCy7hiA,6004
|
|
9
|
-
luminarycloud/mesh.py,sha256=
|
|
9
|
+
luminarycloud/mesh.py,sha256=6O4fTg8gWYLTrBsf0-MH6c7HL72iZbPUfGGk_II9PR4,4782
|
|
10
10
|
luminarycloud/named_variable_set.py,sha256=RsfGJDoZFajbJ2a2fWc-ZHRsZts5U7ZY6rIXSjXL7bY,4568
|
|
11
11
|
luminarycloud/project.py,sha256=fizJxgQ9PhHmPUfQ4vR0DVv90Rw_tlpAXlulVeg0708,32194
|
|
12
12
|
luminarycloud/reference_values.py,sha256=vWIX1VXMctspeQIjNtjmZdex55K0jHf1xz5gsGeMCfo,4357
|
|
13
|
-
luminarycloud/simulation.py,sha256=
|
|
13
|
+
luminarycloud/simulation.py,sha256=lvcKGRQ8-8cBtETaY7kkDN1w_AHoFzgLahxFjpatNwI,13065
|
|
14
14
|
luminarycloud/simulation_param.py,sha256=fKad0d0rCUL4EbdLvQS7WTK6_US3vQ2pbG8uaSrhxx4,16732
|
|
15
15
|
luminarycloud/simulation_queue.py,sha256=dbrxDxGROlxpCVaUmHItZ8uftfLQinCj53nYZ-CRleI,4702
|
|
16
|
-
luminarycloud/simulation_template.py,sha256=
|
|
16
|
+
luminarycloud/simulation_template.py,sha256=ZsvgsUjW2nAJQ_JnZCsVdaRoogjpBIRNwhdXRxTmcSI,21526
|
|
17
17
|
luminarycloud/solution.py,sha256=xS04WDjoPenJaBxx9xm7t8A4YrNIcq_oQfl4WJ8gAic,6770
|
|
18
18
|
luminarycloud/tables.py,sha256=i6KMjthjRbks4Vxv6Eu6VLulRC9U8fhkzwknR2Ax3Nc,6922
|
|
19
19
|
luminarycloud/tag.py,sha256=aC1xnHFVOEk7V6tp16b0wdwuGAJoqq7u3tzuYwbkkY0,1384
|
|
@@ -27,7 +27,7 @@ luminarycloud/_auth/exceptions.py,sha256=XsjA6xxFGnufP5V7BOxnq_syuSRrLa-HWntncW5
|
|
|
27
27
|
luminarycloud/_auth/util.py,sha256=EmDl9BBV0SuKVyyq7PyYXPyOEkWBJRIqPN46l2srjEg,1040
|
|
28
28
|
luminarycloud/_client/__init__.py,sha256=q-q1lnJE9EirX5p_O15FnanUoSYdEOD5zP1XrUedKMU,681
|
|
29
29
|
luminarycloud/_client/authentication_plugin.py,sha256=eJXs0b8pYih12fBU1vgJ8gGpAdtjfbqCuxSprjR-p9E,1351
|
|
30
|
-
luminarycloud/_client/client.py,sha256=
|
|
30
|
+
luminarycloud/_client/client.py,sha256=KiugyhRBcWIQY61bS22HjTz0-beRdBms3NGkgC36388,11307
|
|
31
31
|
luminarycloud/_client/config.py,sha256=o_HJsmPOLaeorYToR9_wzNhJYRoFnmeqcxCRAoUAqZk,236
|
|
32
32
|
luminarycloud/_client/http_client.py,sha256=yWx6BJ5C40PRI6Y5qo7b4abUecME_QGcWu1IQVwMHDU,6423
|
|
33
33
|
luminarycloud/_client/logging_interceptor.py,sha256=I7xJzTQoV5O_Ioi7OjWXI2mQWxdpbagu7QnzbJSFcHg,2593
|
|
@@ -44,8 +44,8 @@ luminarycloud/_helpers/_simulation_params_from_json.py,sha256=Iq7S8XUqh3Y-6cZ2rv
|
|
|
44
44
|
luminarycloud/_helpers/_timestamp_to_datetime.py,sha256=Vh2-e7MRrxG8z7CMA-DRIIAhqGSUGYuIhW9csoh9pBw,299
|
|
45
45
|
luminarycloud/_helpers/_upload_mesh.py,sha256=eiWBSheNNdejfH3gkE7UohPXLRT3COOPPTN-yn2OU24,11955
|
|
46
46
|
luminarycloud/_helpers/_upload_table.py,sha256=B7Svu97Dr6UYt8pubD99kGvXkR0oKUtKSi3Ppj_qUMI,2211
|
|
47
|
-
luminarycloud/_helpers/_wait_for_mesh.py,sha256=
|
|
48
|
-
luminarycloud/_helpers/_wait_for_simulation.py,sha256=
|
|
47
|
+
luminarycloud/_helpers/_wait_for_mesh.py,sha256=p7Zp6ulifpZDAfRcN0kOPVjOU2e9oWutSrPIbMcsreg,1871
|
|
48
|
+
luminarycloud/_helpers/_wait_for_simulation.py,sha256=DusHJLmLi7NvLu3K7cfrb2ZSbPBrySK8t7TLS22oTms,3520
|
|
49
49
|
luminarycloud/_helpers/cond.py,sha256=BZ0MDBxy2lvcVQyaj0x_qLqJFlsu-X_n9r_Gw1Ppk-c,16752
|
|
50
50
|
luminarycloud/_helpers/defaults.py,sha256=jj6J3F2cjqO1CR5_F4ICxr44hTLC1GypD9Q4YQJRw68,1550
|
|
51
51
|
luminarycloud/_helpers/download.py,sha256=R1wWWgzZsaC7tnPHeu8pZvim0bS-o_DHc_yKUzXNC6g,9495
|
|
@@ -82,10 +82,10 @@ luminarycloud/_proto/api/v0/luminarycloud/output_node/output_node_pb2.py,sha256=
|
|
|
82
82
|
luminarycloud/_proto/api/v0/luminarycloud/output_node/output_node_pb2.pyi,sha256=H2K7EGKLHOe5xNunVkFuY4sHN3LTVjZHLlnTwYqFk-A,7654
|
|
83
83
|
luminarycloud/_proto/api/v0/luminarycloud/output_node/output_node_pb2_grpc.py,sha256=lLpk0zvSn4XsvE5JEJVF7V2x2ZAX6rCHTgIzjVN9xU0,11209
|
|
84
84
|
luminarycloud/_proto/api/v0/luminarycloud/output_node/output_node_pb2_grpc.pyi,sha256=N7KiftsEfElduhrGpevNqC7Ri3FGpYsiZ1LQJ4RwDrw,3738
|
|
85
|
-
luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.py,sha256=
|
|
86
|
-
luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.pyi,sha256=
|
|
87
|
-
luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2_grpc.py,sha256=
|
|
88
|
-
luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2_grpc.pyi,sha256=
|
|
85
|
+
luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.py,sha256=X0g0D6gWEntJNlC2n_1QxDpmvUe0zCHHagaEfMQqQo8,17953
|
|
86
|
+
luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.pyi,sha256=2-Fw6lmbiU072BpR-gDnORHk9YJPGYGbjWoegBNpLO0,23657
|
|
87
|
+
luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2_grpc.py,sha256=WMjycj2H85rdfZ9_JOe1BZhg3k3x9UamYJm5N2LO_5U,9498
|
|
88
|
+
luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2_grpc.pyi,sha256=xynVc9ide5kxdAwOs9XYL8cQU3BrZaiHLMTKTk5uNPQ,3400
|
|
89
89
|
luminarycloud/_proto/api/v0/luminarycloud/project/project_pb2.py,sha256=INzCXfjQQyzuBrbnqs6Uvle_kpEnotrEhhgHIx8ZeV0,17209
|
|
90
90
|
luminarycloud/_proto/api/v0/luminarycloud/project/project_pb2.pyi,sha256=HaHlJdQlPHccQOpaS7t6JW7M9I4RGSZXB12zImp_qGk,14982
|
|
91
91
|
luminarycloud/_proto/api/v0/luminarycloud/project/project_pb2_grpc.py,sha256=pmYkibMi49G82r9Dh4f83IiNaAWFOqKp6-TbBRA3Llo,20258
|
|
@@ -94,8 +94,8 @@ luminarycloud/_proto/api/v0/luminarycloud/project_ui_state/project_ui_state_pb2.
|
|
|
94
94
|
luminarycloud/_proto/api/v0/luminarycloud/project_ui_state/project_ui_state_pb2.pyi,sha256=-vtlNWPz2kbOPyD26lVOPI5YWsDc35ZWWdWHQV8H40g,3166
|
|
95
95
|
luminarycloud/_proto/api/v0/luminarycloud/project_ui_state/project_ui_state_pb2_grpc.py,sha256=5EC2wbMzDyXuFROZzH1ief__dT6x4N8qJwsPtSy16sA,8038
|
|
96
96
|
luminarycloud/_proto/api/v0/luminarycloud/project_ui_state/project_ui_state_pb2_grpc.pyi,sha256=hGkGk-DMn0Lo6QBtLALBF2HLLV6rgs6zMRmqmDzBZco,2513
|
|
97
|
-
luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2.py,sha256=
|
|
98
|
-
luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2.pyi,sha256=
|
|
97
|
+
luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2.py,sha256=B-RmO5ezNyk8rTkj4V1lfOoHIl9zhE34gb1ig9UOMYE,31350
|
|
98
|
+
luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2.pyi,sha256=H8t7i8Tmw2RzTeWoF4T2YCXxItKi9IXDZBSglsVFZbA,37149
|
|
99
99
|
luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2_grpc.py,sha256=09Mqc5yVuRwDEnV7oKd9zw0WZS0X7-IB0VVo5Lf3Vus,27538
|
|
100
100
|
luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2_grpc.pyi,sha256=rzENHjHuDfNZ11S-_1YUcEfwhVJFk1qkBwHksgpqY1M,11699
|
|
101
101
|
luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2.py,sha256=K0PmW_-cCzfQpykeHh9qqnlnItAZqnVQExHAOKPDVqc,17287
|
|
@@ -118,10 +118,10 @@ luminarycloud/_proto/api/v0/luminarycloud/upload/upload_pb2.py,sha256=GSBDw-gXRD
|
|
|
118
118
|
luminarycloud/_proto/api/v0/luminarycloud/upload/upload_pb2.pyi,sha256=XbFvpZvvrS7QcH5AFXfpRGl4hQvhd3QdKO6x0oTlCCU,165
|
|
119
119
|
luminarycloud/_proto/api/v0/luminarycloud/upload/upload_pb2_grpc.py,sha256=eyC9tE7Rid-6OvRiSohEim8mkORz-cVa-ml4T3S8qBU,12767
|
|
120
120
|
luminarycloud/_proto/api/v0/luminarycloud/upload/upload_pb2_grpc.pyi,sha256=Xknd7R7907K_Sv4rtixxvcBnyz5lA_RzgbHcrwM7qLo,6431
|
|
121
|
-
luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.py,sha256=
|
|
122
|
-
luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.pyi,sha256=
|
|
123
|
-
luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2_grpc.py,sha256=
|
|
124
|
-
luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2_grpc.pyi,sha256=
|
|
121
|
+
luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.py,sha256=kaCgXHbnc9--biNbEXYnNpsW8Vv9ERJKnlB1BalFZ_o,76714
|
|
122
|
+
luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.pyi,sha256=Uz_NEPpCc-aV80Q2-tm15Eamj6CklaUuEBIt3gCKaN0,95469
|
|
123
|
+
luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2_grpc.py,sha256=aKoPboT8HQV4prwYV15B80C8o2j1TpSTGREG2aea2Uw,20130
|
|
124
|
+
luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2_grpc.pyi,sha256=faJ8c5BRLeHBtAhMrzayo3VQ4pI0ZcgOup8w322-ngA,5462
|
|
125
125
|
luminarycloud/_proto/assistant/assistant_pb2.py,sha256=zG3T15gNuEZE5yajkWfMUjl_nSdTJ6C-Mbd90_H_Svo,21590
|
|
126
126
|
luminarycloud/_proto/assistant/assistant_pb2.pyi,sha256=-IwjZXxwyMtts9T3yiCWszonhfoD8t5U5SuIQHb2SKs,26829
|
|
127
127
|
luminarycloud/_proto/assistant/assistant_pb2_grpc.py,sha256=jFKPYswcJ7jQaZFb1R3meXMDxmwUZyWwaj5tIOBfQ_U,13195
|
|
@@ -138,8 +138,8 @@ luminarycloud/_proto/cadmetadata/cadmetadata_pb2.py,sha256=bJoJXDLcAqmtHfgR6JKNZ
|
|
|
138
138
|
luminarycloud/_proto/cadmetadata/cadmetadata_pb2.pyi,sha256=ilRDD1oOkFffy4bpgPblZHU2j_2PR_gqdL-_5tRBiU0,4463
|
|
139
139
|
luminarycloud/_proto/client/entity_pb2.py,sha256=LmCbzEBTtsBnfgofVEsYFvVCvw-tDzU9o3eOn0-JqmY,1442
|
|
140
140
|
luminarycloud/_proto/client/entity_pb2.pyi,sha256=nUZ93BId89hhsZhyzMoFohDRRYtKUza458dOLNJVENk,1111
|
|
141
|
-
luminarycloud/_proto/client/simulation_pb2.py,sha256=
|
|
142
|
-
luminarycloud/_proto/client/simulation_pb2.pyi,sha256=
|
|
141
|
+
luminarycloud/_proto/client/simulation_pb2.py,sha256=9LlqhXvoIsKqURxjnXAWh9ENucl6TZsWeQ2GRqdJgxk,436868
|
|
142
|
+
luminarycloud/_proto/client/simulation_pb2.pyi,sha256=cE211nn96MhVg9x-357scg8nsJzb4zDgAO2X1_sPynE,372215
|
|
143
143
|
luminarycloud/_proto/condition/condition_pb2.py,sha256=0WWoUz2yYAJ8Ux9J7Yqap6UdvvzLxnF_tlBceqk76Us,5144
|
|
144
144
|
luminarycloud/_proto/condition/condition_pb2.pyi,sha256=eZ6hTW0F9RDDCDni4IELnCHBSyPZmcw6aKayrKGuQSU,5914
|
|
145
145
|
luminarycloud/_proto/entitygroup/entitygroup_pb2.py,sha256=tkyRcUY1HzMaV0u6_rhotd60iR8lkszoLNqiDVOK4b8,3877
|
|
@@ -194,6 +194,10 @@ luminarycloud/_proto/parametricworker/parametricworker_pb2.py,sha256=vldSHCCpERE
|
|
|
194
194
|
luminarycloud/_proto/parametricworker/parametricworker_pb2.pyi,sha256=R1j0hXIlvccrdQ5Vf45xV6my7dzcPJ94igVZrZ2BjSg,10158
|
|
195
195
|
luminarycloud/_proto/parametricworker/parametricworker_pb2_grpc.py,sha256=sxVIAGz_rFE52RMWGcLpm2o6Qs-lCcoSuDcJSv94f0M,10008
|
|
196
196
|
luminarycloud/_proto/parametricworker/parametricworker_pb2_grpc.pyi,sha256=T8RFKXUxrTOGMpXpjAE-b43Nw8LJjetckFC_d-aDIu4,3378
|
|
197
|
+
luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2.py,sha256=ulfXXYAKvBK6RPLT8JXeEDtH7UxtmPnzJbx5_ty2kPU,1651
|
|
198
|
+
luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2.pyi,sha256=VbmaLisaneVcvS68mWV2faJnoF4vrS4wYBvDZezwPpk,221
|
|
199
|
+
luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2_grpc.py,sha256=6VYOuVOIegaK5c3qrNEx9Etk9Gd52PdZ6RKMSSNkRZ8,3271
|
|
200
|
+
luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2_grpc.pyi,sha256=Weofl41CRNCGP-fX2cmKCr9k9r6wvQjnel0sJH31U8s,1359
|
|
197
201
|
luminarycloud/_proto/quantity/quantity_options_pb2.py,sha256=TypSq4HRGXvh2UoDhXLpWnDsI6FMaL5vk2Z9tzTtYZw,7063
|
|
198
202
|
luminarycloud/_proto/quantity/quantity_options_pb2.pyi,sha256=oBJBtX4_N7omjABzrEIGgzlxgytK8GEwokpkb10bNfg,13065
|
|
199
203
|
luminarycloud/_proto/quantity/quantity_pb2.py,sha256=rHmcTfnAHkIafFzI5_37B9oMR2fYJgIMMb-gt6ds6BU,135198
|
|
@@ -240,7 +244,7 @@ luminarycloud/outputs/output_definitions.py,sha256=E85hRbAiCphGq-YTUjFYYz64vjg7z
|
|
|
240
244
|
luminarycloud/outputs/stopping_conditions.py,sha256=JSYEViCUaz3d1YiKEBvyCWPlY1z6CYrBLGrVYLDqjF4,8638
|
|
241
245
|
luminarycloud/params/__init__.py,sha256=d9DXzEw3oV1iOMXWpmYYEg2mYndFcxYW3NxrW6x-EFs,175
|
|
242
246
|
luminarycloud/params/enum/__init__.py,sha256=vNvQ8Q-2d7Vd2bbN0x-qlSeYMAxBfEEl3fUbcf1xWPQ,158
|
|
243
|
-
luminarycloud/params/enum/_enum_wrappers.py,sha256=
|
|
247
|
+
luminarycloud/params/enum/_enum_wrappers.py,sha256=jF65YFpX3VOH0kwAk9fkS7xZsrd6r2M6HP63bgMzxkA,63072
|
|
244
248
|
luminarycloud/params/enum/residual_output.py,sha256=wRYCRbvDk-1hJWVFzRyz4Ndr1FagB4-h_JSE9sENszw,1520
|
|
245
249
|
luminarycloud/params/geometry/__init__.py,sha256=X_XNImpQcZ3LaVsXab5jVI5R_0Ep6jyIDtCyok8GgOE,454
|
|
246
250
|
luminarycloud/params/geometry/geometry.py,sha256=MVKaHnIQ-iK04Mr69LwW08NQ909r-mMpr4J93URpWmw,629
|
|
@@ -279,7 +283,7 @@ luminarycloud/params/simulation/entity_relationships/volume_material_relationshi
|
|
|
279
283
|
luminarycloud/params/simulation/entity_relationships/volume_physics_relationship_.py,sha256=yFf7BchW_OYyiXp7KcMaEv2DH1nY5fj3ZXACphGxLvM,2076
|
|
280
284
|
luminarycloud/params/simulation/material/__init__.py,sha256=_wXdstxqZYBo4bopH00rl0wJJ_ltRnO3Kyzy9hGoKWs,106
|
|
281
285
|
luminarycloud/params/simulation/material/material_fluid_.py,sha256=AGBCnCt5-64giB7HeklEFegd1kW7iL1a4-zV2QbQ1Lw,15311
|
|
282
|
-
luminarycloud/params/simulation/material/material_solid_.py,sha256=
|
|
286
|
+
luminarycloud/params/simulation/material/material_solid_.py,sha256=0DyP_b7asi4gqwS99cL4I9NlnhGrZe2cunrB2EorJAY,3833
|
|
283
287
|
luminarycloud/params/simulation/material/fluid/__init__.py,sha256=_JggccSu5o-OUlthHLyDrR_mtb9O7fXv3gBAxxQ5mc8,356
|
|
284
288
|
luminarycloud/params/simulation/material/fluid/boussinesq_approximation_.py,sha256=Zj-jDu7pmB98SSOo0KGmlpMLjgsR76gtjj38HbK4yoo,1018
|
|
285
289
|
luminarycloud/params/simulation/material/fluid/material_model_.py,sha256=iaTNTnykmP8AWYvZyG4pXJ5f05BFpZFFUrLCULArV80,936
|
|
@@ -490,14 +494,15 @@ luminarycloud/params/simulation/time/time_step_ramp/__init__.py,sha256=fBLjMyx7n
|
|
|
490
494
|
luminarycloud/params/simulation/time/time_step_ramp/time_step_ramp_off_.py,sha256=K91Qd0rlNS8XvUF96et38VRbw_aCN-CSE8m8Ff17DIQ,1089
|
|
491
495
|
luminarycloud/params/simulation/time/time_step_ramp/time_step_ramp_on_.py,sha256=IYtJRE1urILLXfhCYcFhEExELObHgYzAeAmHDix_1Yc,1445
|
|
492
496
|
luminarycloud/physics_ai/__init__.py,sha256=zSdYA5L3kqGsCfHZVvbYpXd25j8CyAjaHZQFCaQp8ps,478
|
|
493
|
-
luminarycloud/physics_ai/architectures.py,sha256=
|
|
497
|
+
luminarycloud/physics_ai/architectures.py,sha256=hfU9F0qxfOOh3G85Bs3fABDJESHAtREK1RTuOkPZPQA,4393
|
|
494
498
|
luminarycloud/physics_ai/inference.py,sha256=Q9k1GAKio5GVLM0jMqvEWTfkA872V-8BfvGP1n_A4a4,7597
|
|
495
499
|
luminarycloud/physics_ai/models.py,sha256=USuz1LKbt4U3nRAYUYGQz7bRLhPIBnb3Q3xQwFam6Z0,2135
|
|
496
500
|
luminarycloud/physics_ai/solution.py,sha256=IdQFEobvCAu0HJ4KwWvvpUGfRktC6thPhALpoDEIDF0,2423
|
|
501
|
+
luminarycloud/physics_ai/training_jobs.py,sha256=e00WETgMqAps6N_PM8C3LmIcrUx3a-6UcwtfPbv1trs,1242
|
|
497
502
|
luminarycloud/pipeline_util/dictable.py,sha256=_YhxibnVCUqSpBH-IHBqvjiYlnAYMbuQv9dWK0eZn7Y,1073
|
|
498
503
|
luminarycloud/pipeline_util/yaml.py,sha256=RG3Gqv4ORaYX4lTyRVBsGVGE138zsxJIYzoWr4Aczrs,1883
|
|
499
504
|
luminarycloud/pipelines/__init__.py,sha256=bOu2XBDzOb5n9R5JwYFowLuLoSWXWW7I4mGm43cXdSs,1348
|
|
500
|
-
luminarycloud/pipelines/api.py,sha256=
|
|
505
|
+
luminarycloud/pipelines/api.py,sha256=ZA36tmDbOD--WqZP_aqKMew026SASfwn-RmqhtqUbX8,4454
|
|
501
506
|
luminarycloud/pipelines/arguments.py,sha256=cFbVzOumOUMzO4yB0aWblMH78fZvT-RMZEO-12EBWOs,3787
|
|
502
507
|
luminarycloud/pipelines/core.py,sha256=W_E8vLec2Sxi7LDGfEzkxFKrbDDnaxpD3BI3nBL4lpU,14754
|
|
503
508
|
luminarycloud/pipelines/operators.py,sha256=yYJ6SZu00zo73sSv3Hn5yfagBIKF9Z9r0ujg5b9uC08,5441
|
|
@@ -509,15 +514,17 @@ luminarycloud/types/adfloat.py,sha256=iSe08QPhQw-IK4j4GZcFM-OKlIHeLyKqUTLncIw2Iz
|
|
|
509
514
|
luminarycloud/types/ids.py,sha256=1N0K4xezmi2Dno8TH68tvBgZZCmqYUPbNKujudrzkNg,715
|
|
510
515
|
luminarycloud/types/matrix3.py,sha256=7E2CyDZBGL_YPiPyOKve2fhr0COL-7y2yJqqW70W7d8,922
|
|
511
516
|
luminarycloud/types/vector3.py,sha256=agzBz6_vBN6YzKQUlqB94BYOdOaFAbetJKqOtCthkDQ,3381
|
|
512
|
-
luminarycloud/vis/__init__.py,sha256=
|
|
513
|
-
luminarycloud/vis/data_extraction.py,sha256=
|
|
517
|
+
luminarycloud/vis/__init__.py,sha256=U-wbXLZn0pBmQaqLAMzyn0e-KJnWIe4UlvY25Hc9xys,1730
|
|
518
|
+
luminarycloud/vis/data_extraction.py,sha256=HSc4gSjXoH4jP_Fdot_qNCIuWA8D25hD_GkORy0xFfw,29599
|
|
514
519
|
luminarycloud/vis/display.py,sha256=VxnBtFTGjKINt2cMrJ_SbBI1y_csin9kMVqR5jsHpLo,10312
|
|
515
520
|
luminarycloud/vis/filters.py,sha256=WARUNUlx_fnuepGubMwbSRPOt56RBjBUVTYeRkqGv2c,48746
|
|
516
521
|
luminarycloud/vis/interactive_inference.py,sha256=5CyhmU4G2Iz6Ar8pczZVXivk_CniSQk8fmxCLb6BsCk,5943
|
|
517
|
-
luminarycloud/vis/
|
|
522
|
+
luminarycloud/vis/interactive_report.py,sha256=HmQgkxVx_4iiPrPFc3xMVbNmvOQjzf6pBY2To3TzirQ,5562
|
|
523
|
+
luminarycloud/vis/interactive_scene.py,sha256=RVQEvXcjKo-9kLlFAO-oASoYYjLEqDQF7WPyTPocEzo,10425
|
|
518
524
|
luminarycloud/vis/primitives.py,sha256=_EDSEAddSAFTRUU9at1Gxt-5chLO723f9c8V5atTeTg,4546
|
|
525
|
+
luminarycloud/vis/report.py,sha256=6CWDrwxs8oGKWh1RxzGfKLoxiv8AYHMOVx1bVc4W-zs,4231
|
|
519
526
|
luminarycloud/vis/vis_util.py,sha256=AWGmHcfYXGmfe5t5Jbb1Fqe2nxVdEQbBitCaWSeT89M,1821
|
|
520
|
-
luminarycloud/vis/visualization.py,sha256=
|
|
521
|
-
luminarycloud-0.
|
|
522
|
-
luminarycloud-0.
|
|
523
|
-
luminarycloud-0.
|
|
527
|
+
luminarycloud/vis/visualization.py,sha256=88egJE4-9hucD9VGZ79q38WSBIaSnwKg9Z8iHNP2nSQ,58643
|
|
528
|
+
luminarycloud-0.20.0.dist-info/METADATA,sha256=W86HkKKXtkJ_tm620JHAc3ytT6FLe-FCH61ebrBfeJQ,2574
|
|
529
|
+
luminarycloud-0.20.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
530
|
+
luminarycloud-0.20.0.dist-info/RECORD,,
|
|
File without changes
|