archimedes.StructConfig¶

class archimedes.StructConfig¶

Base class for creating configuration objects with automatic type discrimination.

This class extends Pydantic’s BaseModel to automatically add a type field based on the class name, enabling type-safe configuration systems with automatic serialization and validation. Subclasses must specify their type using the type parameter in the class definition.

Parameters:

type (str) – The type identifier for this configuration class, specified in the class definition using StructConfig, type="typename".

Notes

The type field is automatically added to the class and set to the value specified in the class definition. This enables automatic discrimination when working with unions of different configuration types.

Subclasses are expected to implement a build() method that constructs the corresponding module instance based on the configuration parameters. This may include any “offline” validation, preprocessing, or data loading that should occur once at initialization time rather than at runtime.

Key features:

  • Automatic type field addition and population

  • Validation and serialization of the fields

  • Designed to work with UnionConfig for type discrimination

Examples

>>> from typing import Protocol
>>> import archimedes as arc
>>>
>>> class GravityModel(Protocol):
...     def __call__(self, position: np.ndarray) -> np.ndarray:
...         ...
>>>
>>> @arc.struct
>>> class ConstantGravity:
...     g0: float
...
...     def __call__(self, position: np.ndarray) -> np.ndarray:
...         return np.array([0, 0, self.g0])
>>>
>>> class ConstantGravityConfig(arc.StructConfig, type="constant"):
...     g0: float = 9.81
...
...     def build(self) -> ConstantGravity:
...         return ConstantGravity(self.g0)
>>>
>>> ConstantGravityConfig(g0=9.81).build()
ConstantGravity(g0=9.81)
>>>
>>> # Another configuration type
>>> class PointGravityConfig(arc.StructConfig, type="point"):
...     mu: float = 3.986e14  # m^3/s^2
...     RE: float = 6.3781e6  # m
...     lat: float = 0.0  # deg
...     lon: float = 0.0  # deg
...
...     def build(self) -> PointGravity:
...         # Implementation omitted for brevity
...         pass
>>>
>>> # Create a discriminated union of configuration types
>>> GravityConfig = arc.UnionConfig[ConstantGravityConfig, PointGravityConfig]

See also

UnionConfig

Create discriminated unions of StructConfig subclasses

module

Decorator for creating modular dataclass components