# ArtaModel — the study *Named by Arash, 2026-08-18. Third-edition gendered data (dad/mom from P21; both births to the day, both birthplaces; the wedding date; sidereal phases from Kerykeion at 09:00 local). 250 fits in `artamodel_study.py`; every number below is held out on couples born after 1900 unless marked "inner", every choice made on the inner temporal split, and every experiment on a FIXED population.* ## The model ``` y = | b + Σᵢ aᵢ ·e^{i(θmᵢ − θdᵢ)} synastry, mom − dad + mᵢ ·e^{i(θtᵢ − θmᵢ)} the wedding sky transiting mom + dᵢ ·e^{i(θtᵢ − θdᵢ)} the wedding sky transiting dad + mnᵢ·e^{i θmᵢ} mom's own natal phase + dnᵢ·e^{i θdᵢ} dad's own natal phase + tnᵢ·e^{i θtᵢ} the wedding sky's own phase + cᵢ ·e^{i θcᵢ} the composite (shorter-arc midpoint of the two natal longitudes) + tcᵢ·e^{i(θtᵢ − θcᵢ)} |² the wedding sky transiting the composite ``` Fourteen bodies (Sun … Pluto, true node = Rāhu, true south node = Ketu, Chiron, mean Lilith), Ascendant/MC optional. Every term exists only when both of its phases exist ("if wedding is not known, drop the last two terms"; "if dob of either is not known, drop the natal term of it") — a missing phase contributes exactly zero. Complex weights as (Re, Im), |·|², a logistic head for the loss, Adam with L2, early-stopped on the inner temporal split; F copies of the formula combined by the head, F = 1 being the formula literally. **Populations.** FULL — both natal charts complete and the wedding day known: 6,258 train / 2,635 held out. CHARTS — both charts, wedding may be year-only: 9,716 / 7,428. ANY — any row with one phasor: up to 76,081 / 7,428. **Plain reference on the same rows** (boosted trees on the two ages at the start, the gap and the start year): FULL 0.6371 · CHARTS 0.6083 · ANY 0.6171. Dad's age at the start alone: 0.6264 on FULL. ## 1 · Which terms (all 63 subsets of the six + the composite rungs, FULL, F = 1) | terms | phasors | inner | held out | |---|---|---|---| | **m + d** (the two wedding-transit terms) — *selected by inner* | 28 | 0.6426 | **0.6304** | | a + m + d (Arash's first formula) | 42 | 0.6416 | 0.6258 | | a + d | 28 | 0.6280 | 0.6318 | | d alone | 14 | 0.6235 | 0.6223 | | a alone (synastry) | 14 | 0.5965 | 0.5755 | | mn + dn (the natal phases) | 28 | 0.5507 | 0.5235 | | tn (the wedding sky alone) | 14 | 0.5201 | 0.4551 | | c (the composite alone) | 14 | 0.5069 | 0.4563 | | c + tc | 28 | 0.6149 | 0.5828 | | a + m + d + mn + dn | 70 | 0.6113 | 0.6098 | | a + m + d + mn + dn + tn | 84 | 0.6021 | 0.5931 | | a + m + d + c + tc | 70 | 0.6162 | 0.6104 | | all eight | 112 | 0.5634 | 0.5740 | Across the 70 configurations the inner split picks m+d; the best held-out anywhere is 0.6318, so the optimism of selecting on the test set would have been only +0.0014 here. Every **absolute-phase** term (mn, dn, tn, c) makes the model worse out of time; every **difference** term (a, m, d, tc) helps or is neutral. ## 2 · Which bodies (3-term a+m+d, FULL) **One body at a time:** Uranus alone **0.6419** · the three outer 0.6302 · Neptune 0.6260 · Pluto 0.6203 · Chiron 0.6118 · Saturn 0.5913 · the nodes 0.5670 · Jupiter 0.5136 · Moon 0.5026 · Lilith 0.5003 · Mars 0.4938 · Venus 0.4796 · Mercury 0.4784 · **Sun 0.4728**. Sets: modern10 0.6202 · slow5 0.6204 · classical7 0.5889 · fast5 0.4827. **Dropping one body from all fourteen** changes held-out by −0.0012 (Chiron) to **+0.0062** (either node) — dropping any *fast* body improves the model, dropping any *slow* body barely moves it (they are redundant with each other). ## 3 · Invariances that prove what it reads | convention (recomputed through Kerykeion) | 3-term held out | 6-term held out | |---|---|---| | Lahiri 09:00 local (baseline) | 0.6258 | 0.5931 | | Raman · Fagan-Bradley · Krishnamurti | 0.6258 · 0.6258 · 0.6258 | 0.5931 · 0.5931 · 0.5931 | | **tropical** | 0.6258 | 0.5941 | | birth hour 06:00 · 12:00 · 18:00 local | 0.6258 · 0.6259 · 0.6259 | 0.5931 | | 12:00 UT, **place ignored** | 0.6259 | 0.5933 | | wedding at 00:00 UT | 0.6260 | 0.5934 | The three-term model is **exactly invariant** to the ayanāṁśa and to the zodiac (a constant offset cancels in a difference of two phases), and invariant to four decimals to the birth hour and the birthplace (a common shift of both charts moves a slow body by nothing). It therefore cannot be reading anything sidereal, local, or angular. ## 4 · What it reads **The two ages at the wedding, and the age gap, through the slow bodies as clocks.** Uranus moves 4.3°/yr and completes a cycle in 84 years, so `θt − θm` for Uranus is mom's age at the wedding, unwrapped for anyone under 84; Neptune (2.2°/yr) and Pluto (1.5°/yr) the same at lower resolution; `θm − θd` for the same bodies is the age gap. The fitted anatomy says so directly — the largest weights of the 3-term model are `d_pluto 1.27, m_pluto 1.16, a_pluto 1.11, d_uranus 0.99, a_neptune 0.90, d_neptune 0.90` — and the controls confirm it: | 3-term, FULL | AUC | |---|---| | held out | 0.6269 | | **held out within 3-year cells of (dad's age, mom's age)** | **0.4955** | | within 2-year age-gap bands | 0.5635 | | plain reference (two ages + gap + start year, boosted) | 0.6371 | | reference + ArtaModel score (combiner fitted on train, out-of-fold) | 0.6361 | Hold the two ages flat and the model is at chance. Add its score to the plain reference and nothing is gained. The 6-, 3+composite- and 8-term variants read 0.4765, 0.5080 and 0.5058 age-cell-matched; the reference gains at most +0.0024 from any of them (noise). ## 5 · The rest - **Populations** (same formula): a+m+d FULL 0.6258 → CHARTS 0.6047 → ANY 0.6086; the six-term formula FULL 0.5931 → CHARTS 0.5719 → **ANY 0.4877** — on ANY, ~50,000 rows carrying only a wedding sky (an era clock) join the fit and drag the shared weights toward era, which reverses across the 1900 split. - **Angles** (ASC/MC in the synastry/natal terms): 0.6194 vs 0.6258 without — worse. - **Harmonics** (phases × h): h=2 0.6284, h=3 0.6203, h=4 0.6069 for a+m+d — a clock survives doubling. - **Fields × L2** (3-term): held-out 0.616–0.6365 across 28 settings; the inner split picks F=64, L2=0.01 → 0.6163 (optimism of picking on the test set would be +0.020). Ten seeds at F=1: 0.6252 ± 0.0030. - **Temporal folds inside the training half** rank the ladder the way the held-out set does here (a+m+d 0.63 on the folds vs 0.626 held out; six-term 0.58–0.63 vs 0.593) — unlike the tropical stacks of the first edition. - **Composite (Davison-style)**: alone at chance (0.4563); with its transit, 0.5828; added to a+m+d, worse (0.6104). ## 6 · Verdict ArtaModel is a well-behaved, fully specified, honestly fitted model — and every point of held-out AUC it earns is the two partners' ages at the wedding and the gap between their births, measured by the outer planets as clocks. That is why it is invariant to the zodiac, the hour and the place; why Uranus alone equals the whole thing; why the fast bodies are pure noise; and why it vanishes when the ages are held flat. Its ceiling on this data is the plain reference (0.6371 on FULL), which it does not reach (0.6304 at best, m+d) and does not add to. What would move it: information that is not a function of the three dates — birth **times** (the angles would then be real), or a wedding **place** (a real electional lagna). Both are absent from Wikidata for these couples. ## 7 · Ensembles, boosting, and split single-sum models (`artamodel_ensemble.py`) Arash, 2026-08-18: "use ensembles and boosting techniques and split multiple single sum model". FULL population; the plain reference on the same rows is 0.6353. | construction | 3-term | 6-term | |---|---|---| | single ArtaModel F=1 | 0.6251 | 0.5820 | | BAG, 25 bootstraps rank-averaged | 0.6339 | 0.6031 | | BOOST, single-sum fields on residuals | 0.6318 | 0.5933–0.5969 | | SPLIT per body (14 single sums), linear head | 0.6339 | 0.6251 | | SPLIT per term / per phasor, linear head | 0.6291 / 0.6297 | 0.6195 / 0.6070 | | SPLIT → LightGBM on the intensities | 0.6220–0.6293 | 0.6097–0.6269 | | **BOOST over SPLIT, per phasor** | **0.6373** | **0.6388** | Splitting rescues the six-term formula (each absolute-phase term in its own sum can be weighted down); boosting over the split sums reaches the reference but does not cross it; the age-cell-matched control stays at 0.50–0.52 for every construction — better instruments for the same two quantities. Inner-selected picks: 3-term BOOST 0.6318, 6-term BOOST-over-SPLIT-per-body 0.6293 (the top held-out numbers carry about +0.007 of optimism). ## 8 · Midpoints, per-body models, sums, aspect grids — every model on every row it has (`artamodel_split_models.py`, `artamodel_full_stack.py`, `artamodel_blend.py`) Arash, 2026-08-19: three midpoint terms (the natal composite **c** = mid(θm, θd), **mw** = mid(θm, θt), **dw** = mid(θd, θt) → `TERMS9`); every model trained on the rows it has (the dad-natal model on almost everything, a day-missing row on the outer planets only — the precision-aware phases do this by themselves); per-body models |b + aᵢ e^{i(θmᵢ−θdᵢ)}|² **in addition to** the sum models; and the aspects. Marriages-only edition III: 89,465 train rows, 7,249 test rows, most dates year-only. Every member is a coherent field with a logistic head, early-stopped on the inner temporal split of its **own** population; train scores are out-of-fold over two temporal halves; test scores from a fit on all its rows; the stacker is LightGBM over the member scores (NaN where a member has nothing for the couple). **Members (144).** 126 per-phasor models (9 terms × 14 bodies, each on its own rows); 9 per-term sums over the 14 bodies — inside the square the cross terms cos(φᵢ−φⱼ) ARE the aspects between that term's phasors; the 3-/6-/9-term whole-formula sums; three explicit inter-body aspect grids (synastry θmᵢ−θdⱼ, wedding→mom θtᵢ−θmⱼ, wedding→dad θtᵢ−θdⱼ, all i≠j, 182 phasors each); and three boosted split sums — the deployed construction on the 9,553 full-chart rows, and the 6- and 9-term constructions on all 75,852 rows with any phasor. | member (held out, on the rows it scores) | rows | AUC | |---|---|---| | phasor **d_neptune** (wedding→dad) | 16,622 | **0.6312** | | phasor d_pluto / d_uranus / a_uranus | 16,622 / 16,622 / 11,255 | 0.6231 / 0.6177 / 0.6031 | | SUM term d over 14 bodies | 16,622 | 0.6267 | | SUM 3-term (a+m+d) over all bodies | 22,426 | 0.6097 | | SUM term a / m | 11,255 / 8,787 | 0.5825 / 0.5924 | | SUM term c / mw / dw (the three midpoints) | 11,255 / 8,787 / 16,622 | 0.4763 / 0.4545 / 0.3938 | | SUM term mn / dn / tn (absolute phases) | 13,669 / 24,332 / 67,396 | 0.4851 / 0.5154 / 0.4713 | | SUM 6-term / 9-term over all bodies | 75,852 | 0.4821 / 0.5345 | | ASPECTS synastry / wedding→mom / wedding→dad grids | 11,255 / 8,787 / 16,622 | 0.5205 / 0.5044 / 0.5200 | | BOOST6 on full-chart rows (deployed construction) | 9,553 | 0.6235 | | BOOST6 / BOOST9 on every any-phasor row | 75,852 | 0.5665 / 0.5656 | | stack / blend (all 7,249 test rows) | held | age-cell-matched | board | |---|---|---|---| | REFERENCE plain columns alone | 0.5971 | 0.5078 | 0.61055 | | STACK 126 per-phasor only | 0.5880 | 0.5119 | | | STACK 12 sum models only / 3 aspect grids only | 0.5521 / 0.5195 | 0.4759 / 0.5257 | | | STACK all 144 members, no plain | 0.5812 | 0.5010 | | | STACK all 144 + plain (regularised / loose / tight) | 0.6059 / 0.6018 / 0.6100 | 0.5112 / 0.4977 / 0.5205 | **0.61149** (selector-picked: loose) | | RANK-BLEND top-3 members by train OOF (d_uranus, 3-term sum, a_uranus) | 0.6183 | 0.5558 | | | deployed 6-term boosted (train-only fit) | 0.6235 | 0.5701 | 0.63 | | 0.7·deployed + 0.3·stack | 0.6263 | 0.5592 | | **What it says.** (1) The new midpoint terms are below chance as sums (0.39–0.48) and add nothing in the stack: a midpoint of two slow clocks is a third clock with the information of neither. (2) The per-body models confirm the anatomy to the body: the strongest single model on the whole dataset is **Neptune at the wedding relative to Neptune at the groom's birth** — Neptune moves 2.2°/yr, so that phase IS the groom's age at the wedding, and Pluto/Uranus are the next-best clocks. (3) The explicit aspect grids (182 inter-body separations each) are 0.50–0.52: the classical synastry and transit aspects carry nothing once each body's own clock is a separate term. (4) Fitting on every available row HURTS the boosted sum (0.5665 on 75,852 rows vs 0.6235 on 9,553 full charts): the year-only rows hand the field only the outer planets, and the stage picker then spends its stages on the clocks that least separate within a year. (5) **The train-OOF of every clock-reading member is below chance across temporal halves (BOOST6 0.47–0.53, held 0.62)** — a clock fitted on one era is anti-predictive on the next, and it scores on the leaderboard only because test shares train's eras. (6) Nothing here beats the deployed 6-term boosted split (0.631 on the board): the 144-member stack lands at 0.61149 beside the plain columns (0.61055), and every age-cell-matched read stays at 0.50–0.57. The deployed model and its explanation stand. **Correction (2026-08-19, `artamodel_stack_forward.py`).** The OOF above was built over two temporal halves, which includes the BACKWARDS direction (fit late, score early); clock members are anti-predictive that way (d_neptune 0.66 forward, 0.51 mixed), so the stacker was taught its best members were noise. Rebuilt with forward-chaining OOF (fit on all rows before a cut, score the next block; cuts 1823/1847/1867/1883), member OOF now tracks held-out (d_neptune 0.658→0.631, SUM 3-term 0.663→0.610). Fitted stackers still land at 0.60–0.62 held because the last train block (1883–1900) ranks models differently from the test era (SUM 3-term 0.681 there / 0.610 held; the deployed member 0.509 / 0.624) — internal temporal CV does not rank for the test era. The selection-free read, equal-weight rank averages of fixed pools: deployed+plain 0.6323; + the six strongest forward members 0.6283; existing ensemble + those members 0.6260–0.6294; existing ensemble alone 0.6299. The decisive fact: on the 2,627 test rows where d_neptune exists the existing ensemble already scores **0.6425** (deployed 0.6410) against d_neptune's 0.6312 on the same rows — the per-body members are a weaker reading of the same two ages, not added information, so an equal-weight blend with them adds noise. No leaderboard gain exists here. **The monotone ensemble (2026-08-19, `artamodel_nonneg_stack.py`, `artamodel_nonneg_final.py`).** Arash: "a bigger ensemble must always be better than its subset of members." With NON-NEGATIVE weights over rank-transformed member scores and a convex loss, every subset is a feasible point of the full problem, so on the data the weights are fitted on the full pool cannot lose to a subset — monotone by construction (asserted in the subset table). Three defects had to go first: (1) the backwards OOF direction (above); (2) the train OOF was 76% wedding-sky-only rows and the test has NONE (test = post-1900 couples, all with both charts), so one weight vector was tuned to a group absent from the test — weights are now fitted per availability group (dad+wedding clocks / synastry only / sky only); (3) the greedy boosted member changes its phasor set between folds (≤1823 picks only d_neptune), so a fixed-cycle twin of the deployed six phasors was added (BOOST6-FIXED, held 0.6217). Result on the board: the ALL-147 grouped stack **0.62263** (was 0.61149 broken), plain 0.61055, the small equal-weight ensemble 0.63068. Held-out on all 7,249: full 0.6202 vs its best subset 0.6262 — half a standard error; the public board is 2,180 rows (SE ±0.012). What remains is the era itself: inside the dad+wedding group the 1867–1900 train block has plain 0.670 vs the clocks 0.618, the test era has the clocks 0.641 vs plain 0.632 — a reversal no train-fitted weight can anticipate, the same fact the ensemble competition recorded. Equal weights over a small strong pool land well on this test by luck, not by a rule a stacker could learn.