luminarycloud 0.15.2__py3-none-any.whl → 0.15.4__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 +1 -0
- luminarycloud/_helpers/_code_representation.py +44 -19
- luminarycloud/_helpers/_create_simulation.py +2 -0
- luminarycloud/_helpers/_entity_identifier.py +6 -0
- luminarycloud/_helpers/named_variables.py +6 -15
- luminarycloud/_helpers/warnings/experimental.py +6 -2
- luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.py +103 -81
- luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.pyi +37 -1
- luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.py +33 -0
- luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.pyi +10 -0
- luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.py +45 -15
- luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.pyi +104 -22
- luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2.py +46 -46
- luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2.pyi +7 -1
- luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2.py +12 -12
- luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2.pyi +10 -2
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.py +221 -143
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.pyi +154 -7
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2_grpc.py +33 -0
- luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2_grpc.pyi +10 -0
- luminarycloud/_proto/assistant/assistant_pb2.py +92 -71
- luminarycloud/_proto/assistant/assistant_pb2.pyi +58 -11
- luminarycloud/_proto/assistant/assistant_pb2_grpc.py +47 -13
- luminarycloud/_proto/assistant/assistant_pb2_grpc.pyi +18 -6
- luminarycloud/_proto/client/simulation_pb2.py +373 -324
- luminarycloud/_proto/client/simulation_pb2.pyi +123 -3
- luminarycloud/_proto/fvm/solver_results_pb2.py +25 -11
- luminarycloud/_proto/fvm/solver_results_pb2.pyi +24 -1
- luminarycloud/_proto/geometry/geometry_pb2.py +64 -63
- luminarycloud/_proto/geometry/geometry_pb2.pyi +11 -3
- luminarycloud/_proto/hexmesh/hexmesh_pb2.py +18 -14
- luminarycloud/_proto/hexmesh/hexmesh_pb2.pyi +14 -4
- luminarycloud/_proto/named_variable_set/named_variable_set_pb2.py +49 -0
- luminarycloud/_proto/named_variable_set/named_variable_set_pb2.pyi +53 -0
- luminarycloud/_proto/namedvariableset/namedvariableset_pb2.py +49 -0
- luminarycloud/_proto/namedvariableset/namedvariableset_pb2.pyi +53 -0
- luminarycloud/_proto/quantity/quantity_pb2.py +8 -5
- luminarycloud/_proto/quantity/quantity_pb2.pyi +2 -0
- luminarycloud/_wrapper.py +26 -7
- luminarycloud/enum/__init__.py +5 -0
- luminarycloud/enum/physics_ai_lifecycle_state.py +30 -0
- luminarycloud/enum/quantity_type.py +43 -0
- luminarycloud/enum/vis_enums.py +6 -2
- luminarycloud/geometry.py +46 -2
- luminarycloud/meshing/mesh_generation_params.py +6 -5
- luminarycloud/meshing/sizing_strategy/sizing_strategies.py +2 -1
- luminarycloud/named_variable_set.py +13 -6
- luminarycloud/params/enum/_enum_wrappers.py +68 -0
- luminarycloud/params/simulation/_lib.py +1 -1
- luminarycloud/params/simulation/adaptive_mesh_refinement/boundary_layer_profile_.py +5 -6
- luminarycloud/params/simulation/adaptive_mesh_refinement_.py +6 -7
- luminarycloud/params/simulation/adjoint_.py +3 -4
- luminarycloud/params/simulation/basic/gravity/gravity_off_.py +3 -4
- luminarycloud/params/simulation/basic/gravity/gravity_on_.py +3 -4
- luminarycloud/params/simulation/basic/gravity_.py +3 -4
- luminarycloud/params/simulation/body_frame_.py +3 -4
- luminarycloud/params/simulation/entity_relationships/volume_material_relationship_.py +9 -6
- luminarycloud/params/simulation/entity_relationships/volume_physics_relationship_.py +9 -6
- luminarycloud/params/simulation/entity_relationships_.py +3 -4
- luminarycloud/params/simulation/general_.py +3 -4
- luminarycloud/params/simulation/material/fluid/boussinesq_approximation/boussinesq_off_.py +3 -4
- luminarycloud/params/simulation/material/fluid/boussinesq_approximation/boussinesq_on_.py +5 -6
- luminarycloud/params/simulation/material/fluid/boussinesq_approximation_.py +3 -4
- luminarycloud/params/simulation/material/fluid/material_model/ideal_gas_.py +5 -6
- luminarycloud/params/simulation/material/fluid/material_model/incompressible_fluid_.py +4 -5
- luminarycloud/params/simulation/material/fluid/material_model/incompressible_fluid_with_energy_.py +5 -6
- luminarycloud/params/simulation/material/fluid/material_model_.py +3 -4
- luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/prescribed_conductivity_.py +4 -5
- luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/prescribed_prandtl_number_.py +4 -5
- luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/temperature_dependent_conductivity_.py +3 -4
- luminarycloud/params/simulation/material/fluid/thermal_conductivity_model_.py +3 -4
- luminarycloud/params/simulation/material/fluid/viscosity_model/prescribed_viscosity_.py +4 -5
- luminarycloud/params/simulation/material/fluid/viscosity_model/sutherland_.py +6 -7
- luminarycloud/params/simulation/material/fluid/viscosity_model/temperature_dependent_viscosity_.py +3 -4
- luminarycloud/params/simulation/material/fluid/viscosity_model_.py +3 -4
- luminarycloud/params/simulation/material/material_fluid_.py +4 -5
- luminarycloud/params/simulation/material/material_solid_.py +6 -7
- luminarycloud/params/simulation/material_entity_.py +6 -5
- luminarycloud/params/simulation/monitor_plane_.py +4 -5
- luminarycloud/params/simulation/motion_data/frame_transforms/no_transform_.py +3 -4
- luminarycloud/params/simulation/motion_data/frame_transforms/rotational_transform_.py +3 -4
- luminarycloud/params/simulation/motion_data/frame_transforms/translational_transform_.py +3 -4
- luminarycloud/params/simulation/motion_data/frame_transforms_.py +3 -4
- luminarycloud/params/simulation/motion_data/motion_type/constant_angular_motion_.py +3 -4
- luminarycloud/params/simulation/motion_data/motion_type/constant_translation_motion_.py +3 -4
- luminarycloud/params/simulation/motion_data/motion_type_.py +3 -4
- luminarycloud/params/simulation/motion_data_.py +3 -4
- luminarycloud/params/simulation/multi_physics_coupling_options_.py +3 -4
- luminarycloud/params/simulation/output_.py +3 -4
- luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection/actuator_disk_specify_normal_vector_.py +3 -4
- luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection/actuator_disk_specify_rotation_angles_.py +3 -4
- luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection_.py +3 -4
- luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk_.py +5 -6
- luminarycloud/params/simulation/particle_group/particle_group_type/actuator_line_.py +3 -4
- luminarycloud/params/simulation/particle_group/particle_group_type/probe_points_.py +3 -4
- luminarycloud/params/simulation/particle_group/particle_group_type/source_points_.py +3 -4
- luminarycloud/params/simulation/particle_group/particle_group_type_.py +3 -4
- luminarycloud/params/simulation/particle_group_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/adjoint_controls_fluid_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/basic_fluid_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/farfield_.py +9 -10
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/fan_curve_inlet_.py +5 -6
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/mach_inlet_.py +5 -6
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/mass_flow_inlet_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/total_pressure_inlet_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/velocity_components_inlet_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/velocity_magnitude_inlet_.py +5 -6
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/fan_curve_outlet_.py +5 -6
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_pressure_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_target_corrected_mass_flow_rate_.py +7 -8
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_target_mass_flow_rate_.py +5 -6
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/symmetry_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/turbulence_boundary_conditions_.py +9 -10
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/energy/prescribed_heat_flux_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/energy/prescribed_temperature_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/no_slip_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/slip_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/wall_model_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/wall_energy_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/wall_momentum_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/boundary_conditions_fluid_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/initialization/fluid_existing_solution_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/initialization/fluid_farfield_values_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/initialization/fluid_prescribed_values_.py +5 -6
- luminarycloud/params/simulation/physics/fluid/initialization/turbulence_initialization_.py +9 -10
- luminarycloud/params/simulation/physics/fluid/initialization_fluid_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/physical_behavior/blade_element_airfoil_data_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_blade_element_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_radial_distribution_.py +6 -7
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_uniform_thrust_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/fan_curve_internal_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_line_model/actuator_line_blade_element_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_line_model_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/blade_element_params_.py +5 -6
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model/general_acceleration_source_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model/general_mass_source_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/physical_behavior_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/porous_behavior_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_explicit_relaxation_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup/robust_startup_off_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup/robust_startup_on_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation_.py +8 -9
- luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method/cfl_based_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method/fixed_pseudo_time_step_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/solution_controls_fluid_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/ec2_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/fds_.py +5 -6
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/ld2_.py +5 -6
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/rhie_chow_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_order/first_order_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_order/second_order_.py +8 -9
- luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_order_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/spatial_discretization_fluid_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/ddes_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/ddes_vtm_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/iddes_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst/constants/custom_komega_sst_constants_.py +16 -17
- luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst/constants/default_komega_sst_constants_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst/komega_sst_constants_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras/constants/custom_spalart_allmaras_constants_.py +15 -16
- luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras/constants/default_spalart_allmaras_constants_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras/spalart_allmaras_constants_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/amd_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/sigma_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/smagorinsky_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/vreman_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/wale_.py +4 -5
- luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model_.py +3 -4
- luminarycloud/params/simulation/physics/fluid/turbulence_.py +5 -6
- luminarycloud/params/simulation/physics/fluid_.py +7 -6
- luminarycloud/params/simulation/physics/heat/adjoint_controls_heat_.py +3 -4
- luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_convection_.py +5 -6
- luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_heat_flux_.py +4 -5
- luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_integrated_heat_flux_.py +4 -5
- luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_symmetry_.py +3 -4
- luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_temperature_.py +4 -5
- luminarycloud/params/simulation/physics/heat/boundary_conditions_heat_.py +3 -4
- luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type/heat_source_type_power_.py +4 -5
- luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type/heat_source_type_power_per_unit_of_volume_.py +4 -5
- luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type_.py +3 -4
- luminarycloud/params/simulation/physics/heat/heat_source_.py +3 -4
- luminarycloud/params/simulation/physics/heat/initialization/heat_existing_solution_.py +3 -4
- luminarycloud/params/simulation/physics/heat/initialization/heat_prescribed_values_.py +4 -5
- luminarycloud/params/simulation/physics/heat/initialization_heat_.py +3 -4
- luminarycloud/params/simulation/physics/heat/solution_controls/heat_relaxation_method/heat_implicit_relaxation_.py +3 -4
- luminarycloud/params/simulation/physics/heat/solution_controls/heat_relaxation_method_.py +3 -4
- luminarycloud/params/simulation/physics/heat/solution_controls_heat_.py +3 -4
- luminarycloud/params/simulation/physics/heat/spatial_discretization_heat_.py +5 -6
- luminarycloud/params/simulation/physics/heat_.py +5 -5
- luminarycloud/params/simulation/physics/periodic_pair/periodicity_type/rotational_periodicity_.py +3 -4
- luminarycloud/params/simulation/physics/periodic_pair/periodicity_type/translational_periodicity_.py +3 -4
- luminarycloud/params/simulation/physics/periodic_pair/periodicity_type_.py +3 -4
- luminarycloud/params/simulation/physics/periodic_pair_.py +3 -4
- luminarycloud/params/simulation/physics/solution_controls/linear_solver_type/gauss_seidel_.py +3 -4
- luminarycloud/params/simulation/physics/solution_controls/linear_solver_type/krylov_amg_.py +4 -5
- luminarycloud/params/simulation/physics/solution_controls/linear_solver_type_.py +4 -5
- luminarycloud/params/simulation/physics_.py +6 -5
- luminarycloud/params/simulation/simulation_param_.py +3 -4
- luminarycloud/params/simulation/sliding_interfaces_.py +3 -4
- luminarycloud/params/simulation/surface_name_.py +3 -4
- luminarycloud/params/simulation/time/compute_statistics/compute_statistics_off_.py +3 -4
- luminarycloud/params/simulation/time/compute_statistics/compute_statistics_on_.py +3 -4
- luminarycloud/params/simulation/time/compute_statistics_.py +3 -4
- luminarycloud/params/simulation/time/time_marching/time_explicit_.py +3 -4
- luminarycloud/params/simulation/time/time_marching/time_implicit_.py +3 -4
- luminarycloud/params/simulation/time/time_marching_.py +3 -4
- luminarycloud/params/simulation/time/time_step_ramp/time_step_ramp_off_.py +3 -4
- luminarycloud/params/simulation/time/time_step_ramp/time_step_ramp_on_.py +4 -5
- luminarycloud/params/simulation/time/time_step_ramp_.py +3 -4
- luminarycloud/params/simulation/time_.py +4 -5
- luminarycloud/params/simulation/volume_entity_.py +6 -5
- luminarycloud/physics_ai/__init__.py +2 -0
- luminarycloud/physics_ai/architectures.py +42 -8
- luminarycloud/physics_ai/inference.py +0 -2
- luminarycloud/physics_ai/models.py +44 -15
- luminarycloud/pipeline_util/dictable.py +27 -0
- luminarycloud/pipeline_util/yaml.py +55 -0
- luminarycloud/pipelines/__init__.py +29 -0
- luminarycloud/pipelines/core.py +225 -0
- luminarycloud/pipelines/operators.py +197 -0
- luminarycloud/pipelines/parameters.py +42 -0
- luminarycloud/project.py +60 -9
- luminarycloud/simulation.py +35 -4
- luminarycloud/simulation_param.py +16 -12
- luminarycloud/simulation_template.py +31 -12
- luminarycloud/solution.py +1 -1
- luminarycloud/types/__init__.py +2 -0
- luminarycloud/types/adfloat.py +50 -8
- luminarycloud/types/ids.py +2 -0
- luminarycloud/types/vector3.py +2 -1
- luminarycloud/vis/__init__.py +12 -5
- luminarycloud/vis/data_extraction.py +546 -0
- luminarycloud/vis/display.py +64 -8
- luminarycloud/vis/filters.py +183 -43
- luminarycloud/vis/interactive_scene.py +2 -1
- luminarycloud/vis/primitives.py +38 -0
- luminarycloud/vis/vis_util.py +56 -0
- luminarycloud/vis/visualization.py +241 -71
- {luminarycloud-0.15.2.dist-info → luminarycloud-0.15.4.dist-info}/METADATA +3 -1
- {luminarycloud-0.15.2.dist-info → luminarycloud-0.15.4.dist-info}/RECORD +255 -240
- {luminarycloud-0.15.2.dist-info → luminarycloud-0.15.4.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Copyright 2025 Luminary Cloud, Inc. All Rights Reserved.
|
|
2
|
+
from .core import (
|
|
3
|
+
Pipeline as Pipeline,
|
|
4
|
+
)
|
|
5
|
+
|
|
6
|
+
from .parameters import (
|
|
7
|
+
StringPipelineParameter as StringPipelineParameter,
|
|
8
|
+
IntPipelineParameter as IntPipelineParameter,
|
|
9
|
+
FloatPipelineParameter as FloatPipelineParameter,
|
|
10
|
+
BoolPipelineParameter as BoolPipelineParameter,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
from .operators import (
|
|
14
|
+
# Operator base class, mainly exported for testing
|
|
15
|
+
Operator as Operator,
|
|
16
|
+
# PipelineOutputs, i.e. things that "flow" in a Pipeline
|
|
17
|
+
PipelineOutputGeometry as PipelineOutputGeometry,
|
|
18
|
+
PipelineOutputMesh as PipelineOutputMesh,
|
|
19
|
+
PipelineOutputSimulation as PipelineOutputSimulation,
|
|
20
|
+
# Concrete operators and their output types
|
|
21
|
+
ReadGeometry as ReadGeometry,
|
|
22
|
+
ReadGeometryOutputs as ReadGeometryOutputs,
|
|
23
|
+
ModifyGeometry as ModifyGeometry,
|
|
24
|
+
ModifyGeometryOutputs as ModifyGeometryOutputs,
|
|
25
|
+
Mesh as Mesh,
|
|
26
|
+
MeshOutputs as MeshOutputs,
|
|
27
|
+
Simulate as Simulate,
|
|
28
|
+
SimulateOutputs as SimulateOutputs,
|
|
29
|
+
)
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
# Copyright 2025 Luminary Cloud, Inc. All Rights Reserved.
|
|
2
|
+
from abc import ABC, abstractmethod
|
|
3
|
+
from dataclasses import is_dataclass, fields
|
|
4
|
+
from typing import Type, TypeVar, Generic
|
|
5
|
+
import re
|
|
6
|
+
import yaml
|
|
7
|
+
|
|
8
|
+
from .._helpers.warnings import experimental
|
|
9
|
+
from ..pipeline_util.yaml import ensure_yamlizable
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class PipelineParameter(ABC):
|
|
13
|
+
"""
|
|
14
|
+
Base class for all concrete PipelineParameters.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
def __init__(self, name: str):
|
|
18
|
+
self.name = name
|
|
19
|
+
self._validate()
|
|
20
|
+
|
|
21
|
+
@property
|
|
22
|
+
def type(self) -> str:
|
|
23
|
+
return self._type()
|
|
24
|
+
|
|
25
|
+
@abstractmethod
|
|
26
|
+
def _type(self) -> str:
|
|
27
|
+
pass
|
|
28
|
+
|
|
29
|
+
def _validate(self) -> None:
|
|
30
|
+
if not re.match(r"^[a-zA-Z0-9_-]+$", self.name):
|
|
31
|
+
raise ValueError(
|
|
32
|
+
"name must only contain alphanumeric characters, underscores and hyphens"
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
def _add_to_params(self, params: dict) -> None:
|
|
36
|
+
if self.name in params and params[self.name]["type"] != self.type:
|
|
37
|
+
raise ValueError(
|
|
38
|
+
f"Parameter name {self.name} used with multiple types: {params[self.name]['type']} != {self.type}"
|
|
39
|
+
)
|
|
40
|
+
params[self.name] = {"type": self.type}
|
|
41
|
+
|
|
42
|
+
def _to_pipeline_dict(self) -> tuple[dict, list["PipelineParameter"]]:
|
|
43
|
+
return {"$pipeline_param": self.name}, [self]
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class PipelineInput:
|
|
47
|
+
"""
|
|
48
|
+
A named input for an Operator instance (i.e. a Task). Explicitly connected to a PipelineOutput.
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
def __init__(self, upstream_output: "PipelineOutput", owner: "Operator", name: str):
|
|
52
|
+
self.upstream_output = upstream_output
|
|
53
|
+
self.owner = owner
|
|
54
|
+
self.name = name
|
|
55
|
+
|
|
56
|
+
def _to_dict(self, id_for_task: dict) -> dict:
|
|
57
|
+
if self.upstream_output.owner not in id_for_task:
|
|
58
|
+
raise ValueError(
|
|
59
|
+
f"Task {self.owner} depends on a task, {self.upstream_output.owner}, that isn't in the Pipeline. Did you forget to add it?"
|
|
60
|
+
)
|
|
61
|
+
upstream_task_id = id_for_task[self.upstream_output.owner]
|
|
62
|
+
upstream_output_name = self.upstream_output.name
|
|
63
|
+
return {self.name: f"{upstream_task_id}.{upstream_output_name}"}
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class PipelineOutput(ABC):
|
|
67
|
+
"""
|
|
68
|
+
A named output for an Operator instance (i.e. a Task). Can be used to spawn any number of
|
|
69
|
+
connected PipelineInputs.
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
def __init__(self, owner: "Operator", name: str):
|
|
73
|
+
self.owner = owner
|
|
74
|
+
self.name = name
|
|
75
|
+
self.downstream_inputs: list[PipelineInput] = []
|
|
76
|
+
|
|
77
|
+
def _spawn_input(self, owner: "Operator", name: str) -> PipelineInput:
|
|
78
|
+
input = PipelineInput(self, owner, name)
|
|
79
|
+
self.downstream_inputs.append(input)
|
|
80
|
+
return input
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class OperatorInputs:
|
|
84
|
+
"""
|
|
85
|
+
A collection of all PipelineInputs for an Operator instance (i.e. a Task).
|
|
86
|
+
"""
|
|
87
|
+
|
|
88
|
+
def __init__(
|
|
89
|
+
self, owner: "Operator", **input_descriptors: tuple[Type[PipelineOutput], PipelineOutput]
|
|
90
|
+
):
|
|
91
|
+
"""
|
|
92
|
+
input_descriptors is a dict of input name -> (required_upstream_output_type, upstream_output)
|
|
93
|
+
We have that required_upstream_output_type so we can do runtime validation that each given
|
|
94
|
+
output is of the correct type for the input it's hooked up to.
|
|
95
|
+
"""
|
|
96
|
+
self.inputs: set[PipelineInput] = set()
|
|
97
|
+
for name, (required_upstream_output_type, upstream_output) in input_descriptors.items():
|
|
98
|
+
if not isinstance(upstream_output, required_upstream_output_type):
|
|
99
|
+
raise ValueError(
|
|
100
|
+
f"Input {name} must be a {required_upstream_output_type.__name__}, got {upstream_output.__class__.__name__}"
|
|
101
|
+
)
|
|
102
|
+
self.inputs.add(upstream_output._spawn_input(owner, name))
|
|
103
|
+
|
|
104
|
+
def _to_dict(self, id_for_task: dict) -> dict[str, str]:
|
|
105
|
+
d: dict[str, str] = {}
|
|
106
|
+
for input in self.inputs:
|
|
107
|
+
d |= input._to_dict(id_for_task)
|
|
108
|
+
return d
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
T = TypeVar("T", bound="OperatorOutputs")
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class OperatorOutputs(ABC):
|
|
115
|
+
"""
|
|
116
|
+
A collection of all PipelineOutputs for an Operator instance (i.e. a Task). Must be subclassed,
|
|
117
|
+
and the subclass must also be a dataclass whose fields are all PipelineOutput subclasses. Then
|
|
118
|
+
that subclass should be instantiated with `_instantiate_for`. Sounds a little complicated,
|
|
119
|
+
perhaps, but it's not bad. See the existing subclasses in `./operators.py` for examples.
|
|
120
|
+
"""
|
|
121
|
+
|
|
122
|
+
@classmethod
|
|
123
|
+
def _instantiate_for(cls: type[T], owner: "Operator") -> T:
|
|
124
|
+
# create an instance with all fields instantiated with the given owner, and named by the
|
|
125
|
+
# field name.
|
|
126
|
+
# Also validate here that we are a dataclass, and all our fields are PipelineOutput types.
|
|
127
|
+
# Would love to get this done in the type system, but I think it's impossible, so this is
|
|
128
|
+
# the next best thing.
|
|
129
|
+
if not is_dataclass(cls):
|
|
130
|
+
raise TypeError(f"'{cls.__name__}' must be a dataclass")
|
|
131
|
+
outputs = {}
|
|
132
|
+
for field in fields(cls):
|
|
133
|
+
assert not isinstance(field.type, str)
|
|
134
|
+
if not issubclass(field.type, PipelineOutput):
|
|
135
|
+
raise TypeError(
|
|
136
|
+
f"Field '{field.name}' in '{cls.__name__}' must be a subclass of PipelineOutput"
|
|
137
|
+
)
|
|
138
|
+
outputs[field.name] = field.type(owner, field.name)
|
|
139
|
+
return cls(**outputs)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
TOutputs = TypeVar("TOutputs", bound=OperatorOutputs)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
class Operator(Generic[TOutputs], ABC):
|
|
146
|
+
def __init__(
|
|
147
|
+
self,
|
|
148
|
+
task_name: str | None,
|
|
149
|
+
params: dict,
|
|
150
|
+
inputs: OperatorInputs,
|
|
151
|
+
outputs: TOutputs,
|
|
152
|
+
):
|
|
153
|
+
self._operator_name = self.__class__.__name__
|
|
154
|
+
self._task_name = task_name if task_name is not None else self._operator_name
|
|
155
|
+
self._params = params
|
|
156
|
+
self._inputs = inputs
|
|
157
|
+
self.outputs = outputs
|
|
158
|
+
ensure_yamlizable(self._params_dict()[0], "Operator parameters")
|
|
159
|
+
|
|
160
|
+
def _to_dict(self, id_for_task: dict) -> tuple[dict, list[PipelineParameter]]:
|
|
161
|
+
params, params_list = self._params_dict()
|
|
162
|
+
d = {
|
|
163
|
+
"name": self._task_name,
|
|
164
|
+
"operator": self._operator_name,
|
|
165
|
+
"params": params,
|
|
166
|
+
"inputs": self._inputs._to_dict(id_for_task),
|
|
167
|
+
}
|
|
168
|
+
return d, params_list
|
|
169
|
+
|
|
170
|
+
def _params_dict(self) -> tuple[dict, list[PipelineParameter]]:
|
|
171
|
+
d = {}
|
|
172
|
+
params = []
|
|
173
|
+
for name, value in self._params.items():
|
|
174
|
+
if hasattr(value, "_to_pipeline_dict"):
|
|
175
|
+
d[name], downstream_params = value._to_pipeline_dict()
|
|
176
|
+
params.extend(downstream_params)
|
|
177
|
+
else:
|
|
178
|
+
d[name] = value
|
|
179
|
+
return d, params
|
|
180
|
+
|
|
181
|
+
def __str__(self) -> str:
|
|
182
|
+
return f'{self._operator_name}(name="{self._task_name}")'
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
@experimental
|
|
186
|
+
class Pipeline:
|
|
187
|
+
def __init__(self, name: str, tasks: list[Operator]):
|
|
188
|
+
self.name = name
|
|
189
|
+
self.tasks = tasks
|
|
190
|
+
|
|
191
|
+
def to_yaml(self) -> str:
|
|
192
|
+
return yaml.safe_dump(self._to_dict())
|
|
193
|
+
|
|
194
|
+
def _to_dict(self) -> dict:
|
|
195
|
+
id_for_task = self._assign_ids_to_tasks()
|
|
196
|
+
tasks = {}
|
|
197
|
+
params = []
|
|
198
|
+
for task in id_for_task.keys():
|
|
199
|
+
task_dict, referenced_params = task._to_dict(id_for_task)
|
|
200
|
+
tasks[id_for_task[task]] = task_dict
|
|
201
|
+
params.extend(referenced_params)
|
|
202
|
+
|
|
203
|
+
d = {
|
|
204
|
+
"lc_pipeline": {
|
|
205
|
+
"schema_version": 1,
|
|
206
|
+
"name": self.name,
|
|
207
|
+
"params": self._pipeline_params_dict(params),
|
|
208
|
+
"tasks": tasks,
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
ensure_yamlizable(d, "Pipeline")
|
|
212
|
+
return d
|
|
213
|
+
|
|
214
|
+
def _assign_ids_to_tasks(self) -> dict[Operator, str]:
|
|
215
|
+
return {task: f"t{i + 1}-{task._operator_name}" for i, task in enumerate(self.tasks)}
|
|
216
|
+
|
|
217
|
+
def _pipeline_params_dict(self, params: list[PipelineParameter]) -> dict:
|
|
218
|
+
d: dict[str, dict] = {}
|
|
219
|
+
for p in params:
|
|
220
|
+
if p.name in d and d[p.name]["type"] != p.type:
|
|
221
|
+
raise ValueError(
|
|
222
|
+
f'PipelineParameter "{p.name}" used with multiple types: {d[p.name]["type"]} != {p.type}'
|
|
223
|
+
)
|
|
224
|
+
d[p.name] = {"type": p.type}
|
|
225
|
+
return d
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# Copyright 2025 Luminary Cloud, Inc. All Rights Reserved.
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
|
|
4
|
+
from .._helpers.warnings import experimental
|
|
5
|
+
from .core import Operator, OperatorInputs, OperatorOutputs, PipelineOutput
|
|
6
|
+
from .parameters import StringPipelineParameter
|
|
7
|
+
from ..meshing import MeshGenerationParams
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
# Concrete PipelineOutput classes, i.e. the things that can "flow" in a Pipeline
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class PipelineOutputGeometry(PipelineOutput):
|
|
14
|
+
"""A representation of a Geometry in a Pipeline."""
|
|
15
|
+
|
|
16
|
+
pass
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class PipelineOutputMesh(PipelineOutput):
|
|
20
|
+
"""A representation of a Mesh in a Pipeline."""
|
|
21
|
+
|
|
22
|
+
pass
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class PipelineOutputSimulation(PipelineOutput):
|
|
26
|
+
"""A representation of a Simulation in a Pipeline."""
|
|
27
|
+
|
|
28
|
+
pass
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
# Operators
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@dataclass
|
|
35
|
+
class ReadGeometryOutputs(OperatorOutputs):
|
|
36
|
+
geometry: PipelineOutputGeometry
|
|
37
|
+
"""
|
|
38
|
+
The Geometry identified by the given `geometry_id`, in the state it was in when the Pipeline was
|
|
39
|
+
invoked. I.e. the latest GeometryVersion at that moment.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@experimental
|
|
44
|
+
class ReadGeometry(Operator[ReadGeometryOutputs]):
|
|
45
|
+
"""
|
|
46
|
+
Reads a Geometry into the Pipeline.
|
|
47
|
+
|
|
48
|
+
Parameters
|
|
49
|
+
----------
|
|
50
|
+
geometry_id : str | StringPipelineParameter
|
|
51
|
+
The ID of the Geometry to retrieve.
|
|
52
|
+
|
|
53
|
+
Outputs
|
|
54
|
+
-------
|
|
55
|
+
geometry : PipelineOutputGeometry
|
|
56
|
+
The latest GeometryVersion of the Geometry as of the moment the Pipeline was invoked.
|
|
57
|
+
|
|
58
|
+
.. warning:: This feature is experimental and may change or be removed in the future.
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
def __init__(
|
|
62
|
+
self,
|
|
63
|
+
*,
|
|
64
|
+
task_name: str | None = None,
|
|
65
|
+
geometry_id: str | StringPipelineParameter,
|
|
66
|
+
):
|
|
67
|
+
super().__init__(
|
|
68
|
+
task_name,
|
|
69
|
+
{"geometry_id": geometry_id},
|
|
70
|
+
OperatorInputs(self),
|
|
71
|
+
ReadGeometryOutputs._instantiate_for(self),
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
@dataclass
|
|
76
|
+
class ModifyGeometryOutputs(OperatorOutputs):
|
|
77
|
+
geometry: PipelineOutputGeometry
|
|
78
|
+
"""The modified Geometry, represented as a new GeometryVersion."""
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
# TODO: figure out what `mods` actually is. What does the non-pipeline geo mod interface look like?
|
|
82
|
+
@experimental
|
|
83
|
+
class ModifyGeometry(Operator[ModifyGeometryOutputs]):
|
|
84
|
+
"""
|
|
85
|
+
Modifies a Geometry.
|
|
86
|
+
|
|
87
|
+
Parameters
|
|
88
|
+
----------
|
|
89
|
+
mods : dict
|
|
90
|
+
The modifications to apply to the Geometry.
|
|
91
|
+
geometry : PipelineOutputGeometry
|
|
92
|
+
The Geometry to modify.
|
|
93
|
+
|
|
94
|
+
Outputs
|
|
95
|
+
-------
|
|
96
|
+
geometry : PipelineOutputGeometry
|
|
97
|
+
The modified Geometry, represented as a new GeometryVersion.
|
|
98
|
+
|
|
99
|
+
.. warning:: This feature is experimental and may change or be removed in the future.
|
|
100
|
+
"""
|
|
101
|
+
|
|
102
|
+
def __init__(
|
|
103
|
+
self,
|
|
104
|
+
*,
|
|
105
|
+
task_name: str | None = None,
|
|
106
|
+
mods: list[dict],
|
|
107
|
+
geometry: PipelineOutputGeometry,
|
|
108
|
+
):
|
|
109
|
+
raise NotImplementedError("ModifyGeometry is not implemented yet.")
|
|
110
|
+
super().__init__(
|
|
111
|
+
task_name,
|
|
112
|
+
{"mods": mods},
|
|
113
|
+
OperatorInputs(self, geometry=(PipelineOutputGeometry, geometry)),
|
|
114
|
+
ModifyGeometryOutputs._instantiate_for(self),
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
@dataclass
|
|
119
|
+
class MeshOutputs(OperatorOutputs):
|
|
120
|
+
mesh: PipelineOutputMesh
|
|
121
|
+
"""The Mesh generated from the given Geometry."""
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
@experimental
|
|
125
|
+
class Mesh(Operator[MeshOutputs]):
|
|
126
|
+
"""
|
|
127
|
+
Generates a Mesh from a Geometry.
|
|
128
|
+
|
|
129
|
+
Parameters
|
|
130
|
+
----------
|
|
131
|
+
mesh_gen_params : MeshGenerationParams
|
|
132
|
+
The parameters to use for mesh generation.
|
|
133
|
+
geometry : PipelineOutputGeometry
|
|
134
|
+
The Geometry to mesh.
|
|
135
|
+
|
|
136
|
+
Outputs
|
|
137
|
+
-------
|
|
138
|
+
mesh : PipelineOutputMesh
|
|
139
|
+
The generated Mesh.
|
|
140
|
+
|
|
141
|
+
.. warning:: This feature is experimental and may change or be removed in the future.
|
|
142
|
+
"""
|
|
143
|
+
|
|
144
|
+
def __init__(
|
|
145
|
+
self,
|
|
146
|
+
*,
|
|
147
|
+
task_name: str | None = None,
|
|
148
|
+
mesh_gen_params: MeshGenerationParams,
|
|
149
|
+
geometry: PipelineOutputGeometry,
|
|
150
|
+
):
|
|
151
|
+
super().__init__(
|
|
152
|
+
task_name,
|
|
153
|
+
{"mesh_gen_params": mesh_gen_params},
|
|
154
|
+
OperatorInputs(self, geometry=(PipelineOutputGeometry, geometry)),
|
|
155
|
+
MeshOutputs._instantiate_for(self),
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
@dataclass
|
|
160
|
+
class SimulateOutputs(OperatorOutputs):
|
|
161
|
+
simulation: PipelineOutputSimulation
|
|
162
|
+
"""The Simulation."""
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
@experimental
|
|
166
|
+
class Simulate(Operator[SimulateOutputs]):
|
|
167
|
+
"""
|
|
168
|
+
Runs a Simulation.
|
|
169
|
+
|
|
170
|
+
Parameters
|
|
171
|
+
----------
|
|
172
|
+
sim_template_id : str | StringPipelineParameter
|
|
173
|
+
The ID of the SimulationTemplate to use for the Simulation.
|
|
174
|
+
mesh : PipelineOutputMesh
|
|
175
|
+
The Mesh to use for the Simulation.
|
|
176
|
+
|
|
177
|
+
Outputs
|
|
178
|
+
-------
|
|
179
|
+
simulation : PipelineOutputSimulation
|
|
180
|
+
The Simulation.
|
|
181
|
+
|
|
182
|
+
.. warning:: This feature is experimental and may change or be removed in the future.
|
|
183
|
+
"""
|
|
184
|
+
|
|
185
|
+
def __init__(
|
|
186
|
+
self,
|
|
187
|
+
*,
|
|
188
|
+
task_name: str | None = None,
|
|
189
|
+
sim_template_id: str | StringPipelineParameter,
|
|
190
|
+
mesh: PipelineOutputMesh,
|
|
191
|
+
):
|
|
192
|
+
super().__init__(
|
|
193
|
+
task_name,
|
|
194
|
+
{"sim_template_id": sim_template_id},
|
|
195
|
+
OperatorInputs(self, mesh=(PipelineOutputMesh, mesh)),
|
|
196
|
+
SimulateOutputs._instantiate_for(self),
|
|
197
|
+
)
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Copyright 2025 Luminary Cloud, Inc. All Rights Reserved.
|
|
2
|
+
from .core import PipelineParameter
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class StringPipelineParameter(PipelineParameter):
|
|
6
|
+
"""
|
|
7
|
+
A String Pipeline Parameter can replace a hard-coded string in Pipeline operator arguments to
|
|
8
|
+
allow its value to be set when the Pipeline is invoked.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
def _type(self) -> str:
|
|
12
|
+
return "string"
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class FloatPipelineParameter(PipelineParameter):
|
|
16
|
+
"""
|
|
17
|
+
A Float Pipeline Parameter can replace a hard-coded float in Pipeline operator arguments to
|
|
18
|
+
allow its value to be set when the Pipeline is invoked.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def _type(self) -> str:
|
|
22
|
+
return "float"
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class IntPipelineParameter(PipelineParameter):
|
|
26
|
+
"""
|
|
27
|
+
An Int Pipeline Parameter can replace a hard-coded int in Pipeline operator arguments to
|
|
28
|
+
allow its value to be set when the Pipeline is invoked.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
def _type(self) -> str:
|
|
32
|
+
return "int"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class BoolPipelineParameter(PipelineParameter):
|
|
36
|
+
"""
|
|
37
|
+
A Bool Pipeline Parameter can replace a hard-coded bool in Pipeline operator arguments to
|
|
38
|
+
allow its value to be set when the Pipeline is invoked.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
def _type(self) -> str:
|
|
42
|
+
return "bool"
|
luminarycloud/project.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# Copyright 2023-2024 Luminary Cloud, Inc. All Rights Reserved.
|
|
2
2
|
from __future__ import annotations
|
|
3
3
|
|
|
4
|
+
import logging
|
|
4
5
|
import re
|
|
5
6
|
import uuid
|
|
6
7
|
from datetime import datetime
|
|
@@ -45,7 +46,8 @@ from .enum import GPUType, MeshType, TableType
|
|
|
45
46
|
from .meshing import MeshAdaptationParams, MeshGenerationParams
|
|
46
47
|
from .simulation_param import SimulationParam
|
|
47
48
|
from .tables import RectilinearTable, create_rectilinear_table
|
|
48
|
-
from .types import MeshID, ProjectID, SimulationTemplateID
|
|
49
|
+
from .types import MeshID, ProjectID, SimulationTemplateID, NamedVariableSetID, Expression, LcFloat
|
|
50
|
+
from .named_variable_set import get_named_variable_set
|
|
49
51
|
|
|
50
52
|
if TYPE_CHECKING:
|
|
51
53
|
from .geometry import Geometry
|
|
@@ -331,8 +333,7 @@ class Project(ProtoWrapperBase):
|
|
|
331
333
|
existing geometry, use MeshGenerationParams. If adapting a mesh from an existing,
|
|
332
334
|
solution use MeshAdaptationParams.
|
|
333
335
|
name : str
|
|
334
|
-
|
|
335
|
-
parameters already exists.
|
|
336
|
+
Mesh name. Max 256 characters.
|
|
336
337
|
"""
|
|
337
338
|
|
|
338
339
|
try:
|
|
@@ -352,6 +353,7 @@ class Project(ProtoWrapperBase):
|
|
|
352
353
|
self,
|
|
353
354
|
names_to_file_paths: Dict[str, Union[PathLike[Any], str]],
|
|
354
355
|
params: hexmeshpb.HexMeshSpec,
|
|
356
|
+
use_internal_wrap: bool = False,
|
|
355
357
|
) -> "Mesh":
|
|
356
358
|
"""
|
|
357
359
|
Creates a hex mesh. Only for internal use.
|
|
@@ -387,6 +389,8 @@ class Project(ProtoWrapperBase):
|
|
|
387
389
|
for name, url in names_to_uploaded_file_paths.items():
|
|
388
390
|
params.names_to_file_urls[name] = url
|
|
389
391
|
|
|
392
|
+
params.use_wrap = use_internal_wrap
|
|
393
|
+
|
|
390
394
|
req = meshpb.CreateHexMeshRequest(project_id=self.id, hex_mesh_config=params)
|
|
391
395
|
|
|
392
396
|
res: meshpb.CreateHexMeshResponse = client.CreateHexMesh(req)
|
|
@@ -480,6 +484,7 @@ class Project(ProtoWrapperBase):
|
|
|
480
484
|
name: str,
|
|
481
485
|
simulation_template_id: str,
|
|
482
486
|
*,
|
|
487
|
+
_named_variable_set_id: Optional[NamedVariableSetID] = None,
|
|
483
488
|
description: str = "",
|
|
484
489
|
batch_processing: bool = True,
|
|
485
490
|
gpu_type: Optional[GPUType] = None,
|
|
@@ -512,12 +517,19 @@ class Project(ProtoWrapperBase):
|
|
|
512
517
|
Number of GPUs to use for the simulation. Must be specified to a
|
|
513
518
|
positive value if `gpu_type` is specified.
|
|
514
519
|
"""
|
|
520
|
+
|
|
521
|
+
named_variable_set_version_id: Optional[str] = None
|
|
522
|
+
if _named_variable_set_id is not None:
|
|
523
|
+
named_variable_set = get_named_variable_set(_named_variable_set_id)
|
|
524
|
+
named_variable_set_version_id = named_variable_set._version_id
|
|
525
|
+
|
|
515
526
|
_simulation = create_simulation(
|
|
516
527
|
get_default_client(),
|
|
517
528
|
self.id,
|
|
518
529
|
mesh_id,
|
|
519
530
|
name,
|
|
520
531
|
simulation_template_id,
|
|
532
|
+
named_variable_set_version_id=named_variable_set_version_id,
|
|
521
533
|
description=description,
|
|
522
534
|
batch_processing=batch_processing,
|
|
523
535
|
gpu_type=gpu_type,
|
|
@@ -548,7 +560,7 @@ class Project(ProtoWrapperBase):
|
|
|
548
560
|
*,
|
|
549
561
|
parameters: Optional[SimulationParam] = None,
|
|
550
562
|
params_json_path: Optional[PathLike | str] = None,
|
|
551
|
-
copy_from: Optional[
|
|
563
|
+
copy_from: "Optional[SimulationTemplate | SimulationTemplateID | str]" = None,
|
|
552
564
|
) -> "SimulationTemplate":
|
|
553
565
|
"""
|
|
554
566
|
Create a new simulation template object.
|
|
@@ -573,11 +585,9 @@ class Project(ProtoWrapperBase):
|
|
|
573
585
|
int(params_json_path is not None)
|
|
574
586
|
+ int(parameters is not None)
|
|
575
587
|
+ int(copy_from is not None)
|
|
576
|
-
|
|
588
|
+
> 1
|
|
577
589
|
):
|
|
578
|
-
raise ValueError(
|
|
579
|
-
"Exactly one of parameters, params_json_path, or copy_from must be set"
|
|
580
|
-
)
|
|
590
|
+
raise ValueError("Only one of parameters, params_json_path, or copy_from can be set")
|
|
581
591
|
|
|
582
592
|
param_proto: clientpb.SimulationParam | None = None
|
|
583
593
|
copy_from_id: str | None = None
|
|
@@ -600,7 +610,7 @@ class Project(ProtoWrapperBase):
|
|
|
600
610
|
|
|
601
611
|
@experimental
|
|
602
612
|
def create_named_variable_set(
|
|
603
|
-
self, name: str, named_variables: dict[str,
|
|
613
|
+
self, name: str, named_variables: dict[str, LcFloat]
|
|
604
614
|
) -> NamedVariableSet:
|
|
605
615
|
"""
|
|
606
616
|
Create a new named variable set.
|
|
@@ -626,6 +636,47 @@ class Project(ProtoWrapperBase):
|
|
|
626
636
|
return [lc.NamedVariableSet(n) for n in res.named_variable_sets]
|
|
627
637
|
|
|
628
638
|
|
|
639
|
+
@experimental
|
|
640
|
+
def add_named_variables_from_csv(project: Project, csv_path: str) -> list[NamedVariableSet]:
|
|
641
|
+
"""
|
|
642
|
+
This function reads named variables from a CSV file and creates corresponding NamedVariableSets in the given project.
|
|
643
|
+
The CSV file should have the following format:
|
|
644
|
+
name, var1, var2, ...
|
|
645
|
+
name1, val1, val2, ...
|
|
646
|
+
name2, val1, val2, ...
|
|
647
|
+
"""
|
|
648
|
+
import csv
|
|
649
|
+
|
|
650
|
+
def is_float(s: str) -> bool:
|
|
651
|
+
try:
|
|
652
|
+
float(s)
|
|
653
|
+
return True
|
|
654
|
+
except ValueError:
|
|
655
|
+
return False
|
|
656
|
+
|
|
657
|
+
named_variable_sets = []
|
|
658
|
+
with open(csv_path) as csvfile:
|
|
659
|
+
reader = csv.reader(csvfile)
|
|
660
|
+
header = next(reader)
|
|
661
|
+
keys = [k.strip() for k in header[1:]]
|
|
662
|
+
for row in reader:
|
|
663
|
+
if len(row) != len(keys) + 1:
|
|
664
|
+
logging.warning(
|
|
665
|
+
f"Skipping row {row} because it has the wrong number of columns ({len(row)} instead of {len(keys) + 1})"
|
|
666
|
+
)
|
|
667
|
+
continue
|
|
668
|
+
name = row[0]
|
|
669
|
+
named_variables: dict[str, LcFloat] = {
|
|
670
|
+
k: float(v.strip()) if is_float(v.strip()) else Expression(v.strip())
|
|
671
|
+
for k, v in zip(keys, row[1:])
|
|
672
|
+
}
|
|
673
|
+
named_variable_sets.append(
|
|
674
|
+
project.create_named_variable_set(name=name, named_variables=named_variables)
|
|
675
|
+
)
|
|
676
|
+
logging.info(f"Created named variable set {name} with {len(named_variables)} variables")
|
|
677
|
+
return named_variable_sets
|
|
678
|
+
|
|
679
|
+
|
|
629
680
|
def create_project(
|
|
630
681
|
name: str,
|
|
631
682
|
description: str = "",
|
luminarycloud/simulation.py
CHANGED
|
@@ -291,6 +291,10 @@ class Simulation(ProtoWrapperBase):
|
|
|
291
291
|
return [Solution(s) for s in res.solutions]
|
|
292
292
|
|
|
293
293
|
def get_parameters(self) -> SimulationParam:
|
|
294
|
+
"""
|
|
295
|
+
Returns the simulation parameters associated with this simulation to allow customization of
|
|
296
|
+
the parameters.
|
|
297
|
+
"""
|
|
294
298
|
req = simulationpb.GetSimulationParametersRequest(id=self.id)
|
|
295
299
|
return SimulationParam.from_proto(get_default_client().GetSimulationParameters(req))
|
|
296
300
|
|
|
@@ -298,12 +302,39 @@ class Simulation(ProtoWrapperBase):
|
|
|
298
302
|
"Use get_parameters() instead. This method will be removed in a future release.",
|
|
299
303
|
)
|
|
300
304
|
def get_simulation_param(self) -> SimulationParam:
|
|
301
|
-
"""
|
|
302
|
-
Returns the simulation parameters associated with this template to allow customization of
|
|
303
|
-
the parameters.
|
|
304
|
-
"""
|
|
305
305
|
return self.get_parameters()
|
|
306
306
|
|
|
307
|
+
# This is used by the assistant for the SDK Code shown in the Results tab.
|
|
308
|
+
def _to_code(self) -> str:
|
|
309
|
+
return f"""# This code shows how to modify the parameters of the current simulation to create a new one.
|
|
310
|
+
import luminarycloud as lc
|
|
311
|
+
|
|
312
|
+
current_simulation = lc.get_simulation("{self.id}")
|
|
313
|
+
params = current_simulation.get_parameters()
|
|
314
|
+
|
|
315
|
+
# TODO(USER): Modify the parameters.
|
|
316
|
+
# You can use params.find_parameter to help you find the parameters you wish to modify.
|
|
317
|
+
# params.find_parameter("mach")
|
|
318
|
+
# Alternatively, the Simulation SDK Code shown in the Setup tab, shows how to create the
|
|
319
|
+
# entire params object from scratch. The following line produces a similar result.
|
|
320
|
+
# print(params.to_code())
|
|
321
|
+
|
|
322
|
+
project = lc.get_project("{self.project_id}")
|
|
323
|
+
# Modify the setup (synced with UI), or an existing template, or create a new one.
|
|
324
|
+
template = project.list_simulation_templates()[0]
|
|
325
|
+
# template = lc.get_simulation_template("...")
|
|
326
|
+
# template = project.create_simulation_template("New Template")
|
|
327
|
+
|
|
328
|
+
template.update(parameters=params)
|
|
329
|
+
|
|
330
|
+
# NOTE: This starts a new simulation.
|
|
331
|
+
# This uses the mesh from the current simulation, you can use project.list_meshes() to find
|
|
332
|
+
# other meshes available in the project.
|
|
333
|
+
simulation = project.create_simulation(current_simulation.mesh_id, "New Simulation", template.id)
|
|
334
|
+
# Waiting for the simulation to finish is optional.
|
|
335
|
+
status = simulation.wait()
|
|
336
|
+
"""
|
|
337
|
+
|
|
307
338
|
|
|
308
339
|
def get_simulation(id: SimulationID) -> Simulation:
|
|
309
340
|
"""
|