openscvx 0.3.2.dev195__tar.gz → 0.3.2.dev204__tar.gz

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 (235) hide show
  1. {openscvx-0.3.2.dev195/openscvx.egg-info → openscvx-0.3.2.dev204}/PKG-INFO +1 -1
  2. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/__init__.py +4 -0
  3. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/_version.py +3 -3
  4. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/__init__.py +4 -0
  5. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/math.py +202 -0
  6. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/lowerers/cvxpy.py +33 -0
  7. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/lowerers/jax.py +76 -0
  8. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204/openscvx.egg-info}/PKG-INFO +1 -1
  9. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/symbolic/expr/test_math.py +676 -0
  10. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/.github/assets/logo.svg +0 -0
  11. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/.github/release-drafter.yml +0 -0
  12. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/.github/workflows/_docs.yml +0 -0
  13. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/.github/workflows/docs.yml +0 -0
  14. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/.github/workflows/lint.yml +0 -0
  15. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/.github/workflows/nightly.yml +0 -0
  16. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/.github/workflows/release-drafter.yml +0 -0
  17. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/.github/workflows/release.yml +0 -0
  18. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/.github/workflows/tests-integration.yml +0 -0
  19. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/.github/workflows/tests-unit.yml +0 -0
  20. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/.gitignore +0 -0
  21. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/CONTRIBUTING.md +0 -0
  22. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/LICENSE +0 -0
  23. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/README.md +0 -0
  24. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/Overview/constraint_reformulation.md +0 -0
  25. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/Overview/control_parameterization.md +0 -0
  26. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/Overview/discretization.md +0 -0
  27. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/Overview/ocp.md +0 -0
  28. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/Overview/scvx.md +0 -0
  29. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/Overview/time_dilation.md +0 -0
  30. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/UnderTheHood/lowering_architecture.md +0 -0
  31. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/UnderTheHood/vectorization_and_vmapping.md +0 -0
  32. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/Usage/advanced_problem_setup.md +0 -0
  33. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/Usage/api.md +0 -0
  34. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/Usage/api_constraints.md +0 -0
  35. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/Usage/api_control.md +0 -0
  36. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/Usage/api_integrators.md +0 -0
  37. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/Usage/api_state.md +0 -0
  38. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/Usage/api_trajoptproblem.md +0 -0
  39. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/Usage/api_variable.md +0 -0
  40. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/Usage/basic_problem_setup.md +0 -0
  41. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/Usage/tutorial_6dof_los_guidance.md +0 -0
  42. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/Usage/tutorial_6dof_obstacle_avoidance.md +0 -0
  43. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/Usage/tutorials.md +0 -0
  44. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/assets/favicon.png +0 -0
  45. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/assets/images/ct-scvx_dark.png +0 -0
  46. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/assets/images/ct-scvx_light.png +0 -0
  47. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/assets/images/ctcs_dark.png +0 -0
  48. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/assets/images/ctcs_light.png +0 -0
  49. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/assets/images/problem_class_dark.png +0 -0
  50. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/assets/images/problem_class_light.png +0 -0
  51. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/assets/logo.svg +0 -0
  52. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/citation.md +0 -0
  53. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/examples.md +0 -0
  54. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/getting-started.md +0 -0
  55. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/index.md +0 -0
  56. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/docs/javascripts/mathjax.js +0 -0
  57. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/examples/abstract/3DoF_pdg.py +0 -0
  58. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/examples/abstract/brachistochrone.py +0 -0
  59. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/examples/arm/three_link_arm.py +0 -0
  60. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/examples/car/dubins_car.py +0 -0
  61. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/examples/car/dubins_car_disjoint.py +0 -0
  62. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/examples/car/dubins_car_stljax.py +0 -0
  63. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/examples/drone/cinema_vp.py +0 -0
  64. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/examples/drone/cinema_vp_realtime_base.py +0 -0
  65. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/examples/drone/dr_double_integrator.py +0 -0
  66. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/examples/drone/dr_vp.py +0 -0
  67. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/examples/drone/dr_vp_nodal.py +0 -0
  68. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/examples/drone/dr_vp_polytope.py +0 -0
  69. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/examples/drone/drone_racing.py +0 -0
  70. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/examples/drone/obstacle_avoidance.py +0 -0
  71. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/examples/drone/obstacle_avoidance_nodal.py +0 -0
  72. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/examples/drone/obstacle_avoidance_realtime_base.py +0 -0
  73. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/examples/drone/obstacle_avoidance_vmap.py +0 -0
  74. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/examples/plotting.py +0 -0
  75. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/examples/plotting_viser.py +0 -0
  76. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/examples/realtime/cinema_vp_realtime.py +0 -0
  77. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/examples/realtime/drone_racing_realtime.py +0 -0
  78. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/examples/realtime/dubins_car_realtime.py +0 -0
  79. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/examples/realtime/obstacle_avoidance_realtime.py +0 -0
  80. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/examples/spacecraft/proxops_cw.py +0 -0
  81. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/figures/ctlos_cine.gif +0 -0
  82. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/figures/ctlos_dr.gif +0 -0
  83. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/figures/dtlos_cine.gif +0 -0
  84. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/figures/dtlos_dr.gif +0 -0
  85. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/figures/openscvx_logo.svg +0 -0
  86. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/figures/openscvx_logo_square.png +0 -0
  87. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/figures/oscvx_structure_full_dark.svg +0 -0
  88. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/figures/video_preview.png +0 -0
  89. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/__init__.py +0 -0
  90. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/1-background.avif +0 -0
  91. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/1-background@1x.avif +0 -0
  92. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/1-background@2x.avif +0 -0
  93. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/1-background@3x.avif +0 -0
  94. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/1-background@4x.avif +0 -0
  95. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/2-mars.avif +0 -0
  96. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/2-mars@1x.avif +0 -0
  97. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/2-mars@2x.avif +0 -0
  98. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/2-mars@3x.avif +0 -0
  99. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/2-mars@4x.avif +0 -0
  100. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/3-moon.avif +0 -0
  101. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/3-moon@1x.avif +0 -0
  102. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/3-moon@2x.avif +0 -0
  103. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/3-moon@3x.avif +0 -0
  104. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/3-moon@4x.avif +0 -0
  105. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/4-sat1.avif +0 -0
  106. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/4-sat1@1x.avif +0 -0
  107. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/4-sat1@2x.avif +0 -0
  108. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/4-sat1@3x.avif +0 -0
  109. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/4-sat1@4x.avif +0 -0
  110. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/5-space.avif +0 -0
  111. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/5-space@1x.avif +0 -0
  112. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/5-space@2x.avif +0 -0
  113. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/5-space@3x.avif +0 -0
  114. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/5-space@4x.avif +0 -0
  115. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/6-earth.avif +0 -0
  116. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/6-earth@1x.avif +0 -0
  117. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/6-earth@2x.avif +0 -0
  118. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/6-earth@3x.avif +0 -0
  119. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/images/layers/6-earth@4x.avif +0 -0
  120. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/javascripts/parallax.js +0 -0
  121. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/logo.svg +0 -0
  122. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/stylesheets/custom.css +0 -0
  123. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/assets/stylesheets/parallax.css +0 -0
  124. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/home.html +0 -0
  125. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/main.html +0 -0
  126. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/partials/parallax/hero.html +0 -0
  127. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/material/overrides/partials/parallax.html +0 -0
  128. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/mkdocs.yml +0 -0
  129. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/algorithms/__init__.py +0 -0
  130. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/algorithms/autotuning.py +0 -0
  131. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/algorithms/base.py +0 -0
  132. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/algorithms/optimization_results.py +0 -0
  133. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/algorithms/penalized_trust_region.py +0 -0
  134. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/config.py +0 -0
  135. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/discretization/__init__.py +0 -0
  136. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/discretization/discretization.py +0 -0
  137. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/expert/__init__.py +0 -0
  138. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/expert/byof.py +0 -0
  139. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/expert/lowering.py +0 -0
  140. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/expert/validation.py +0 -0
  141. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/integrators/__init__.py +0 -0
  142. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/integrators/runge_kutta.py +0 -0
  143. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/lowered/__init__.py +0 -0
  144. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/lowered/cvxpy_constraints.py +0 -0
  145. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/lowered/cvxpy_variables.py +0 -0
  146. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/lowered/dynamics.py +0 -0
  147. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/lowered/jax_constraints.py +0 -0
  148. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/lowered/parameters.py +0 -0
  149. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/lowered/problem.py +0 -0
  150. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/lowered/unified.py +0 -0
  151. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/plotting/__init__.py +0 -0
  152. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/plotting/plotting.py +0 -0
  153. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/plotting/scp_iteration.py +0 -0
  154. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/plotting/viser/__init__.py +0 -0
  155. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/plotting/viser/animated.py +0 -0
  156. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/plotting/viser/plotly_integration.py +0 -0
  157. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/plotting/viser/primitives.py +0 -0
  158. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/plotting/viser/scp.py +0 -0
  159. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/plotting/viser/server.py +0 -0
  160. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/problem.py +0 -0
  161. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/propagation/__init__.py +0 -0
  162. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/propagation/post_processing.py +0 -0
  163. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/propagation/propagation.py +0 -0
  164. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/solvers/__init__.py +0 -0
  165. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/solvers/cvxpy.py +0 -0
  166. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/__init__.py +0 -0
  167. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/augmentation.py +0 -0
  168. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/builder.py +0 -0
  169. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/constraint_set.py +0 -0
  170. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/arithmetic.py +0 -0
  171. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/array.py +0 -0
  172. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/constraint.py +0 -0
  173. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/control.py +0 -0
  174. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/expr.py +0 -0
  175. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/lie/__init__.py +0 -0
  176. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/lie/adjoint.py +0 -0
  177. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/lie/se3.py +0 -0
  178. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/lie/so3.py +0 -0
  179. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/linalg.py +0 -0
  180. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/spatial.py +0 -0
  181. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/state.py +0 -0
  182. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/stl.py +0 -0
  183. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/variable.py +0 -0
  184. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/expr/vmap.py +0 -0
  185. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/hashing.py +0 -0
  186. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/lower.py +0 -0
  187. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/lowerers/__init__.py +0 -0
  188. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/preprocessing.py +0 -0
  189. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/problem.py +0 -0
  190. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/time.py +0 -0
  191. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/symbolic/unified.py +0 -0
  192. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/utils/__init__.py +0 -0
  193. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/utils/cache.py +0 -0
  194. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/utils/caching.py +0 -0
  195. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/utils/printing.py +0 -0
  196. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/utils/profiling.py +0 -0
  197. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx/utils/utils.py +0 -0
  198. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx.egg-info/SOURCES.txt +0 -0
  199. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx.egg-info/dependency_links.txt +0 -0
  200. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx.egg-info/requires.txt +0 -0
  201. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/openscvx.egg-info/top_level.txt +0 -0
  202. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/pyproject.toml +0 -0
  203. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/scripts/gen_example_pages.py +0 -0
  204. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/scripts/gen_ref_pages.py +0 -0
  205. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/setup.cfg +0 -0
  206. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/__init__.py +0 -0
  207. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/brachistochrone_analytical.py +0 -0
  208. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/symbolic/__init__.py +0 -0
  209. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/symbolic/expr/__init__.py +0 -0
  210. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/symbolic/expr/test_arithmetic.py +0 -0
  211. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/symbolic/expr/test_array.py +0 -0
  212. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/symbolic/expr/test_constraint.py +0 -0
  213. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/symbolic/expr/test_expr.py +0 -0
  214. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/symbolic/expr/test_lie.py +0 -0
  215. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/symbolic/expr/test_linalg.py +0 -0
  216. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/symbolic/expr/test_node_reference.py +0 -0
  217. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/symbolic/expr/test_parameters.py +0 -0
  218. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/symbolic/expr/test_scaling.py +0 -0
  219. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/symbolic/expr/test_spatial.py +0 -0
  220. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/symbolic/expr/test_variable.py +0 -0
  221. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/symbolic/expr/test_vmap.py +0 -0
  222. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/symbolic/test_augmentation.py +0 -0
  223. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/symbolic/test_hashing.py +0 -0
  224. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/symbolic/test_lower_cvxpy.py +0 -0
  225. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/symbolic/test_lower_jax.py +0 -0
  226. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/symbolic/test_preprocessing.py +0 -0
  227. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/symbolic/test_unified.py +0 -0
  228. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/test_brachistochrone.py +0 -0
  229. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/test_cvxpygen_optional.py +0 -0
  230. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/test_discretization.py +0 -0
  231. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/test_examples.py +0 -0
  232. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/test_expert.py +0 -0
  233. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/test_integrators.py +0 -0
  234. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/test_plotting.py +0 -0
  235. {openscvx-0.3.2.dev195 → openscvx-0.3.2.dev204}/tests/test_propagation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscvx
