stjames 0.0.102__py3-none-any.whl → 0.0.103__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of stjames might be problematic. Click here for more details.

stjames/engine.py CHANGED
@@ -4,12 +4,11 @@ from .base import LowercaseStrEnum
4
4
  class Engine(LowercaseStrEnum):
5
5
  AIMNET2 = "aimnet2"
6
6
  MACE = "mace"
7
- OCP24 = "ocp24"
8
7
  OMOL25 = "omol25"
9
8
  ORB = "orb"
10
9
  TBLITE = "tblite"
11
10
  XTB = "xtb"
12
- TERRACHEM = "terrachem"
11
+ TERACHEM = "terachem"
13
12
  PYSCF = "pyscf"
14
13
  PSI4 = "psi4"
15
14
  OPENFF = "openff"
stjames/method.py CHANGED
@@ -34,12 +34,11 @@ class Method(LowercaseStrEnum):
34
34
  AIMNET2_WB97MD3 = "aimnet2_wb97md3"
35
35
  MACE_MP_0 = "mace_mp_0"
36
36
  MACE_MP_0B2_L = "mace_mp_0b2_l"
37
- OCP24_S = "ocp24_s"
38
- OCP24_L = "ocp24_l"
39
37
  OMOL25_CONSERVING_S = "omol25_conserving_s"
40
38
  UMA_M_OMOL = "uma_m_omol"
41
39
  UMA_S_OMOL = "uma_s_omol"
42
40
  ORB_V3_CONSERVATIVE_INF_OMAT = "orb_v3_conservative_inf_omat"
41
+ ORB_V3_CONSERVATIVE_OMOL = "orb_v3_conservative_omol"
43
42
 
44
43
  GFN_FF = "gfn_ff"
45
44
  GFN0_XTB = "gfn0_xtb"
@@ -77,11 +76,9 @@ class Method(LowercaseStrEnum):
77
76
  return Engine.AIMNET2
78
77
  case Method.MACE_MP_0B2_L:
79
78
  return Engine.MACE
80
- case Method.OCP24_S | Method.OCP24_L:
81
- return Engine.OCP24
82
79
  case Method.OMOL25_CONSERVING_S | Method.UMA_M_OMOL | Method.UMA_S_OMOL:
83
80
  return Engine.OMOL25
84
- case Method.ORB_V3_CONSERVATIVE_INF_OMAT:
81
+ case Method.ORB_V3_CONSERVATIVE_INF_OMAT | Method.ORB_V3_CONSERVATIVE_OMOL:
85
82
  return Engine.ORB
86
83
  case method if method in XTB_METHODS:
87
84
  return Engine.TBLITE if is_periodic else Engine.XTB
@@ -96,12 +93,11 @@ class Method(LowercaseStrEnum):
96
93
 
