Metadata-Version: 2.4
Name: itaca
Version: 0.2.1
Summary: Integrated Toolkit for Aerospace Computation and Analysis: rigorous engineering data management, analysis, and computation
Author: Geovana Neves
License-Expression: MIT
Project-URL: Homepage, https://github.com/nevesgeovana/itaca
Project-URL: Source, https://github.com/nevesgeovana/itaca
Project-URL: Changelog, https://github.com/nevesgeovana/itaca/blob/main/CHANGELOG.md
Project-URL: Issues, https://github.com/nevesgeovana/itaca/issues
Keywords: aerospace,data-management,uncertainty,GUM,provenance,wind-tunnel
Classifier: Development Status :: 2 - Pre-Alpha
Classifier: Intended Audience :: Science/Research
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Scientific/Engineering
Classifier: Typing :: Typed
Requires-Python: <3.14,>=3.11
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: numpy<3.0,>=1.26
Provides-Extra: pandas
Requires-Dist: pandas<3.0,>=2.1; extra == "pandas"
Provides-Extra: dev
Requires-Dist: pytest<10.0,>=9.0.3; extra == "dev"
Requires-Dist: pytest-cov<8.0,>=7.0; extra == "dev"
Requires-Dist: hypothesis<7.0,>=6.100; extra == "dev"
Requires-Dist: ruff==0.15.22; extra == "dev"
Requires-Dist: mypy<2.0,>=1.10; extra == "dev"
Requires-Dist: pre-commit<5.0,>=3.7; extra == "dev"
Requires-Dist: scipy<2.0,>=1.11; extra == "dev"
Requires-Dist: uncertainties<4.0,>=3.2; extra == "dev"
Requires-Dist: pyyaml<7.0,>=6.0; extra == "dev"
Requires-Dist: build<2.0,>=1.0; extra == "dev"
Requires-Dist: pandas<3.0,>=2.1; extra == "dev"
Requires-Dist: packaging<26.0,>=23.0; extra == "dev"
Dynamic: license-file

# ITACA

