Public API

The supported public API is stoms.atomsledger. SQLite and PostgreSQL are supported backends. Import public names from this module rather than implementation modules.

from stoms.atomsledger import AtomsLedger, SQLiteRepository

ledger = AtomsLedger("study.atomsledger")

AtomsLedger() uses atomsledger.sqlite. AtomsLedger.open(path) is a path constructor. Passing a Repository implementation is supported at the service boundary, but SQLiteRepository is the only supported concrete backend.

Domain values

Public value Purpose
Provenance Required created_by and purpose; optional immutable tags, notes, and strict JSON metadata.
StructureSourceSpec Immutable description of a structure-producing process.
MethodSpec Description of an evaluation method; method_identifier is its ordinary matching identity.
StructureInput, EvaluationInput, TrajectoryFrame Batch ingestion and trajectory inputs.
StructureRecord, EvaluationRecord, TrajectoryRecord Immutable persisted records.
StoredQuery, StoredQuerySummary Immutable query definitions and listing views.
Aggregation, AggregationMember, AggregationMemberInput, AggregationSummary Immutable ordered memberships and views.

StructureID, StoredQueryID, and AggregationID are string aliases. The library creates type-prefixed IDs such as str_, eval_, traj_, query_, and agg_.

Public imports

stoms.atomsledger.__all__ exports the following names:

Group Names
Service and storage AtomsLedger, SQLiteRepository, SQLiteCatalog
Records and views StructureRecord, EvaluationRecord, TrajectoryRecord, StoredQuery, StoredQuerySummary, Aggregation, AggregationSummary, AggregationMember, StructureContentMatch, StructureContentConflict, StructureCatalogEntry, EvaluatorCatalogEntry, SelectedRecord, NumericalProjection, StrictSelection
Inputs and query values StructureInput, EvaluationInput, TrajectoryFrame, AggregationMemberInput, Provenance, StructureSourceSpec, MethodSpec, StructureQuery, EvaluationQuery, DatasetQuery, EvaluatorSelector
Type aliases StructureID, StoredQueryID, AggregationID, JSONValue
Transfer TransferReport, transfer_repository, verify_repository_subset, export_sqlite, import_sqlite
Errors and warning AtomsLedgerError, RecordNotFoundError, DuplicateRecordError, IntegrityError, StrictSelectionError, StructureContentConflictError, StructureContentMismatchError, AggregationConflictError, AggregationNotFoundError, AggregationValidationError, StoredQueryInUseError, SerializationError, EquivalentAtomsWarning

Ingest and read

ledger.add_structure(atoms, source_spec, provenance, *, allow_equivalent_atoms=False)
ledger.add_structures(items, *, source_spec, provenance=None, allow_equivalent_atoms=False)
ledger.add_evaluation(structure_id, *, method, properties, units=None, provenance)
ledger.add_evaluations(items)
ledger.add_trajectory(*, kind, frames, provenance)

ledger.load_atoms(structure_id)
ledger.load_evaluation(evaluation_id)
ledger.validate_structure_content(structure_id, atoms)
ledger.find_structures(query=None)
ledger.find_evaluations(query=None)
ledger.list_method_identifiers()

add_structure returns a record ID or StructureContentMatch values. add_structures returns IDs or raises StructureContentConflictError atomically. Evaluation ingestion requires one or more of energy, forces, or node_energy. Their accepted shapes are ()/(1,), (n, 3), and (n,); their default units are eV, eV/angstrom, and eV.

Query, catalog, and tags

StructureQuery(...)
EvaluationQuery(...)
DatasetQuery(structures=..., evaluations=..., require_evaluation=False)
EvaluatorSelector(method, exact_match=False)

ledger.catalog.search(query=None)
ledger.catalog.iter_search(query=None)
ledger.add_tags(record_id, tags)
ledger.add_tags_many(records)
ledger.get_tags(record_id)

StructureQuery filters by ID, content hash, formula, effective tags, purpose, and time. EvaluationQuery filters by ID, structure ID, method family/name/ version/code/identifier, property presence, effective tags, and time. DatasetQuery.require_evaluation does not select an evaluator for strict selection.

The catalog returns StructureCatalogEntry values with evaluator metadata, property names, and units without loading structure or numerical payloads. Tags are append-only and supported for structures and evaluations.

Strict selection and extxyz

selection = ledger.select(query=None, *, evaluator=None, exact_match=False)
selection.project(property_name)
selection.project_energy()

ledger.to_extxyz(destination, *, dataset=None, evaluator=None, selection=None,
                 aggregation_id=None)
ledger.export_extxyz(destination, *, query=None, template=None, dataset=None,
                     evaluator=None, selection=None, aggregation_id=None,
                     include_node_energy=False)

select accepts a DatasetQuery, StructureQuery, StoredQuery, stored-query ID, or None. A string is an ID, not a stored-query label. Evaluators can be a method name, MethodSpec, EvaluationQuery, or EvaluatorSelector. Selection raises StrictSelectionError unless every selected structure has exactly one matching evaluation.

Pass aggregation_id to export its members in their immutable stored order. Each member's attached evaluation ID is used directly; it cannot be combined with a query, template, dataset, evaluator, or explicit selection.

StrictSelection.project returns NumericalProjection with aligned IDs and a read-only NumPy array. Values must be numeric, have one declared unit, and share a shape.

Stored queries and aggregations

ledger.create_stored_query(*, label, query, provenance, description="", hidden_at=None)
ledger.list_stored_queries()
ledger.get_stored_query(query_id)
ledger.hide_stored_query(query_id)
ledger.delete_stored_query(query_id, *, force=False)

ledger.create_aggregation(*, name, members, description=None, metadata=None,
                          external_key=None, supersedes_id=None)
ledger.materialize_stored_query(*, stored_query_id, name, description=None,
                                metadata=None, external_key=None)
ledger.get_aggregation(aggregation_id, *, include_members=True)
ledger.get_aggregation_by_external_key(external_key, *, include_members=True)
ledger.list_aggregations(*, name=None, source_stored_query_id=None,
                         metadata_filter=None)
ledger.get_aggregation_structure_ids(aggregation_id)
ledger.get_aggregation_structures(aggregation_id)

Stored-query labels are nonunique. Hiding changes visibility but not the query. Deleting a query referenced by an aggregation raises StoredQueryInUseError unless force=True. Aggregation members contain a required structure ID and an optional evaluation ID. Membership is immutable. external_key permits idempotent recreation only with matching membership and compatible fields.

Transfer

ledger.transfer_to(target, *, conflict="verify", batch_size=256)
ledger.export_database(destination, *, overwrite=False, batch_size=256)
ledger.import_database(source, *, conflict="verify", batch_size=256)

transfer_repository(source, target, *, conflict="verify", batch_size=256)
verify_repository_subset(source, target)
export_sqlite(source, destination, *, overwrite=False, batch_size=256)
import_sqlite(source, target, *, conflict="verify", batch_size=256)

Conflict policy is error, skip, or verify. verify accepts an existing ID only if its immutable fingerprint matches. Transfer is additive and never rewrites or deletes destination records.

Errors and warnings

Public errors derive from AtomsLedgerError: RecordNotFoundError, DuplicateRecordError, IntegrityError, StrictSelectionError, StructureContentConflictError, StructureContentMismatchError, AggregationConflictError, AggregationNotFoundError, AggregationValidationError, StoredQueryInUseError, and SerializationError. Reused or equivalent structure IDs issue EquivalentAtomsWarning.