I maintain Reformulation Assurance, an open-source workbench for ingredient replacement projects in formulated products (coatings, cosmetics, food). It imports a lab’s trial history, fits GP and random-forest models per specification, ranks fresh candidates from a bounded mixture generator by the joint probability of meeting every spec, and then runs the qualification side: replicate checks, approvals tied to a hash of the evidence, and a dossier export.
The benchmark
The part this forum might have views on is the ranking. I benchmarked the app’s ranker against BayBE 0.15 on the 88-lot cosmetics history that ships with the app, with a random-forest oracle standing in for the lab.
- BayBE with a desirability objective: top-2% candidate in round one, all five seeds
- the app’s ranker: one or two rounds
- a scalarized single target: about twenty
- random: about thirty
- with an MLP oracle instead: the app’s ranker median 4 rounds, BayBE 6
Script and results are in the repo (backtest_ranker_vs_baybe.py, backtest_results.csv), with the limitations in the docstring, including that the oracle is itself a model.
Where I would value a push
The candidate generation is model-ranked random search over the simplex, not Bayesian optimization, and the app says so. Is there a standard way people here handle the sparse-history case, 15 to 40 lots, where pure exploitation should stop working? And if anyone has a formulation history they could share, even anonymised, I would like to see where the ranker breaks.
Demo (shared sandbox, nothing real please): https://reformulation-assurance-demo.streamlit.app/
Code: GitHub - TM289012/reformulation-assurance · GitHub