chemparseplot 1.9.9__tar.gz → 1.9.11__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 (101) hide show
  1. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/PKG-INFO +1 -1
  2. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/_version.py +2 -2
  3. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/plot/neb.py +46 -0
  4. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/plot/optimization.py +10 -0
  5. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/plot/test_surface_auto_thin.py +73 -0
  6. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/.gitignore +0 -0
  7. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/LICENSE +0 -0
  8. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/__init__.py +0 -0
  9. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/api.py +0 -0
  10. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/__init__.py +0 -0
  11. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/chemgp_hdf5.py +0 -0
  12. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/chemgp_jsonl.py +0 -0
  13. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/converter.py +0 -0
  14. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/eon/__init__.py +0 -0
  15. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/eon/_trajectory_common.py +0 -0
  16. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/eon/con_io.py +0 -0
  17. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/eon/dimer_trajectory.py +0 -0
  18. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/eon/gprd.py +0 -0
  19. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/eon/min_trajectory.py +0 -0
  20. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/eon/minimization.py +0 -0
  21. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/eon/neb.py +0 -0
  22. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/eon/saddle_search.py +0 -0
  23. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/eon/stitch.py +0 -0
  24. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/file_.py +0 -0
  25. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/grammar/__init__.py +0 -0
  26. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/grammar/_deps.py +0 -0
  27. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/grammar/orca_text.py +0 -0
  28. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/grammar/xyz.py +0 -0
  29. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/neb_utils.py +0 -0
  30. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/orca/__init__.py +0 -0
  31. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/orca/_opi.py +0 -0
  32. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/orca/geomscan.py +0 -0
  33. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/orca/neb/__init__.py +0 -0
  34. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/orca/neb/interp.py +0 -0
  35. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/orca/neb/opi_parser.py +0 -0
  36. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/patterns.py +0 -0
  37. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/plumed.py +0 -0
  38. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/projection.py +0 -0
  39. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/sella/saddle_search.py +0 -0
  40. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/trajectory/__init__.py +0 -0
  41. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/trajectory/hdf5.py +0 -0
  42. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/trajectory/neb.py +0 -0
  43. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/parse/types.py +0 -0
  44. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/plot/__init__.py +0 -0
  45. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/plot/chemgp.py +0 -0
  46. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/plot/geomscan.py +0 -0
  47. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/plot/plumed.py +0 -0
  48. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/plot/structs.py +0 -0
  49. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/plot/theme.py +0 -0
  50. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/units.py +0 -0
  51. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/chemparseplot/util.py +0 -0
  52. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/pyproject.toml +0 -0
  53. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/readme.md +0 -0
  54. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/__init__.py +0 -0
  55. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/_optional_imports.py +0 -0
  56. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/conftest.py +0 -0
  57. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/fixtures/h2mol.xyz +0 -0
  58. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/fixtures/orca_energy_coords_snippet.out +0 -0
  59. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/fixtures_geomscan_snippet.txt +0 -0
  60. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/__init__.py +0 -0
  61. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/_con_fixtures.py +0 -0
  62. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/grammar/__init__.py +0 -0
  63. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/grammar/test_grammar_deps.py +0 -0
  64. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/grammar/test_orca_text_grammar.py +0 -0
  65. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/grammar/test_xyz_grammar.py +0 -0
  66. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/orca/test_geomscan.py +0 -0
  67. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/orca/test_interp.py +0 -0
  68. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/test_chemgp_hdf5.py +0 -0
  69. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/test_chemgp_jsonl_types.py +0 -0
  70. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/test_con_io.py +0 -0
  71. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/test_converter.py +0 -0
  72. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/test_dimer_trajectory.py +0 -0
  73. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/test_eon_neb_types.py +0 -0
  74. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/test_eon_trajectory_common.py +0 -0
  75. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/test_min_trajectory.py +0 -0
  76. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/test_minimization_result.py +0 -0
  77. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/test_neb_stitch.py +0 -0
  78. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/test_neb_utils.py +0 -0
  79. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/test_orca_public_api.py +0 -0
  80. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/test_parser_types.py +0 -0
  81. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/test_patterns.py +0 -0
  82. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/test_plumed.py +0 -0
  83. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/test_projection.py +0 -0
  84. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/test_readcon_boundary.py +0 -0
  85. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/test_saddle_results.py +0 -0
  86. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/test_sella_saddle.py +0 -0
  87. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/test_trajectory_hdf5.py +0 -0
  88. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/parse/test_trajectory_neb.py +0 -0
  89. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/plot/__init__.py +0 -0
  90. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/plot/test_chemgp_utils.py +0 -0
  91. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/plot/test_neb_helpers.py +0 -0
  92. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/plot/test_neb_renderers.py +0 -0
  93. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/plot/test_optimization.py +0 -0
  94. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/plot/test_orca_neb_payload.py +0 -0
  95. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/plot/test_projection_refactor.py +0 -0
  96. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/plot/test_strip_rendering.py +0 -0
  97. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/plot/test_structs_units.py +0 -0
  98. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/test_coverage_batch.py +0 -0
  99. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/test_full_coverage.py +0 -0
  100. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/test_public_api.py +0 -0
  101. {chemparseplot-1.9.9 → chemparseplot-1.9.11}/tests/tutorials/test_chemparseplot.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: chemparseplot
