Skip to main content

Use Pydantic to build complex types from simple parameters.

Project description

The cyanotype process, which gave birth to the "blueprint", uses iron salts and UV light to transform simple negatives into deep Prussian blue artwork.

Features

Cyantic lets you build complex types from simple blueprints, using Pydantic.

  • Build complex objects using intermediate Pydantic models.
  • Reference other values using @value:x.y.z
  • Import objects using @import:x.y.z
  • Define custom @hook handlers (see tests)

Installation

  • uv add cyantic

Usage

from cyantic import Blueprint, blueprint, CyanticModel, hook
from torch import Tensor
import torch
import yaml

# 1. Create and register some useful parameterisations
#       (or soon install from PyPi, i.e. `rye add cyantic-torch`)

@blueprint(Tensor)
class NormalTensor(Blueprint[Tensor]):

    mean: float
    std: float
    size: tuple[int, ...]

    def build(self) -> Tensor:
        return torch.normal(self.mean, self.std, size=self.size)

@blueprint(Tensor)
class UniformTensor(Blueprint[Tensor]):
    low: float
    high: float
    size: tuple[int, ...]

    def build(self) -> Tensor:
      return torch.empty(self.size).uniform_(self.low, self.high)


# 2. Write pydantic models using `CyanticModel` base class

class MyModel(CyanticModel):
    normal_tensor: Tensor
    uniform_tensor: Tensor


# 3. (optional) define custom hooks

@hook("env")
def env_hook(name: str, _: ValidationContext) -> str:
    """Handle @env:VARIABLE_NAME references."""
    try:
        return os.environ[name]
    except KeyError as e:
        raise ValueError(f"Environment variable {name} not found") from e


# 4. Validate from YAML files that specify the parameterisation

some_yaml = """common:
    size: [3, 5]
    foo: @env:MY_VARIABLE
normal_tensor:
    mean: 0.0
    std: 0.1
    size: @value:common.size
uniform_tensor:
    low: -1.0
    std: 1.0
    size: @value:common.size
"""

# 4. Receive objects built from the parameterisations.

my_model = MyModel.model_validate(yaml.safe_load(some_yaml))
assert isinstance(my_model.normal_tensor, Tensor)
assert isinstance(my_model.uniform_tensor, Tensor)

Development

  • git clone https://github.com/flywhl/cyantic.git
  • cd cyantic
  • uv sync
  • just test

Flywheel

Science needs humble software tools. Flywheel is an open source collective building simple tools to preserve scientific momentum, inspired by devtools and devops culture.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cyantic-0.3.0.tar.gz (43.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cyantic-0.3.0-py3-none-any.whl (10.9 kB view details)

Uploaded Python 3

File details

Details for the file cyantic-0.3.0.tar.gz.

File metadata

  • Download URL: cyantic-0.3.0.tar.gz
  • Upload date:
  • Size: 43.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.5.16

File hashes

Hashes for cyantic-0.3.0.tar.gz
Algorithm Hash digest
SHA256 941623cc362d07ee9a0ac26b1de2202d1c1708e03d9ebaa7f4d2b01ea064834b
MD5 b9d142194a2e98c3b54521bb15136dd1
BLAKE2b-256 00b366e5edb4fdc85ffcf24dfbb7e4ce4f6852ae62a811aba6ac4e8806268fd6

See more details on using hashes here.

File details

Details for the file cyantic-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: cyantic-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 10.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.5.16

File hashes

Hashes for cyantic-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 96a9b8d01667781835d52f58248b775a49dc13aff4294d05b6cbf2b480dca29f
MD5 dd100bd3964952db31bfe01f8b43224a
BLAKE2b-256 f858ae24c37b8dd48b4e6fad41daf0dc1e25fe3a7aef2d804904e1f21cb05ab1

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page