Skip to content

Commit 57dc2a1

Browse files
docs: sweep every head and profile-dimension number to the live roster
Prompted by a fair question β€” "don't we have more heads now?" β€” which turned out to be pointing at a genuinely ambiguous line. Two different numbers had been drifting: 195 trained heads 6 taste + 172 aroma + 5 mouthfeel + 12 safety 183 profile dimensions 6 taste + 172 aroma + 5 mouthfeel (tox EXCLUDED, deliberately) Tox is kept out of the flavour-profile vector on purpose: safety is not a flavour-match dimension, and if it were in there two molecules could rank as "similar tasting" partly because they share a liver-toxicity signature. That is wrong in a formulation tool and dangerous in a food one. The stale numbers were spread across the schema, six docs and three source files β€” 175/177/178-dim profiles and 166/167-head rosters, each correct at some point in the last two days. The pgvector column was the worst of them: vector(177) would have rejected every insert of a 183-dim profile at runtime, and nothing would have caught it until the first real docker compose up. Also corrects a comment in predict.py that was not merely stale but actively wrong. It claimed the model load "is fanned out across cores (joblib.load releases the GIL)". Both halves are false β€” unpickling is GIL-bound, which is why threads measured ~2.5x SLOWER, and the process pool that IS faster deadlocks because loading runs during module import. Anyone optimising from that comment would have re-walked the exact path #225 documents as a dead end. Signed-off-by: Austin L. <86896075+rvnminers-A-and-N@users.noreply.github.com>
1 parent 111b822 commit 57dc2a1

16 files changed

Lines changed: 43 additions & 40 deletions

β€ŽCHANGELOG.mdβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ exists to install it somewhere other than the machine it was built on.
3131
- Numbers glossary in `HOW-IT-WORKS.md` and in the app's own How-it-works panel.
3232

3333
### Changed
34-
- Aroma roster **164 β†’ 166 heads**; confident-capable heads **94 β†’ 108**.
34+
- Aroma roster **164 β†’ 172 heads**; confident-capable heads **94 β†’ 108**.
3535
- Chip families (flavor / note / taste / mouthfeel) share one visual language instead of four
3636
accidental ones, and each studio section explains what its dimension *is*.
3737
- Every molecule has a display name: names fall back to molecular formula, with multi-component

β€Ždocs/ACCURACY.mdβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ because of it, and the reasoning is recorded in `train_aroma._calibrate` so nobo
128128
half the time when they fire.
129129

130130
They are **not deleted, disabled, or hidden.** They keep their score, their column in the
131-
178-dimension flavor profile, their chips in search, their colour on the map, and every molecule
131+
183-dimension flavor profile, their chips in search, their colour on the map, and every molecule
132132
they find. What changes is one word: they are reported as **indicative** rather than *confident*,
133133
and the UI hatches their bar so you can see it at a glance.
134134

β€Ždocs/AROMA-AUDIT.mdβ€Ž

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
> **Update β€” supplement applied, then made food-only.** `build_aroma_supplement.py` adds a curated
44
> **public-domain** character-impact set (`aroma_supplement.csv`, resolved via PubChem) for the sparse
5-
> descriptors below. Result: **42 β†’ 167 heads** (food-safe core + non-food aroma-only tier; see the
5+
> descriptors below. Result: **42 β†’ 172 heads** (food-safe core + non-food aroma-only tier; see the
66
> multi-industry note below), after open-government sourcing (see below) took the
77
> curated supplement to **~1,994 labelled molecules**. New heads include `coconut`, `nutty`, `caramel`,
88
> `winey`, `onion`, `honey`, `herbal`, `vanilla`, `buttery`, `balsamic`, `smoky`, `cinnamon`, `spicy`,
@@ -28,10 +28,10 @@
2828
> 2-phenylethanol) instead of the E/Z terpene twins (nerol/geraniol) that dedupe to one row under the
2929
> connectivity-skeleton key. That was the **food-safe** ceiling at ~86.
3030
>
31-
> **Then we walked the road past it β€” the non-food aroma-only descriptor space β€” to 167 heads.** The
31+
> **Then we walked the road past it β€” the non-food aroma-only descriptor space β€” to 172 heads.** The
3232
> corpus is now deliberately **multi-industry**, not food-only: odor is physical, so to read
3333
> structure→smell well the corpus should include the fragrance space, and a per-molecule **safety flag**
34-
> (open-gov food registers) β€” not corpus membership β€” gates edibility per mode. The same 167 heads serve
34+
> (open-gov food registers) β€” not corpus membership β€” gates edibility per mode. The same 172 heads serve
3535
> every "Mancer" mode: **Flavormancer** (food chemistry), **Beveragemancer** (beverage), **Aromamancer**
3636
> (fragrance), **Vapemancer** (inhalation), **Oilmancer** (essential oils). Molecule names are resolved
3737
> to structures through PubChem and folded in flagged non-food. New heads cleared across several