[![PyPI](https://img.shields.io/pypi/v/itaca)](https://pypi.org/project/itaca/)
[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.21482648.svg)](https://doi.org/10.5281/zenodo.21482648)
[![CI](https://github.com/nevesgeovana/itaca/actions/workflows/ci.yml/badge.svg)](https://github.com/nevesgeovana/itaca/actions/workflows/ci.yml)

**Integrated Toolkit for Aerospace Computation and Analysis**

*From data to wisdom.*

```python
import itaca as itc
```

ITACA is a Python library for rigorous engineering data management,
analysis, and computation, with a primary focus on aerospace applications.
It manages multidimensional experimental and numerical datasets (wind
tunnel campaigns, CFD post-processing, flight-test data, engineering
computations) with mandatory provenance, automatic GUM-compliant
uncertainty propagation including covariance, and origin tags for every
value. Where a propagation rule is not yet frozen, the operation raises
instead of returning a number: see Status below for which five. The
plotting layer (`ItcFigure`, the AIAA style, the matplotlib backend) is
roadmapped for v0.3.0 and is not in the library today.

## Installation

```bash
pip install itaca
```

ITACA needs Python 3.11, 3.12 or 3.13, and depends only on NumPy. The pandas
bridge (`itc.load(df)`, `db.to_pandas()`) is optional:

```bash
pip install "itaca[pandas]"
```

## Quickstart

```python
import numpy as np
import itaca as itc

# Load, then declare which column is the sweep dimension.
rows = np.column_stack([[0.0, 2.0, 4.0], [10.0, 12.0, 14.0]])
db = itc.load(rows, names=["alpha", "FZ"]).pivot(dims=["alpha"])

# Assign an uncertainty; it propagates by the GUM rules, automatically.
db = db.set_uncertainty({"FZ": 0.05})
db = db.compute("CZ = FZ / 100.0")

print(db.vars["CZ"].values)             # [0.1  0.12 0.14]
print(db.uncertainty.systematic["CZ"])  # [0.0005 0.0005 0.0005]
print(db.history)                       # every step, in order
```

Every operation returns a **new** frame and records itself in History,
so nothing above mutates `db`. See `examples/` for a complete synthetic
wind tunnel walkthrough.

## Status

Pre-release, and the API is not frozen. Two milestones have shipped.

**Milestone M0, released as v0.1.0**: loading in all modes, inspection and
diagnostics, structural operations, two-component GUM uncertainty
propagation with covariance, string-equation derivation, explicit
combination, exports, and the `.itc` native format with state-hash
revalidation.

**Milestone M1, released as v0.2.0**: the analysis operations (`expand`,
`concat`, `interpolate`, `average`, `integrate`, `smooth`, `diff`,
`fitmodel`, `fitvalue`), the axes and vector-group system with rotation and
moment transfer, replayable pipelines and `.itc_pipe`, and reusable
processors defined by an `.itceq` equation file.

**Read the [release
notes](https://github.com/nevesgeovana/itaca/blob/main/CHANGELOG.md) before
you rely on uncertainty.** Five operations REFUSE to propagate it rather than
guessing: `smooth`, `diff`, `fitmodel`, `fitvalue`, and
`fill(method="polyfit")`. Each raises when the frame carries an uncertainty,
because its propagation rule is not yet frozen. The notes also carry a
`Known open` section listing the defects known open in this release, several
of which produce a wrong number silently.

**Upgrading from an earlier version**, three things will bite first.

An `.itc` archive written by ANY earlier version no longer opens: the format
is at `itaca-itc/3` and its two predecessors are refused by name, with a
message saying what the archive lacks. Re-export from the source data, or, if
the archive is your only copy, open it in a scratch environment on the version
that wrote it and export to CSV or JSON first.

The archives are refused rather than read, and the reason is the point of the
change: neither predecessor records a spatial coordinate system, so a frame
saved in Polar coordinates would come back Cartesian and integrate against the
wrong area element. Reading them would reintroduce the defect the new schema
exists to close, so silent reinterpretation is not offered as the remedy.

Code that derived quantities from a common root now RAISES
`UncertaintyLineageError` where it previously returned a number. The number
was wrong, by up to 3.6x on the measured case, and the message names the
single expression that is already correct or the `set_correlation` call that
settles it.

Python 3.11 is the floor, as of v0.2.0.

The SRS is versioned in `docs/srs/`; its document version and revision
are stated on the SRS title page and in the revision history table.
Releases follow the incremental roadmap in the SRS Chapter 10: each
milestone ships on PyPI with a Zenodo DOI.

## Design record

* `docs/srs/`: the SRS LaTeX sources, the authoritative reference for
  what ITACA must do and how it is built. First workspace-tracked
  version: document 0.1.0, 2026-07-21.
* `docs/DECISIONS.md`: the architectural decisions with long-form
  rationale (the file's own header carries the current range).
* `docs/OPEN_QUESTIONS.md`: the design questions with resolutions.
* `docs/SISTER_PYFLIGHTSTREAM.md`: the co-developed sister library
  (DD-22, DD-23): division of labor, the cross-requirement
  convention, and the shared review process.
* `RELEASING.md`: how a release is cut, and the one piece of
  configuration that lives on PyPI rather than in this repository, so no
  test here can check it (DD-45).

## Core convictions

1. Data management before analysis: a result is only as trustworthy as
   the pipeline that produced it.
2. Provenance is mandatory: every dataset knows where it came from, what
   was done to it, by whom, and when.
3. Fail fast and loud: ambiguity is an error, silent fallbacks are
   defects.
4. Uncertainty is native: two-component GUM propagation with covariance,
   not an afterthought.
5. Test-driven, coverage at or above 90 percent, minimal API surface,
   NumPy-only core.

## License and citation

MIT License (see `LICENSE`). Citation metadata lives in `CITATION.cff`.
Tagged releases are mirrored on Zenodo: cite the concept DOI
[10.5281/zenodo.21482648](https://doi.org/10.5281/zenodo.21482648) for
the latest version, or the per-release DOI, which is on the Zenodo record
for each archived version (v0.1.0:
[10.5281/zenodo.21482649](https://doi.org/10.5281/zenodo.21482649)).
A
software paper (JOSS or SoftwareX) is planned after the API
stabilizes.

## Author

Geovana Neves, aerospace engineer (aeropropulsive integration and wind
tunnel testing), ITA / TU Delft.
