luminarycloud 0.22.2__py3-none-any.whl → 0.23.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 (267) hide show
  1. luminarycloud/__init__.py +9 -3
  2. luminarycloud/_client/client.py +1 -1
  3. luminarycloud/_client/retry_interceptor.py +13 -2
  4. luminarycloud/_helpers/_code_representation.py +1 -0
  5. luminarycloud/_helpers/_create_simulation.py +5 -1
  6. luminarycloud/_helpers/proto_decorator.py +46 -38
  7. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.py +214 -137
  8. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2.pyi +152 -0
  9. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.py +103 -0
  10. luminarycloud/_proto/api/v0/luminarycloud/geometry/geometry_pb2_grpc.pyi +40 -0
  11. luminarycloud/_proto/api/v0/luminarycloud/named_variable_set/named_variable_set_pb2.py +25 -3
  12. luminarycloud/_proto/api/v0/luminarycloud/named_variable_set/named_variable_set_pb2.pyi +30 -0
  13. luminarycloud/_proto/api/v0/luminarycloud/named_variable_set/named_variable_set_pb2_grpc.py +34 -0
  14. luminarycloud/_proto/api/v0/luminarycloud/named_variable_set/named_variable_set_pb2_grpc.pyi +12 -0
  15. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.py +155 -59
  16. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2.pyi +252 -22
  17. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2_grpc.py +102 -0
  18. luminarycloud/_proto/api/v0/luminarycloud/physics_ai/physics_ai_pb2_grpc.pyi +36 -0
  19. luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2.py +94 -71
  20. luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2.pyi +46 -0
  21. luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2_grpc.py +35 -0
  22. luminarycloud/_proto/api/v0/luminarycloud/simulation/simulation_pb2_grpc.pyi +16 -0
  23. luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2.py +25 -3
  24. luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2.pyi +32 -0
  25. luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2_grpc.py +34 -0
  26. luminarycloud/_proto/api/v0/luminarycloud/simulation_template/simulation_template_pb2_grpc.pyi +12 -0
  27. luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.py +68 -21
  28. luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2.pyi +119 -0
  29. luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2_grpc.py +33 -0
  30. luminarycloud/_proto/api/v0/luminarycloud/vis/vis_pb2_grpc.pyi +10 -0
  31. luminarycloud/_proto/client/simulation_pb2.py +405 -346
  32. luminarycloud/_proto/client/simulation_pb2.pyi +175 -21
  33. luminarycloud/_proto/clusterconfig/clusterconfig_pb2.py +273 -0
  34. luminarycloud/_proto/clusterconfig/clusterconfig_pb2.pyi +808 -0
  35. luminarycloud/_proto/geometry/geometry_pb2.pyi +1 -1
  36. luminarycloud/_proto/lcstatus/details/geometry/geometry_pb2.py +256 -0
  37. luminarycloud/_proto/lcstatus/details/geometry/geometry_pb2.pyi +472 -0
  38. luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2.py +2 -2
  39. luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2_grpc.py +102 -0
  40. luminarycloud/_proto/physicsaitrainingservice/physicsaitrainingservice_pb2_grpc.pyi +36 -0
  41. luminarycloud/_proto/quantity/quantity_pb2.pyi +1 -1
  42. luminarycloud/enum/__init__.py +1 -0
  43. luminarycloud/enum/gpu_type.py +42 -7
  44. luminarycloud/enum/vis_enums.py +18 -0
  45. luminarycloud/geometry.py +81 -0
  46. luminarycloud/geometry_contacts.py +222 -0
  47. luminarycloud/meshing/mesh_generation_params.py +4 -4
  48. luminarycloud/meshing/sizing_strategy/__init__.py +0 -1
  49. luminarycloud/meshing/sizing_strategy/sizing_strategies.py +0 -20
  50. luminarycloud/params/geometry/shapes.py +137 -31
  51. luminarycloud/params/outputs/__init__.py +0 -2
  52. luminarycloud/params/outputs/output.py +17 -5
  53. luminarycloud/params/simulation/__init__.py +2 -0
  54. luminarycloud/params/simulation/adaptive_mesh_refinement/active_region_.py +1 -1
  55. luminarycloud/params/simulation/adaptive_mesh_refinement/boundary_layer_profile_.py +1 -1
  56. luminarycloud/params/simulation/adaptive_mesh_refinement_.py +1 -1
  57. luminarycloud/params/simulation/adjoint_.py +8 -5
  58. luminarycloud/params/simulation/basic/gravity/gravity_off_.py +1 -1
  59. luminarycloud/params/simulation/basic/gravity/gravity_on_.py +1 -1
  60. luminarycloud/params/simulation/basic/gravity_.py +1 -1
  61. luminarycloud/params/simulation/body_frame_.py +1 -1
  62. luminarycloud/params/simulation/entity_relationships/volume_material_relationship_.py +1 -1
  63. luminarycloud/params/simulation/entity_relationships/volume_physics_relationship_.py +1 -1
  64. luminarycloud/params/simulation/entity_relationships_.py +1 -1
  65. luminarycloud/params/simulation/general_.py +1 -1
  66. luminarycloud/params/simulation/material/fluid/boussinesq_approximation/boussinesq_off_.py +1 -1
  67. luminarycloud/params/simulation/material/fluid/boussinesq_approximation/boussinesq_on_.py +1 -1
  68. luminarycloud/params/simulation/material/fluid/boussinesq_approximation_.py +1 -1
  69. luminarycloud/params/simulation/material/fluid/material_model/__init__.py +2 -0
  70. luminarycloud/params/simulation/material/fluid/material_model/ideal_gas_.py +1 -1
  71. luminarycloud/params/simulation/material/fluid/material_model/incompressible_fluid_.py +1 -1
  72. luminarycloud/params/simulation/material/fluid/material_model/incompressible_fluid_with_energy_.py +1 -1
  73. luminarycloud/params/simulation/material/fluid/material_model/real_gas_backend/__init__.py +2 -0
  74. luminarycloud/params/simulation/material/fluid/material_model/real_gas_backend/real_gas_coolprop_.py +43 -0
  75. luminarycloud/params/simulation/material/fluid/material_model/real_gas_backend/real_gas_polynomial_.py +53 -0
  76. luminarycloud/params/simulation/material/fluid/material_model/real_gas_backend_.py +29 -0
  77. luminarycloud/params/simulation/material/fluid/material_model_.py +1 -1
  78. luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/prescribed_conductivity_.py +1 -1
  79. luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/prescribed_prandtl_number_.py +1 -1
  80. luminarycloud/params/simulation/material/fluid/thermal_conductivity_model/temperature_dependent_conductivity_.py +1 -1
  81. luminarycloud/params/simulation/material/fluid/thermal_conductivity_model_.py +1 -1
  82. luminarycloud/params/simulation/material/fluid/viscosity_model/prescribed_viscosity_.py +1 -1
  83. luminarycloud/params/simulation/material/fluid/viscosity_model/sutherland_.py +1 -1
  84. luminarycloud/params/simulation/material/fluid/viscosity_model/temperature_dependent_viscosity_.py +1 -1
  85. luminarycloud/params/simulation/material/fluid/viscosity_model_.py +1 -1
  86. luminarycloud/params/simulation/material/material_fluid_.py +78 -2
  87. luminarycloud/params/simulation/material/material_solid_.py +1 -1
  88. luminarycloud/params/simulation/material_entity_.py +1 -1
  89. luminarycloud/params/simulation/monitor_plane_.py +1 -1
  90. luminarycloud/params/simulation/motion_data/frame_transforms/no_transform_.py +1 -1
  91. luminarycloud/params/simulation/motion_data/frame_transforms/rotational_transform_.py +1 -1
  92. luminarycloud/params/simulation/motion_data/frame_transforms/translational_transform_.py +1 -1
  93. luminarycloud/params/simulation/motion_data/frame_transforms_.py +1 -1
  94. luminarycloud/params/simulation/motion_data/motion_type/constant_angular_motion_.py +1 -1
  95. luminarycloud/params/simulation/motion_data/motion_type/constant_translation_motion_.py +1 -1
  96. luminarycloud/params/simulation/motion_data/motion_type_.py +1 -1
  97. luminarycloud/params/simulation/motion_data_.py +1 -1
  98. luminarycloud/params/simulation/multi_physics_coupling_options_.py +1 -1
  99. luminarycloud/params/simulation/nonlinear_control/__init__.py +1 -0
  100. luminarycloud/params/simulation/nonlinear_control/nonlinear_control_system_.py +48 -0
  101. luminarycloud/params/simulation/nonlinear_control_.py +61 -0
  102. luminarycloud/params/simulation/output_.py +1 -1
  103. luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection/actuator_disk_specify_normal_vector_.py +1 -1
  104. luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection/actuator_disk_specify_rotation_angles_.py +1 -1
  105. luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk/actuator_disk_orientation_selection_.py +1 -1
  106. luminarycloud/params/simulation/particle_group/particle_group_type/actuator_disk_.py +1 -1
  107. luminarycloud/params/simulation/particle_group/particle_group_type/actuator_line_.py +1 -1
  108. luminarycloud/params/simulation/particle_group/particle_group_type/probe_points_.py +1 -1
  109. luminarycloud/params/simulation/particle_group/particle_group_type/source_points_.py +1 -1
  110. luminarycloud/params/simulation/particle_group/particle_group_type_.py +1 -1
  111. luminarycloud/params/simulation/particle_group_.py +1 -1
  112. luminarycloud/params/simulation/physics/fluid/adjoint_controls_fluid_.py +1 -1
  113. luminarycloud/params/simulation/physics/fluid/basic_fluid_.py +1 -1
  114. luminarycloud/params/simulation/physics/fluid/boundary_conditions/farfield_.py +1 -1
  115. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/fan_curve_inlet_.py +1 -1
  116. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/mach_inlet_.py +1 -1
  117. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/mass_flow_inlet_.py +1 -1
  118. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/total_pressure_inlet_.py +1 -1
  119. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/velocity_components_inlet_.py +1 -1
  120. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet/velocity_magnitude_inlet_.py +1 -1
  121. luminarycloud/params/simulation/physics/fluid/boundary_conditions/inlet_.py +1 -1
  122. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/fan_curve_outlet_.py +1 -1
  123. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_pressure_.py +1 -1
  124. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_target_corrected_mass_flow_rate_.py +1 -1
  125. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy/outlet_target_mass_flow_rate_.py +1 -1
  126. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet/outlet_strategy_.py +1 -1
  127. luminarycloud/params/simulation/physics/fluid/boundary_conditions/outlet_.py +1 -1
  128. luminarycloud/params/simulation/physics/fluid/boundary_conditions/symmetry_.py +1 -1
  129. luminarycloud/params/simulation/physics/fluid/boundary_conditions/turbulence_boundary_conditions_.py +1 -1
  130. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/energy/prescribed_heat_flux_.py +1 -1
  131. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/energy/prescribed_temperature_.py +1 -1
  132. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/no_slip_.py +1 -1
  133. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/slip_.py +1 -1
  134. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/momentum/wall_model_.py +1 -1
  135. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/wall_energy_.py +1 -1
  136. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall/wall_momentum_.py +1 -1
  137. luminarycloud/params/simulation/physics/fluid/boundary_conditions/wall_.py +1 -1
  138. luminarycloud/params/simulation/physics/fluid/boundary_conditions_fluid_.py +1 -1
  139. luminarycloud/params/simulation/physics/fluid/initialization/__init__.py +1 -0
  140. luminarycloud/params/simulation/physics/fluid/initialization/fluid_existing_solution_.py +1 -1
  141. luminarycloud/params/simulation/physics/fluid/initialization/fluid_farfield_values_.py +14 -1
  142. luminarycloud/params/simulation/physics/fluid/initialization/fluid_initialization_per_zone_.py +48 -0
  143. luminarycloud/params/simulation/physics/fluid/initialization/fluid_prescribed_values_.py +14 -1
  144. luminarycloud/params/simulation/physics/fluid/initialization/turbulence_initialization_.py +1 -1
  145. luminarycloud/params/simulation/physics/fluid/initialization_fluid_.py +1 -1
  146. luminarycloud/params/simulation/physics/fluid/physical_behavior/blade_element_airfoil_data_.py +1 -1
  147. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_blade_element_.py +1 -1
  148. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_radial_distribution_.py +1 -1
  149. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/actuator_disk_uniform_thrust_.py +1 -1
  150. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model/fan_curve_internal_.py +1 -1
  151. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_disk_model_.py +1 -1
  152. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_line_model/actuator_line_blade_element_.py +1 -1
  153. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/actuator_line_model_.py +1 -1
  154. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/blade_element_params_.py +1 -1
  155. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model/general_acceleration_source_.py +1 -1
  156. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model/general_mass_source_.py +1 -1
  157. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model/particle_source_model_.py +1 -1
  158. luminarycloud/params/simulation/physics/fluid/physical_behavior/physical_behavior_model_.py +1 -1
  159. luminarycloud/params/simulation/physics/fluid/physical_behavior_.py +1 -1
  160. luminarycloud/params/simulation/physics/fluid/porous_behavior_.py +1 -1
  161. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_explicit_relaxation_.py +1 -1
  162. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup/robust_startup_auto_.py +1 -1
  163. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup/robust_startup_off_.py +1 -1
  164. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup/robust_startup_on_.py +1 -1
  165. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation/robust_startup_.py +1 -1
  166. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method/fluid_implicit_relaxation_.py +1 -1
  167. luminarycloud/params/simulation/physics/fluid/solution_controls/fluid_relaxation_method_.py +1 -1
  168. luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method/cfl_based_.py +1 -1
  169. luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method/fixed_pseudo_time_step_.py +1 -1
  170. luminarycloud/params/simulation/physics/fluid/solution_controls/pseudo_time_step_method_.py +1 -1
  171. luminarycloud/params/simulation/physics/fluid/solution_controls_fluid_.py +1 -1
  172. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/ec2_.py +1 -1
  173. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/fds_.py +1 -1
  174. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/ld2_.py +1 -1
  175. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme/rhie_chow_.py +1 -1
  176. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_.py +1 -1
  177. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_order/first_order_.py +1 -1
  178. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_order/second_order_.py +1 -1
  179. luminarycloud/params/simulation/physics/fluid/spatial_discretization/convective_scheme_order_.py +1 -1
  180. luminarycloud/params/simulation/physics/fluid/spatial_discretization_fluid_.py +1 -1
  181. luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/ddes_.py +1 -1
  182. luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/ddes_vtm_.py +1 -1
  183. luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation/iddes_.py +1 -1
  184. luminarycloud/params/simulation/physics/fluid/turbulence/des_formulation_.py +1 -1
  185. luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst/constants/custom_komega_sst_constants_.py +1 -1
  186. luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst/constants/default_komega_sst_constants_.py +1 -1
  187. luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst/komega_sst_constants_.py +1 -1
  188. luminarycloud/params/simulation/physics/fluid/turbulence/komega_sst_.py +1 -1
  189. luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras/constants/custom_spalart_allmaras_constants_.py +1 -1
  190. luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras/constants/default_spalart_allmaras_constants_.py +1 -1
  191. luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras/spalart_allmaras_constants_.py +1 -1
  192. luminarycloud/params/simulation/physics/fluid/turbulence/spalart_allmaras_.py +1 -1
  193. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/amd_.py +1 -1
  194. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/sigma_.py +1 -1
  195. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/smagorinsky_.py +1 -1
  196. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/vreman_.py +1 -1
  197. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model/wale_.py +1 -1
  198. luminarycloud/params/simulation/physics/fluid/turbulence/sub_grid_scale_model_.py +1 -1
  199. luminarycloud/params/simulation/physics/fluid/turbulence_.py +1 -1
  200. luminarycloud/params/simulation/physics/fluid_.py +1 -1
  201. luminarycloud/params/simulation/physics/heat/adjoint_controls_heat_.py +1 -1
  202. luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_convection_.py +1 -1
  203. luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_heat_flux_.py +1 -1
  204. luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_integrated_heat_flux_.py +1 -1
  205. luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_symmetry_.py +1 -1
  206. luminarycloud/params/simulation/physics/heat/boundary_conditions/heat_bc_temperature_.py +1 -1
  207. luminarycloud/params/simulation/physics/heat/boundary_conditions_heat_.py +1 -1
  208. luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type/heat_source_type_power_.py +1 -1
  209. luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type/heat_source_type_power_per_unit_of_volume_.py +1 -1
  210. luminarycloud/params/simulation/physics/heat/heat_source/heat_source_type_.py +1 -1
  211. luminarycloud/params/simulation/physics/heat/heat_source_.py +1 -1
  212. luminarycloud/params/simulation/physics/heat/initialization/__init__.py +1 -0
  213. luminarycloud/params/simulation/physics/heat/initialization/heat_existing_solution_.py +1 -1
  214. luminarycloud/params/simulation/physics/heat/initialization/heat_prescribed_values/__init__.py +1 -0
  215. luminarycloud/params/simulation/physics/heat/initialization/heat_prescribed_values/heat_initialization_per_zone_.py +40 -0
  216. luminarycloud/params/simulation/physics/heat/initialization/heat_prescribed_values_.py +14 -1
  217. luminarycloud/params/simulation/physics/heat/initialization_heat_.py +1 -1
  218. luminarycloud/params/simulation/physics/heat/solution_controls/heat_relaxation_method/heat_implicit_relaxation_.py +1 -1
  219. luminarycloud/params/simulation/physics/heat/solution_controls/heat_relaxation_method_.py +1 -1
  220. luminarycloud/params/simulation/physics/heat/solution_controls_heat_.py +1 -1
  221. luminarycloud/params/simulation/physics/heat/spatial_discretization_heat_.py +1 -1
  222. luminarycloud/params/simulation/physics/heat_.py +1 -1
  223. luminarycloud/params/simulation/physics/periodic_pair_.py +5 -1
  224. luminarycloud/params/simulation/physics/solution_controls/linear_solver_type/gauss_seidel_.py +1 -1
  225. luminarycloud/params/simulation/physics/solution_controls/linear_solver_type/krylov_amg_.py +1 -1
  226. luminarycloud/params/simulation/physics/solution_controls/linear_solver_type_.py +1 -1
  227. luminarycloud/params/simulation/physics_.py +1 -1
  228. luminarycloud/params/simulation/simulation_param_.py +8 -1
  229. luminarycloud/params/simulation/sliding_interfaces_.py +1 -1
  230. luminarycloud/params/simulation/surface_name_.py +1 -1
  231. luminarycloud/params/simulation/time/compute_statistics/compute_statistics_off_.py +1 -1
  232. luminarycloud/params/simulation/time/compute_statistics/compute_statistics_on_.py +1 -1
  233. luminarycloud/params/simulation/time/compute_statistics_.py +1 -1
  234. luminarycloud/params/simulation/time/time_marching/time_explicit_.py +1 -1
  235. luminarycloud/params/simulation/time/time_marching/time_implicit_.py +1 -1
  236. luminarycloud/params/simulation/time/time_marching_.py +1 -1
  237. luminarycloud/params/simulation/time/time_step_ramp/time_step_ramp_off_.py +1 -1
  238. luminarycloud/params/simulation/time/time_step_ramp/time_step_ramp_on_.py +1 -1
  239. luminarycloud/params/simulation/time/time_step_ramp_.py +1 -1
  240. luminarycloud/params/simulation/time_.py +1 -1
  241. luminarycloud/params/simulation/volume_entity_.py +1 -1
  242. luminarycloud/physics_ai/__init__.py +17 -0
  243. luminarycloud/physics_ai/architectures.py +130 -18
  244. luminarycloud/physics_ai/datasets.py +301 -0
  245. luminarycloud/physics_ai/training_jobs.py +50 -4
  246. luminarycloud/pipelines/__init__.py +16 -4
  247. luminarycloud/pipelines/api.py +192 -17
  248. luminarycloud/pipelines/arguments.py +8 -3
  249. luminarycloud/pipelines/core.py +296 -45
  250. luminarycloud/pipelines/flowables.py +138 -0
  251. luminarycloud/pipelines/stages.py +34 -55
  252. luminarycloud/pipelines/user_code_validation.py +122 -0
  253. luminarycloud/project.py +0 -14
  254. luminarycloud/simulation.py +42 -11
  255. luminarycloud/simulation_param.py +0 -62
  256. luminarycloud/simulation_template.py +1 -11
  257. luminarycloud/types/adfloat.py +48 -4
  258. luminarycloud/types/matrix3.py +9 -9
  259. luminarycloud/types/vector3.py +52 -23
  260. luminarycloud/vis/__init__.py +3 -0
  261. luminarycloud/vis/visualization.py +88 -0
  262. luminarycloud/volume_selection.py +29 -17
  263. {luminarycloud-0.22.2.dist-info → luminarycloud-0.23.0.dist-info}/METADATA +1 -1
  264. {luminarycloud-0.22.2.dist-info → luminarycloud-0.23.0.dist-info}/RECORD +266 -249
  265. luminarycloud/params/outputs/residual_output.py +0 -24
  266. /luminarycloud/params/{simulation/_lib.py → _lib.py} +0 -0
  267. {luminarycloud-0.22.2.dist-info → luminarycloud-0.23.0.dist-info}/WHEEL +0 -0