β€Ždocs/AROMA.mdβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ enumerable via the annotations API. Pipeline:
1818
physicochemical descriptor block** (`chemfeatures.py`: MW, logP, TPSA, H-bond donors/
1919
acceptors, rotatable bonds, ring counts, fraction sp3, heteroatoms β€” the global properties
2020
bare bits miss). After broadening the vocabulary, folding the curated `flavors.csv` molecules
21-
in (825 β†’ **2403** molecules, incl. a curated public-domain supplement), and adding those features, **167 heads clear CV-AUROC β‰₯ 0.70**
21+
in (825 β†’ **2403** molecules, incl. a curated public-domain supplement), and adding those features, **172 heads clear CV-AUROC β‰₯ 0.70**
2222
(each score is that descriptor's own held-out AUROC): medicinal 0.97, ammoniacal 0.96,
2323
petroleum 0.96, citrus 0.94, camphor 0.93, almond 0.92, fatty 0.89, minty 0.88, ethereal 0.87,
2424
fruity 0.87, fishy 0.86, sulfurous 0.85, garlic 0.84, floral 0.83, pungent 0.81, earthy 0.73.

β€Ždocs/CAPABILITIES.mdβ€Ž

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ shape of the tool. The organizing discipline throughout: **every output is tagge
66
by how it's derived, and nothing claims more certainty than its source supports.**
77

88
> **Edition note.** This catalogues the **commercial** edition (Apache-2.0,
9-
> commercial-clean data). **Aroma ships here** as 167 presence/absence odor-descriptor
9+
> commercial-clean data). **Aroma ships here** as 172 presence/absence odor-descriptor
1010
> heads trained on public-domain HSDB text (plus 5 mouthfeel/chemesthesis heads and 12
1111
> Tox21 safety heads) β€” what's still gated is scored **intensity** (*how strong* a note
1212
> is), which needs research/customer panel data and lives in the **academic edition**
@@ -33,7 +33,7 @@ by how it's derived, and nothing claims more certainty than its source supports.
3333
- Multitaste β€” fires when 2+ taste heads are high (**trained**-derived).
3434
- Known-taste ground truth β€” verified labels override predictions (**lookup**).
3535

36-
**Aroma** β€” **167 odor-descriptor heads ship** (**trained**)
36+
**Aroma** β€” **172 odor-descriptor heads ship** (**trained**)
3737
- Presence/absence per descriptor (citrus, floral, minty, almond, fatty, petroleum, earthy,
3838
medicinal, sulfurous, camphor, fruity, fishy, garlic, ethereal, ammoniacal, pungent) β€”
3939
RandomForests on fingerprint + physicochemical features, over public-domain HSDB odor text +

β€Ždocs/DATA-PIPELINE.mdβ€Ž

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ local compute.
4545
**Verify it worked** (this is the honest end-to-end check, not just "the server started"):
4646