97
94
  PrepackagedNNPMethod = Literal[
98
95
  Method.AIMNET2_WB97MD3,
99
- Method.OCP24_S,
100
- Method.OCP24_L,
101
96
  Method.OMOL25_CONSERVING_S,
102
97
  Method.UMA_M_OMOL,
103
98
  Method.UMA_S_OMOL,
104
99
  Method.ORB_V3_CONSERVATIVE_INF_OMAT,
100
+ Method.ORB_V3_CONSERVATIVE_OMOL,
105
101
  Method.EGRET_1,
106
102
  Method.EGRET_1E,
107
103
  Method.EGRET_1T,
@@ -109,12 +105,11 @@ PrepackagedNNPMethod = Literal[
109
105
 
110
106
  PREPACKAGED_NNP_METHODS = [
111
107
  Method.AIMNET2_WB97MD3,
112
- Method.OCP24_S,
113
- Method.OCP24_L,
114
108
  Method.OMOL25_CONSERVING_S,
115
109
  Method.UMA_M_OMOL,
116
110
  Method.UMA_S_OMOL,
117
111
  Method.ORB_V3_CONSERVATIVE_INF_OMAT,
112
+ Method.ORB_V3_CONSERVATIVE_OMOL,
118
113
  Method.EGRET_1,
119
114
  Method.EGRET_1E,
120
115
  Method.EGRET_1T,
stjames/types.py CHANGED
@@ -1,4 +1,4 @@
1
- from typing import Callable, Iterable, TypeAlias
1
+ from typing import Callable, Iterable, Protocol, TypeAlias, overload
2
2
 
3
3
  UUID: TypeAlias = str
4
4
 
@@ -10,22 +10,32 @@ FloatPerAtom: TypeAlias = list[float]
10
10
  Matrix3x3: TypeAlias = tuple[Vector3D, Vector3D, Vector3D]
11
11
 
12
12
 
13
- def round_list(round_to: int = 6) -> Callable[[Iterable[float]], list[float]]:
14
- """Create a validator that rounds each float in a list to a given number of decimal places."""
13
+ class _Iterable_Rounder(Protocol):
14
+ """Callable with return types conditioned on the input type(s)."""
15
15
 
16
- def rounder(values: Iterable[float]) -> list[float]:
17
- return [round(value, round_to) for value in values]
16
+ @overload
17
+ def __call__(self, values: None, /) -> None: ...
18
+ @overload
19
+ def __call__(self, values: Iterable[float], /) -> list[float]: ...
20
+ @overload
21
+ def __call__(self, values: Iterable[float | None], /) -> list[float | None]: ...
18
22
 
19
- return rounder
20
23
 
24
+ def round_list(round_to: int = 6) -> _Iterable_Rounder:
25
+ """Round values (even if Nones), preserving types."""
21
26
 
22
- def round_optional_list(round_to: int = 6) -> Callable[[Iterable[float] | None], list[float] | None]:
23
- """Create a validator that rounds each float in a list to a given number of decimal places."""
27
+ @overload
28
+ def rounder(values: None, /) -> None: ...
29
+ @overload
30
+ def rounder(values: Iterable[float], /) -> list[float]: ...
31
+ @overload
32
+ def rounder(values: Iterable[float | None], /) -> list[float | None]: ...
24
33
 
25
- def rounder(values: Iterable[float] | None) -> list[float] | None:
34
+ def rounder(values: Iterable[float] | Iterable[float | None] | None, /) -> list[float] | list[float | None] | None:
26
35
  if values is None:
27
36
  return None
28
- return [round(value, round_to) for value in values]
37
+
38
+ return [round(v, round_to) if v is not None else None for v in values]
29
39
 
30
40
  return rounder
31
41
 
@@ -1,7 +1,7 @@
1
1
  """Conformer search workflow."""
2
2
 
3
3
  from abc import ABC
4
- from typing import Annotated, Self, Sequence, TypeVar
4
+ from typing import Annotated, Literal, Self, Sequence, TypeVar
5
5
 
6
6
  from pydantic import AfterValidator, BaseModel, Field, field_validator, model_validator
7
7
 
@@ -94,6 +94,7 @@ class ETKDGSettings(ConformerGenSettings):
94
94
  num_confs_considered: int = 100
95
95
  max_mmff_iterations: int = 500
96
96
  max_mmff_energy: float | None = 30
97
+ settings_type: Literal["etkdg"] = "etkdg"
97
98
 
98
99
  @field_validator("constraints")
99
100
  def check_constraints(cls, constraints: Sequence[Constraint]) -> Sequence[Constraint]:
@@ -209,6 +210,7 @@ class iMTDSettings(ConformerGenSettings, ABC):
209
210
  speed: iMTDSpeeds = iMTDSpeeds.QUICK
210
211
  reopt: bool = _sentinel # type: ignore [assignment]
211
212
  free_energy_weights: bool = False
213
+ settings_type: Literal["imtd"] = "imtd"
212
214
 
213
215
  @model_validator(mode="after")
214
216
  def validate_and_build_imtdgc_settings(self) -> Self:
@@ -253,6 +255,9 @@ class iMTDsMTDSettings(iMTDSettings):
253
255
  run_type: str = "imtd-smtd"
254
256
 
255
257
 
258
+ ConformerGenSettingsUnion = Annotated[ETKDGSettings | iMTDSettings, Field(discriminator="settings_type")]
259
+
260
+
256
261
  class ConformerGenMixin(BaseModel):
257
262
  """
258
263
  Mixin for workflows that need conformer generation.
@@ -265,7 +270,7 @@ class ConformerGenMixin(BaseModel):
265
270
  """
266
271
 
267
272
  conf_gen_mode: Mode = Mode.RAPID
268
- conf_gen_settings: ConformerGenSettings = _sentinel # type: ignore [assignment]
273
+ conf_gen_settings: ConformerGenSettingsUnion = _sentinel # type: ignore [assignment]
269
274
  constraints: Sequence[Constraint] = tuple()
270
275
  nci: bool = False
271
276
  max_confs: int | None = None
@@ -273,8 +278,8 @@ class ConformerGenMixin(BaseModel):
273
278
  @model_validator(mode="after")
274
279
  def validate_and_build_conf_gen_settings(self) -> Self:
275
280
  """Validate and build the ConformerGenSettings."""
276
- if self.conf_gen_settings is not _sentinel and self.conf_gen_mode != Mode.MANUAL:
277
- raise ValueError("Cannot specify conf_gen_settings with non-MANUAL mode")
281
+ if self.conf_gen_settings is not _sentinel:
282
+ return self
278
283
 
279
284
  match self.conf_gen_mode:
280
285
  case Mode.MANUAL:
@@ -7,7 +7,7 @@ from pydantic import AfterValidator, ConfigDict, field_validator, model_validato
7
7
  from ..base import Base, round_float
8
8
  from ..pdb import PDB
9
9
  from ..types import UUID, Vector3D
10
- from .conformer_search import ConformerGenSettings, ETKDGSettings
10
+ from .conformer_search import ConformerGenSettingsUnion, ETKDGSettings
11
11
  from .workflow import MoleculeWorkflow
12
12
 
13
13
 
@@ -79,12 +79,12 @@ class DockingWorkflow(MoleculeWorkflow):
79
79
  pocket: tuple[Vector3D, Vector3D]
80
80
 
81
81
  do_csearch: bool = True
82
- conformer_gen_settings: ConformerGenSettings = ETKDGSettings(mode="reckless")
82
+ conformer_gen_settings: ConformerGenSettingsUnion = ETKDGSettings(mode="reckless")
83
83
 
84
84
  do_optimization: bool = True
85
85
  # optimization_settings - here in future once we have a cleaner mode sol'n, ccw 7.9.25
86
86
 
87
- docking_settings: DockingSettings = VinaSettings()
87
+ docking_settings: VinaSettings = VinaSettings()
88
88
 
89
89
  do_pose_refinement: bool = True
90
90
 
@@ -4,7 +4,7 @@ from typing import Annotated, Optional, Self
4
4
 
5
5
  from pydantic import AfterValidator, model_validator
6
6
 
7
- from ..base import Base, round_float
7
+ from ..base import Base, round_float, round_optional_float
8
8
  from ..types import round_list
9
9
  from .workflow import SMILESWorkflow
10
10
 
@@ -72,9 +72,9 @@ class MacropKaWorkflow(SMILESWorkflow):
72
72
 
73
73
  microstates: list[MacropKaMicrostate] = []
74
74
  pKa_values: list[MacropKaValue] = []
75
- isoelectric_point: Annotated[Optional[float], AfterValidator(round_float(3))] = None
76
- solvation_energy: Annotated[Optional[float], AfterValidator(round_float(3))] = None
77
- kpuu_probability: Annotated[Optional[float], AfterValidator(round_float(3))] = None
75
+ isoelectric_point: Annotated[Optional[float], AfterValidator(round_optional_float(3))] = None
76
+ solvation_energy: Annotated[Optional[float], AfterValidator(round_optional_float(3))] = None
77
+ kpuu_probability: Annotated[Optional[float], AfterValidator(round_optional_float(3))] = None
78
78
 
79
79
  microstate_weights_by_pH: list[
80
80
  tuple[
@@ -1,5 +1,6 @@
1
1
  """Multi-stage optimization workflow."""
2
2
 
3
+ import logging
3
4
  import re
4
5
  from typing import Self, Sequence
5
6
 
@@ -18,6 +19,8 @@ from ..task import Task
18
19
  from ..types import UUID
19
20
  from .workflow import MoleculeWorkflow
20
21
 
22
+ logger = logging.getLogger(__name__)
23
+
21
24
 
22
25
  class MultiStageOptSettings(BaseModel):
23
26
  """
@@ -109,7 +112,8 @@ class MultiStageOptSettings(BaseModel):
109
112
  pass
110
113
 
111
114
  case (mode, True):
112
- raise ValueError(f"Cannot specify optimization_settings or singlepoint_settings with {mode=}")
115
+ logger.debug(f"Mode {mode=} specified with optimization_settings or singlepoint_settings, ignoring")
116
+ pass
113
117
 
114
118
  case (mode, False):
115
119
  self._assign_settings_by_mode(mode)
@@ -253,7 +257,8 @@ class MultiStageOptMixin(BaseModel):
253
257
  pass
254
258
 
255
259
  case (mso_mode, msos) if msos is not _sentinel_msos:
256
- raise ValueError(f"Cannot specify multistage_opt_settings with {mso_mode=}, {msos=}")
260
+ logger.debug(f"Mode {mso_mode=} specified with multistage_opt_settings, ignoring")
261
+ pass
257
262
 
258
263
  case (mso_mode, _):
259
264
  self.multistage_opt_settings = MultiStageOptSettings(
stjames/workflows/nmr.py CHANGED
@@ -8,7 +8,7 @@ from ..base import Base, LowercaseStrEnum, round_float
8
8
  from ..mode import Mode
9
9
  from ..settings import Settings
10
10
  from ..solvent import Solvent
11
- from ..types import UUID, round_list, round_optional_list
11
+ from ..types import UUID, round_list
12
12
  from .conformer_search import ConformerGenSettings, iMTDSettings
13
13
  from .multistage_opt import MultiStageOptSettings
14
14
  from .workflow import MoleculeWorkflow
@@ -66,8 +66,8 @@ class NMRSpectroscopyWorkflow(MoleculeWorkflow):
66
66
 
67
67
  conformers: list[UUID] = []
68
68
  boltzmann_weights: Annotated[list[float], AfterValidator(round_list(3))] = []
69
- per_conformer_chemical_shifts: list[Annotated[list[float | None], AfterValidator(round_optional_list(3))]] = []
70
- chemical_shifts: Annotated[list[float | None], AfterValidator(round_optional_list(3))] = []
69
+ per_conformer_chemical_shifts: list[Annotated[list[float | None], AfterValidator(round_list(3))]] = []
70
+ chemical_shifts: Annotated[list[float | None], AfterValidator(round_list(3))] = []
71
71
  symmetry_equivalent_nuclei: list[list[int]] = []
72
72
 
73
73
  predicted_peaks: dict[int, list[NMRPeak]] = {}
@@ -5,7 +5,7 @@ from typing import Annotated, Literal
5
5
  from pydantic import AfterValidator, BaseModel, ConfigDict
6
6
 
7
7
  from ..base import LowercaseStrEnum, round_float
8
- from ..types import UUID, round_optional_list
8
+ from ..types import UUID, round_list
9
9
  from .workflow import FASTAWorkflow
10
10
 
11
11
 
@@ -86,4 +86,4 @@ class ProteinCofoldingWorkflow(FASTAWorkflow):
86
86
  scores: CofoldingScores | None = None
87
87
  model: CofoldingModel = CofoldingModel.BOLTZ_2
88
88
  affinity_score: AffinityScore | None = None
89
- lddt: Annotated[list[float] | None, AfterValidator(round_optional_list(3))] = None
89
+ lddt: Annotated[list[float] | None, AfterValidator(round_list(3))] = None
@@ -5,7 +5,7 @@ from typing import Annotated, Self
5
5
  from pydantic import AfterValidator, BaseModel, model_validator
6
6
 
7
7
  from ..base import LowercaseStrEnum
8
- from ..types import round_list, round_optional_list
8
+ from ..types import round_list
9
9
  from .workflow import SMILESWorkflow
10
10
 
11
11
 
@@ -24,7 +24,7 @@ class SolubilityResult(BaseModel):
24
24
  """
25
25
 
26
26
  solubilities: Annotated[list[float], AfterValidator(round_list(6))]
27
- uncertainties: Annotated[list[float | None], AfterValidator(round_optional_list(6))]
27
+ uncertainties: Annotated[list[float | None], AfterValidator(round_list(6))]
28
28
 
29
29
  @model_validator(mode="after")
30
30
  def check_size(self) -> Self:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: stjames
3
- Version: 0.0.102
3
+ Version: 0.0.103
4
4
  Summary: standardized JSON atom/molecule encoding scheme
5
5
  Author-email: Corin Wagen <corin@rowansci.com>
6
6
  Project-URL: Homepage, https://github.com/rowansci/stjames
@@ -7,9 +7,9 @@ stjames/calculation.py,sha256=O2LwwQ_cOLmDOGXTHA9J71YbUZXigUSbvbLA-fSVm3w,915
7
7
  stjames/compute_settings.py,sha256=wuYE6W4WqP3oFHwAeEp7XQ0oMz_MNLucWgrsuJ4kEFQ,268
8
8
  stjames/constraint.py,sha256=B6oV0rYjmAWr8gpi5f03gRy_uuqjUURVDVwoez5Cfbg,2442
9
9
  stjames/correction.py,sha256=ZVErCcj4TPyZeKrdvXVjHa0tFynsCaoy96QZUVxWFM8,413
10
- stjames/engine.py,sha256=4Vt1uF1jNGPj-06F2I73oU5RoH1MlNOlDRSNkWN91NE,315
10
+ stjames/engine.py,sha256=jaOHi3nhKZG85HAvKu-HuDl1Hh9nnJfhmOez2ghZXWA,293
11
11
  stjames/message.py,sha256=Rq6QqmHZKecWxYH8fVyXmuoCCPZv8YinvgykSeorXSU,216
12
- stjames/method.py,sha256=gZbrHAivm2OXCbF3_6swei1LG6YQ7Uo1EY7aN0x3XHs,4501
12
+ stjames/method.py,sha256=tMdngVD7kU5ob285YD2-2UVq1gwf0T7dkGF0qYSNoWQ,4453
13
13
  stjames/mode.py,sha256=xw46Cc7f3eTS8i35qECi-8DocAlANhayK3w4akD4HBU,496
14
14
  stjames/molecule.py,sha256=4Tsa_gRC4C-qGPop24jRIs2q07r0LGbSRb-ApOaZa5c,20839
15
15
  stjames/opt_settings.py,sha256=LEwGXUEKq5TfU5rr60Z4QQBhCqiw1Ch5w0M_lXawWo8,642
@@ -22,7 +22,7 @@ stjames/solvent.py,sha256=u037tmu-9oa21s-WEDZ7VC7nuNVjkqR2ML4JWjWSME4,1158
22
22
  stjames/status.py,sha256=KQHDqWSd4kBLow23YLcfOkFdtqN61RFZI-jf2zANWRY,501
23
23
  stjames/task.py,sha256=OLINRqe66o7t8arffilwmggrF_7TH0L79u6DhGruxV8,329
24
24
  stjames/thermochem_settings.py,sha256=ZTLz31v8Ltutde5Nfm0vH5YahWjcfFWfr_R856KffxE,517
25
- stjames/types.py,sha256=Fco-Lw8DYvUhbSvOjYZHaE_AaMyFNdWLUjNvb5aTAzw,4498
25
+ stjames/types.py,sha256=PGEZeqGnomgWUSHcMuUftzvZt7l4VwaQ1Pi-7vEkibg,4773
26
26
  stjames/atomium_stjames/__init__.py,sha256=gZkzC7i9D_fmWUTN55gtygITo3-qvJUda5CXLR0jyCQ,306
27
27
  stjames/atomium_stjames/data.py,sha256=-hzwBpTHq5JetsOVyopUJswKnKAkMtJ_XkONxjXVupU,5675
28
28
  stjames/atomium_stjames/mmcif.py,sha256=em1fNt6577OaUjL7Pctru7aJp3ceZ9kEnj5w6BRWdVs,27090
@@ -42,30 +42,30 @@ stjames/workflows/admet.py,sha256=h8ph6oeRCxU3-_jqRRWPg3RZcheu9JzCHiWqSC9VYKY,12
42
42
  stjames/workflows/basic_calculation.py,sha256=sAgHBcNHE72ZbZPB9vyZShALRC4zOVw6It6cpJlbX2A,911
43
43
  stjames/workflows/bde.py,sha256=g_In-caftXiimrhfdptHjpfrYQUs3vF58qYmRnaTN8g,10825
44
44
  stjames/workflows/conformer.py,sha256=18aO6ngMBeGAmQkBdLGCCHr398RIYr1v2hD2IT1u4cc,3005
45
- stjames/workflows/conformer_search.py,sha256=4yPEKIIedeaVvaAwgjwC1FxiHqM6n2zOF6c9Yk_q1oA,13513
45
+ stjames/workflows/conformer_search.py,sha256=clWFstrz-y1N1x8KtbY7kYUdLrWFSlTLKr-9KnJxt8M,13625
46
46
  stjames/workflows/descriptors.py,sha256=T4tc7xdtBdxESGO86KR323jPQ2pgwxBqgV0khA6MEgQ,584
47
- stjames/workflows/docking.py,sha256=Lc3xB2H_hu0bxlGQBurDtytZfVwSFCgcTyJFWjMDhKI,3857
47
+ stjames/workflows/docking.py,sha256=JG-c6um2tVNeu5H1uzpdQEM5RGMXKgcGNKptTstqj9o,3864
48
48
  stjames/workflows/double_ended_ts_search.py,sha256=ovJgEVFc6c3mijCE3TKAY70YvqNmAZ5Y4XgV4-tIxBI,3127
49
49
  stjames/workflows/electronic_properties.py,sha256=GT3-NC7w-dbcOJ-3AzJ7LgzH6frTbiH2Iyb9BCa-SvY,4112
50
50
  stjames/workflows/fukui.py,sha256=095GDGSSEc5PDD1aoKM8J7icgR5tfwS5Bs9XxFQHge4,2387
51
51
  stjames/workflows/hydrogen_bond_basicity.py,sha256=q9eXty68ZyCmrB6G_8bfeOT8Ui_IQquRPu6z-3rNreQ,1589
52
52
  stjames/workflows/ion_mobility.py,sha256=rvvAt4ZD-Npl0tHL7TEuaS3XKjHiMkSZVzyJoivdyps,1665
53
53
  stjames/workflows/irc.py,sha256=ZP7icylW8rgo_Uh7h3bmyumn0ru1IyF-61nP5Jnmq3M,3402
54
- stjames/workflows/macropka.py,sha256=KRIyk4gsSYL3eqyzCDndStGLwjWSo60cgCAzvAoD1Nk,3754
54
+ stjames/workflows/macropka.py,sha256=Krj0xXuB-u57Kqlf4bbRiHDUWCpliFr6YPiYqPmYaWk,3803
55
55
  stjames/workflows/molecular_dynamics.py,sha256=HqWNxxPSAphfI0DdbTERFkq8UeBjEvhnA_ETv0xw_RY,3522
56
- stjames/workflows/multistage_opt.py,sha256=SpbA8hNvktnlLS7C-9mBNGluBSrdVS8ygHl1C4TzWcI,16499
57
- stjames/workflows/nmr.py,sha256=Fw7k_ZvIaxpAxkdgW2xMORhaI5s5BY_v7_VEPG1Ylgc,2710
56
+ stjames/workflows/multistage_opt.py,sha256=UN-4WLsT2WEjO5KqDPrcCkb708Co-ZScHx3g2bto768,16597
57
+ stjames/workflows/nmr.py,sha256=2314qzkAFt-Wu6IDC2AI7eedYocqcCxIy9uZWkHMz_Q,2671
58
58
  stjames/workflows/pka.py,sha256=j3vBh2YM3nJzJ1XJKPsmYahRCeaU9n3P-G-u9_moaFw,2065
59
59
  stjames/workflows/pose_analysis_md.py,sha256=ES0XlzaLpTjhLrNvcB0zFZa1b1ZHXekN72EbLsx0Skw,4723
60
- stjames/workflows/protein_cofolding.py,sha256=6WWbVOGzFjIRgQLMmMVODfIxo1jYFmRS1xnJmN0kOBw,3016
60
+ stjames/workflows/protein_cofolding.py,sha256=ZjHER5DsO2vgCpgqttcNIU8xISN5B4DdqdrTxLKFsKY,2998
61
61
  stjames/workflows/redox_potential.py,sha256=7S18t9Y3eynSnA3lZbRlvLfdbgeBopdiigLzt1zxg5c,3871
62
62
  stjames/workflows/scan.py,sha256=DXQBpa2t2PowAtOwmdgpxaSLq--fEShljzAGSb8Nf5U,2993
63
- stjames/workflows/solubility.py,sha256=C5FD16p3bkvJz9rhZkgrg_gMrYGY4mnqvXPqqLbixiw,2991
63
+ stjames/workflows/solubility.py,sha256=DhsOxThAslWihpvOKJINNeMiBWSEzRsdqBlfgo2PwX4,2961
64
64
  stjames/workflows/spin_states.py,sha256=0degmE-frovgoXweshZyjfjqL7nkbaFoO9YoJhvQnaI,4748
65
65
  stjames/workflows/tautomer.py,sha256=7eYKziGPg8Km6lfowTzSkgJfJ4SHUPrAmnTf8Bi-SB0,1164
66
66
  stjames/workflows/workflow.py,sha256=OE05pt2ZOd8TzTOlBngXCVg9wv_553ZR60VNRPlq0f8,1953
67
- stjames-0.0.102.dist-info/licenses/LICENSE,sha256=i05z7xEhyrg6f8j0lR3XYjShnF-MJGFQ-DnpsZ8yiVI,1084
68
- stjames-0.0.102.dist-info/METADATA,sha256=sRGYL13y6ucmCcnYzhSzmmClIOn-uyzvURPkABaJ8Lo,1725
69
- stjames-0.0.102.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
70
- stjames-0.0.102.dist-info/top_level.txt,sha256=FYCwxl6quhYOAgG-mnPQcCK8vsVM7B8rIUrO-WrQ_PI,8
71
- stjames-0.0.102.dist-info/RECORD,,
67
+ stjames-0.0.103.dist-info/licenses/LICENSE,sha256=i05z7xEhyrg6f8j0lR3XYjShnF-MJGFQ-DnpsZ8yiVI,1084
68
+ stjames-0.0.103.dist-info/METADATA,sha256=ncWtuaR7uYzpmbJ89kySb8O5pJwKJDFX9jBQ5OXl9GY,1725
69
+ stjames-0.0.103.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
70
+ stjames-0.0.103.dist-info/top_level.txt,sha256=FYCwxl6quhYOAgG-mnPQcCK8vsVM7B8rIUrO-WrQ_PI,8
71
+ stjames-0.0.103.dist-info/RECORD,,