@@ -1,33 +1,9 @@
1
1
  # Copyright 2025 Luminary Cloud, Inc. All Rights Reserved.
2
2
  from dataclasses import dataclass
3
3
 
4
- from .core import Stage, StageInputs, StageOutputs, PipelineOutput
4
+ from .core import StandardStage, StageInputs, StageOutputs
5
+ from .flowables import PipelineOutputGeometry, PipelineOutputMesh, PipelineOutputSimulation
5
6
  from .parameters import BoolPipelineParameter, StringPipelineParameter, IntPipelineParameter
6
- from ..meshing import MeshGenerationParams
7
-
8
-
9
- # Concrete PipelineOutput classes, i.e. the things that can "flow" in a Pipeline
10
-
11
-
12
- class PipelineOutputGeometry(PipelineOutput):
13
- """A representation of a Geometry in a Pipeline."""
14
-
15
- pass
16
-
17
-
18
- class PipelineOutputMesh(PipelineOutput):
19
- """A representation of a Mesh in a Pipeline."""
20
-
21
- pass
22
-
23
-
24
- class PipelineOutputSimulation(PipelineOutput):
25
- """A representation of a Simulation in a Pipeline."""
26
-
27
- pass
28
-
29
-
30
- # Stages
31
7
 
32
8
 
