Skip to main content

A trainable continual-learning architecture (manas/buddhi/ahaṃkāra/citta) you train on your own data — AND a governed loop engine built from the same organs: watch → learn what's normal → self-improve → orchestrate many specialists under one audited control ring. No forgetting (DER++ · O-LoRA · forgetting-curve replay), energy + feature-space + one-class novelty, calibrated abstention, scale-stable mātrā-LAMB optimization, adaptive plasticity, and a swappable risk-tier control ring.

Project description

antahkarana — train a continual-learning mind on your data

PyPI License Python Model card

antahkarana is a trainable architecture, not a frozen model. You bring your data (and optionally your backbone); it trains a model that learns continually without forgetting, detects novelty / zero-days, abstains when unsure, and consolidates in sleep. Four organs — manas · buddhi · ahaṃkāra · citta — the mind is the same for every domain; only a thin adapter changes.

architecture

Built on the validated Antaḥkaraṇa-base core (gated G0–G5, proven across language · vision · security · with seeded, adaptive evaluation — see the model card for plots, results, and honest limits).

Install

pip install antahkarana            # core + tabular
pip install antahkarana[text]      # + HuggingFace LLM adapter

Train on your data in ~10 lines (tabular)

from antahkarana import Antahkarana, TabularAdapter

# YOUR data: a list of tasks, each (X_train, y_train, X_test, y_test)
stream = TabularAdapter.make_stream(your_tasks)

bb   = TabularAdapter(input_dim=122, n_tasks=4, n_classes=2)   # built-in MLP — bring only data
mind = Antahkarana(bb, replay_strategy="der", avidya_strategy="energy")
res  = mind.train(stream)

print(res["forgetting"], res["final_row"], res["risk_coverage"])

New in 2.0 — the loop engine: watch · learn · improve · orchestrate

antahkarana 2.0 loop engine

The same four organs that learn continually on training tasks now run as a governed loop engine on live observations. Generic agent loops watch and act; this one learns what's normal (fewer false alarms over time), remembers without forgetting, governs by construction (every action passes an audited control ring), and abstains when unsure. Fully additive — every 1.x symbol and default is unchanged.

from antahkarana import Loop, Policy

# A governed stock watcher: it stays silent until the right shoe appears,
# then ESCALATES to you — it never buys on its own (purchase is hard-blocked).
watch = Loop(
    sense=check_product_page,                         # your eyes: return the current observation
    change=lambda o, mem: 1.0 if (o["in_stock"] and o["price"] <= 175) else 0.0,
    category=lambda o: "purchase",
    signature=lambda o: f"{o['in_stock']}:{o['price']}",   # smṛti dedup — don't re-alert the same thing
    gate=Policy(name="shopper", hard_block=["purchase"]),  # the control ring: never auto-buy
    on_escalate=lambda obs, iv: notify_me(obs),
)
watch.run(max_steps=1000)

Four composing phases — each maps 1:1 to an organ:

  • Loop (watch) — a governed sentinel. Sense → score novelty → fire only on a real spike vs the running baseline (ahaṃkāra) → route through the control ring → dedup (smṛti). Hard-blocked actions escalate to a human, never auto-act; everything is audited.
  • OneClassChange (learn) — a learned baseline for Loop: a Normal-only autoencoder that refits on a sliding window with held-out calibration and adapts to drift. Under drift, a static rule's false alarms blow up to 45–98% while the learned baseline holds them at the ~5% budget (3 seeds).
  • ImproveLoop (improve)build → critique → fix → repeat until a learned standard is met, then gate the ship. Monotone convergence in 3–4 rounds, and it never auto-ships (the finished draft is escalated for sign-off).
  • Orchestrator (orchestrate) — buddhi fans out N specialist loops under ONE ring and ONE audit log, then ranks what surfaced so you see the critical thing first. The software spine of the air-gapped Box.

The loop engine is a thin governed runtime around your backbone — it supplies memory + calibrated novelty + the audited gate + the learning baseline; the reasoning/action inside each loop is yours. See examples/loop_stock_watch.py.

