burnman-cpp 0.2.0__tar.gz → 0.4.0__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 (400) hide show
  1. burnman_cpp-0.4.0/.github/workflows/wheels.yml +68 -0
  2. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/.gitignore +1 -0
  3. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/CMakeLists.txt +17 -1
  4. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/PKG-INFO +20 -9
  5. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/README.md +16 -7
  6. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/pyproject.toml +21 -2
  7. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_phase_diagram.py +5 -2
  8. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_phase_diagram_line_resolution.py +27 -1
  9. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_slb2024.py +22 -6
  10. burnman_cpp-0.4.0/python/tests/test_wheel_metadata.py +22 -0
  11. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/phase_diagram/continuation.cpp +7 -4
  12. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/phase_diagram/tracing.cpp +21 -5
  13. burnman_cpp-0.4.0/tools/build_wheel_dependencies.py +177 -0
  14. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/.clang-format +0 -0
  15. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/.github/workflows/benchmarks.yml +0 -0
  16. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/.github/workflows/format.yml +0 -0
  17. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/.github/workflows/tests.yml +0 -0
  18. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/LICENSE +0 -0
  19. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/Makefile +0 -0
  20. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/benchmarks/README.md +0 -0
  21. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/benchmarks/core/benchmark_assemblage.cpp +0 -0
  22. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/benchmarks/core/benchmark_mineral.cpp +0 -0
  23. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/benchmarks/cpp_python_speedup.py +0 -0
  24. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/benchmarks/eos/benchmark_property_modifiers.cpp +0 -0
  25. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/benchmarks/parse_benchmarks.py +0 -0
  26. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/benchmarks/python_benchmarks.py +0 -0
  27. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/benchmarks/requirements.txt +0 -0
  28. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/example_basalt_phase_diagram.py +0 -0
  29. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/example_composition.py +0 -0
  30. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/example_equilibrate.py +0 -0
  31. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/example_forsterite_thermodynamic_sections.py +0 -0
  32. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/example_green2025_at1.py +0 -0
  33. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/example_green2025_klb1.py +0 -0
  34. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/example_green2025_mix1g.py +0 -0
  35. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/example_green2025_re46.py +0 -0
  36. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/example_green2025_ton101s.py +0 -0
  37. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/example_green2025_ton101u.py +0 -0
  38. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/example_harzburgite_basalt_px.py +0 -0
  39. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/example_iron_hematite_tx.py +0 -0
  40. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/example_metasediment_contours.py +0 -0
  41. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/example_metasediment_phase_diagram.py +0 -0
  42. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/example_olivine_px.py +0 -0
  43. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/example_olivine_tx.py +0 -0
  44. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/example_olivine_vx.py +0 -0
  45. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/example_patch_phase_diagram.py +0 -0
  46. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/example_phase_diagram_grid.py +0 -0
  47. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/example_plot_pyrolite_sp_relaxed_properties.py +0 -0
  48. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/example_pyrolite_phase_diagram.py +0 -0
  49. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/example_pyrolite_phase_diagram_zoom.py +0 -0
  50. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/example_pyrolite_sp_phase_diagram.py +0 -0
  51. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/example_refine_phase_diagram.py +0 -0
  52. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/example_single_point_equilibrium.py +0 -0
  53. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/example_solution_equilibrium.py +0 -0
  54. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/green2025.py +0 -0
  55. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/examples/green2025_reference.md +0 -0
  56. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/core/assemblage.hpp +0 -0
  57. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/core/combined_mineral.hpp +0 -0
  58. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/core/composite_material.hpp +0 -0
  59. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/core/composition.hpp +0 -0
  60. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/core/equation_of_state.hpp +0 -0
  61. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/core/material.hpp +0 -0
  62. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/core/mineral.hpp +0 -0
  63. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/core/relaxed_solution.hpp +0 -0
  64. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/core/solution.hpp +0 -0
  65. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/core/solution_model.hpp +0 -0
  66. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/core/solution_models/asymmetric_regular_solution.hpp +0 -0
  67. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/core/solution_models/ideal_solution.hpp +0 -0
  68. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/core/solution_models/solution_model_base.hpp +0 -0
  69. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/core/solution_models/symmetric_regular_solution.hpp +0 -0
  70. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/eos/birch_murnaghan.hpp +0 -0
  71. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/eos/components/bukowinski_electronic.hpp +0 -0
  72. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/eos/components/debye.hpp +0 -0
  73. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/eos/components/einstein.hpp +0 -0
  74. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/eos/components/excess_params.hpp +0 -0
  75. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/eos/components/gsl_params.hpp +0 -0
  76. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/eos/components/property_modifiers.hpp +0 -0
  77. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/eos/hp.hpp +0 -0
  78. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/eos/hp_liquid.hpp +0 -0
  79. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/eos/make_eos.hpp +0 -0
  80. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/eos/mie_grueneisen_debye.hpp +0 -0
  81. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/eos/modified_tait.hpp +0 -0
  82. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/eos/slb.hpp +0 -0
  83. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/eos/vinet.hpp +0 -0
  84. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/minerals/datasets.hpp +0 -0
  85. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/minerals/model_sets.hpp +0 -0
  86. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/minerals/phase_aliases.hpp +0 -0
  87. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/minerals/water.hpp +0 -0
  88. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/optim/roots/bracket.hpp +0 -0
  89. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/optim/roots/brent.hpp +0 -0
  90. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/optim/roots/damped_newton_solver.hpp +0 -0
  91. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/optim/roots/damped_newton_state.hpp +0 -0
  92. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/optim/roots/damped_newton_types.hpp +0 -0
  93. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/averaging/averaging_base.hpp +0 -0
  94. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/averaging/averaging_schemes.hpp +0 -0
  95. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/averaging/averaging_utils.hpp +0 -0
  96. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/averaging/hs.hpp +0 -0
  97. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/averaging/hs_lower.hpp +0 -0
  98. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/averaging/hs_upper.hpp +0 -0
  99. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/averaging/reuss.hpp +0 -0
  100. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/averaging/voigt.hpp +0 -0
  101. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/averaging/vrh.hpp +0 -0
  102. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/equilibration/equality_constraint_base.hpp +0 -0
  103. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/equilibration/equality_constraint_helpers.hpp +0 -0
  104. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/equilibration/equality_constraint_variants.hpp +0 -0
  105. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/equilibration/equality_constraints.hpp +0 -0
  106. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/equilibration/equilibrate.hpp +0 -0
  107. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/equilibration/equilibrate_impl.hpp +0 -0
  108. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/equilibration/equilibrate_lambda_bounds.hpp +0 -0
  109. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/equilibration/equilibrate_objective.hpp +0 -0
  110. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/equilibration/equilibrate_types.hpp +0 -0
  111. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/equilibration/equilibrate_utils.hpp +0 -0
  112. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/phase_diagram/boundary_repair.hpp +0 -0
  113. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/phase_diagram/calculation.hpp +0 -0
  114. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/phase_diagram/common.hpp +0 -0
  115. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/phase_diagram/consistency.hpp +0 -0
  116. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/phase_diagram/continuation.hpp +0 -0
  117. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/phase_diagram/contours.hpp +0 -0
  118. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/phase_diagram/critical.hpp +0 -0
  119. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/phase_diagram/domain.hpp +0 -0
  120. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/phase_diagram/polygons.hpp +0 -0
  121. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/phase_diagram/properties.hpp +0 -0
  122. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/phase_diagram/refinement.hpp +0 -0
  123. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/phase_diagram/stability.hpp +0 -0
  124. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/phase_diagram/tracing.hpp +0 -0
  125. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/phase_diagram/types.hpp +0 -0
  126. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/phase_diagram/verification.hpp +0 -0
  127. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/phase_diagram.hpp +0 -0
  128. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/tools/polytope.hpp +0 -0
  129. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/utils/chemistry_utils.hpp +0 -0
  130. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/utils/constants.hpp +0 -0
  131. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/utils/exceptions.hpp +0 -0
  132. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/utils/index_utils.hpp +0 -0
  133. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/utils/math_utils.hpp +0 -0
  134. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/utils/matrix_utils.hpp +0 -0
  135. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/utils/polygon_utils.hpp +0 -0
  136. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/utils/string_utils.hpp +0 -0
  137. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/utils/types/mineral_params.hpp +0 -0
  138. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/utils/types/ndarray.hpp +0 -0
  139. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/utils/types/simple_types.hpp +0 -0
  140. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/utils/types/types.hpp +0 -0
  141. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/utils/utils.hpp +0 -0
  142. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/utils/validate_optionals.hpp +0 -0
  143. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/utils/vector_utils.hpp +0 -0
  144. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/include/burnman/utils/warnings.hpp +0 -0
  145. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/bindings/bindings.hpp +0 -0
  146. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/bindings/combined.cpp +0 -0
  147. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/bindings/composition.cpp +0 -0
  148. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/bindings/equilibration.cpp +0 -0
  149. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/bindings/materials.cpp +0 -0
  150. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/bindings/minerals.cpp +0 -0
  151. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/bindings/model_sets.cpp +0 -0
  152. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/bindings/modifiers.cpp +0 -0
  153. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/bindings/module.cpp +0 -0
  154. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/bindings/params.cpp +0 -0
  155. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/bindings/phase_diagram.cpp +0 -0
  156. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/bindings/polytope.cpp +0 -0
  157. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/bindings/solutions.cpp +0 -0
  158. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/bindings/utils.cpp +0 -0
  159. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/burnman_cpp/__init__.py +0 -0
  160. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/burnman_cpp/adapters.py +0 -0
  161. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/burnman_cpp/constants.py +0 -0
  162. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/burnman_cpp/minerals/__init__.py +0 -0
  163. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/burnman_cpp/tools/__init__.py +0 -0
  164. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/burnman_cpp/tools/aspect.py +0 -0
  165. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/burnman_cpp/tools/contours.py +0 -0
  166. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/burnman_cpp/tools/phase_diagram.py +0 -0
  167. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/burnman_cpp/tools/phase_diagram_helpers.py +0 -0
  168. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/burnman_cpp/tools/phase_diagram_workflow.py +0 -0
  169. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/burnman_cpp/tools/polytope.py +0 -0
  170. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/burnman_cpp/tools/potential_grid.py +0 -0
  171. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/burnman_cpp/tools/properties.py +0 -0
  172. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/conftest.py +0 -0
  173. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/basalt_field_verification.json +0 -0
  174. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/basalt_local_amphibole.json +0 -0
  175. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/basalt_local_plagioclase.json +0 -0
  176. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/basalt_nearby_bivariant_junctions.json +0 -0
  177. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/forsterite_latent_interval.json +0 -0
  178. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/green_provisional_loops.json +0 -0
  179. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/harzburgite_garnet_composition_boundary.json +0 -0
  180. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/harzburgite_thin_composition_field.json +0 -0
  181. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/metasediment_contour_field.json +0 -0
  182. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/metasediment_contour_ordering_field.json +0 -0
  183. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/metasediment_curve_edit.json +0 -0
  184. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/metasediment_curved_mica_field.json +0 -0
  185. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/metasediment_curved_node_connections.json +0 -0
  186. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/metasediment_endpoints.json +0 -0
  187. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/metasediment_missing_melt_connection.json +0 -0
  188. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/metasediment_ordering_segment.json +0 -0
  189. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/metasediment_parallel_fields.json +0 -0
  190. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/metasediment_thin_finite_field.json +0 -0
  191. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/metasediment_univariant_loop.json +0 -0
  192. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/metasediment_univariant_segments.json +0 -0
  193. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/phase_diagram_model_limit_fan.json +0 -0
  194. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_cold_endpoints.json +0 -0
  195. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_critical_endpoints.json +0 -0
  196. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_crossed_loops.json +0 -0
  197. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_duplicate_curve.json +0 -0
  198. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_duplicate_invariant.json +0 -0
  199. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_duplicate_junctions.json +0 -0
  200. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_endpoints.json +0 -0
  201. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_exchanged_junction_zeros.json +0 -0
  202. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_frame_order.json +0 -0
  203. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_limiting_neighbours.json +0 -0
  204. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_local_opx.json +0 -0
  205. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_missing_solution_branch.json +0 -0
  206. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_model_limit.json +0 -0
  207. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_narrow_curves.json +0 -0
  208. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_narrow_solution_replacement.json +0 -0
  209. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_nearby_junctions.json +0 -0
  210. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_nearby_univariant_junctions.json +0 -0
  211. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_neighbouring_branches.json +0 -0
  212. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_partial_duplicate.json +0 -0
  213. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_perimeter_neighbours.json +0 -0
  214. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_pt_coincident_phase_outs.json +0 -0
  215. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_pt_cold_coexistence.json +0 -0
  216. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_pt_cold_model_limits.json +0 -0
  217. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_pt_cold_reaction_duplicates.json +0 -0
  218. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_pt_detached_junctions.json +0 -0
  219. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_pt_equivalent_reaction_curves.json +0 -0
  220. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_pt_garnet_stability.json +0 -0
  221. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_pt_model_limit_duplicates.json +0 -0
  222. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_pt_repair_regressions.json +0 -0
  223. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_reaction_extents.json +0 -0
  224. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_refinement_segment.json +0 -0
  225. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_retired_junction_geometry.json +0 -0
  226. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_short_branch_labels.json +0 -0
  227. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_solution_replacement.json +0 -0
  228. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_solvus_seeds.json +0 -0
  229. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_sp_ak_branch_switch.json +0 -0
  230. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_sp_cf_copy_junctions.json +0 -0
  231. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_sp_enthalpy_branch.json +0 -0
  232. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_sp_failed_bracket.json +0 -0
  233. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_sp_false_cpx_junction.json +0 -0
  234. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_sp_false_junction.json +0 -0
  235. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_sp_junction.json +0 -0
  236. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_sp_missing_ak_boundary.json +0 -0
  237. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_sp_reaction_classification.json +0 -0
  238. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_sp_soft_grid_point.json +0 -0
  239. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_sp_trace_site_junctions.json +0 -0
  240. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_sp_trace_site_response.json +0 -0
  241. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_sp_unconnected_junctions.json +0 -0
  242. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_sp_wrong_branch_junction.json +0 -0
  243. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_stable_vertex_loop.json +0 -0
  244. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/data/pyrolite_zoom_reaction_limits.json +0 -0
  245. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_adapters.py +0 -0
  246. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_aspect_table.py +0 -0
  247. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_bindings.py +0 -0
  248. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_complete_datasets.py +0 -0
  249. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_composition.py +0 -0
  250. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_composition_phase_diagram.py +0 -0
  251. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_composition_reference.py +0 -0
  252. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_constants.py +0 -0
  253. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_contour_tools.py +0 -0
  254. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_enthalpy_ps_infill.py +0 -0
  255. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_equilibration.py +0 -0
  256. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_forsterite_sections.py +0 -0
  257. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_gaussian_moment_corrected.py +0 -0
  258. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_green2025.py +0 -0
  259. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_melt.py +0 -0
  260. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_mineral_catalogue_reference.py +0 -0
  261. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_model_sets.py +0 -0
  262. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_modifiers.py +0 -0
  263. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_native_failure_reference.py +0 -0
  264. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_native_minerals.py +0 -0
  265. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_phase_diagram_branch_identity.py +0 -0
  266. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_phase_diagram_consistency.py +0 -0
  267. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_phase_diagram_contours.py +0 -0
  268. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_phase_diagram_critical_endpoints.py +0 -0
  269. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_phase_diagram_partial_duplicates.py +0 -0
  270. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_phase_diagram_patching.py +0 -0
  271. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_phase_diagram_perimeter_labels.py +0 -0
  272. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_phase_diagram_plot.py +0 -0
  273. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_phase_diagram_workflow.py +0 -0
  274. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_polygon_utils.py +0 -0
  275. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_polytope.py +0 -0
  276. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_potential_grid.py +0 -0
  277. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_property_grid.py +0 -0
  278. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_reference_tools.py +0 -0
  279. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_slb_reference.py +0 -0
  280. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_stable_equilibrium.py +0 -0
  281. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/python/tests/test_thermodynamic_phase_diagram.py +0 -0
  282. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/core/assemblage.cpp +0 -0
  283. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/core/combined_mineral.cpp +0 -0
  284. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/core/composite_material.cpp +0 -0
  285. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/core/composition.cpp +0 -0
  286. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/core/equation_of_state.cpp +0 -0
  287. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/core/material.cpp +0 -0
  288. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/core/mineral.cpp +0 -0
  289. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/core/relaxed_solution.cpp +0 -0
  290. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/core/solution.cpp +0 -0
  291. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/core/solution_models/asymmetric_regular_solution.cpp +0 -0
  292. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/core/solution_models/ideal_solution.cpp +0 -0
  293. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/core/solution_models/solution_model_base.cpp +0 -0
  294. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/core/solution_models/symmetric_regular_solution.cpp +0 -0
  295. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/eos/birch_murnaghan.cpp +0 -0
  296. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/eos/components/bukowinski_electronic.cpp +0 -0
  297. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/eos/components/debye.cpp +0 -0
  298. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/eos/components/einstein.cpp +0 -0
  299. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/eos/components/property_modifiers.cpp +0 -0
  300. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/eos/hp.cpp +0 -0
  301. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/eos/hp_liquid.cpp +0 -0
  302. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/eos/make_eos.cpp +0 -0
  303. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/eos/mie_grueneisen_debye.cpp +0 -0
  304. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/eos/modified_tait.cpp +0 -0
  305. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/eos/slb.cpp +0 -0
  306. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/eos/vinet.cpp +0 -0
  307. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/minerals/datasets.cpp +0 -0
  308. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/minerals/model_sets.cpp +0 -0
  309. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/minerals/phase_aliases.cpp +0 -0
  310. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/minerals/water.cpp +0 -0
  311. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/optim/roots/damped_newton_solver.cpp +0 -0
  312. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/averaging/averaging_base.cpp +0 -0
  313. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/averaging/averaging_utils.cpp +0 -0
  314. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/averaging/hs.cpp +0 -0
  315. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/averaging/hs_lower.cpp +0 -0
  316. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/averaging/hs_upper.cpp +0 -0
  317. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/averaging/reuss.cpp +0 -0
  318. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/averaging/voigt.cpp +0 -0
  319. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/averaging/vrh.cpp +0 -0
  320. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/equilibration/equality_constraint_variants.cpp +0 -0
  321. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/equilibration/equilibrate_impl.cpp +0 -0
  322. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/equilibration/equilibrate_lambda_bounds.cpp +0 -0
  323. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/equilibration/equilibrate_objective.cpp +0 -0
  324. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/equilibration/equilibrate_utils.cpp +0 -0
  325. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/phase_diagram/boundary_repair.cpp +0 -0
  326. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/phase_diagram/calculation.cpp +0 -0
  327. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/phase_diagram/common.cpp +0 -0
  328. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/phase_diagram/consistency.cpp +0 -0
  329. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/phase_diagram/contours.cpp +0 -0
  330. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/phase_diagram/critical.cpp +0 -0
  331. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/phase_diagram/domain.cpp +0 -0
  332. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/phase_diagram/polygons.cpp +0 -0
  333. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/phase_diagram/potential.cpp +0 -0
  334. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/phase_diagram/properties.cpp +0 -0
  335. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/phase_diagram/refinement.cpp +0 -0
  336. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/phase_diagram/stability.cpp +0 -0
  337. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/phase_diagram/verification.cpp +0 -0
  338. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/polytope.cpp +0 -0
  339. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/tools/solution_simplification.cpp +0 -0
  340. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/utils/chemistry_utils.cpp +0 -0
  341. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/src/utils/polygon_utils.cpp +0 -0
  342. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/core/test_assemblage.cpp +0 -0
  343. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/core/test_composition.cpp +0 -0
  344. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/core/test_material.cpp +0 -0
  345. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/core/test_mineral.cpp +0 -0
  346. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/core/test_solution.cpp +0 -0
  347. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/core/test_solution_model.cpp +0 -0
  348. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/eos/test_birch_murnaghan.cpp +0 -0
  349. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/eos/test_bukowinski_electronic.cpp +0 -0
  350. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/eos/test_debye.cpp +0 -0
  351. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/eos/test_einstein.cpp +0 -0
  352. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/eos/test_excess_params.cpp +0 -0
  353. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/eos/test_hp.cpp +0 -0
  354. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/eos/test_mie_grueneisen_debye.cpp +0 -0
  355. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/eos/test_modified_tait.cpp +0 -0
  356. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/eos/test_property_modifiers.cpp +0 -0
  357. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/eos/test_slb.cpp +0 -0
  358. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/eos/test_vinet.cpp +0 -0
  359. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/eos/test_volume_accuracy.cpp +0 -0
  360. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/include/eos_names.hpp +0 -0
  361. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/include/equilibration_fixtures.hpp +0 -0
  362. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/include/ps1994_reference.hpp +0 -0
  363. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/include/solution_fixtures.hpp +0 -0
  364. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/include/thermocalc_reference.hpp +0 -0
  365. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/include/tolerances.hpp +0 -0
  366. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/minerals/test_native_datasets.cpp +0 -0
  367. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/minerals/test_thermocalc_reference.cpp +0 -0
  368. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/minerals/test_water.cpp +0 -0
  369. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/optim/roots/test_damped_newton.cpp +0 -0
  370. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/optim/roots/test_roots.cpp +0 -0
  371. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/reference/burnman.json +0 -0
  372. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/reference/ps1994.json +0 -0
  373. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/reference/thermocalc_metapelite.json +0 -0
  374. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/test_main.cpp +0 -0
  375. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/tools/averaging/test_averaging_schemes.cpp +0 -0
  376. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/tools/equilibration/test_equality_constraints.cpp +0 -0
  377. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/tools/equilibration/test_equilibrate.cpp +0 -0
  378. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/tools/equilibration/test_equilibrate_lambda_bounds.cpp +0 -0
  379. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/tools/equilibration/test_equilibrate_objective.cpp +0 -0
  380. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/tools/equilibration/test_equilibrate_utils.cpp +0 -0
  381. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/tools/test_phase_diagram.cpp +0 -0
  382. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/tools/test_phase_diagram_consistency.cpp +0 -0
  383. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/tools/test_polytope.cpp +0 -0
  384. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/utils/test_chemistry_utils.cpp +0 -0
  385. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/utils/test_constants.cpp +0 -0
  386. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/utils/test_exceptions.cpp +0 -0
  387. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/utils/test_index_utils.cpp +0 -0
  388. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/utils/test_math_utils.cpp +0 -0
  389. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/utils/test_matrix_utils.cpp +0 -0
  390. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/utils/test_polygon_utils.cpp +0 -0
  391. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/utils/test_string_utils.cpp +0 -0
  392. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/utils/test_types.cpp +0 -0
  393. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/utils/test_validate_optionals.cpp +0 -0
  394. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/utils/test_vector_utils.cpp +0 -0
  395. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tests/utils/test_warnings.cpp +0 -0
  396. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tools/burnman_reference.py +0 -0
  397. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tools/check_reference_data.py +0 -0
  398. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tools/export_example_minerals.py +0 -0
  399. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tools/extract_thermocalc_reference.py +0 -0
  400. {burnman_cpp-0.2.0 → burnman_cpp-0.4.0}/tools/generate_ps1994_reference.py +0 -0