33
9
  @dataclass
@@ -39,7 +15,7 @@ class ReadGeometryOutputs(StageOutputs):
39
15
  """
40
16
 
41
17
 
42
- class ReadGeometry(Stage[ReadGeometryOutputs]):
18
+ class ReadGeometry(StandardStage[ReadGeometryOutputs]):
43
19
  """
44
20
  Reads a Geometry into the Pipeline.
45
21
 
@@ -93,19 +69,19 @@ class ReadMeshOutputs(StageOutputs):
93
69
  """
94
70
 
95
71
 
96
- class ReadMesh(Stage[ReadMeshOutputs]):
72
+ class ReadMesh(StandardStage[ReadMeshOutputs]):
97
73
  """
98
74
  Reads a Mesh into the Pipeline.
99
75
 
76
+ Does not complete until the Mesh is ready for simulation. Fails if the meshing job completes
77
+ with errors.
78
+
100
79
  .. warning:: This feature is experimental and may change or be removed in the future.
101
80
 
102
81
  Parameters
103
82
  ----------
104
83
  mesh_id : str | StringPipelineParameter
105
84
  The ID of the Mesh to retrieve.
106
- wait_timeout_seconds : int | IntPipelineParameter | None
107
- The number of seconds to wait for the Mesh to be ready. If None, defaults to 1800 seconds
108
- (30 minutes).
109
85
 