New in 1.1.0 — four ways to not forget · scale-stable training · closed-loop plasticity

antahkarana 1.1

A backward-compatible release — every new behaviour is opt-in; the defaults reproduce 1.0. Validated on the NSL-KDD high-interference stream (3 seeds), cross-checked on UNSW-NB15 + vision; core gates green.

  • Four complementary no-forgetting mechanisms — saṃskāra (EWC) · DER++ (now on the text adapter too) · OrthoLoRA structural isolation (forgetting +0.288 → +0.215 where a penalty gives ~0) · forgetting-curve replay (nidrā) that rehearses the about-to-be-forgotten items first (rare-tail recall 0.276 → 0.314).
  • MatraLAMB scale-stable optimization (Antahkarana(optimizer="lamb")) — a trust-ratio step (mātrā) so a full backbone and a tiny adapter move in proportion to their own magnitude, and one lr is stable across any scale. At the lr that used to collapse O-LoRA, forgetting +0.167 → +0.003 (≈ zero), accuracy up, robust on every seed; plus max_grad_norm gradient clipping (saṃyama).
  • Adaptive guṇa (Antahkarana(adaptive_guna=True)) — plasticity closes the loop on measured forgetting: strictly Pareto-better where there's headroom (−11% forgetting and +accuracy), a safe no-op when there isn't.
  • OneClassNovelty — complementary zero-day detector for threats sitting inside the known-data manifold (UNSW Backdoor AUROC 0.47 → 0.93).

antahkarana 1.1 performance

