Skip to main content

Intrinsic Green Learning: task-conditioned intrinsic-dimensionality discovery via a learned encoder and a multi-scale Green's-function kernel.

Project description

Intrinsic Green Learning

OpenSSF Scorecard OpenSSF Best Practices REUSE compliant

Task-conditioned intrinsic-dimensionality discovery for high-dimensional data. IGL pairs a learned encoder with a multi-scale Green's-function kernel and trains the system end-to-end via Variable Projection with random Matryoshka truncation. The model fits the task and simultaneously reveals how many dimensions the task actually needs — usually far fewer than the ambient input.

Note on the import name. The distribution is intrinsic-green-learning; the import name is igl. This collides with libigl; if you need both in the same env, install one of them with a different module name.

Why IGL?

For the same input data, a classifier usually needs fewer latent dimensions than a regressor, which in turn needs fewer than a full autoencoder. IGL discovers this hierarchy automatically:

$$ d_{\text{eff}}(\text{classification}) ;\le; d_{\text{eff}}(\text{regression}) ;\le; d_{\text{eff}}(\text{reconstruction}) $$

The library ships an examples/synthetic/moons_xor.py script that fits all three estimators on the same data and reports the discovered dimensions — the hierarchy holds out of the box.

Installation

pip install intrinsic-green-learning

Optional extras:

Extra Adds Use case
[viz] matplotlib Plot dimension curves via igl.viz.plot_dimension_curve.
[eeg] mne + moabb + pyriemann Future EEG / clinical loaders (placeholder for v0.2).
[nlp] transformers + datasets Future NLP loaders.
[elbow] kneed Alternative elbow detector.
[all] all of the above One-shot install for development.

Quickstart

The library exposes three sklearn-compatible estimators plus a SPD extension. All accept numpy arrays at the API boundary.

Classification

import numpy as np
import igl
from igl.data import embed_in_high_dim, make_moons

x_2d, y = make_moons(400, noise=0.1, seed=0)
x = embed_in_high_dim(x_2d, target_dim=16, seed=0).numpy()

clf = igl.IGLClassifier(max_dim=8, random_state=0).fit(x, y.numpy())
print(f"accuracy = {clf.score(x, y.numpy()):.3f}")
print(f"discovered d_eff = {clf.effective_dimension_}")  # ~ 1 on moons

Regression and reconstruction

from igl.data import make_swiss_roll

x, params = make_swiss_roll(800, seed=0)
x_np = x.numpy(); params_np = params.numpy()

reg = igl.IGLRegressor(max_dim=8, random_state=0).fit(x_np, params_np)
ae = igl.IGLAutoencoder(max_dim=8, random_state=0).fit(x_np)

print(reg.effective_dimension_)   # ~ 2 on swiss roll (intrinsic dim)
print(ae.effective_dimension_)    # ~ 2 on swiss roll

Cross-task hierarchy check

report = igl.compare_d_eff(
    cls=clf.dimension_curve_,
    reg=reg.dimension_curve_,
    recon=ae.dimension_curve_,
)
print(report.d_effs)            # {'cls': 1, 'reg': 2, 'recon': 2}
print(report.hierarchy_holds)   # True

SPD / Riemannian extension

For covariance-valued data (EEG, clinical signals, …), igl.spd ships an AIRM-based reconstruction classifier:

from igl.data import make_spd_dataset
from igl.spd import IGLReconSPDClassifier, LogEigVectorizer

spd, y = make_spd_dataset(400, d=8, n_classes=3, seed=0)
x = LogEigVectorizer().fit(spd.numpy()).transform(spd.numpy())

clf = IGLReconSPDClassifier(
    latent_dim=8, max_dim=12,
    orthogonality_weight=0.1,   # plug-in via the ExtraLoss seam
    random_state=0,
).fit(x, y.numpy())
print(clf.effective_dimension_)

Custom training loop

If sklearn's surface is too high-level, use the bare PyTorch entry points directly:

import torch
import igl

