Skip to content

Commit 7d74c0b

Browse files
moeyensjclaude
andauthored
Remove pydantic dependency from checkpointing (#171)
Pydantic was only used in checkpointing.py as typed data containers with no validation or serialization. Replace with stdlib dataclasses to simplify the dependency tree. Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent b6171e2 commit 7d74c0b

1 file changed

Lines changed: 28 additions & 44 deletions

File tree

src/thor/checkpointing.py

Lines changed: 28 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import logging
22
import pathlib
3-
from typing import Annotated, Dict, List, Literal, Optional, Type, Union
3+
from dataclasses import dataclass
4+
from typing import Dict, List, Literal, Optional, Union
45

56
import pyarrow.parquet as pq
6-
import pydantic
77
import quivr as qv
88
import ray
99

@@ -28,93 +28,77 @@
2828
]
2929

3030

31-
class FilterObservations(pydantic.BaseModel):
31+
@dataclass
32+
class FilterObservations:
3233
stage: Literal["filter_observations"]
3334

3435

35-
class GenerateEphemeris(pydantic.BaseModel):
36-
class Config:
37-
arbitrary_types_allowed = True
38-
36+
@dataclass
37+
class GenerateEphemeris:
3938
stage: Literal["generate_ephemeris"]
4039
filtered_observations: Union[Observations, ray.ObjectRef]
4140
test_orbit_ephemeris: Union[TestOrbitEphemeris, ray.ObjectRef]
4241

4342

44-
class RangeAndTransform(pydantic.BaseModel):
45-
class Config:
46-
arbitrary_types_allowed = True
47-
43+
@dataclass
44+
class RangeAndTransform:
4845
stage: Literal["range_and_transform"]
4946
test_orbit_ephemeris: Union[TestOrbitEphemeris, ray.ObjectRef]
5047
filtered_observations: Union[Observations, ray.ObjectRef]
5148

5249

53-
class ClusterAndLink(pydantic.BaseModel):
54-
class Config:
55-
arbitrary_types_allowed = True
56-
50+
@dataclass
51+
class ClusterAndLink:
5752
stage: Literal["cluster_and_link"]
5853
test_orbit_ephemeris: Union[TestOrbitEphemeris, ray.ObjectRef]
5954
filtered_observations: Union[Observations, ray.ObjectRef]
6055
transformed_detections: Union[TransformedDetections, ray.ObjectRef]
6156

6257

63-
class InitialOrbitDetermination(pydantic.BaseModel):
64-
class Config:
65-
arbitrary_types_allowed = True
66-
58+
@dataclass
59+
class InitialOrbitDetermination:
6760
stage: Literal["initial_orbit_determination"]
6861
filtered_observations: Union[Observations, ray.ObjectRef]
6962
clusters: Union[FittedClusters, ray.ObjectRef]
7063
cluster_members: Union[FittedClusterMembers, ray.ObjectRef]
7164

7265

73-
class DifferentialCorrection(pydantic.BaseModel):
74-
class Config:
75-
arbitrary_types_allowed = True
76-
66+
@dataclass
67+
class DifferentialCorrection:
7768
stage: Literal["differential_correction"]
7869
filtered_observations: Union[Observations, ray.ObjectRef]
7970
iod_orbits: Union[FittedOrbits, ray.ObjectRef]
8071
iod_orbit_members: Union[FittedOrbitMembers, ray.ObjectRef]
8172

8273

83-
class RecoverOrbits(pydantic.BaseModel):
84-
class Config:
85-
arbitrary_types_allowed = True
86-
74+
@dataclass
75+
class RecoverOrbits:
8776
stage: Literal["recover_orbits"]
8877
filtered_observations: Union[Observations, ray.ObjectRef]
8978
od_orbits: Union[FittedOrbits, ray.ObjectRef]
9079
od_orbit_members: Union[FittedOrbitMembers, ray.ObjectRef]
9180

9281

93-
class Complete(pydantic.BaseModel):
94-
class Config:
95-
arbitrary_types_allowed = True
96-
82+
@dataclass
83+
class Complete:
9784
stage: Literal["complete"]
9885
recovered_orbits: Union[FittedOrbits, ray.ObjectRef]
9986
recovered_orbit_members: Union[FittedOrbitMembers, ray.ObjectRef]
10087

10188

102-
CheckpointData = Annotated[
103-
Union[
104-
FilterObservations,
105-
GenerateEphemeris,
106-
RangeAndTransform,
107-
ClusterAndLink,
108-
InitialOrbitDetermination,
109-
DifferentialCorrection,
110-
RecoverOrbits,
111-
Complete,
112-
],
113-
pydantic.Field(discriminator="stage"),
89+
CheckpointData = Union[
90+
FilterObservations,
91+
GenerateEphemeris,
92+
RangeAndTransform,
93+
ClusterAndLink,
94+
InitialOrbitDetermination,
95+
DifferentialCorrection,
96+
RecoverOrbits,
97+
Complete,
11498
]
11599

116100
# A mapping from stage to model class
117-
stage_to_model: Dict[str, Type[pydantic.BaseModel]] = {
101+
stage_to_model: Dict[str, type] = {
118102
"filter_observations": FilterObservations,
119103
"generate_ephemeris": GenerateEphemeris,
120104
"range_and_transform": RangeAndTransform,

0 commit comments

Comments
 (0)