aadya-m1-mini
aadya-m1-mini is a 0.84M-parameter, 3.4 MB version of aadya-m1 that forecasts when the next period is likely to start as a full probability distribution. Same inputs, same outputs, same code; about 300 times fewer parameters. It is the version built for phones, browsers and other low-power devices, and runs comfortably on a laptop CPU too. Try it live Your cycle data never has to leave the device.
Aadya (आद्या) is Sanskrit for “the first” or “the beginning”, a fitting name for a model that forecasts the start of a cycle, whose day one is the first day of bleeding.
Which model should I use?
| aadya-m1 | aadya-m1-mini | |
|---|---|---|
| Parameters | 256M | 0.84M |
| Weights | about 1 GB | 3.4 MB |
| Best for | servers, desktops, research, fine-tuning, the larger starting point | phones, browsers, low-power devices |
| Accuracy on 364 public real users (mean CRPS, lower is better) | 1.930 | 1.932 (level) |
| Live demo | aadya-m1-try | aadya-m1-mini-try |
Same API, same inputs, same outputs. On the public real data we have, the two are level, so choosing the small one costs nothing in accuracy there; choose aadya-m1 when you want the extra capacity to fine-tune or to study larger-scale behaviour.
Highlights
- Tiny. 0.84M parameters and a 3.4 MB weights file, against 256M parameters and about 1 GB for aadya-m1.
- As accurate on the public real data we have. On 364 public real users it scores 1.932 mean error (CRPS, lower is better) against 1.930 for aadya-m1, 1.952 for a classical Bayesian reference and 2.354 for the rolling-median heuristic most trackers use: level with aadya-m1 (paired difference +0.003 [−0.005, +0.011]), slightly ahead of the reference (−0.019 [−0.038, −0.003]), and about 18% below the heuristic.
- Also on simulated users. 2.906 against 2.925 for aadya-m1 on the 539 AadyaBench validation users (paired difference −0.018 [−0.033, −0.004]).
- Honest uncertainty. It outputs a probability for every cycle length from 1 to 120 days, never one brittle date.
- Private by design. No accounts, no network calls, learns from confirmed periods on the device only.
Why this model exists
Critics asked whether a 256M-parameter network is needed. We tested it: the same recipe was trained at four sizes (0.84M, 10.8M, 57M and 256M parameters). All of them reach about the same error on simulated and real users, so for this task the number of parameters is not the bottleneck. aadya-m1-mini is the smallest of them. It passed the same release rule as aadya-m1 (clearly better than the Bayesian reference on simulated users, 80% window coverage inside 0.80 ± 0.05, no real-data loss against aadya-m1).

Model details
| Type | Probabilistic model for next-cycle length |
| Parameters | 836,093 (0.84M) |
| Architecture | Same transformer family as aadya-m1: 4 layers, 4 heads, hidden size 128 |
| Input | Past cycle lengths (days), days since the last period, optional age group, optional ovulation-test day |
| Output | A probability for each cycle length from 1 to 120 days |
| Training data | Synthetic users only (6 scenarios, 1,500 users each, 20 cycles per user); no real person's records |
| Training | One run, same loss and recipe as aadya-m1 (cross-entropy + 0.5 × CRPS + an auxiliary head), 2 epochs |
| License | Apache-2.0 |
Benchmarks
Mean CRPS in days (lower is better). Evaluation uses fixed seeds and public data only. The real-data column pools the 251 Creighton users (5-fold cross-fitted, so no user is both fitted and scored) and the 113 Marquette users (scored out of distribution).
| Method | Simulated users (539) | Real users, pooled (364) |
|---|---|---|
| aadya-m1-mini | 2.906 | 1.932 |
| aadya-m1 (256M) | 2.925 | 1.930 |
| LSTM (same training data) | 2.965 | 1.983 |
| Classical Bayes reference | 3.026 | 1.952 |
| Rolling median (usual tracker method) | 3.702 | 2.354 |
| 28-day constant | 3.712 | 2.539 |
Larger simulated board (5,400 users, same protocol): aadya-m1-mini 2.876, aadya-m1 2.889, LSTM 2.926, Bayes reference 2.988. The mini is slightly ahead of aadya-m1 here (paired difference -0.013 [-0.018, -0.008]; one training run, so we do not read this as a real advantage). As for aadya-m1, the lead over the Bayes reference comes from irregular cycles; on regular, drifting and follicular-plus-luteal users it is level or slightly behind.


On the 364 real users aadya-m1-mini is slightly ahead of the reference (−0.019 [−0.038, −0.003]), which is a small but clear difference, and clearly ahead of the heuristics; it is level with aadya-m1 (paired difference +0.003 [−0.005, +0.011]). Numbers behind the table: benchmarks/scores.json.
Inference
pip install -r requirements.txt # numpy, scipy, torch, safetensors, huggingface_hub
from huggingface_hub import snapshot_download
import sys
path = snapshot_download("manasdutta04/aadya-m1-mini")
sys.path.insert(0, path)
from aadya_m1 import AadyaM1
model = AadyaM1.from_pretrained(path)
# Past cycle lengths in days (oldest first), days since the last period started
pmf = model.forecast([28, 30, 27, 29], days_since_last_period=0, age_group="25-34")
print(model.window(pmf)) # 80% window, for example (26, 33)
# Learn from the real outcome, on this device only
model.observe_outcome(29)
pmf[k - 1] is the probability that the next cycle is k days long. Show the whole distribution or a window, never a single date presented as certain. The optional ovulation-test input (ovulation_test_day) works as in aadya-m1 and is experimental.
Intended use
- Apps and tools that show when a period is likely to start, with honest uncertainty, where a 1 GB model does not fit (phones, browsers, small devices)
- Research and education on probabilistic forecasting of cycle timing
Out of scope: diagnosis, contraception or conception planning, "safe days", treatment decisions, and anything that sends a person's data to a server. This is not a medical device.
Limitations
- Results come from simulated users plus two small public cohorts (364 real users in total), so this is early evidence. The lead over a classical Bayesian reference on real data is small, about 1% of the error.
- It was trained once at this size. Differences of 0.01 to 0.02 CRPS between model sizes are within training variance.
- The unseen-simulator test in the project was run on aadya-m1, not on this model. Like aadya-m1, its small edge over the strongest classical methods may be partly specific to the simulator it was trained on; its advantage over simple heuristics is the robust part.
- Less accurate for very irregular cycles, postpartum or perimenopause phases, hormonal contraception, and very short histories. Forgotten period logs hurt every method.
- The ovulation-test input has been tested on one small study only, and with aadya-m1 rather than this model.
Relationship to aadya-m1
aadya-m1-mini shares the code, API, license and evaluation protocol of aadya-m1. The preprint (DOI 10.5281/zenodo.23236800) describes aadya-m1 and includes the scaling study that produced this model (Section 6.16); the decisions behind it are recorded in the project's decision log (D-049 to D-051).
License
Apache-2.0. See LICENSE.
Contributing
Ideas, bug reports and forecasting methods are welcome at github.com/manasdutta04/aadya.
Citation
If you use this model, please cite the aadya-m1 preprint and mention the model name:
@misc{dutta2026aadyam1,
title = {aadya-m1: An Open, On-Device Probabilistic Model for Calibrated Next-Period Forecasting},
author = {Dutta, Manas},
year = {2026},
doi = {10.5281/zenodo.23236800},
url = {https://doi.org/10.5281/zenodo.23236800},
note = {Preprint; model: aadya-m1-mini}
}