110
86
  Outputs
111
87
  -------
@@ -118,57 +94,60 @@ class ReadMesh(Stage[ReadMeshOutputs]):
118
94
  *,
119
95
  stage_name: str | None = None,
120
96
  mesh_id: str | StringPipelineParameter,
121
- wait_timeout_seconds: int | IntPipelineParameter | None = None,
122
97
  ):
123
- if wait_timeout_seconds is None:
124
- wait_timeout_seconds = 30 * 60
125
98
  super().__init__(
126
99
  stage_name,
127
- {"mesh_id": mesh_id, "wait_timeout_seconds": wait_timeout_seconds},
100
+ {"mesh_id": mesh_id},
128
101
  StageInputs(self),
129
102
  ReadMeshOutputs._instantiate_for(self),
130
103
  )
131
104
 
132
105
 
133
106
  @dataclass
134
- class ModifyGeometryOutputs(StageOutputs):
135
- geometry: PipelineOutputGeometry
136
- """The modified Geometry, represented as a new GeometryVersion."""
107
+ class WaitForMeshOutputs(StageOutputs):
108
+ mesh: PipelineOutputMesh
109
+ """
110
+ The Mesh that will be waited for.
111
+ """
137
112
 
138
113
 
139
- # TODO: figure out what `mods` actually is. What does the non-pipeline geo mod interface look like?
140
- class ModifyGeometry(Stage[ModifyGeometryOutputs]):
114
+ class WaitForMesh(StandardStage[WaitForMeshOutputs]):
141
115
  """
142
- Modifies a Geometry.
116
+ Waits for a Mesh to be ready.
117
+
118
+ This is useful if you have a more complicated meshing setup than the `Mesh` stage can handle.
119
+
120
+ For example, you can use a `RunScript` stage to call `lc.create_or_get_mesh()` with arbitrary
121
+ meshing parameters, then pass the resulting mesh to this stage to wait for it to be ready.
122
+ Mesh creation can take minutes to hours, and `RunScript` has a short timeout, so you can't wait
123
+ for it to complete in the `RunScript` stage, but `lc.create_or_get_mesh()` returns immediately
124
+ and mesh creation happens asynchronously, so you can wait for it to be ready in this stage.
143
125
 
144
126
  .. warning:: This feature is experimental and may change or be removed in the future.
145
127
 
146
128
  Parameters
147
129
  ----------
148
- mods : dict
149
- The modifications to apply to the Geometry.
150
- geometry : PipelineOutputGeometry
151
- The Geometry to modify.
130
+ mesh : PipelineOutputMesh
131
+ The Mesh to wait for.
152
132
 
153
133
  Outputs
154
134
  -------
155
- geometry : PipelineOutputGeometry
156
- The modified Geometry, represented as a new GeometryVersion.
135
+ mesh : PipelineOutputMesh
136
+ The same Mesh that was passed in as input. It will now be in a `COMPLETED` status, and ready
137
+ to be used in a Simulation.
157
138
  """