@@ -0,0 +1,68 @@
1
+ name: Wheels
2
+
3
+ on:
4
+ pull_request:
5
+ paths:
6
+ - CMakeLists.txt
7
+ - pyproject.toml
8
+ - src/**
9
+ - include/**
10
+ - python/**
11
+ - tools/build_wheel_dependencies.py
12
+ - .github/workflows/wheels.yml
13
+ push:
14
+ tags: ["v*"]
15
+ workflow_dispatch:
16
+
17
+ permissions:
18
+ contents: read
19
+
20
+ defaults:
21
+ run:
22
+ shell: bash
23
+
24
+ jobs:
25
+ sdist:
26
+ runs-on: ubuntu-24.04
27
+ steps:
28
+ - uses: actions/checkout@v7
29
+ with:
30
+ persist-credentials: false
31
+ - uses: actions/setup-python@v7
32
+ with:
33
+ python-version: "3.12"
34
+ - run: python -m pip install build twine
35
+ - run: python -m build --sdist
36
+ - run: python -m twine check --strict dist/*
37
+ - uses: actions/upload-artifact@v7
38
+ with:
39
+ name: sdist
40
+ path: dist/*.tar.gz
41
+
42
+ wheels:
43
+ needs: sdist
44
+ timeout-minutes: 90
45
+ strategy:
46
+ fail-fast: false
47
+ matrix:
48
+ os: [ubuntu-24.04, ubuntu-24.04-arm, macos-15, macos-15-intel]
49
+ runs-on: ${{ matrix.os }}
50
+ env:
51
+ # Pull requests test each architecture; releases/manual runs build every ABI.
52
+ CIBW_BUILD: ${{ github.event_name == 'pull_request' && 'cp312-*' || 'cp3{10,11,12,13,14,15}-*' }}
53
+ CIBW_ARCHS: native
54
+ steps:
55
+ - uses: actions/download-artifact@v7
56
+ with:
57
+ name: sdist
58
+ path: dist
59
+ - uses: actions/setup-python@v7
60
+ with:
61
+ python-version: "3.12"
62
+ - run: python -m pip install cibuildwheel==4.3.1
63
+ # Build from the archive users receive, not from a developer checkout.
64
+ - run: python -m cibuildwheel dist/*.tar.gz --output-dir wheelhouse
65
+ - uses: actions/upload-artifact@v7
66
+ with:
67
+ name: wheels-${{ matrix.os }}
68
+ path: wheelhouse/*.whl
@@ -22,6 +22,7 @@ __pycache__/
22
22
  *.egg-info/
23
23
  .pytest_cache/
24
24
  dist/
25
+ wheelhouse/
25
26
 
26
27
  # Output files
27
28
  examples/*_output/
@@ -9,7 +9,11 @@ if(APPLE AND NOT DEFINED CMAKE_OSX_DEPLOYMENT_TARGET AND
9
9
  set(CMAKE_OSX_DEPLOYMENT_TARGET "${BURNMAN_HOST_MACOS_VERSION}"
10
10
  CACHE STRING "Minimum supported macOS version")
11
11
  endif()
12
- project(burnman_cpp VERSION 0.1.0 LANGUAGES CXX)
12
+ # Keep the installed package metadata and native __version__ in agreement.
13
+ file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/pyproject.toml" BURNMAN_VERSION_LINE
14
+ REGEX "^version = ")
15
+ string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" BURNMAN_VERSION "${BURNMAN_VERSION_LINE}")
16
+ project(burnman_cpp VERSION ${BURNMAN_VERSION} LANGUAGES CXX)
13
17
 
14
18
  option(BURNMAN_BUILD_PYTHON "Build the Python extension" ON)
15
19
  option(BURNMAN_BUILD_TESTS "Build the C++ unit tests" OFF)
@@ -31,6 +35,11 @@ function(burnman_compiler_warnings target)
31
35
  endfunction()
32
36
 
33
37
  # Let CMake find standard Homebrew installations as well as system packages.
38
+ set(BURNMAN_WHEEL_DEPENDENCIES "" CACHE PATH "Private prefix for wheel dependencies")
39
+ if(BURNMAN_WHEEL_DEPENDENCIES)
40
+ list(PREPEND CMAKE_PREFIX_PATH "${BURNMAN_WHEEL_DEPENDENCIES}")
41
+ set(GSL_ROOT_DIR "${BURNMAN_WHEEL_DEPENDENCIES}")
42
+ endif()
34
43
  if(APPLE)
35
44
  list(APPEND CMAKE_PREFIX_PATH /opt/homebrew /usr/local)
36
45
  endif()
@@ -77,6 +86,13 @@ if(BURNMAN_BUILD_PYTHON)
77
86
  target_compile_definitions(_core PRIVATE BURNMAN_VERSION="${PROJECT_VERSION}")
78
87
  burnman_compiler_warnings(_core)
79
88
  install(TARGETS _core LIBRARY DESTINATION burnman_cpp RUNTIME DESTINATION burnman_cpp)
89
+ if(BURNMAN_WHEEL_DEPENDENCIES)
90
+ # Let the wheel repair tool find libraries that use relative install names.
91
+ set_target_properties(_core PROPERTIES
92
+ INSTALL_RPATH "${BURNMAN_WHEEL_DEPENDENCIES}/lib")
93
+ install(DIRECTORY "${BURNMAN_WHEEL_DEPENDENCIES}/share/licenses/"
94
+ DESTINATION burnman_cpp/native_licenses)
95
+ endif()
80
96
  endif()
81
97
 
82
98
  if(BURNMAN_BUILD_TESTS OR BURNMAN_BUILD_BENCHMARKS)
@@ -1,16 +1,18 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: burnman_cpp
3
- Version: 0.2.0
3
+ Version: 0.4.0
4
4
  Summary: Python bindings for the BurnMan C++ mineral physics library
5
5
  Author-Email: The BurnMan Team <bob.myhill@bristol.ac.uk>
6
6
  License-Expression: GPL-3.0-or-later
7
7
  License-File: LICENSE
8
- Classifier: Operating System :: OS Independent
8
+ Classifier: Operating System :: MacOS :: MacOS X
9
+ Classifier: Operating System :: POSIX :: Linux
9
10
  Classifier: Programming Language :: Python :: 3.10
10
11
  Classifier: Programming Language :: Python :: 3.11
11
12
  Classifier: Programming Language :: Python :: 3.12
12
13
  Classifier: Programming Language :: Python :: 3.13
13
14
  Classifier: Programming Language :: Python :: 3.14
15
+ Classifier: Programming Language :: Python :: 3.15
14
16
  Requires-Python: >=3.10
15
17
  Requires-Dist: numpy>=1.23
16
18
  Requires-Dist: scipy>=1.9
@@ -46,7 +48,22 @@ Python authors (as of 2025, from the [BurnMan README](https://github.com/geodyna
46
48
  * Juliane Dannberg
47
49
  * Rene Gassmoeller
48
50
 
49
- ## Requirements
51
+ ## Installation
52
+
53
+ ### Published Python wheels
54
+
55
+ Install the published package with:
56
+
57
+ ```sh
58
+ python -m pip install --upgrade pip
59
+ python -m pip install burnman_cpp
60
+ ```
61
+
62
+ If no matching wheel is available, pip builds from source and needs the dependencies below.
63
+
64
+ ### Building from source
65
+
66
+ Source builds require:
50
67
 
51
68
  - A C++17 compiler, such as GCC or Clang.
52
69
  - CMake 3.18 or newer.
@@ -55,10 +72,6 @@ Python authors (as of 2025, from the [BurnMan README](https://github.com/geodyna
55
72
  - Python 3.10 or newer and its development headers for the Python package.
56
73
  - Catch2 3.4 or newer for C++ tests and benchmarks.
57
74
 
58
- ## Installation
59
-
60
- ### Native dependencies
61
-
62
75
  On Ubuntu:
63
76
 
64
77
  ```sh
@@ -75,8 +88,6 @@ xcode-select --install
75
88
  brew install python cmake eigen gsl nlopt cddlib gmp catch2
76
89
  ```
77
90
 
78
- ### Python package
79
-
80
91
  Clone the repository:
81
92
 
82
93
  ```sh
@@ -22,7 +22,22 @@ Python authors (as of 2025, from the [BurnMan README](https://github.com/geodyna
22
22
  * Juliane Dannberg
23
23
  * Rene Gassmoeller
24
24
 
25
- ## Requirements
25
+ ## Installation
26
+
27
+ ### Published Python wheels
28
+
29
+ Install the published package with:
30
+
31
+ ```sh
32
+ python -m pip install --upgrade pip
33
+ python -m pip install burnman_cpp
34
+ ```
35
+
36
+ If no matching wheel is available, pip builds from source and needs the dependencies below.
37
+
38
+ ### Building from source
39
+
40
+ Source builds require:
26
41
 
27
42
  - A C++17 compiler, such as GCC or Clang.
28
43
  - CMake 3.18 or newer.
@@ -31,10 +46,6 @@ Python authors (as of 2025, from the [BurnMan README](https://github.com/geodyna
31
46
  - Python 3.10 or newer and its development headers for the Python package.
32
47
  - Catch2 3.4 or newer for C++ tests and benchmarks.
33
48
 
34
- ## Installation
35
-
36
- ### Native dependencies
37
-
38
49
  On Ubuntu:
39
50
 
40
51
  ```sh
@@ -51,8 +62,6 @@ xcode-select --install
51
62
  brew install python cmake eigen gsl nlopt cddlib gmp catch2
52
63
  ```
53
64
 
54
- ### Python package
55
-
56
65
  Clone the repository:
57
66
 
58
67
  ```sh
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
4
4
 
5
5
  [project]
6
6
  name = "burnman_cpp"
7
- version = "0.2.0"
7
+ version = "0.4.0"
8
8
  authors = [{name = "The BurnMan Team", email = "bob.myhill@bristol.ac.uk"}]
9
9
  description = "Python bindings for the BurnMan C++ mineral physics library"
10
10
  readme = "README.md"
@@ -13,12 +13,14 @@ license = "GPL-3.0-or-later"
13
13
  license-files = ["LICENSE"]
14
14
  dependencies = ["numpy>=1.23", "scipy>=1.9"]
15
15
  classifiers = [
16
- "Operating System :: OS Independent",
16
+ "Operating System :: MacOS :: MacOS X",
17
+ "Operating System :: POSIX :: Linux",
17
18
  "Programming Language :: Python :: 3.10",
18
19
  "Programming Language :: Python :: 3.11",
19
20
  "Programming Language :: Python :: 3.12",
20
21
  "Programming Language :: Python :: 3.13",
21
22
  "Programming Language :: Python :: 3.14",
23
+ "Programming Language :: Python :: 3.15",
22
24
  ]
23
25
 
24
26
  [project.optional-dependencies]
@@ -36,6 +38,7 @@ sdist.include = [
36
38
  "/python/bindings/*.cpp", "/python/bindings/*.hpp",
37
39
  "/python/burnman_cpp/**/*.py", "/python/tests/*.py", "/examples/*.py",
38
40
  "/tools/export_example_minerals.py",
41
+ "/tools/build_wheel_dependencies.py",
39
42
  ]
40
43
  sdist.exclude = [".venv/**", "build/**", "bin/**", "*.csv", "benchmark-report.xml", "**/__pycache__/**"]
41
44
 
@@ -44,3 +47,19 @@ testpaths = ["python/tests"]
44
47
 
45
48
  [tool.black]
46
49
  target-version = ["py310"]
50
+
51
+ [tool.cibuildwheel]
52
+ build = "cp3{10,11,12,13,14,15}-*"
53
+ skip = "*-musllinux_* *-win*"
54
+ test-extras = ["test"]
55
+ test-command = "python -m pytest {project}/python/tests/test_wheel_metadata.py {project}/python/tests/test_bindings.py {project}/python/tests/test_equilibration.py {project}/python/tests/test_stable_equilibrium.py {project}/python/tests/test_polytope.py -q"
56
+
57
+ [tool.cibuildwheel.linux]
58
+ manylinux-x86_64-image = "manylinux_2_28"
59
+ manylinux-aarch64-image = "manylinux_2_28"
60
+ before-all = "dnf install -y autoconf automake libtool && python3 {project}/tools/build_wheel_dependencies.py --prefix /tmp/burnman-wheel-deps"
61
+ environment = { CC="gcc", CXX="g++", CFLAGS="", CXXFLAGS="", LDFLAGS="", CMAKE_ARGS="-DBURNMAN_WHEEL_DEPENDENCIES=/tmp/burnman-wheel-deps", CMAKE_BUILD_PARALLEL_LEVEL="2" }
62
+
63
+ [tool.cibuildwheel.macos]
64
+ before-all = "brew install autoconf automake libtool && python3 {project}/tools/build_wheel_dependencies.py --prefix /tmp/burnman-wheel-deps"
65
+ environment = { CC="clang", CXX="clang++", CFLAGS="", CXXFLAGS="", LDFLAGS="", MACOSX_DEPLOYMENT_TARGET="11.0", CMAKE_ARGS="-DBURNMAN_WHEEL_DEPENDENCIES=/tmp/burnman-wheel-deps", CMAKE_BUILD_PARALLEL_LEVEL="2" }
@@ -410,7 +410,8 @@ def test_resume_refines_curved_chords_only_when_resolution_is_requested():
410
410
  assert p.residual < 0.01
411
411
 
412
412
 
413
- def test_resume_removes_a_verified_retraced_part_of_a_curved_boundary():
413
+ @pytest.mark.parametrize("reverse_order", [False, True])
414
+ def test_resume_removes_a_verified_retraced_part_of_a_curved_boundary(reverse_order):
414
415
  phases = curved_phases()
415
416
  opts = settings()
416
417
  opts.max_recovery_passes = 0
@@ -430,10 +431,12 @@ def test_resume_removes_a_verified_retraced_part_of_a_curved_boundary():
430
431
  line,
431
432
  id=1,
432
433
  end_node=line["start_node"],
433
- points=[original[0], original[3], original[0]],
434
+ points=original[:6] + original[4::-1],
434
435
  termination="junction; junction",
435
436
  )
436
437
  saved["boundaries"].append(duplicate)
438
+ if reverse_order:
439
+ saved["boundaries"].reverse()
437
440
  saved["resolved"] = False # Request repair of the injected retrace.
438
441
  assert not any(
439
442
  p.has_open_boundary for p in bm.phase_diagram_field_polygons(saved).polygons
@@ -20,6 +20,7 @@ import runpy
20
20
 
21
21
  import numpy as np
22
22
  import pytest
23
+ from scipy.linalg import qr
23
24
  import burnman_cpp as bm
24
25
  from conftest import oxide_params
25
26
  from test_phase_diagram import crossing_phases, curved_phases, pure, settings
@@ -454,13 +455,38 @@ def test_equivalent_univariant_extents_need_a_verified_root_not_every_warm_start
454
455
 
455
456
 
456
457
  @pytest.mark.parametrize("reverse", [False, True])
458
+ @pytest.mark.parametrize("different_faces", [False, True])
457
459
  @pytest.mark.parametrize(
458
460
  "fixture", ["model_limit_duplicates", "cold_reaction_duplicates"]
459
461
  )
460
- def test_equivalent_reactions_can_end_at_separate_model_limit_records(reverse, fixture):
462
+ def test_equivalent_reactions_can_end_at_separate_model_limit_records(
463
+ reverse, different_faces, fixture
464
+ ):
461
465
  data = json.loads(
462
466
  (Path(__file__).parent / f"data/pyrolite_pt_{fixture}.json").read_text()
463
467
  )
468
+ if different_faces:
469
+ # Open the union of the observed garnet faces on one trace. A full
470
+ # identity basis would also unfreeze sites absent from every saved
471
+ # equilibrium, introducing stiff directions at these cold endpoints.
472
+ rows = np.unique(
473
+ np.vstack(
474
+ [
475
+ phase["composition_basis"]
476
+ for line in data["boundaries"]
477
+ for point in line["points"]
478
+ for phase in point["phases"]
479
+ if phase["candidate_index"] == 6
480
+ ]
481
+ ),
482
+ axis=0,
483
+ )
484
+ _, _, pivots = qr(rows.T, pivoting=True)
485
+ basis = rows[pivots[: np.linalg.matrix_rank(rows)]].tolist()
486
+ for point in data["boundaries"][0]["points"]:
487
+ for phase in point["phases"]:
488
+ if phase["candidate_index"] == 6:
489
+ phase["composition_basis"] = basis
464
490
  if reverse:
465
491
  transform_saved_traces(data, "reverse")
466
492
  result = refine_pyrolite_fixture(data)
@@ -458,15 +458,31 @@ def test_resumed_model_limit_remains_attached_to_recomputed_eos_envelope(example
458
458
  previous,
459
459
  opts,
460
460
  )
461
- point = result.boundaries[0].points[0 if case["start"] else -1]
461
+ line = result.boundaries[0]
462
+ point = line.points[0 if case["start"] else -1]
462
463
  saved = previous["boundaries"][0]["points"][0 if case["start"] else -1]
464
+ location = np.array([point.pressure, point.temperature])
465
+ scale = np.ptp(np.asarray(result.coordinate_ranges), axis=1)
466
+ # Rebuilding the EOS envelope may re-correct a nearby saved endpoint onto
467
+ # that envelope. Verify the accepted equilibrium and its attachment rather
468
+ # than requiring the old numerical stopping point to remain unchanged.
463
469
  assert (
464
- point.pressure == saved["pressure"]
465
- and point.temperature == saved["temperature"]
470
+ np.linalg.norm((location - [saved["pressure"], saved["temperature"]]) / scale)
471
+ <= 2.0 * opts.node_tolerance
466
472
  )
467
- location = np.array([point.pressure, point.temperature])
473
+ assert point.mass_balance_error <= opts.mass_balance_tolerance
474
+ n_endmembers = sum(len(phase.composition) for phase in point.phases)
475
+ assert point.residual <= np.hypot(
476
+ np.sqrt(n_endmembers) * 0.1 * opts.affinity_tolerance,
477
+ np.linalg.norm(list(result.composition_start.values()))
478
+ * opts.mass_balance_tolerance,
479
+ )
480
+ assert point.minimum_affinity >= -opts.affinity_tolerance
481
+ node_id = line.start_node if case["start"] else line.end_node
482
+ node = result.nodes[node_id]
483
+ assert (node.pressure, node.temperature) == (point.pressure, point.temperature)
468
484
  assert any(
469
- np.min(np.linalg.norm((ring - location) / [150.0e9, 4000.0], axis=1)) < 1.0e-12
485
+ np.min(np.linalg.norm((ring - location) / scale, axis=1)) < 1.0e-12
470
486
  for ring in result.excluded_regions
471
487
  )
472
488
  # The common serializer keeps the envelope, original compositions and
@@ -481,7 +497,7 @@ def test_resumed_model_limit_remains_attached_to_recomputed_eos_envelope(example
481
497
  )
482
498
  assert resumed.settings.required_eos_phases == ["opx"]
483
499
  assert any(
484
- np.min(np.linalg.norm((ring - location) / [150.0e9, 4000.0], axis=1)) < 1.0e-12
500
+ np.min(np.linalg.norm((ring - location) / scale, axis=1)) < 1.0e-12
485
501
  for ring in resumed.excluded_regions
486
502
  )
487
503
 
@@ -0,0 +1,22 @@
1
+ # ------------------------------------------------------
2
+ #
3
+ # SPDX-License-Identifier: GPL-3.0-or-later
4
+ #
5
+ # SPDX-FileCopyrightText: Copyright (C) 2026 by the BurnMan Team.
6
+ #
7
+ # This file is part of BurnMan.
8
+ #
9
+ # Detailed license information governing the source code
10
+ # and contributions can be found in the LICENSE document.
11
+ #
12
+ # ------------------------------------------------------
13
+
14
+ """The installed distribution and its compiled extension describe one release."""
15
+
16
+ from importlib.metadata import version
17
+
18
+ import burnman_cpp as bm
19
+
20
+
21
+ def test_native_and_distribution_versions_agree():
22
+ assert bm.__version__ == version("burnman_cpp")
@@ -1057,10 +1057,10 @@ bool same_boundary_curve(Engine &engine, const Result &result,
1057
1057
  return std::find(two.assemblage.begin(), two.assemblage.end(),
1058
1058
  p.id) == two.assemblage.end();
1059
1059
  });
1060
- // Reaction extents can carry different saved active faces. Open
1060
+ // Independent traces can carry different saved active faces. Open
1061
1061
  // their union without copying compositions between independent
1062
1062
  // starting states, so a stale frozen site cannot define identity.
1063
- if (univariant && !share_composition_faces(first_seed, warm))
1063
+ if (!share_composition_faces(first_seed, warm))
1064
1064
  return false;
1065
1065
  // Identity needs more accurate roots than ordinary tracing: weak
1066
1066
  // frozen-site affinities can otherwise leave two accepted states
@@ -1152,6 +1152,10 @@ bool same_boundary_curve(Engine &engine, const Result &result,
1152
1152
  // corrected equilibria; failed warm starts supply no evidence either way,
1153
1153
  // whereas any actual disagreement vetoes the identification.
1154
1154
  const auto forward = verified(first, second);
1155
+ // A partial retrace must lie on the whole curve. The reverse requirement
1156
+ // would incorrectly demand that its short arc also covers the whole curve.
1157
+ if (partial)
1158
+ return forward.value_or(false);
1155
1159
  if (shared_branch) {
1156
1160
  if (forward == false)
1157
1161
  return false;
@@ -1159,7 +1163,6 @@ bool same_boundary_curve(Engine &engine, const Result &result,
1159
1163
  return backward != false &&
1160
1164
  (forward.value_or(false) || backward.value_or(false));
1161
1165
  }
1162
- return forward.value_or(false) &&
1163
- (partial || verified(second, first).value_or(false));
1166
+ return forward.value_or(false) && verified(second, first).value_or(false);
1164
1167
  }
1165
1168
  } // namespace burnman::phase_diagrams::detail
@@ -2473,6 +2473,9 @@ void Tracer::model_domain() {
2473
2473
  }
2474
2474
 
2475
2475
  void Tracer::reconcile_boundaries(bool transfer_labels_only) {
2476
+ auto returns_to_node = [](const Boundary &line) {
2477
+ return line.start_node >= 0 && line.start_node == line.end_node;
2478
+ };
2476
2479
  std::vector<Boundary> unique;
2477
2480
  for (auto &line : result.boundaries) {
2478
2481
  bool duplicate = false;
@@ -2484,11 +2487,18 @@ void Tracer::reconcile_boundaries(bool transfer_labels_only) {
2484
2487
  continue;
2485
2488
  bool same_sides = same_boundary_sides(old, line);
2486
2489
  bool same_ends = same_boundary_nodes(old, line, result);
2487
- const bool partial = complete_boundary(line) != complete_boundary(old);
2488
- auto &part = complete_boundary(line) ? old : line;
2489
- auto &whole = complete_boundary(line) ? line : old;
2490
+ const bool unfinished = complete_boundary(line) != complete_boundary(old);
2491
+ // An out-and-back trace can be complete at its shared starting node
2492
+ // while covering only part of another boundary. Verify its entire arc
2493
+ // just as for an unfinished retrace; a genuine closed loop must survive.
2494
+ const bool partial =
2495
+ unfinished || returns_to_node(line) != returns_to_node(old);
2496
+ const bool line_is_part =
2497
+ unfinished ? !complete_boundary(line) : returns_to_node(line);
2498
+ auto &part = line_is_part ? line : old;
2499
+ auto &whole = line_is_part ? old : line;
2490
2500
  if (partial) {
2491
- // An unfinished retrace is removable only when an anchored,
2501
+ // A partial retrace is removable only when an anchored,
2492
2502
  // completed record covers its entire equilibrium branch.
2493
2503
  auto shares = [&](int node) {
2494
2504
  return node >= 0 &&
@@ -2527,7 +2537,13 @@ void Tracer::reconcile_boundaries(bool transfer_labels_only) {
2527
2537
  bad.reaction_kind = good.reaction_kind;
2528
2538
  }
2529
2539
  duplicate = true;
2530
- retain_curve(old, line);
2540
+ // Keep the whole arc even if its covered retrace has more samples.
2541
+ if (partial && !line_is_part) {
2542
+ const int id = old.id;
2543
+ old = std::move(line);
2544
+ old.id = id;
2545
+ } else if (!partial)
2546
+ retain_curve(old, line);
2531
2547
  if (!same_sides && univariant)
2532
2548
  label(old);
2533
2549
  break;