Full details + the honest negatives we kept (and didn't ship): CHANGELOG · API.md.

The 1.0 foundation — stable API, with the control ring + calibrated novelty built in

The public API is now frozen under SemVer — 13 symbols (Antahkarana, the adapters, FeatureOOD, NoveltyCalibrator, the eval metrics, and the Policy / RiskRouter / Tier / Intervention control ring). A breaking change to any of them — or to the frozen BackboneAdapter contract — bumps the major version, so your adapters and training code keep working while organ implementations stay free to improve. Full surface + guarantees: API.md. The two capabilities that landed on the road to 1.0 are part of that stable surface:

The control ring (Layer-2 policy)

A swappable risk-tier router over any trained backbone. One consolidated brain (the weights = Layer-1 disposition), many deployment policies (config = Layer-2) — change safety posture without retraining, and every decision is logged (transparency by construction).

two-layer architecture

A request flows through the consolidated organs (Layer 1); manas emits a risk score; the RiskRouter applies the deployment Policy (Layer 2) to pick a tier — ALLOW / NOTIFY / SOFT_BLOCK / HARD_BLOCK — and logs every decision.

control ring performance

Validated on UNSW-NB15: calibrated to ~5% false-block on normal traffic, the ring gates known attacks and catches ~95% of a held-out zero-day family it never trained on — built on the Layer-1 DER++ no-forgetting win.

from antahkarana import Policy, RiskRouter
ring = RiskRouter(Policy.load("policy.yaml"))     # hard/soft blocks, thresholds, operator overrides
iv   = ring.gate(score=novelty, category="intrusion")
# iv.tier ∈ {allow, notify, soft_block, hard_block};  iv.allowed / iv.notify / iv.reason drive the response

See examples/control_ring.py.

Calibrated novelty — NoveltyCalibrator (manas → ring)

Raw novelty scores live on arbitrary scales, so a fixed ring threshold over- or under-blocks. NoveltyCalibrator maps one or more signals (energy, FeatureOOD, …) to a calibrated [0,1] against a normal reference (empirical CDF) — so a ring threshold of 0.95 is a 5% false-alarm rate, and manas output is directly ring-ready.

from antahkarana import NoveltyCalibrator
cal = NoveltyCalibrator(mode="mean")                  # "mean" steadier · "max" more sensitive
cal.fit(energy=normal_energy, feature=normal_feat)    # calibrate against NORMAL data
p = cal.score(energy=new_energy, feature=new_feat)    # 0..1 ; 0.95 ≈ 5% false alarms

Honest note: no unsupervised fusion of energy+feature beat the best single signal on held-out UNSW-NB15 families — calibration's value is the FPR-tunable scale, not an AUROC boost.

Core (since 0.3.0) — DER++ replay + feature-space novelty

DER++ works for tabular (replay_strategy="der"): on a 6-family UNSW-NB15 stream it cut forgetting from +0.048 (naive) to +0.009 — the no-forgetting guarantee holds on modern data, not just text/vision.

FeatureOOD adds a penultimate-feature novelty detector (Mahalanobis / kNN) complementary to the default energy score — measured to rescue families where energy fails (Backdoor AUROC 0.37→0.79) while energy remains better where it already works. Pick per deployment or ensemble; energy stays the default.

from antahkarana import FeatureOOD
det   = FeatureOOD("mahalanobis").fit(known_features, known_labels)   # bb.features(inputs) -> embeddings
score = det.score(new_features)        # higher = more novel / likely zero-day

Text (any HuggingFace causal-LM + LoRA)

from antahkarana import Antahkarana, TextAdapter
bb     = TextAdapter("mistralai/Mistral-7B-v0.1")             # frozen base, small LoRA trains
stream = TextAdapter.make_stream(your_text_tasks)             # [(train_pairs, eval_pairs), …]
Antahkarana(bb).train(stream)

Any other modality

Copy antahkarana/adapters/template.py (CustomAdapter) and implement 5 methods over your encoder (audio, graph, multi-modal, robotics, …). The continual-learning mind is unchanged.

Runnable examples

python examples/train_tabular.py     # concept-drift stream: naive forgets, the core doesn't
python examples/train_security.py    # continual threat detection (attack families) + calibrated triage

What you get back

train() returns: the task×task accuracy matrix, final_row, final_avg, forgetting, risk_coverage (calibrated abstention), recovery (sleep), and the trajectory (per-task guṇa/novelty).

Knobs

Antahkarana(bb, samskara=, replay_strategy="naive"|"der", avidya_strategy="msp"|"energy", sleep=, base_lr=, epochs=) — turn each organ on/off and swap in the SOTA implementation (DER++ dark-knowledge replay, energy-OOD novelty).

Ship it closed-source

python build_wheel.py compiles the engine to binary .so (Nuitka) and drops the source, leaving only the public interface readable — others can pip install and train on their data without seeing your code. (For maximum IP protection, serve it behind an API instead.)

60-second tour

python examples/try_it.py        # no-forgetting · zero-day · abstention · control ring

(API stability + the frozen BackboneAdapter contract are covered under The 1.0 foundation above; full surface in API.md.)


Author — Deepak Soni · Apache-2.0

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

antahkarana-2.0.0.tar.gz (47.0 kB view details)

Uploaded Source

Built Distribution

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

antahkarana-2.0.0-py3-none-any.whl (51.5 kB view details)

Uploaded Python 3

File details

Details for the file antahkarana-2.0.0.tar.gz.

File metadata

  • Download URL: antahkarana-2.0.0.tar.gz
  • Upload date:
  • Size: 47.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.6

File hashes

Hashes for antahkarana-2.0.0.tar.gz
Algorithm Hash digest
SHA256 a92cbc5cd556e38d34c6e08234048327fa86407039c962d702457ceed49c8c31
MD5 562ff4a7f3be7be4edf8dc3c498e8ce5
BLAKE2b-256 9cdac1b39a80e027f0129706c0049cca1bc0d15b8c470674be4adda55d4da0d9

See more details on using hashes here.

File details

Details for the file antahkarana-2.0.0-py3-none-any.whl.

File metadata

  • Download URL: antahkarana-2.0.0-py3-none-any.whl
  • Upload date:
  • Size: 51.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.6

File hashes

Hashes for antahkarana-2.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f759a6d8eb7380abcfb4407948d9b30d59f4a6ac0769127b9db41a839455b1c0
MD5 07555b1e512f375e58ad841d18c7fc08
BLAKE2b-256 7653b3bfe25ebbd31142cf4dcd785240020e9900ed1c7ea28f7188bfe413b738

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