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.
Files changed (110) hide show
  1. luminarycloud/__init__.py +5 -1
  2. luminarycloud/_client/client.py +7 -0
  3. luminarycloud/_client/http_client.py +10 -8
  4. luminarycloud/_feature_flag.py +22 -0
  5. luminarycloud/_helpers/_create_simulation.py +7 -2
  6. luminarycloud/_helpers/_upload_mesh.py +1 -0
  7. luminarycloud/_helpers/_wait_for_mesh.py +6 -5
  8. luminarycloud/_helpers/_wait_for_simulation.py +3 -3
  9. luminarycloud/_helpers/download.py +3 -1
  10. luminarycloud/_helpers/pagination.py +62 -0
  11. luminarycloud/_helpers/proto_decorator.py +13 -5
  12. luminarycloud/_helpers/upload.py +18 -12
  13. luminarycloud/_proto/api/v0/luminarycloud/feature_flag/feature_flag_pb2.py +55 -0
  14. luminarycloud/_proto/api/v0/luminarycloud/feature_flag/feature_flag_pb2.pyi +52 -0
  15. luminarycloud/_proto/api/v0/luminarycloud/feature_flag/feature_flag_pb2_grpc.py +72 -0
  16. luminarycloud/_proto/api/v0/luminarycloud/feature_flag/feature_flag_pb2_grpc.pyi +35 -0
  17. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.py +168 -124
  18. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.pyi +133 -4
  19. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.py +66 -0
  20. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.pyi +20 -0
  21. luminarycloud/_proto/api/v0/luminarycloud/inference/inference_pb2.py +8 -8
  22. luminarycloud/_proto/api/v0/luminarycloud/inference/inference_pb2.pyi +5 -5
  23. luminarycloud/_proto/api/v0/luminarycloud/mesh/mesh_pb2.py +74 -73
  24. luminarycloud/_proto/api/v0/luminarycloud/mesh/mesh_pb2.pyi +17 -3
  25. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.py +96 -25
  26. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.pyi +235 -1
  27. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2_grpc.py +34 -0
  28. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2_grpc.pyi +12 -0
  29. luminarycloud/_proto/api/v0/luminarycloud/project/project_pb2.py +16 -16
  30. luminarycloud/_proto/api/v0/luminarycloud/project/project_pb2.pyi +7 -3
  31. luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2.py +97 -61
  32. luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2.pyi +77 -4
  33. luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2_grpc.py +34 -0
  34. luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2_grpc.pyi +12 -0
  35. luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2.py +33 -31
  36. luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2.pyi +23 -2
  37. luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.py +126 -27
  38. luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.pyi +183 -0
  39. luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2_grpc.py +99 -0
  40. luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2_grpc.pyi +30 -0
  41. luminarycloud/_proto/assistant/assistant_pb2.py +74 -41
  42. luminarycloud/_proto/assistant/assistant_pb2.pyi +64 -2
  43. luminarycloud/_proto/assistant/assistant_pb2_grpc.py +33 -0
  44. luminarycloud/_proto/assistant/assistant_pb2_grpc.pyi +10 -0
  45. luminarycloud/_proto/base/base_pb2.py +20 -7
  46. luminarycloud/_proto/base/base_pb2.pyi +38 -0
  47. luminarycloud/_proto/cad/shape_pb2.py +39 -19
  48. luminarycloud/_proto/cad/shape_pb2.pyi +86 -34
  49. luminarycloud/_proto/cad/transformation_pb2.py +60 -16
  50. luminarycloud/_proto/cad/transformation_pb2.pyi +138 -32
  51. luminarycloud/_proto/client/simulation_pb2.py +501 -348
  52. luminarycloud/_proto/client/simulation_pb2.pyi +607 -11
  53. luminarycloud/_proto/geometry/geometry_pb2.py +77 -63
  54. luminarycloud/_proto/geometry/geometry_pb2.pyi +42 -3
  55. luminarycloud/_proto/hexmesh/hexmesh_pb2.py +24 -18
  56. luminarycloud/_proto/hexmesh/hexmesh_pb2.pyi +23 -2
  57. luminarycloud/_proto/inferenceservice/inferenceservice_pb2.py +10 -10
  58. luminarycloud/_proto/inferenceservice/inferenceservice_pb2.pyi +5 -5
  59. luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2.py +29 -0
  60. luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2.pyi +7 -0
  61. luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2_grpc.py +70 -0
  62. luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2_grpc.pyi +30 -0
  63. luminarycloud/_proto/quantity/quantity_options_pb2.py +6 -6
  64. luminarycloud/_proto/quantity/quantity_options_pb2.pyi +10 -1
  65. luminarycloud/_proto/quantity/quantity_pb2.py +176 -167
  66. luminarycloud/_proto/quantity/quantity_pb2.pyi +11 -5
  67. luminarycloud/enum/__init__.py +1 -0
  68. luminarycloud/enum/gpu_type.py +2 -0
  69. luminarycloud/enum/quantity_type.py +9 -0
  70. luminarycloud/enum/vis_enums.py +23 -3
  71. luminarycloud/exceptions.py +7 -1
  72. luminarycloud/feature_modification.py +45 -35
  73. luminarycloud/geometry.py +107 -9
  74. luminarycloud/geometry_version.py +57 -3
  75. luminarycloud/mesh.py +1 -2
  76. luminarycloud/meshing/mesh_generation_params.py +8 -8
  77. luminarycloud/params/enum/_enum_wrappers.py +562 -30
  78. luminarycloud/params/simulation/adaptive_mesh_refinement_.py +4 -0
  79. luminarycloud/params/simulation/material/material_solid_.py +15 -1
  80. luminarycloud/params/simulation/physics/__init__.py +0 -1
  81. luminarycloud/params/simulation/physics/periodic_pair_.py +12 -31
  82. luminarycloud/physics_ai/architectures.py +58 -0
  83. luminarycloud/physics_ai/inference.py +13 -13
  84. luminarycloud/physics_ai/solution.py +3 -1
  85. luminarycloud/physics_ai/training_jobs.py +37 -0
  86. luminarycloud/pipelines/__init__.py +11 -3
  87. luminarycloud/pipelines/api.py +248 -16
  88. luminarycloud/pipelines/arguments.py +15 -0
  89. luminarycloud/pipelines/core.py +113 -96
  90. luminarycloud/pipelines/{operators.py → stages.py} +96 -39
  91. luminarycloud/project.py +15 -47
  92. luminarycloud/simulation.py +69 -5
  93. luminarycloud/simulation_param.py +0 -9
  94. luminarycloud/simulation_template.py +2 -1
  95. luminarycloud/types/matrix3.py +12 -0
  96. luminarycloud/vis/__init__.py +17 -0
  97. luminarycloud/vis/data_extraction.py +20 -4
  98. luminarycloud/vis/interactive_report.py +110 -0
  99. luminarycloud/vis/interactive_scene.py +29 -2
  100. luminarycloud/vis/report.py +252 -0
  101. luminarycloud/vis/visualization.py +127 -5
  102. luminarycloud/volume_selection.py +132 -69
  103. {luminarycloud-0.19.0.dist-info → luminarycloud-0.22.0.dist-info}/METADATA +1 -1
  104. {luminarycloud-0.19.0.dist-info → luminarycloud-0.22.0.dist-info}/RECORD +105 -97
  105. luminarycloud/params/simulation/physics/periodic_pair/__init__.py +0 -2
  106. luminarycloud/params/simulation/physics/periodic_pair/periodicity_type/__init__.py +0 -2
  107. luminarycloud/params/simulation/physics/periodic_pair/periodicity_type/rotational_periodicity_.py +0 -31
  108. luminarycloud/params/simulation/physics/periodic_pair/periodicity_type/translational_periodicity_.py +0 -29
  109. luminarycloud/params/simulation/physics/periodic_pair/periodicity_type_.py +0 -25
  110. {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 at constant pressure."
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,
@@ -1,6 +1,5 @@
1
1
  from . import fluid
2
2
  from . import heat
3
- from . import periodic_pair
4
3
  from . import solution_controls
5
4
  from .fluid_ import Fluid
6
5
  from .heat_ import Heat
@@ -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
- periodicity_type: PeriodicityType = field(default_factory=TranslationalPeriodicity)
43
- " Possible types: ``TranslationalPeriodicity``, ``RotationalPeriodicity`` from the ``periodicity_type`` module."
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
- if isinstance(self.periodicity_type, TranslationalPeriodicity):
54
- _proto.periodic_bc_type = clientpb.TRANSLATIONAL
55
- _proto.periodic_translation.CopyFrom(self.periodicity_type.translation._to_ad_proto())
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
- if proto.periodic_bc_type == clientpb.INVALID_PERIODIC_BC_TYPE:
69
- raise ValueError("Invalid periodicity_type")
70
- elif proto.periodic_bc_type == clientpb.TRANSLATIONAL:
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
- artifact_url: str,
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
- artifact_url : str
66
- Fullpath of the model artifact directory to be used for inference.
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, artifact_url, conditions, settings, write_visualization_data
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
- artifact_url: str,
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
- artifact_url : str
104
- Fullpath of the model artifact directory to be used for inference.
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, artifact_url, conditions, settings, write_visualization_data
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
- artifact_url: str,
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
- artifact_url : str
178
- URL of the model artifact directory to be used for inference.
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
- artifact_url=artifact_url,
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 .operators import (
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
  )