module = igl.IGLModule(
    input_dim=16, max_dim=8, output_dim=2,
    config=igl.IGLConfig(
        encoder=igl.EncoderConfig(hidden=(128, 64)),  # pyramidal MLP
        kernel=igl.KernelConfig(n_anchors=64, operator=igl.OperatorName.GAUSSIAN),
    ),
)

trainer = igl.MatryoshkaTrainer(
    loss=igl.CrossEntropyLoss(n_classes=2),
    config=igl.MatryoshkaConfig(epochs=500),
)
history = trainer.fit(module, x_train_t, y_train_t, x_val=x_val_t, y_val=y_val_t)
curve = igl.eval_dimension_curve(module, x_val_t, y_val_t, loss=igl.CrossEntropyLoss(n_classes=2))
print("d_eff =", igl.detect_elbow(curve))

Documentation

Local build:

uv sync --group doc
uv run mkdocs serve

Published at https://hotherio.github.io/intrinsic-green-learning/latest/ after the first release.

Examples

Three runnable scripts under examples/synthetic/:

Script Manifold Tasks Expected d_eff
torus_classification.py T² ⊂ R⁴ → R³² XOR cls + sin/cos reg ≈ 2
moons_xor.py Moons ⊂ R² → R¹⁶ cls + reg + recon d_cls ≤ d_reg ≤ d_recon
swiss_roll_recon.py Swiss roll ⊂ R³ autoencoder + reg ≈ 2

Run with python -m examples.synthetic.<name>; outputs land in results/<name>/<git_short_sha>/. Install [viz] for PNG plots.

Development

uv sync --all-groups
uv run lefthook install

Verify your environment:

uv run pytest                                # tests + 100% coverage
uv run basedpyright src                      # strict type check
uv run lefthook run pre-commit --all-files   # full pre-commit pass

Conventions

The library follows the Hother Python guidelines under docs/guidelines/:

  • basedpyright strict type checking; Any is not allowed in public signatures.
  • __all__ exhaustive at every module surface.
  • Google-style docstrings on every public symbol.
  • Single base exception igl.IGLError, one level deep.
  • Conventional Commits: commit subjects drive python-semantic-release (feat: → minor, fix: / perf: / refactor: → patch, BREAKING CHANGE: → major).
  • String-valued type aliases are enum.StrEnum classes with a companion Literal mirror; public APIs accept either form.

Release process

Releases are fully automated by python-semantic-release on every push to main via .github/workflows/semantic-release.yml. See docs/security.md for the supply-chain posture (OIDC, sigstore attestations, GPG-signed checksums, pip-audit).

License

MIT. See LICENSE and REUSE.toml.

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

intrinsic_green_learning-0.2.0.tar.gz (95.5 kB view details)

Uploaded Source

Built Distribution

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

intrinsic_green_learning-0.2.0-py3-none-any.whl (95.5 kB view details)

Uploaded Python 3

File details

Details for the file intrinsic_green_learning-0.2.0.tar.gz.

File metadata

  • Download URL: intrinsic_green_learning-0.2.0.tar.gz
  • Upload date:
  • Size: 95.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for intrinsic_green_learning-0.2.0.tar.gz
Algorithm Hash digest
SHA256 145041db0da75664787276f0e7ed211f2e464ce12156191333fb3394c9791610
MD5 3523d83f2100011db83f70c11cebabc1
BLAKE2b-256 37dfc71fc96aac796ab1204616aadcec10e2f1d0e0c0afdf0c701ed1397b6e97

See more details on using hashes here.

Provenance

The following attestation bundles were made for intrinsic_green_learning-0.2.0.tar.gz:

Publisher: semantic-release.yml on hotherio/intrinsic-green-learning

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file intrinsic_green_learning-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for intrinsic_green_learning-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4ea6a7ffde2040b4d98a47e456d3a861cac0817fc86ae762f828c31789bf43d3
MD5 199c9653c43c7da2e81655838a8aad7d
BLAKE2b-256 9d9126ad7d2e1066f65a6994fc861a2eb53b2f7a4425175cc577e6e187ba62e3

See more details on using hashes here.

Provenance

The following attestation bundles were made for intrinsic_green_learning-0.2.0-py3-none-any.whl:

Publisher: semantic-release.yml on hotherio/intrinsic-green-learning

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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