3
- Version: 1.9.9
3
+ Version: 1.9.11
4
4
  Summary: Parsers and plotting tools for computational chemistry
5
5
  Project-URL: Documentation, https://chemparseplot.rgoswami.me
6
6
  Project-URL: Issues, https://github.com/HaoZeke/chemparseplot/issues
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '1.9.9'
22
- __version_tuple__ = version_tuple = (1, 9, 9)
21
+ __version__ = version = '1.9.11'
22
+ __version_tuple__ = version_tuple = (1, 9, 11)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -988,6 +988,36 @@ def surface_fit_indices(n: int, max_points: int) -> np.ndarray:
988
988
  return idx
989
989
 
990
990
 
991
+ @dataclass(frozen=True, slots=True)
992
+ class SurfaceFitConfig:
993
+ """Declarative surface-fit knobs (TOML-friendly mapping).
994
+
995
+ Prefer this over growing positional/flag lists. Key names match
996
+ rgpycrumbs eOn plot TOML (``[shared]`` / ``[min]`` / ``[neb]``)::
997
+
998
+ auto_thin = false
999
+ max_surface_points = 64
1000
+
1001
+ Defaults keep historical behaviour (no thinning).
1002
+
1003
+ ```{versionadded} 1.9.10
1004
+ ```
1005
+ """
1006
+
1007
+ auto_thin: bool = False
1008
+ max_surface_points: int = 64
1009
+
1010
+ @classmethod
1011
+ def from_mapping(cls, data: Mapping[str, Any] | None) -> SurfaceFitConfig:
1012
+ """Build from a TOML table or plain dict (unknown keys ignored)."""
1013
+ if not data:
1014
+ return cls()
1015
+ return cls(
1016
+ auto_thin=bool(data.get("auto_thin", False)),
1017
+ max_surface_points=int(data.get("max_surface_points", 64)),
1018
+ )
1019
+
1020
+
991
1021
  def plot_landscape_surface(
992
1022
  ax,
993
1023
  rmsd_r,
@@ -1009,6 +1039,7 @@ def plot_landscape_surface(
1009
1039
  basis=None,
1010
1040
  auto_thin: bool = False, # noqa: FBT001, FBT002
1011
1041
  max_surface_points: int = 64,
1042
+ surface_fit: SurfaceFitConfig | Mapping[str, Any] | None = None,
1012
1043
  ) -> Any:
1013
1044
  """Plot the 2D landscape surface using reaction valley projection.
1014
1045
 
@@ -1035,6 +1066,9 @@ def plot_landscape_surface(
1035
1066
  opt in (dense eOn min movies can otherwise yield non-finite grids).
1036
1067
  max_surface_points : int, default 64
1037
1068
  Cap on fit observations when ``auto_thin`` is True.
1069
+ surface_fit : SurfaceFitConfig or mapping, optional
1070
+ TOML-friendly config object. When given, overrides *auto_thin* and
1071
+ *max_surface_points* (prefer this over ad-hoc kwargs).
1038
1072
 
1039
1073
  ```{versionadded} 0.1.0
1040
1074
  ```
@@ -1046,6 +1080,10 @@ def plot_landscape_surface(
1046
1080
  ```{versionadded} 1.9.9
1047
1081
  Added *auto_thin* and *max_surface_points*.
1048
1082
  ```
1083
+
1084
+ ```{versionadded} 1.9.10
1085
+ Added *surface_fit* (:class:`SurfaceFitConfig` / mapping).
1086
+ ```
1049
1087
  """
1050
1088
  from rgpycrumbs.surfaces import (
1051
1089
  NYSTROM_N_INDUCING_DEFAULT,
@@ -1054,6 +1092,14 @@ def plot_landscape_surface(
1054
1092
  nystrom_paths_needed,
1055
1093
  )
1056
1094
 
1095
+ if surface_fit is not None:
1096
+ if isinstance(surface_fit, SurfaceFitConfig):
1097
+ fit_cfg = surface_fit
1098
+ else:
1099
+ fit_cfg = SurfaceFitConfig.from_mapping(surface_fit)
1100
+ auto_thin = fit_cfg.auto_thin
1101
+ max_surface_points = fit_cfg.max_surface_points
1102
+
1057
1103
  rmsd_r = np.asarray(rmsd_r, dtype=float)
1058
1104
  rmsd_p = np.asarray(rmsd_p, dtype=float)
1059
1105
  z_data = np.asarray(z_data, dtype=float)
@@ -352,6 +352,7 @@ def render_single_ended_landscape(
352
352
  perspective_tilt: float = 0.0,
353
353
  auto_thin: bool = False,
354
354
  max_surface_points: int = 64,
355
+ surface_fit: Any | None = None,
355
356
  ) -> None:
356
357
  """Full single-ended landscape pipeline shared by min/saddle CLIs.
357
358
 
@@ -368,6 +369,10 @@ def render_single_ended_landscape(
368
369
  (default False: opt-in subsampling of dense fit clouds).
369
370
  max_surface_points
370
371
  Cap on fit observations when ``auto_thin`` is True.
372
+ surface_fit
373
+ Optional :class:`~chemparseplot.plot.neb.SurfaceFitConfig` or mapping
374
+ (TOML table keys). When set, overrides *auto_thin* /
375
+ *max_surface_points*.
371
376
 
372
377
  ```{versionadded} 1.8.1
373
378
  ```
@@ -375,6 +380,10 @@ def render_single_ended_landscape(
375
380
  ```{versionadded} 1.9.9
376
381
  Added *auto_thin* and *max_surface_points*.
377
382
  ```
383
+
384
+ ```{versionadded} 1.9.10
385
+ Added *surface_fit*.
386
+ ```
378
387
  """
379
388
  from matplotlib import ticker
380
389
 
@@ -434,6 +443,7 @@ def render_single_ended_landscape(
434
443
  z_label=z_label,
435
444
  auto_thin=auto_thin,
436
445
  max_surface_points=max_surface_points,
446
+ surface_fit=surface_fit,
437
447
  )
438
448
  if cb is not None:
439
449
  cb.ax.yaxis.set_major_formatter(ticker.FormatStrFormatter("%.3f"))
@@ -112,3 +112,76 @@ class TestPlotLandscapeSurfaceAutoThin:
112
112
  assert seen["n"] <= 64
113
113
  assert seen["n"] < n
114
114
  plt.close(fig)
115
+
116
+
117
+ class TestSurfaceFitConfig:
118
+ def test_from_mapping_defaults(self):
119
+ from chemparseplot.plot.neb import SurfaceFitConfig
120
+
121
+ cfg = SurfaceFitConfig.from_mapping(None)
122
+ assert cfg.auto_thin is False
123
+ assert cfg.max_surface_points == 64
124
+
125
+ def test_from_mapping_overrides(self):
126
+ from chemparseplot.plot.neb import SurfaceFitConfig
127
+
128
+ cfg = SurfaceFitConfig.from_mapping(
129
+ {"auto_thin": True, "max_surface_points": 48, "noise": "ignored"}
130
+ )
131
+ assert cfg.auto_thin is True
132
+ assert cfg.max_surface_points == 48
133
+
134
+ def test_surface_fit_kwarg_overrides_scalars(self):
135
+ import sys
136
+ import types
137
+
138
+ import matplotlib.pyplot as plt
139
+ import numpy as np
140
+
141
+ from chemparseplot.plot import neb as neb_mod
142
+ from chemparseplot.plot.neb import SurfaceFitConfig
143
+
144
+ seen: dict = {}
145
+
146
+ class DummyModel:
147
+ def __init__(self, **kwargs):
148
+ x = kwargs.get("x", kwargs.get("x_obs"))
149
+ seen["n"] = len(x)
150
+ self.ls = 0.5
151
+ self.noise = 1e-2
152
+
153
+ def __call__(self, pts):
154
+ return np.zeros(len(pts))
155
+
156
+ def predict_var(self, pts):
157
+ return np.ones(len(pts)) * 0.01
158
+
159
+ fake = types.ModuleType("rgpycrumbs.surfaces")
160
+ fake.NYSTROM_N_INDUCING_DEFAULT = 300
161
+ fake.NYSTROM_THRESHOLD = 1000
162
+ fake.get_surface_model = lambda method: DummyModel
163
+ fake.nystrom_paths_needed = lambda *a, **k: 1
164
+ sys.modules["rgpycrumbs.surfaces"] = fake
165
+ sys.modules.setdefault("rgpycrumbs", types.ModuleType("rgpycrumbs"))
166
+
167
+ n = 100
168
+ r = np.linspace(0.0, 1.0, n)
169
+ p = np.linspace(1.0, 0.0, n)
170
+ z = np.linspace(0.0, 0.2, n)
171
+ fig, ax = plt.subplots()
172
+ neb_mod.plot_landscape_surface(
173
+ ax,
174
+ r,
175
+ p,
176
+ np.zeros(n),
177
+ np.zeros(n),
178
+ z,
179
+ method="rbf",
180
+ project_path=False,
181
+ show_pts=False,
182
+ auto_thin=False,
183
+ max_surface_points=64,
184
+ surface_fit=SurfaceFitConfig(auto_thin=True, max_surface_points=20),
185
+ )
186
+ assert seen["n"] <= 20
187
+ plt.close(fig)
File without changes
File without changes
File without changes