luminarycloud 0.19.0__py3-none-any.whl → 0.22.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/__init__.py +5 -1
- luminarycloud/_client/client.py +7 -0
- luminarycloud/_client/http_client.py +10 -8
- luminarycloud/_feature_flag.py +22 -0
- luminarycloud/_helpers/_create_simulation.py +7 -2
- luminarycloud/_helpers/_upload_mesh.py +1 -0
- luminarycloud/_helpers/_wait_for_mesh.py +6 -5
- luminarycloud/_helpers/_wait_for_simulation.py +3 -3
- luminarycloud/_helpers/download.py +3 -1
- luminarycloud/_helpers/pagination.py +62 -0
- luminarycloud/_helpers/proto_decorator.py +13 -5
- luminarycloud/_helpers/upload.py +18 -12
- luminarycloud/_proto/api/v0/luminarycloud/feature_flag/feature_flag_pb2.py +55 -0
- luminarycloud/_proto/api/v0/luminarycloud/feature_flag/feature_flag_pb2.pyi +52 -0
- luminarycloud/_proto/api/v0/luminarycloud/feature_flag/feature_flag_pb2_grpc.py +72 -0
- luminarycloud/_proto/api/v0/luminarycloud/feature_flag/feature_flag_pb2_grpc.pyi +35 -0
- luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.py +168 -124
- luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.pyi +133 -4
- luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.py +66 -0
- luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.pyi +20 -0
- luminarycloud/_proto/api/v0/luminarycloud/inference/inference_pb2.py +8 -8
- luminarycloud/_proto/api/v0/luminarycloud/inference/inference_pb2.pyi +5 -5
- luminarycloud/_proto/api/v0/luminarycloud/mesh/mesh_pb2.py +74 -73
- luminarycloud/_proto/api/v0/luminarycloud/mesh/mesh_pb2.pyi +17 -3
- luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.py +96 -25
- luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.pyi +235 -1
- 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/project/project_pb2.py +16 -16
- luminarycloud/_proto/api/v0/luminarycloud/project/project_pb2.pyi +7 -3
- luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2.py +97 -61
- luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2.pyi +77 -4
- luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2_grpc.py +34 -0
- luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2_grpc.pyi +12 -0
- luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2.py +33 -31
- luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2.pyi +23 -2
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.py +126 -27
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.pyi +183 -0
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2_grpc.py +99 -0
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2_grpc.pyi +30 -0
- luminarycloud/_proto/assistant/assistant_pb2.py +74 -41
- luminarycloud/_proto/assistant/assistant_pb2.pyi +64 -2
- luminarycloud/_proto/assistant/assistant_pb2_grpc.py +33 -0
- luminarycloud/_proto/assistant/assistant_pb2_grpc.pyi +10 -0
- luminarycloud/_proto/base/base_pb2.py +20 -7
- luminarycloud/_proto/base/base_pb2.pyi +38 -0
- luminarycloud/_proto/cad/shape_pb2.py +39 -19
- luminarycloud/_proto/cad/shape_pb2.pyi +86 -34
- luminarycloud/_proto/cad/transformation_pb2.py +60 -16
- luminarycloud/_proto/cad/transformation_pb2.pyi +138 -32
- luminarycloud/_proto/client/simulation_pb2.py +501 -348
- luminarycloud/_proto/client/simulation_pb2.pyi +607 -11
- luminarycloud/_proto/geometry/geometry_pb2.py +77 -63
- luminarycloud/_proto/geometry/geometry_pb2.pyi +42 -3
- luminarycloud/_proto/hexmesh/hexmesh_pb2.py +24 -18
- luminarycloud/_proto/hexmesh/hexmesh_pb2.pyi +23 -2
- luminarycloud/_proto/inferenceservice/inferenceservice_pb2.py +10 -10
- luminarycloud/_proto/inferenceservice/inferenceservice_pb2.pyi +5 -5
- 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/_proto/quantity/quantity_options_pb2.py +6 -6
- luminarycloud/_proto/quantity/quantity_options_pb2.pyi +10 -1
- luminarycloud/_proto/quantity/quantity_pb2.py +176 -167
- luminarycloud/_proto/quantity/quantity_pb2.pyi +11 -5
- luminarycloud/enum/__init__.py +1 -0
- luminarycloud/enum/gpu_type.py +2 -0
- luminarycloud/enum/quantity_type.py +9 -0
- luminarycloud/enum/vis_enums.py +23 -3
- luminarycloud/exceptions.py +7 -1
- luminarycloud/feature_modification.py +45 -35
- luminarycloud/geometry.py +107 -9
- luminarycloud/geometry_version.py +57 -3
- luminarycloud/mesh.py +1 -2
- luminarycloud/meshing/mesh_generation_params.py +8 -8
- luminarycloud/params/enum/_enum_wrappers.py +562 -30
- luminarycloud/params/simulation/adaptive_mesh_refinement_.py +4 -0
- luminarycloud/params/simulation/material/material_solid_.py +15 -1
- luminarycloud/params/simulation/physics/__init__.py +0 -1
- luminarycloud/params/simulation/physics/periodic_pair_.py +12 -31
- luminarycloud/physics_ai/architectures.py +58 -0
- luminarycloud/physics_ai/inference.py +13 -13
- luminarycloud/physics_ai/solution.py +3 -1
- luminarycloud/physics_ai/training_jobs.py +37 -0
- luminarycloud/pipelines/__init__.py +11 -3
- luminarycloud/pipelines/api.py +248 -16
- luminarycloud/pipelines/arguments.py +15 -0
- luminarycloud/pipelines/core.py +113 -96
- luminarycloud/pipelines/{operators.py → stages.py} +96 -39
- luminarycloud/project.py +15 -47
- luminarycloud/simulation.py +69 -5
- luminarycloud/simulation_param.py +0 -9
- luminarycloud/simulation_template.py +2 -1
- luminarycloud/types/matrix3.py +12 -0
- luminarycloud/vis/__init__.py +17 -0
- luminarycloud/vis/data_extraction.py +20 -4
- luminarycloud/vis/interactive_report.py +110 -0
- luminarycloud/vis/interactive_scene.py +29 -2
- luminarycloud/vis/report.py +252 -0
- luminarycloud/vis/visualization.py +127 -5
- luminarycloud/volume_selection.py +132 -69
- {luminarycloud-0.19.0.dist-info → luminarycloud-0.22.0.dist-info}/METADATA +1 -1
- {luminarycloud-0.19.0.dist-info → luminarycloud-0.22.0.dist-info}/RECORD +105 -97
- luminarycloud/params/simulation/physics/periodic_pair/__init__.py +0 -2
- luminarycloud/params/simulation/physics/periodic_pair/periodicity_type/__init__.py +0 -2
- luminarycloud/params/simulation/physics/periodic_pair/periodicity_type/rotational_periodicity_.py +0 -31
- luminarycloud/params/simulation/physics/periodic_pair/periodicity_type/translational_periodicity_.py +0 -29
- luminarycloud/params/simulation/physics/periodic_pair/periodicity_type_.py +0 -25
- {luminarycloud-0.19.0.dist-info → luminarycloud-0.22.0.dist-info}/WHEEL +0 -0
|
@@ -41,6 +41,8 @@ class AdaptiveMeshRefinement(CodeRepr, ParamGroupWrapper[clientpb.AdaptiveMeshRe
|
|
|
41
41
|
"The method to generate the computational mesh."
|
|
42
42
|
target_cv_millions: int = 10
|
|
43
43
|
"User-requested mesh size in millions of control volumes."
|
|
44
|
+
all_tet: enum.AllTet = enum.AllTet.ALL_TET_ON
|
|
45
|
+
"Automatically inserts high aspect ratio mesh elements in the boundary layer and ignores all adaptation boundary layer settings."
|
|
44
46
|
user_scaling: LcFloat = 1.0
|
|
45
47
|
"Scale factor between the geometry and the mesh."
|
|
46
48
|
boundary_layer_profile: list[BoundaryLayerProfile] = field(default_factory=list)
|
|
@@ -55,6 +57,7 @@ class AdaptiveMeshRefinement(CodeRepr, ParamGroupWrapper[clientpb.AdaptiveMeshRe
|
|
|
55
57
|
_proto.final_target_complexity.CopyFrom(_to_ad_proto(self.final_target_complexity))
|
|
56
58
|
_proto.meshing_method = self.meshing_method.value
|
|
57
59
|
_proto.target_cv_millions.value = self.target_cv_millions
|
|
60
|
+
_proto.all_tet = self.all_tet.value
|
|
58
61
|
_proto.user_scaling.CopyFrom(_to_ad_proto(self.user_scaling))
|
|
59
62
|
if self.boundary_layer_profile is not None:
|
|
60
63
|
_proto.boundary_layer_profile.extend(v._to_proto() for v in self.boundary_layer_profile)
|
|
@@ -68,6 +71,7 @@ class AdaptiveMeshRefinement(CodeRepr, ParamGroupWrapper[clientpb.AdaptiveMeshRe
|
|
|
68
71
|
self.final_target_complexity = _from_ad_proto(proto.final_target_complexity)
|
|
69
72
|
self.meshing_method = enum.MeshingMethod(proto.meshing_method)
|
|
70
73
|
self.target_cv_millions = proto.target_cv_millions.value
|
|
74
|
+
self.all_tet = enum.AllTet(proto.all_tet)
|
|
71
75
|
self.user_scaling = _from_ad_proto(proto.user_scaling)
|
|
72
76
|
self.boundary_layer_profile = [
|
|
73
77
|
BoundaryLayerProfile.from_proto(v) for v in proto.boundary_layer_profile
|
|
@@ -25,9 +25,15 @@ class MaterialSolid(CodeRepr, ParamGroupWrapper[clientpb.MaterialSolid]):
|
|
|
25
25
|
density: LcFloat = 2700
|
|
26
26
|
"Constant density value."
|
|
27
27
|
specific_heat_cp: LcFloat = 896
|
|
28
|
-
"Specific heat
|
|
28
|
+
"Specific heat."
|
|
29
|
+
conductivity_model: enum.ThermalConductivityModelSolid = (
|
|
30
|
+
enum.ThermalConductivityModelSolid.ISOTROPIC_CONDUCTIVITY
|
|
31
|
+
)
|
|
32
|
+
"Uniform or direction-dependent conductivity models."
|
|
29
33
|
thermal_conductivity: LcFloat = 167
|
|
30
34
|
"The thermal conductivity of the material."
|
|
35
|
+
orthotropic_conductivity: Vector3 = field(default_factory=lambda: Vector3(167, 167, 167))
|
|
36
|
+
"The thermal conductivities of the material along each axis."
|
|
31
37
|
thermal_conductivity_table: RectilinearTable | None = None
|
|
32
38
|
"Correlation between thermal conductivity and temperature."
|
|
33
39
|
preset: enum.MaterialSolidPreset = enum.MaterialSolidPreset.ALUMINUM
|
|
@@ -37,7 +43,11 @@ class MaterialSolid(CodeRepr, ParamGroupWrapper[clientpb.MaterialSolid]):
|
|
|
37
43
|
_proto = clientpb.MaterialSolid()
|
|
38
44
|
_proto.constant_density_value_solid.CopyFrom(_to_ad_proto(self.density))
|
|
39
45
|
_proto.specific_heat_cp_solid.CopyFrom(_to_ad_proto(self.specific_heat_cp))
|
|
46
|
+
_proto.thermal_conductivity_model_solid = self.conductivity_model.value
|
|
40
47
|
_proto.thermal_conductivity_constant_solid.CopyFrom(_to_ad_proto(self.thermal_conductivity))
|
|
48
|
+
_proto.thermal_conductivity_orthotropic_solid.CopyFrom(
|
|
49
|
+
self.orthotropic_conductivity._to_ad_proto()
|
|
50
|
+
)
|
|
41
51
|
if self.thermal_conductivity_table is not None:
|
|
42
52
|
if self.thermal_conductivity_table.table_type != _param_name_to_table_type(
|
|
43
53
|
"thermal_conductivity_table_data"
|
|
@@ -50,7 +60,11 @@ class MaterialSolid(CodeRepr, ParamGroupWrapper[clientpb.MaterialSolid]):
|
|
|
50
60
|
def _from_proto(self, proto: clientpb.MaterialSolid) -> None:
|
|
51
61
|
self.density = _from_ad_proto(proto.constant_density_value_solid)
|
|
52
62
|
self.specific_heat_cp = _from_ad_proto(proto.specific_heat_cp_solid)
|
|
63
|
+
self.conductivity_model = enum.ThermalConductivityModelSolid(
|
|
64
|
+
proto.thermal_conductivity_model_solid
|
|
65
|
+
)
|
|
53
66
|
self.thermal_conductivity = _from_ad_proto(proto.thermal_conductivity_constant_solid)
|
|
67
|
+
self.orthotropic_conductivity._from_ad_proto(proto.thermal_conductivity_orthotropic_solid)
|
|
54
68
|
if proto.thermal_conductivity_table_data != "":
|
|
55
69
|
self.thermal_conductivity_table = RectilinearTable(
|
|
56
70
|
id=proto.thermal_conductivity_table_data,
|
|
@@ -17,17 +17,6 @@ import luminarycloud.params.enum._enum_wrappers as enum
|
|
|
17
17
|
|
|
18
18
|
from luminarycloud.params.simulation._lib import ParamGroupWrapper, create_unique_id
|
|
19
19
|
|
|
20
|
-
from luminarycloud.params.simulation.physics.periodic_pair.periodicity_type_ import PeriodicityType
|
|
21
|
-
from luminarycloud.params.simulation.physics.periodic_pair.periodicity_type_ import *
|
|
22
|
-
from luminarycloud.params.simulation.physics.periodic_pair.periodicity_type.rotational_periodicity_ import (
|
|
23
|
-
RotationalPeriodicity,
|
|
24
|
-
)
|
|
25
|
-
from luminarycloud.params.simulation.physics.periodic_pair.periodicity_type.rotational_periodicity_ import *
|
|
26
|
-
from luminarycloud.params.simulation.physics.periodic_pair.periodicity_type.translational_periodicity_ import (
|
|
27
|
-
TranslationalPeriodicity,
|
|
28
|
-
)
|
|
29
|
-
from luminarycloud.params.simulation.physics.periodic_pair.periodicity_type.translational_periodicity_ import *
|
|
30
|
-
|
|
31
20
|
|
|
32
21
|
@dataclass(kw_only=True)
|
|
33
22
|
class PeriodicPair(CodeRepr, ParamGroupWrapper[clientpb.PeriodicPair]):
|
|
@@ -39,8 +28,12 @@ class PeriodicPair(CodeRepr, ParamGroupWrapper[clientpb.PeriodicPair]):
|
|
|
39
28
|
""
|
|
40
29
|
surfaces_side_b: list[str] = field(default_factory=list)
|
|
41
30
|
""
|
|
42
|
-
|
|
43
|
-
"
|
|
31
|
+
translation: Vector3 = field(default_factory=lambda: Vector3(0.0, 0.0, 0.0))
|
|
32
|
+
"Holds the translation vector in the x,y,z directions from each point on the first periodic boundary to its matching point on the second periodic boundary."
|
|
33
|
+
center: Vector3 = field(default_factory=lambda: Vector3(0.0, 0.0, 0.0))
|
|
34
|
+
"Origin for the rotational periodicity transformation."
|
|
35
|
+
rotation_vector: Vector3 = field(default_factory=lambda: Vector3(0.0, 0.0, 0.0))
|
|
36
|
+
"Holds the rotation vector needed to transform each point on the first periodic boundary to its matching point on the second periodic boundary. The vector direction defines the periodicity axis and its magnitude defines the periodicity angle, in degrees, from A to B according to the right-hand rule."
|
|
44
37
|
|
|
45
38
|
def _to_proto(self) -> clientpb.PeriodicPair:
|
|
46
39
|
_proto = clientpb.PeriodicPair()
|
|
@@ -50,28 +43,16 @@ class PeriodicPair(CodeRepr, ParamGroupWrapper[clientpb.PeriodicPair]):
|
|
|
50
43
|
_proto.bound_a.extend(self.surfaces_side_a)
|
|
51
44
|
if self.surfaces_side_b is not None:
|
|
52
45
|
_proto.bound_b.extend(self.surfaces_side_b)
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
if isinstance(self.periodicity_type, RotationalPeriodicity):
|
|
57
|
-
_proto.periodic_bc_type = clientpb.ROTATIONAL
|
|
58
|
-
_proto.periodic_center_of_rotation.CopyFrom(self.periodicity_type.center._to_ad_proto())
|
|
59
|
-
_proto.periodic_rotation_angles.CopyFrom(
|
|
60
|
-
self.periodicity_type.rotation_vector._to_ad_proto()
|
|
61
|
-
)
|
|
46
|
+
_proto.periodic_translation.CopyFrom(self.translation._to_ad_proto())
|
|
47
|
+
_proto.periodic_center_of_rotation.CopyFrom(self.center._to_ad_proto())
|
|
48
|
+
_proto.periodic_rotation_angles.CopyFrom(self.rotation_vector._to_ad_proto())
|
|
62
49
|
return _proto
|
|
63
50
|
|
|
64
51
|
def _from_proto(self, proto: clientpb.PeriodicPair) -> None:
|
|
65
52
|
self.name = proto.periodic_pair_name
|
|
66
53
|
self.surfaces_side_a.extend(proto.bound_a)
|
|
67
54
|
self.surfaces_side_b.extend(proto.bound_b)
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
self.periodicity_type = TranslationalPeriodicity()
|
|
72
|
-
self.periodicity_type.translation._from_ad_proto(proto.periodic_translation)
|
|
73
|
-
elif proto.periodic_bc_type == clientpb.ROTATIONAL:
|
|
74
|
-
self.periodicity_type = RotationalPeriodicity()
|
|
75
|
-
self.periodicity_type.center._from_ad_proto(proto.periodic_center_of_rotation)
|
|
76
|
-
self.periodicity_type.rotation_vector._from_ad_proto(proto.periodic_rotation_angles)
|
|
55
|
+
self.translation._from_ad_proto(proto.periodic_translation)
|
|
56
|
+
self.center._from_ad_proto(proto.periodic_center_of_rotation)
|
|
57
|
+
self.rotation_vector._from_ad_proto(proto.periodic_rotation_angles)
|
|
77
58
|
return None
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# Copyright 2025 Luminary Cloud, Inc. All Rights Reserved.
|
|
2
2
|
from typing import List, Optional
|
|
3
|
+
import json
|
|
3
4
|
|
|
4
5
|
from .._client import get_default_client
|
|
5
6
|
from .._proto.api.v0.luminarycloud.physics_ai import physics_ai_pb2 as physaipb
|
|
@@ -7,6 +8,8 @@ from .._wrapper import ProtoWrapper, ProtoWrapperBase
|
|
|
7
8
|
from ..types.ids import PhysicsAiArchitectureID, PhysicsAiArchitectureVersionID
|
|
8
9
|
from ..enum.physics_ai_lifecycle_state import PhysicsAiLifecycleState
|
|
9
10
|
|
|
11
|
+
from .training_jobs import PhysicsAiTrainingJob
|
|
12
|
+
|
|
10
13
|
|
|
11
14
|
@ProtoWrapper(physaipb.PhysicsAiArchitectureVersion)
|
|
12
15
|
class PhysicsAiArchitectureVersion(ProtoWrapperBase):
|
|
@@ -18,10 +21,65 @@ class PhysicsAiArchitectureVersion(ProtoWrapperBase):
|
|
|
18
21
|
|
|
19
22
|
id: PhysicsAiArchitectureVersionID
|
|
20
23
|
name: str
|
|
24
|
+
architecture_name: str
|
|
21
25
|
changelog: str
|
|
22
26
|
lifecycle_state: PhysicsAiLifecycleState
|
|
23
27
|
_proto: physaipb.PhysicsAiArchitectureVersion
|
|
24
28
|
|
|
29
|
+
def get_training_description(self, config: dict) -> str:
|
|
30
|
+
if config.get("description"):
|
|
31
|
+
return config["description"]
|
|
32
|
+
|
|
33
|
+
desc = f"Training job for architecture {self.name}"
|
|
34
|
+
if config.get("custom_args"):
|
|
35
|
+
desc += f" with custom args: {config['custom_args']}"
|
|
36
|
+
return desc
|
|
37
|
+
|
|
38
|
+
def train(self, config: dict) -> PhysicsAiTrainingJob:
|
|
39
|
+
"""
|
|
40
|
+
Submit a training job for this architecture version.
|
|
41
|
+
|
|
42
|
+
Parameters
|
|
43
|
+
----------
|
|
44
|
+
config : dict, optional
|
|
45
|
+
Training configuration dictionary
|
|
46
|
+
|
|
47
|
+
Returns
|
|
48
|
+
-------
|
|
49
|
+
PhysicsAiTrainingJob
|
|
50
|
+
The submitted training job object
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
if "custom_args" not in config:
|
|
54
|
+
config["custom_args"] = ""
|
|
55
|
+
if "priority_class" not in config:
|
|
56
|
+
config["priority_class"] = "prod-batch-priority"
|
|
57
|
+
if "resources" not in config:
|
|
58
|
+
config["resources"] = {}
|
|
59
|
+
if "process_cpus" not in config["resources"]:
|
|
60
|
+
config["resources"]["process_cpus"] = 8
|
|
61
|
+
if "train_gpus" not in config["resources"]:
|
|
62
|
+
config["resources"]["train_gpus"] = 1
|
|
63
|
+
if "test_gpus" not in config["resources"]:
|
|
64
|
+
config["resources"]["test_gpus"] = 1
|
|
65
|
+
if "mode" not in config:
|
|
66
|
+
config["mode"] = "full"
|
|
67
|
+
|
|
68
|
+
training_config_json = json.dumps(config, indent=2)
|
|
69
|
+
external_dataset_uri = f"gs://training-data/architecture-{self.id}"
|
|
70
|
+
req = physaipb.SubmitTrainingJobRequest(
|
|
71
|
+
architecture_version_id=self.id,
|
|
72
|
+
training_description=self.get_training_description(config),
|
|
73
|
+
external_dataset_uri=external_dataset_uri,
|
|
74
|
+
training_config=training_config_json,
|
|
75
|
+
initialization_type=physaipb.MODEL_INITIALIZATION_TYPE_RANDOM,
|
|
76
|
+
base_model_version_id="",
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
response = get_default_client().SubmitTrainingJob(req)
|
|
80
|
+
|
|
81
|
+
return PhysicsAiTrainingJob(response.training_job)
|
|
82
|
+
|
|
25
83
|
|
|
26
84
|
@ProtoWrapper(physaipb.PhysicsAiArchitecture)
|
|
27
85
|
class PhysicsAiArchitecture(ProtoWrapperBase):
|
|
@@ -17,6 +17,7 @@ from ..project import Project
|
|
|
17
17
|
from ..project import Project
|
|
18
18
|
from .._helpers import upload_file
|
|
19
19
|
from .._proto.upload import upload_pb2 as uploadpb
|
|
20
|
+
from ..types.ids import PhysicsAiModelVersionID
|
|
20
21
|
|
|
21
22
|
|
|
22
23
|
@dataclass
|
|
@@ -50,7 +51,7 @@ class ExtAeroInferenceResult:
|
|
|
50
51
|
def external_aero_inference(
|
|
51
52
|
project: Project,
|
|
52
53
|
stl_file: str,
|
|
53
|
-
|
|
54
|
+
model_version_id: PhysicsAiModelVersionID,
|
|
54
55
|
conditions: Optional[Dict[str, Any]] = None,
|
|
55
56
|
settings: Optional[Dict[str, Any]] = None,
|
|
56
57
|
write_visualization_data=False,
|
|
@@ -62,8 +63,8 @@ def external_aero_inference(
|
|
|
62
63
|
The project to which the inference files will be added.
|
|
63
64
|
stl_file : str
|
|
64
65
|
Fullpath the STL file to be used for inference.
|
|
65
|
-
|
|
66
|
-
|
|
66
|
+
model_version_id : PhysicsAiModelVersionID
|
|
67
|
+
The ID of the trained model version to use for inference.
|
|
67
68
|
conditions : Dict[str, Any], optional
|
|
68
69
|
Dictionary of conditions to be passed to the inference service (e.g., alpha, beta, etc.).
|
|
69
70
|
settings : Dict[str, Any], optional
|
|
@@ -80,7 +81,7 @@ def external_aero_inference(
|
|
|
80
81
|
"""
|
|
81
82
|
|
|
82
83
|
result = perform_inference(
|
|
83
|
-
project, stl_file,
|
|
84
|
+
project, stl_file, model_version_id, conditions, settings, write_visualization_data
|
|
84
85
|
)
|
|
85
86
|
return ExtAeroInferenceResult(result)
|
|
86
87
|
|
|
@@ -88,7 +89,7 @@ def external_aero_inference(
|
|
|
88
89
|
def perform_inference(
|
|
89
90
|
project: Project,
|
|
90
91
|
stl_file: str,
|
|
91
|
-
|
|
92
|
+
model_version_id: PhysicsAiModelVersionID,
|
|
92
93
|
conditions: Optional[Dict[str, Any]] = None,
|
|
93
94
|
settings: Optional[Dict[str, Any]] = None,
|
|
94
95
|
write_visualization_data=False,
|
|
@@ -100,8 +101,8 @@ def perform_inference(
|
|
|
100
101
|
The project to which the inference files will be added.
|
|
101
102
|
stl_file : str
|
|
102
103
|
Fullpath the STL file to be used for inference.
|
|
103
|
-
|
|
104
|
-
|
|
104
|
+
model_version_id : PhysicsAiModelVersionID
|
|
105
|
+
The ID of the trained model version to use for inference.
|
|
105
106
|
conditions : Dict[str, Any], optional
|
|
106
107
|
Dictionary of conditions to be passed to the inference service (e.g., alpha, beta, etc.).
|
|
107
108
|
settings : Dict[str, Any], optional
|
|
@@ -142,7 +143,7 @@ def perform_inference(
|
|
|
142
143
|
stl_url = upload_if_file(stl_file)
|
|
143
144
|
|
|
144
145
|
raw = start_inference_job(
|
|
145
|
-
project, stl_url,
|
|
146
|
+
project, stl_url, model_version_id, conditions, settings, write_visualization_data
|
|
146
147
|
)
|
|
147
148
|
currated: dict[str, Any] = {}
|
|
148
149
|
for k, v in raw.items():
|
|
@@ -162,7 +163,7 @@ def perform_inference(
|
|
|
162
163
|
def start_inference_job(
|
|
163
164
|
project: Project,
|
|
164
165
|
stl_url: str,
|
|
165
|
-
|
|
166
|
+
model_version_id: PhysicsAiModelVersionID,
|
|
166
167
|
conditions: Optional[Dict[str, Any]] = None,
|
|
167
168
|
settings: Optional[Dict[str, Any]] = None,
|
|
168
169
|
write_visualization_data=False,
|
|
@@ -174,8 +175,8 @@ def start_inference_job(
|
|
|
174
175
|
Reference to a project.
|
|
175
176
|
stl_url : str
|
|
176
177
|
URL of the STL file to be used for inference.
|
|
177
|
-
|
|
178
|
-
|
|
178
|
+
model_version_id : PhysicsAiModelVersionID
|
|
179
|
+
The ID of the trained model version to use for inference.
|
|
179
180
|
conditions : Dict[str, Any], optional
|
|
180
181
|
Dictionary of conditions to be passed to the inference service (e.g., alpha, beta, etc.).
|
|
181
182
|
settings : Dict[str, Any], optional
|
|
@@ -203,13 +204,12 @@ def start_inference_job(
|
|
|
203
204
|
|
|
204
205
|
req = inferencepb.CreateInferenceServiceJobRequest(
|
|
205
206
|
stl_url=stl_url,
|
|
206
|
-
|
|
207
|
+
model_version_id=str(model_version_id),
|
|
207
208
|
conditions=conditions_bytes,
|
|
208
209
|
settings=settings_bytes,
|
|
209
210
|
project_id=project.id,
|
|
210
211
|
write_visualization_data=write_visualization_data,
|
|
211
212
|
)
|
|
212
|
-
|
|
213
213
|
res: inferencepb.CreateInferenceServiceJobResponse = (
|
|
214
214
|
get_default_client().CreateInferenceServiceJob(req)
|
|
215
215
|
)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import tarfile
|
|
4
|
-
from typing import List, Optional, BinaryIO, cast
|
|
4
|
+
from typing import List, Optional, BinaryIO, cast, Dict
|
|
5
5
|
|
|
6
6
|
from .._client import get_default_client
|
|
7
7
|
from .._helpers.download import download_solution_physics_ai as _download_solution_physics_ai
|
|
@@ -16,6 +16,7 @@ def _download_processed_solution_physics_ai( # noqa: F841
|
|
|
16
16
|
volume_fields_to_keep: Optional[List[QuantityType]] = None,
|
|
17
17
|
process_volume: bool = False,
|
|
18
18
|
single_precision: bool = True,
|
|
19
|
+
internal_options: Optional[Dict[str, str]] = None,
|
|
19
20
|
) -> tarfile.TarFile:
|
|
20
21
|
"""
|
|
21
22
|
Download solution data with physics AI processing applied.
|
|
@@ -50,6 +51,7 @@ def _download_processed_solution_physics_ai( # noqa: F841
|
|
|
50
51
|
volume_fields_to_keep=volume_fields_to_keep,
|
|
51
52
|
process_volume=process_volume,
|
|
52
53
|
single_precision=single_precision,
|
|
54
|
+
internal_options=internal_options,
|
|
53
55
|
)
|
|
54
56
|
|
|
55
57
|
assert stream is not None, "Failed to download solution data"
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Copyright 2025 Luminary Cloud, Inc. All Rights Reserved.
|
|
2
|
+
from typing import List, Optional
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
|
|
5
|
+
from .._client import get_default_client
|
|
6
|
+
from .._proto.api.v0.luminarycloud.physics_ai import physics_ai_pb2 as physaipb
|
|
7
|
+
from .._proto.base import base_pb2 as basepb
|
|
8
|
+
from .._wrapper import ProtoWrapper, ProtoWrapperBase
|
|
9
|
+
from ..types.ids import PhysicsAiArchitectureVersionID
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@ProtoWrapper(physaipb.PhysicsAiTrainingJob)
|
|
13
|
+
class PhysicsAiTrainingJob(ProtoWrapperBase):
|
|
14
|
+
"""
|
|
15
|
+
Represents a Physics AI training job.
|
|
16
|
+
|
|
17
|
+
.. warning:: This feature is experimental and may change or be removed without notice.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
id: str
|
|
21
|
+
architecture_version_id: PhysicsAiArchitectureVersionID
|
|
22
|
+
user_id: str
|
|
23
|
+
training_config: str
|
|
24
|
+
training_data_source_type: physaipb.TrainingDataSourceType
|
|
25
|
+
training_description: str
|
|
26
|
+
external_dataset_uri: str
|
|
27
|
+
initialization_type: physaipb.ModelInitializationType
|
|
28
|
+
base_model_version_id: str
|
|
29
|
+
status: basepb.JobStatus
|
|
30
|
+
error_message: str
|
|
31
|
+
output_model_version_id: str
|
|
32
|
+
creation_time: datetime
|
|
33
|
+
update_time: datetime
|
|
34
|
+
_proto: physaipb.PhysicsAiTrainingJob
|
|
35
|
+
|
|
36
|
+
def get_status(self) -> str:
|
|
37
|
+
return basepb.JobStatusType.Name(self.status.typ)
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
from .core import (
|
|
3
3
|
Pipeline as Pipeline,
|
|
4
4
|
PipelineParameter as PipelineParameter,
|
|
5
|
+
# Stage base class, mainly exported for testing
|
|
6
|
+
Stage as Stage,
|
|
5
7
|
)
|
|
6
8
|
|
|
7
9
|
from .parameters import (
|
|
@@ -11,9 +13,7 @@ from .parameters import (
|
|
|
11
13
|
BoolPipelineParameter as BoolPipelineParameter,
|
|
12
14
|
)
|
|
13
15
|
|
|
14
|
-
from .
|
|
15
|
-
# Operator base class, mainly exported for testing
|
|
16
|
-
Operator as Operator,
|
|
16
|
+
from .stages import (
|
|
17
17
|
# PipelineOutputs, i.e. things that "flow" in a Pipeline
|
|
18
18
|
PipelineOutputGeometry as PipelineOutputGeometry,
|
|
19
19
|
PipelineOutputMesh as PipelineOutputMesh,
|
|
@@ -21,6 +21,8 @@ from .operators import (
|
|
|
21
21
|
# Concrete operators and their output types
|
|
22
22
|
ReadGeometry as ReadGeometry,
|
|
23
23
|
ReadGeometryOutputs as ReadGeometryOutputs,
|
|
24
|
+
ReadMesh as ReadMesh,
|
|
25
|
+
ReadMeshOutputs as ReadMeshOutputs,
|
|
24
26
|
ModifyGeometry as ModifyGeometry,
|
|
25
27
|
ModifyGeometryOutputs as ModifyGeometryOutputs,
|
|
26
28
|
Mesh as Mesh,
|
|
@@ -39,4 +41,10 @@ from .api import (
|
|
|
39
41
|
list_pipelines as list_pipelines,
|
|
40
42
|
get_pipeline as get_pipeline,
|
|
41
43
|
create_pipeline_job as create_pipeline_job,
|
|
44
|
+
get_pipeline_job as get_pipeline_job,
|
|
45
|
+
list_pipeline_jobs as list_pipeline_jobs,
|
|
46
|
+
PipelineJobRecord as PipelineJobRecord,
|
|
47
|
+
PipelineRecord as PipelineRecord,
|
|
48
|
+
PipelineJobRunRecord as PipelineJobRunRecord,
|
|
49
|
+
LogLine as LogLine,
|
|
42
50
|
)
|