158
139
 
159
140
  def __init__(
160
141
  self,
161
142
  *,
162
143
  stage_name: str | None = None,
163
- mods: list[dict],
164
- geometry: PipelineOutputGeometry,
144
+ mesh: PipelineOutputMesh,
165
145
  ):
166
- raise NotImplementedError("ModifyGeometry is not implemented yet.")
167
146
  super().__init__(
168
147
  stage_name,
169
- {"mods": mods},
170
- StageInputs(self, geometry=(PipelineOutputGeometry, geometry)),
171
- ModifyGeometryOutputs._instantiate_for(self),
148
+ {},
149
+ StageInputs(self, mesh=(PipelineOutputMesh, mesh)),
150
+ WaitForMeshOutputs._instantiate_for(self),
172
151
  )
173
152
 
174
153
 
@@ -178,7 +157,7 @@ class MeshOutputs(StageOutputs):
178
157
  """The Mesh generated from the given Geometry."""
179
158
 
180
159
 
181
- class Mesh(Stage[MeshOutputs]):
160
+ class Mesh(StandardStage[MeshOutputs]):
182
161
  """
183
162
  Generates a Mesh from a Geometry.
184
163
 
@@ -224,7 +203,7 @@ class SimulateOutputs(StageOutputs):
224
203
  """The Simulation."""
225
204
 
226
205
 
227
- class Simulate(Stage[SimulateOutputs]):
206
+ class Simulate(StandardStage[SimulateOutputs]):
228
207
  """
229
208
  Runs a Simulation.
230
209
 
@@ -0,0 +1,122 @@
1
+ from __future__ import annotations
2
+
3
+ import ast
4
+ import builtins
5
+ import inspect
6
+ import symtable
7
+ import textwrap
8
+ import types
9
+ from dataclasses import dataclass
10
+ from typing import Callable, Iterable, Union
11
+
12
+
13
+ PROVIDED_GLOBALS = {"luminarycloud", "lc"}
14
+ ALL_ALLOWED_GLOBALS = set(dir(builtins)) | PROVIDED_GLOBALS
15
+
16
+
17
+ @dataclass(frozen=True)
18
+ class ValidatedFunction:
19
+ """Result of validation."""
20
+
21
+ source: str
22
+ entrypoint: str
23
+
24
+
25
+ class FunctionValidationError(ValueError):
26
+ pass
27
+
28
+
29
+ def _param_name_set(fn_node: ast.FunctionDef | ast.AsyncFunctionDef) -> frozenset[str]:
30
+ """
31
+ Return the set of parameter names for the function, excluding kwargs.
32
+ """
33
+ a = fn_node.args
34
+ if a.posonlyargs:
35
+ raise FunctionValidationError("Positional-only arguments are not supported.")
36
+ if a.vararg:
37
+ raise FunctionValidationError("Variable-length arguments are not supported.")
38
+ return frozenset(x.arg for x in a.args)
39
+
40
+
41
+ def validate_portable_top_level_function(
42
+ fn: Callable | str,
43
+ *,
44
+ must_have_params: set[str],
45
+ can_have_params: set[str],
46
+ ) -> ValidatedFunction:
47
+ """
48
+ Validate that `fn` is a function which has no freevars and no globals beyond builtins, and
49
+ comports with the given must_have_params and can_have_params.
50
+
51
+ Raises FunctionValidationError on any violation.
52
+ """
53
+
54
+ if isinstance(fn, str):
55
+ src = textwrap.dedent(fn)
56
+ else:
57
+ try:
58
+ source_lines, _ = inspect.getsourcelines(fn)
59
+ except (OSError, IOError, TypeError) as exc:
60
+ raise ValueError(f"Unable to retrieve source for function: {exc}") from exc
61
+ # Drop decorator lines (everything before the `def`)
62
+ for i, line in enumerate(source_lines):
63
+ if line.lstrip().startswith("def "):
64
+ source_lines = source_lines[i:]
65
+ break
66
+ src = textwrap.dedent("".join(source_lines))
67
+ if not src.endswith("\n"):
68
+ src += "\n"
69
+ parsed = ast.parse(src, filename="<string>", mode="exec")
70
+ body = parsed.body
71
+
72
+ if len(body) != 1 or not isinstance(body[0], ast.FunctionDef):
73
+ found = [type(n).__name__ for n in body]
74
+ raise FunctionValidationError(
75
+ "Code must contain exactly one top-level function definition and nothing else at the top level. "
76
+ f"Found top-level items: {found}"
77
+ )
78
+
79
+ fn_node = body[0]
80
+ fn_name = fn_node.name
81
+
82
+ actual_params = _param_name_set(fn_node)
83
+
84
+ if actual_params - can_have_params != must_have_params:
85
+ raise FunctionValidationError(
86
+ f"Parameter mismatch for function {fn_name!r}.\n"
87
+ f"Your function takes: {sorted(actual_params)}\n"
88
+ f"It must take all stage inputs and params: {sorted(must_have_params)}\n"
89
+ f"It can also take these implicit params: {sorted(can_have_params)}\n"
90
+ f"Your function's extra params are: {sorted(actual_params - must_have_params - can_have_params)}\n"
91
+ f"Your function's missing params are: {sorted(must_have_params - actual_params)}"
92
+ )
93
+
94
+ st = symtable.symtable(src, filename="<string>", compile_type="exec")
95
+
96
+ # Find the function's symbol table (top-level child)
97
+ fn_st = None
98
+ for child in st.get_children():
99
+ if child.get_type() == "function" and child.get_name() == fn_name:
100
+ fn_st = child
101
+ break
102
+ if fn_st is None:
103
+ # This should not happen given the AST check, but keep it explicit.
104
+ raise FunctionValidationError(f"Could not locate symbol table for {fn_name!r}")
105
+
106
+ freevars = [s.get_name() for s in fn_st.get_symbols() if s.is_free()]
107
+ if freevars:
108
+ raise FunctionValidationError(
109
+ f"Function {fn_name!r} closes over nonlocals/free variables: {sorted(set(freevars))}"
110
+ )
111
+
112
+ globals_used = [s.get_name() for s in fn_st.get_symbols() if s.is_global()]
113
+ disallowed_globals = sorted({g for g in globals_used if g not in ALL_ALLOWED_GLOBALS})
114
+
115
+ if disallowed_globals:
116
+ raise FunctionValidationError(
117
+ "RunScript functions must not rely on non-local variables, including imports. All "
118
+ f"modules your script needs (except {', '.join(PROVIDED_GLOBALS)}) must be imported in "
119
+ f"the function body. Found non-local variables: {', '.join(disallowed_globals)}"
120
+ )
121
+
122
+ return ValidatedFunction(source=src, entrypoint=fn_name)
luminarycloud/project.py CHANGED
@@ -30,7 +30,6 @@ from ._helpers import (
30
30
  list_inference_jobs,
31
31
  SurfaceForInference,
32
32
  )