3
- Version: 0.3.2.dev195
3
+ Version: 0.3.2.dev204
4
4
  Summary: A general Python-based successive convexification implementation which uses a JAX backend.
5
5
  Author-email: Chris Hayner and Griffin Norris <haynec@uw.edu>
6
6
  License: Apache Software License
@@ -15,6 +15,7 @@ from openscvx.symbolic.expr import (
15
15
  CTCS,
16
16
  Abs,
17
17
  Add,
18
+ Bilerp,
18
19
  Block,
19
20
  Concat,
20
21
  Constant,
@@ -32,6 +33,7 @@ from openscvx.symbolic.expr import (
32
33
  Index,
33
34
  Inequality,
34
35
  Leaf,
36
+ Linterp,
35
37
  Log,
36
38
  LogSumExp,
37
39
  MatMul,
@@ -107,6 +109,8 @@ __all__ = [
107
109
  "Log",
108
110
  "LogSumExp",
109
111
  "Max",
112
+ "Linterp",
113
+ "Bilerp",
110
114
  # Constraints
111
115
  "Constraint",
112
116
  "Equality",
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.3.2.dev195'
32
- __version_tuple__ = version_tuple = (0, 3, 2, 'dev195')
31
+ __version__ = version = '0.3.2.dev204'
32
+ __version_tuple__ = version_tuple = (0, 3, 2, 'dev204')
33
33
 
34
- __commit_id__ = commit_id = 'ged5d19a8c'
34
+ __commit_id__ = commit_id = 'g3b21ffc13'
@@ -118,9 +118,11 @@ from .linalg import Diag, Norm, Sum, Transpose
118
118
  # Mathematical functions
119
119
  from .math import (
120
120
  Abs,
121
+ Bilerp,
121
122
  Cos,
122
123
  Exp,
123
124
  Huber,
125
+ Linterp,
124
126
  Log,
125
127
  LogSumExp,
126
128
  Max,
@@ -194,6 +196,8 @@ __all__ = [
194
196
  "Log",
195
197
  "LogSumExp",
196
198
  "Max",
199
+ "Linterp",
200
+ "Bilerp",
197
201
  # Linear algebra operations
198
202
  "Transpose",
199
203
  "Stack",
@@ -697,3 +697,205 @@ class LogSumExp(Expr):
697
697
  def __repr__(self):
698
698
  inner = ", ".join(repr(op) for op in self.operands)
699
699
  return f"logsumexp({inner})"
700
+
701
+
702
+ class Linterp(Expr):
703
+ """1D linear interpolation for symbolic expressions.
704
+
705
+ Computes the linear interpolant of data points (xp, fp) evaluated at x,
706
+ equivalent to jax.numpy.interp(x, xp, fp). For values outside the data range,
707
+ the boundary values are returned (no extrapolation).
708
+
709
+ This is useful for incorporating tabulated data (e.g., atmospheric properties,
710
+ engine thrust curves, aerodynamic coefficients) into trajectory optimization
711
+ dynamics and constraints.
712
+
713
+ Attributes:
714
+ x: Query point(s) at which to evaluate the interpolant (symbolic expression)
715
+ xp: 1D array of x-coordinates of data points (must be increasing)
716
+ fp: 1D array of y-coordinates of data points (same length as xp)
717
+
718
+ Example:
719
+ Interpolate atmospheric density from altitude table::
720
+
721
+ import openscvx as ox
722
+ import numpy as np
723
+
724
+ # US 1976 Standard Atmosphere data
725
+ alt_data = np.array([0, 5000, 10000, 15000, 20000]) # meters
726
+ rho_data = np.array([1.225, 0.736, 0.414, 0.195, 0.089]) # kg/m^3
727
+
728
+ altitude = ox.State("altitude", shape=(1,))
729
+ rho = ox.Linterp(altitude[0], alt_data, rho_data)
730
+
731
+ # rho can now be used in dynamics expressions
732
+ drag = 0.5 * rho * v**2 * Cd * S
733
+
734
+ Note:
735
+ - xp must be strictly increasing
736
+ - For query points outside [xp[0], xp[-1]], boundary values are returned
737
+ """
738
+
739
+ def __init__(self, x, xp, fp):
740
+ """Initialize a 1D linear interpolation node.
741
+
742
+ Args:
743
+ x: Query point(s) at which to evaluate the interpolant.
744
+ Can be a scalar or array symbolic expression.
745
+ xp: 1D array of x-coordinates of data points. Must be increasing.
746
+ Can be a numpy array or Constant expression.
747
+ fp: 1D array of y-coordinates of data points. Must have same length as xp.
748
+ Can be a numpy array or Constant expression.
749
+ """
750
+ self.x = to_expr(x)
751
+ self.xp = to_expr(xp)
752
+ self.fp = to_expr(fp)
753
+
754
+ def children(self):
755
+ return [self.x, self.xp, self.fp]
756
+
757
+ def canonicalize(self) -> "Expr":
758
+ """Canonicalize by canonicalizing all operands."""
759
+ x = self.x.canonicalize()
760
+ xp = self.xp.canonicalize()
761
+ fp = self.fp.canonicalize()
762
+ return Linterp(x, xp, fp)
763
+
764
+ def check_shape(self) -> Tuple[int, ...]:
765
+ """Output shape matches the query point shape.
766
+
767
+ The interpolation is element-wise over x, so the output has
768
+ the same shape as the query points.
769
+
770
+ Returns:
771
+ tuple: Shape of the query point x
772
+
773
+ Raises:
774
+ ValueError: If xp and fp have different lengths or are not 1D
775
+ """
776
+ xp_shape = self.xp.check_shape()
777
+ fp_shape = self.fp.check_shape()
778
+
779
+ if len(xp_shape) != 1:
780
+ raise ValueError(f"Linterp xp must be 1D, got shape {xp_shape}")
781
+ if len(fp_shape) != 1:
782
+ raise ValueError(f"Linterp fp must be 1D, got shape {fp_shape}")
783
+ if xp_shape != fp_shape:
784
+ raise ValueError(
785
+ f"Linterp xp and fp must have same length, got {xp_shape} vs {fp_shape}"
786
+ )
787
+
788
+ return self.x.check_shape()
789
+
790
+ def __repr__(self):
791
+ return f"linterp({self.x!r}, {self.xp!r}, {self.fp!r})"
792
+
793
+
794
+ class Bilerp(Expr):
795
+ """2D bilinear interpolation for symbolic expressions.
796
+
797
+ Performs bilinear interpolation on a regular 2D grid. Given grid points
798
+ (xp, yp) and corresponding values fp, computes the bilinearly interpolated
799
+ value at query point (x, y). For values outside the grid, boundary values
800
+ are returned (clamping, no extrapolation).
801
+
802
+ This is useful for incorporating 2D tabulated data (e.g., engine thrust
803
+ as a function of altitude and Mach number, aerodynamic coefficients as
804
+ a function of angle of attack and sideslip) into trajectory optimization.
805
+
806
+ Attributes:
807
+ x: Query x-coordinate (symbolic expression)
808
+ y: Query y-coordinate (symbolic expression)
809
+ xp: 1D array of x grid coordinates (must be increasing), length N
810
+ yp: 1D array of y grid coordinates (must be increasing), length M
811
+ fp: 2D array of values with shape (N, M), where fp[i, j] is the
812
+ value at grid point (xp[i], yp[j])
813
+
814
+ Example:
815
+ Interpolate engine thrust from altitude and Mach number::
816
+
817
+ import openscvx as ox
818
+ import numpy as np
819
+
820
+ # Grid coordinates
821
+ alt_grid = np.array([0, 5000, 10000, 15000, 20000]) # meters
822
+ mach_grid = np.array([0.0, 0.5, 1.0, 1.5, 2.0])
823
+
824
+ # Thrust values: thrust_table[i, j] = thrust at (alt_grid[i], mach_grid[j])
825
+ thrust_table = np.array([...]) # shape (5, 5)
826
+
827
+ altitude = ox.State("altitude", shape=(1,))
828
+ mach = ox.State("mach", shape=(1,))
829
+
830
+ thrust = ox.Bilerp(altitude[0], mach[0], alt_grid, mach_grid, thrust_table)
831
+
832
+ Note:
833
+ - xp and yp must be strictly increasing
834
+ - fp must have shape (len(xp), len(yp))
835
+ - For query points outside the grid, boundary values are returned
836
+ - This node is only supported in JAX lowering (dynamics/cost), not CVXPy
837
+ """
838
+
839
+ def __init__(self, x, y, xp, yp, fp):
840
+ """Initialize a 2D bilinear interpolation node.
841
+
842
+ Args:
843
+ x: Query x-coordinate. Can be a scalar symbolic expression.
844
+ y: Query y-coordinate. Can be a scalar symbolic expression.
845
+ xp: 1D array of x grid coordinates. Must be increasing.
846
+ yp: 1D array of y grid coordinates. Must be increasing.
847
+ fp: 2D array of values with shape (len(xp), len(yp)).
848
+ """
849
+ self.x = to_expr(x)
850
+ self.y = to_expr(y)
851
+ self.xp = to_expr(xp)
852
+ self.yp = to_expr(yp)
853
+ self.fp = to_expr(fp)
854
+
855
+ def children(self):
856
+ return [self.x, self.y, self.xp, self.yp, self.fp]
857
+
858
+ def canonicalize(self) -> "Expr":
859
+ """Canonicalize by canonicalizing all operands."""
860
+ x = self.x.canonicalize()
861
+ y = self.y.canonicalize()
862
+ xp = self.xp.canonicalize()
863
+ yp = self.yp.canonicalize()
864
+ fp = self.fp.canonicalize()
865
+ return Bilerp(x, y, xp, yp, fp)
866
+
867
+ def check_shape(self) -> Tuple[int, ...]:
868
+ """Output shape is scalar (single interpolated value).
869
+
870
+ Returns:
871
+ tuple: Empty tuple (scalar output)
872
+
873
+ Raises:
874
+ ValueError: If grid arrays have invalid shapes
875
+ """
876
+ xp_shape = self.xp.check_shape()
877
+ yp_shape = self.yp.check_shape()
878
+ fp_shape = self.fp.check_shape()
879
+ x_shape = self.x.check_shape()
880
+ y_shape = self.y.check_shape()
881
+
882
+ if len(xp_shape) != 1:
883
+ raise ValueError(f"Bilerp xp must be 1D, got shape {xp_shape}")
884
+ if len(yp_shape) != 1:
885
+ raise ValueError(f"Bilerp yp must be 1D, got shape {yp_shape}")
886
+ if len(fp_shape) != 2:
887
+ raise ValueError(f"Bilerp fp must be 2D, got shape {fp_shape}")
888
+ if fp_shape != (xp_shape[0], yp_shape[0]):
889
+ raise ValueError(
890
+ f"Bilerp fp shape {fp_shape} must match (len(xp), len(yp)) = "
891
+ f"({xp_shape[0]}, {yp_shape[0]})"
892
+ )
893
+ if x_shape != ():
894
+ raise ValueError(f"Bilerp x must be scalar, got shape {x_shape}")
895
+ if y_shape != ():
896
+ raise ValueError(f"Bilerp y must be scalar, got shape {y_shape}")
897
+
898
+ return ()
899
+
900
+ def __repr__(self):
901
+ return f"bilerp({self.x!r}, {self.y!r}, {self.xp!r}, {self.yp!r}, {self.fp!r})"
@@ -134,6 +134,7 @@ from openscvx.symbolic.expr import (
134
134
  CTCS,
135
135
  Abs,
136
136
  Add,
137
+ Bilerp,
137
138
  Block,
138
139
  Concat,
139
140
  Constant,
@@ -147,6 +148,7 @@ from openscvx.symbolic.expr import (
147
148
  Huber,
148
149
  Index,
149
150
  Inequality,
151
+ Linterp,
150
152
  Log,
151
153
  LogSumExp,
152
154
  MatMul,
@@ -1238,6 +1240,37 @@ class CvxpyLowerer:
1238
1240
  block_exprs = [[self.lower(block) for block in row] for row in node.blocks]
1239
1241
  return cp.bmat(block_exprs)
1240
1242
 
1243
+ @visitor(Linterp)
1244
+ def _visit_linterp(self, node: Linterp) -> cp.Expression:
1245
+ """Raise NotImplementedError for linear interpolation.
1246
+
1247
+ Linear interpolation (Linterp) is not DCP-compliant in CVXPy as it
1248
+ represents a piecewise-linear function that is neither convex nor
1249
+ concave in general.
1250
+
1251
+ Args:
1252
+ node: Linterp expression node
1253
+
1254
+ Raises:
1255
+ NotImplementedError: Always raised since Linterp is not DCP-compliant
1256
+ """
1257
+ raise NotImplementedError("Linear interpolation (Linterp) is not DCP-compliant in CVXPy.")
1258
+
1259
+ @visitor(Bilerp)
1260
+ def _visit_bilerp(self, node: Bilerp) -> cp.Expression:
1261
+ """Raise NotImplementedError for bilinear interpolation.
1262
+
1263
+ Bilinear interpolation (Bilerp) is not DCP-compliant in CVXPy as it
1264
+ represents a nonlinear function that is neither convex nor concave.
1265
+
1266
+ Args:
1267
+ node: Bilerp expression node
1268
+
1269
+ Raises:
1270
+ NotImplementedError: Always raised since Bilerp is not DCP-compliant
1271
+ """
1272
+ raise NotImplementedError("Bilinear interpolation (Bilerp) is not DCP-compliant in CVXPy.")
1273
+
1241
1274
 
1242
1275
  def lower_to_cvxpy(expr: Expr, variable_map: Dict[str, cp.Expression] = None) -> cp.Expression:
1243
1276
  """Lower symbolic expression to CVXPy expression or constraint.
@@ -121,6 +121,7 @@ from openscvx.symbolic.expr import (
121
121
  Add,
122
122
  Adjoint,
123
123
  AdjointDual,
124
+ Bilerp,
124
125
  Block,
125
126
  Concat,
126
127
  Constant,
@@ -136,6 +137,7 @@ from openscvx.symbolic.expr import (
136
137
  Huber,
137
138
  Index,
138
139
  Inequality,
140
+ Linterp,
139
141
  Log,
140
142
  LogSumExp,
141
143
  MatMul,
@@ -1451,3 +1453,77 @@ class JaxLowerer:
1451
1453
  return jax.vmap(inner, in_axes=axis)(data)
1452
1454
 
1453
1455
  return vmapped_fn
1456
+
1457
+ @visitor(Linterp)
1458
+ def _visit_linterp(self, node: Linterp):
1459
+ """Lower 1D linear interpolation to JAX function.
1460
+
1461
+ Uses jnp.interp which performs piecewise linear interpolation.
1462
+ For query points outside the data range, boundary values are returned.
1463
+
1464
+ Args:
1465
+ node: Linterp expression node with xp, fp, and x
1466
+
1467
+ Returns:
1468
+ Function (x, u, node, params) -> interpolated value(s)
1469
+
1470
+ Note:
1471
+ The xp and fp arrays are typically constants (tabulated data),
1472
+ while x is typically a symbolic expression (state or derived value).
1473
+ jnp.interp is differentiable through JAX's autodiff.
1474
+ """
1475
+ f_xp = self.lower(node.xp)
1476
+ f_fp = self.lower(node.fp)
1477
+ f_x = self.lower(node.x)
1478
+
1479
+ def linterp_fn(x, u, node_idx, params):
1480
+ xp_val = f_xp(x, u, node_idx, params)
1481
+ fp_val = f_fp(x, u, node_idx, params)
1482
+ x_val = f_x(x, u, node_idx, params)
1483
+ return jnp.interp(x_val, xp_val, fp_val)
1484
+
1485
+ return linterp_fn
1486
+
1487
+ @visitor(Bilerp)
1488
+ def _visit_bilerp(self, node: Bilerp):
1489
+ """Lower 2D bilinear interpolation to JAX function.
1490
+
1491
+ Uses jax.scipy.ndimage.map_coordinates for bilinear interpolation on a
1492
+ regular grid. For query points outside the grid, boundary values are
1493
+ returned (clamping via mode='nearest').
1494
+
1495
+ Args:
1496
+ node: Bilerp expression node with x, y, xp, yp, fp
1497
+
1498
+ Returns:
1499
+ Function (x, u, node, params) -> interpolated scalar value
1500
+
1501
+ Note:
1502
+ The grid arrays (xp, yp, fp) are typically constants (tabulated data),
1503
+ while x and y are symbolic expressions (state or derived values).
1504
+ Physical coordinates are converted to fractional indices before
1505
+ interpolation. The implementation is differentiable through JAX's autodiff.
1506
+ """
1507
+ f_x = self.lower(node.x)
1508
+ f_y = self.lower(node.y)
1509
+ f_xp = self.lower(node.xp)
1510
+ f_yp = self.lower(node.yp)
1511
+ f_fp = self.lower(node.fp)
1512
+
1513
+ def bilerp_fn(x, u, node_idx, params):
1514
+ x_val = f_x(x, u, node_idx, params)
1515
+ y_val = f_y(x, u, node_idx, params)
1516
+ xp_val = f_xp(x, u, node_idx, params)
1517
+ yp_val = f_yp(x, u, node_idx, params)
1518
+ fp_val = f_fp(x, u, node_idx, params)
1519
+
1520
+ # Convert physical coordinates to fractional indices
1521
+ # jnp.interp maps physical coords to index space (handles non-uniform grids)
1522
+ idx_x = jnp.interp(x_val, xp_val, jnp.arange(len(xp_val)))
1523
+ idx_y = jnp.interp(y_val, yp_val, jnp.arange(len(yp_val)))
1524
+
1525
+ # Use map_coordinates with order=1 (bilinear) and mode='nearest' (clamp)
1526
+ coords = jnp.array([[idx_x], [idx_y]])
1527
+ return jax.scipy.ndimage.map_coordinates(fp_val, coords, order=1, mode="nearest")[0]
1528
+
1529
+ return bilerp_fn
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openscvx
3
- Version: 0.3.2.dev195
3
+ Version: 0.3.2.dev204
4
4
  Summary: A general Python-based successive convexification implementation which uses a JAX backend.
5
5
  Author-email: Chris Hayner and Griffin Norris <haynec@uw.edu>
6
6
  License: Apache Software License