4747
```bash
48-
curl -s localhost:8000/api/status # {"ready":true,"total":190,...} (190 artifacts = 189 heads + the intensity regressor)
49-
curl -s localhost:8000/api/heads | jq '.aroma | length' # 166
48+
curl -s localhost:8000/api/status # {"ready":true,"total":190,...} (190 artifacts = 195 heads + the intensity regressor)
49+
curl -s localhost:8000/api/heads | jq '.aroma | length' # 172
5050
# vanillin β€” the vanilla head should fire at 1.0, confident, with its calibrated threshold
5151
curl -s -X POST localhost:8000/api/predict \
5252
-H 'Content-Type: application/json' \

β€Ždocs/HOW-IT-WORKS.mdβ€Ž

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ features (trained on SweetenersDB).
9898

9999
---
100100

101-
## 3. Aroma β€” 167 descriptor heads from public odor text
101+
## 3. Aroma β€” 172 descriptor heads from public odor text
102102

103103
Odor is the hard, licensed part of this field β€” most rich odor datasets are NonCommercial. Our
104104
clean route:
@@ -111,7 +111,7 @@ clean route:
111111
`minty`), producing a presence/absence label per descriptor. We also fold in the curated
112112
character-impact facts from `flavors.csv`.
113113
3. **`train_aroma.py`** trains one RandomForest per descriptor (on fingerprint + descriptors) and
114-
**keeps only the heads that clear CV-AUROC β‰₯ 0.70** β€” an honest bar. **167 heads** survive
114+
**keeps only the heads that clear CV-AUROC β‰₯ 0.70** β€” an honest bar. **172 heads** survive
115115
(citrus, floral, minty, almond, fatty, petroleum, earthy, medicinal, sulfurous, camphor,
116116
fruity, fishy, garlic, ethereal, ammoniacal, pungent, pine, rose, rancid, alcoholic,
117117
woody, green, grassy, putrid), 0.71–0.98. The lower-population heads (β‰ˆ10–20 documented

β€Ždocs/METHODS.mdβ€Ž

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,8 @@ the thin heads β€” a genuine pine match could land at 0.42 and never be shown.
136136
recall climbs faster than precision falls. **A high AUROC does not protect you** β€” AUROC is
137137
computed on ranking and is insensitive to class imbalance; precision is not. `coffee` has
138138
AUROC 0.960 and out-of-fold precision **0.46**; both are true of the same head.
139-
- **Heads that cannot clear the floor are `indicative`, not deleted.** 73 of 167 aroma heads never
140-
reach 50% precision at any threshold. They keep their score, their place in the 178-dim profile,
139+
- **Heads that cannot clear the floor are `indicative`, not deleted.** 65 of 172 aroma heads never
140+
reach 50% precision at any threshold. They keep their score, their place in the 183-dim profile,
141141
their chips and their map colour β€” firing well above base rate is real evidence. They are simply
142142
never presented as a *confident* call: the UI marks them, and the read returns `indicative: true`
143143
plus the head's measured precision. Hiding them would delete reach to paper over a labelling

β€Ždocs/MOUTHFEEL.mdβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ without *feeling* cool, and WS-23 cools the mouth with almost no odour at all.
1010

1111
**Five trained heads**, one RandomForest per sensation on the Morgan fingerprint + physicochemical
1212
block (the same stack as taste/aroma), in their own `mouthfeel_models/` directory, loaded and tagged
13-
`mouthfeel` by `predict.py` and folded into the 175-dim flavor-profile vector used for substitutes.
13+
`mouthfeel` by `predict.py` and folded into the 183-dim flavor-profile vector used for substitutes.
1414

1515
| head | what it is | held-out CV-AUROC |
1616
|---|---|---|

β€Ždocs/TOX.mdβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ assay** heads that act as a *defensive screen*.
1616
|---|---|---|
1717
| label source | **documented + curated** sensory facts (a molecule is *known to be perceived* as X) | **experimental wet-lab screening** (a molecule *measurably was* active in an assay) |
1818
| what a positive means | people report this percept | this well lit up in a dish |
19-
| in the substitute-match vector? | **yes** (175 dims) | **no** β€” deliberately |
19+
| in the substitute-match vector? | **yes** (183 dims) | **no** β€” deliberately |
2020
| framing | prediction | **caution-only review flag** |
2121

2222
Tox is excluded from the flavor-profile vector on purpose: you do not want reformulation

0 commit comments

Comments
Β (0)