33
- from ._helpers.warnings import deprecated
34
33
  from ._proto.api.v0.luminarycloud.geometry import geometry_pb2 as geometrypb
35
34
  from ._proto.api.v0.luminarycloud.mesh import mesh_pb2 as meshpb
36
35
  from ._proto.api.v0.luminarycloud.named_variable_set import (
@@ -833,19 +832,6 @@ def get_project(
833
832
  return Project(res.project)
834
833
 
835
834
 
836
- @deprecated("Use iterate_projects() instead.", "0.10.1")
837
- def list_projects() -> list[Project]:
838
- """
839
- List projects accessible by the user.
840
-
841
- .. deprecated:: 0.10.1
842
- `list_projects()` will be removed in v0.11.0, it is replaced by
843
- `iterate_projects()` because the latter provides a more efficient
844
- way to fetch projects.
845
- """
846
- return list(iterate_projects())
847
-
848
-
849
835
  class ProjectIterator(PaginationIterator[Project]):
850
836
  """Iterator class for projects that provides length hint."""
851
837
 
@@ -6,7 +6,6 @@ from typing import Optional
6
6
  from ._client import get_default_client
7
7
  from ._helpers._timestamp_to_datetime import timestamp_to_datetime
8
8
  from ._helpers._wait_for_simulation import wait_for_simulation
9
- from ._helpers.warnings import deprecated
10
9
  from ._proto.api.v0.luminarycloud.common import common_pb2 as commonpb
11
10
  from ._proto.api.v0.luminarycloud.simulation import simulation_pb2 as simulationpb
12
11
  from ._proto.api.v0.luminarycloud.solution import solution_pb2 as solutionpb
@@ -16,14 +15,14 @@ from ._wrapper import ProtoWrapper, ProtoWrapperBase
16
15
  from .enum import (
17
16
  AveragingType,
18
17
  CalculationType,
18
+ MomentConventionType,
19
19
  QuantityType,
20
20
  ResidualNormalization,
21
- MomentConventionType,
22
21
  SimulationStatus,
23
22
  Vector3Component,
24
23
  )
24
+ from .outputs import ForceOutputDefinition, SurfaceAverageOutputDefinition
25
25
  from .outputs.stopping_conditions import StoppingConditionStatusResult
26
- from .simulation_param import SimulationParam
27
26
  from .reference_values import ReferenceValues
28
27
  from .simulation_param import SimulationParam
29
28
  from .solution import Solution
@@ -74,7 +73,7 @@ class Simulation(ProtoWrapperBase):
74
73
  def update(
75
74
  self,
76
75
  *,
77
- name: str = None,
76
+ name: Optional[str] = None,
78
77
  ) -> None:
79
78
  """
80
79
  Update/Edit simulation attributes.
@@ -184,7 +183,7 @@ class Simulation(ProtoWrapperBase):
184
183
  quantity_type: QuantityType,
185
184
  surface_ids: list[str],
186
185
  *,
187
- reference_values: ReferenceValues = None,
186
+ reference_values: Optional[ReferenceValues] = None,
188
187
  calculation_type: CalculationType = CalculationType.AGGREGATE,
189
188
  frame_id: str = "",
190
189
  force_direction: Optional[Vector3Like] = None,
@@ -279,6 +278,44 @@ class Simulation(ProtoWrapperBase):
279
278
  res = get_default_client().GetSimulationSurfaceQuantityOutput(req)
280
279
  return _DownloadedTextFile(res.csv_file)
281
280
 
281
+ def download_output_from_definition(
282
+ self,
283
+ output_definition: ForceOutputDefinition | SurfaceAverageOutputDefinition,
284
+ *,
285
+ reference_values: Optional[ReferenceValues] = None,
286
+ ):
287
+ """
288
+ Downloads surface outputs (e.g. lift, drag, ...) in csv format based on an output
289
+ definition.
290
+
291
+ Unless `reference_values` is explicitly passed, the Simulation's reference values -- i.e.
292
+ the ones specified when the Simulation was created -- will be used for computing
293
+ non-dimensional output quantities. While the Luminary Cloud UI lets you update the reference
294
+ values on a Simulation result after it has run, those updates only affect the output
295
+ calculations seen in the UI, they have no effect on the ones retrieved by this method.
296
+
297
+ Parameters
298
+ ----------
299
+ output_definition : ForceOutputDefinition | SurfaceAverageOutputDefinition
300
+ Output definition
301
+
302
+ Other Parameters
303
+ ----------------
304
+ reference_values : ReferenceValues, optional
305
+ Reference values used for computing forces, moments, and other non-dimensional output
306
+ quantities. If not provided, the simulation's reference values will be used, i.e., the
307
+ ones specified when the simulation was created.
308
+ """
309
+ req = simulationpb.GetSimulationOutputFromDefinitionRequest(
310
+ id=self.id,
311
+ output_definition=output_definition._to_proto(),
312
+ reference_values=(
313
+ reference_values._to_proto() if reference_values else ReferenceValues()._to_proto()
314
+ ),
315
+ )
316
+ res = get_default_client().GetSimulationOutputFromDefinition(req)
317
+ return _DownloadedTextFile(res.csv_file)
318
+
282
319
  def delete(self) -> None:
283
320
  """
284
321
  Delete the simulation.
@@ -349,12 +386,6 @@ class Simulation(ProtoWrapperBase):
349
386
  res = get_default_client().GetStoppingConditionStatus(req)
350
387
  return StoppingConditionStatusResult._from_proto(res)
351
388
 
352
- @deprecated(
353
- "Use get_parameters() instead. This method will be removed in a future release.",
354
- )
355
- def get_simulation_param(self) -> SimulationParam:
356
- return self.get_parameters()
357
-
358
389
  # This is used by the assistant for the SDK Code shown in the Results tab.
359
390
  def _to_code(self) -> str:
360
391
  return f"""# This code shows how to modify the parameters of the current simulation to create a new one.
@@ -247,63 +247,6 @@ class SimulationParam(_SimulationParam):
247
247
  )
248
248
  )
249
249
 
250
- def configure_adjoint_surface_output(
251
- self,
252
- quantity_type: QuantityType,
253
- surface_ids: list[str],
254
- *,
255
- reference_values: ReferenceValues = None,
256
- frame_id: str = "",
257
- force_direction: Optional[Vector3Like] = None,
258
- moment_center: Optional[Vector3Like] = None,
259
- moment_convention_type: MomentConventionType = MomentConventionType.BODY_FRAME,
260
- averaging_type: AveragingType = AveragingType.UNSPECIFIED,
261
- ) -> None:
262
- """
263
- Helper to configure the surface output differentiated by the adjoint solver.
264
- See Simulation.download_surface_output() for details on the input parameters.
265
-
266
- .. warning:: This feature is experimental and may change or be removed without notice.
267
- """
268
- self.adjoint = self.adjoint or Adjoint()
269
- self.adjoint._output = outputpb.Output()
270
- self.adjoint._output.quantity = quantity_type.value
271
- self.adjoint._output.in_surfaces.extend(surface_ids)
272
- self.adjoint._output.frame_id = frame_id
273
- if QuantityType._is_average(quantity_type):
274
- if averaging_type == AveragingType.UNSPECIFIED:
275
- self.adjoint._output.surface_average_properties.averaging_type = (
276
- SpaceAveragingType.NO_AVERAGING.value
277
- )
278
- elif averaging_type == AveragingType.AREA:
279
- self.adjoint._output.surface_average_properties.averaging_type = (
280
- SpaceAveragingType.AREA.value
281
- )
282
- elif averaging_type == AveragingType.MASS_FLOW:
283
- self.adjoint._output.surface_average_properties.averaging_type = (
284
- SpaceAveragingType.MASS_FLOW.value
285
- )
286
- elif QuantityType._is_force(quantity_type):
287
- self.adjoint._output.force_properties.CopyFrom(
288
- outputpb.ForceProperties(
289
- force_dir_type=(
290
- outputpb.FORCE_DIRECTION_BODY_ORIENTATION_AND_FLOW_DIR
291
- if quantity_type._has_tag(quantityoptspb.TAG_AUTO_DIRECTION)
292
- else outputpb.FORCE_DIRECTION_CUSTOM
293
- ),
294
- force_direction=(
295
- _to_vector3_ad_proto(force_direction) if force_direction else None
296
- ),
297
- moment_center=_to_vector3_ad_proto(moment_center) if moment_center else None,
298
- moment_convention_type=moment_convention_type.value,
299
- )
300
- )
301
- else:
302
- raise ValueError("Invalid QuantityType.")
303
-
304
- if reference_values is not None:
305
- self.reference_values = reference_values
306
-
307
250
  def __repr__(self) -> str:
308
251
  return pformat(vars(self), compact=True, sort_dicts=True)
309
252
 
@@ -334,11 +277,6 @@ from luminarycloud import outputs, SimulationParam, EntityIdentifier
334
277
  code += self._to_code_helper("obj", hide_defaults, use_tmp_objs).replace(
335
278
  "luminarycloud.simulation_param.SimulationParam()", "luminarycloud.SimulationParam()", 1
336
279
  )
337
- if self.adjoint.primal_simulation_id != "":
338
- code += """
339
- # TODO(USER): Select appropriate parameters to configure the adjoint output.
340
- obj.configure_adjoint_output("...")
341
- """
342
280
  return code
343
281
 
344
282
  def find_parameter(self, parameter: str) -> None:
@@ -8,7 +8,6 @@ from difflib import Differ
8
8
  from .enum import (
9
9
  TableType,
10
10
  )
11
- from ._helpers.warnings import deprecated
12
11
  from ._client import get_default_client
13
12
  from ._helpers._simulation_params_from_json import simulation_params_from_json_path
14
13
  from ._helpers._timestamp_to_datetime import timestamp_to_datetime
@@ -180,15 +179,6 @@ class SimulationTemplate(ProtoWrapperBase):
180
179
  """
181
180
  return SimulationParam.from_proto(self._proto.parameters)
182
181
 
183
- @deprecated(
184
- "Use get_parameters() instead. This method will be removed in a future release.",
185
- )
186
- def get_simulation_param(self) -> SimulationParam:
187
- """
188
- Returns a copy of the simulation parameters associated with this template.
189
- """
190
- return self.get_parameters()
191
-
192
182
  def list_tables(
193
183
  self,
194
184
  table_type: Optional[TableType] = None,
@@ -490,7 +480,7 @@ class SimulationTemplate(ProtoWrapperBase):
490
480
  code += "\n\n\n"
491
481
  code += '# Create a new simulation template or modify the one that is synced with the UI "Setup" tab.\n'
492
482
  code += f'project = luminarycloud.get_project("{self.project_id}")\n'
493
- escaped_name = self.name.replace('\\','\\\\').replace('"','\\"')
483
+ escaped_name = self.name.replace("\\", "\\\\").replace('"', '\\"')
494
484
  code += f'template = project.create_simulation_template(name="{escaped_name}")\n'
495
485
  code += '# TODO(USER): To modify the "Setup" template, uncomment the line below and comment out the line above.\n'
496
486
  code += "# template = project.list_simulation_templates()[0] # Setup template\n\n"
@@ -1,5 +1,8 @@
1
+ import warnings
1
2
  from abc import ABCMeta
2
- from typing import Any, Union
3
+ from functools import total_ordering
4
+ from typing import Any
5
+
3
6
  from .._proto.base.base_pb2 import AdFloatType, ExpressionType, FirstOrderAdType, SecondOrderAdType
4
7
 
5
8
 
@@ -9,13 +12,14 @@ class AdFloat(float, metaclass=ABCMeta):
9
12
  pass
10
13
 
11
14
 
15
+ @total_ordering
12
16
  class FirstOrderAdFloat(AdFloat):
13
17
  """An immutable float with first order adjoints/tangents attached."""
14
18
 
15
19
  _tangent: tuple[float, ...]
16
20
  _adjoint: tuple[float, ...]
17
21
 
18
- def __new__(cls: type["FirstOrderAdFloat"], value: float, *_: Any) -> "FirstOrderAdFloat":
22
+ def __new__(cls, value: float, *_: Any) -> "FirstOrderAdFloat":
19
23
  return super().__new__(cls, value)
20
24
 
21
25
  def __init__(self, value: float, tangent: tuple[float, ...], adjoint: tuple[float, ...]):
@@ -45,6 +49,11 @@ class FirstOrderAdFloat(AdFloat):
45
49
  and self.adjoint == other.adjoint
46
50
  )
47
51
 
52
+ def __lt__(self, other: Any) -> bool:
53
+ if not isinstance(other, LcFloat):
54
+ return NotImplemented
55
+ return _lcfloat_to_float(self) < _lcfloat_to_float(other)
56
+
48
57
  @staticmethod
49
58
  def _from_proto(proto: FirstOrderAdType) -> "FirstOrderAdFloat":
50
59
  return FirstOrderAdFloat(
@@ -54,6 +63,7 @@ class FirstOrderAdFloat(AdFloat):
54
63
  )
55
64
 
56
65
 
66
+ @total_ordering
57
67
  class SecondOrderAdFloat(AdFloat):
58
68
  """An immutable float with second order adjoints/tangents attached."""
59
69
 
@@ -101,6 +111,11 @@ class SecondOrderAdFloat(AdFloat):
101
111
  and self._adjoint == other._adjoint
102
112
  )
103
113
 
114
+ def __lt__(self, other: Any) -> bool:
115
+ if not isinstance(other, LcFloat):
116
+ return NotImplemented
117
+ return _lcfloat_to_float(self) < _lcfloat_to_float(other)
118
+
104
119
  @staticmethod
105
120
  def _from_proto(proto: SecondOrderAdType) -> "SecondOrderAdFloat":
106
121
  return SecondOrderAdFloat(
@@ -110,6 +125,7 @@ class SecondOrderAdFloat(AdFloat):
110
125
  )
111
126
 
112
127
 
128
+ @total_ordering
113
129
  class Expression:
114
130
  """An expression or value that can be evaluated or used in evaluations."""
115
131
 
@@ -119,6 +135,8 @@ class Expression:
119
135
  def __init__(self, expression: str):
120
136
  if not expression:
121
137
  raise ValueError("Expression cannot be empty")
138
+ # TODO(LC-26796) either evaluate here or in `_to_proto`
139
+ # (or add a separate method to evaluate, but then `Expression` would no longer be immutable)
122
140
  self._value = 0.0
123
141
  self._expression = expression
124
142
 
@@ -145,11 +163,22 @@ class Expression:
145
163
  return False
146
164
  return self._value == other._value and self._expression == other._expression
147
165
 
148
- def _to_code(self, *args) -> str:
166
+ def __lt__(self, other: Any) -> bool:
167
+ if not isinstance(other, LcFloat):
168
+ return NotImplemented
169
+ return _lcfloat_to_float(self) < _lcfloat_to_float(other)
170
+
171
+ def __float__(self) -> float:
172
+ return self._value
173
+
174
+ def __repr__(self) -> str:
175
+ return self._to_code()
176
+
177
+ def _to_code(self, *args: Any) -> str:
149
178
  return f"Expression({self._expression.__repr__()})"
150
179
 
151
180
 
152
- LcFloat = Union[float, FirstOrderAdFloat, SecondOrderAdFloat, Expression]
181
+ LcFloat = float | FirstOrderAdFloat | SecondOrderAdFloat | Expression
153
182
 
154
183
 
155
184
  def _to_ad_proto(value: LcFloat) -> AdFloatType:
@@ -190,3 +219,18 @@ def _from_ad_proto(proto: AdFloatType) -> LcFloat:
190
219
  return 0.0
191
220
 
192
221
  raise ValueError("Invalid AdFloatType proto")
222
+
223
+
224
+ def _lcfloat_to_float(value: LcFloat) -> float:
225
+ if isinstance(value, AdFloat):
226
+ return float(value)
227
+ if isinstance(value, Expression):
228
+ # TODO(LC-26796) evaluate expressions
229
+ warnings.warn(
230
+ "Attempted to convert Expression to float; result may be unexpected. "
231
+ "This behavior will be improved in a later release.",
232
+ category=UserWarning,
233
+ stacklevel=2,
234
+ )
235
+ return value.value
236
+ return value
@@ -15,9 +15,9 @@ class Matrix3:
15
15
 
16
16
  def _to_proto(self) -> basepb.Matrix3:
17
17
  return basepb.Matrix3(
18
- a=basepb.Vector3(x=self.a.x, y=self.a.y, z=self.a.z),
19
- b=basepb.Vector3(x=self.b.x, y=self.b.y, z=self.b.z),
20
- c=basepb.Vector3(x=self.c.x, y=self.c.y, z=self.c.z),
18
+ a=self.a._to_base_proto(),
19
+ b=self.b._to_base_proto(),
20
+ c=self.c._to_base_proto(),
21
21
  )
22
22
 
23
23
  def _to_ad_proto(self) -> basepb.AdMatrix3:
@@ -28,11 +28,11 @@ class Matrix3:
28
28
  )
29
29
 
30
30
  def _from_proto(self, proto: basepb.Matrix3) -> None:
31
- self.a = Vector3(x=proto.a.x, y=proto.a.y, z=proto.a.z)
32
- self.b = Vector3(x=proto.b.x, y=proto.b.y, z=proto.b.z)
33
- self.c = Vector3(x=proto.c.x, y=proto.c.y, z=proto.c.z)
31
+ self.a._from_base_proto(proto.a)
32
+ self.b._from_base_proto(proto.b)
33
+ self.c._from_base_proto(proto.c)
34
34
 
35
35
  def _from_ad_proto(self, proto: basepb.AdMatrix3) -> None:
36
- self.a = Vector3.from_ad_proto(proto.a)
37
- self.b = Vector3.from_ad_proto(proto.b)
38
- self.c = Vector3.from_ad_proto(proto.c)
36
+ self.a._from_ad_proto(proto.a)
37
+ self.b._from_ad_proto(proto.b)
38
+ self.c._from_ad_proto(proto.c)