|
1 | 1 | # Changelog |
2 | 2 |
|
3 | 3 | The release log for Ax. |
| 4 | + |
| 5 | +## [1.3.0] -- Jun 4, 2026 |
| 6 | + |
| 7 | +### Compatibility |
| 8 | + |
| 9 | +* Require BoTorch==0.18.0 (#5216) |
| 10 | + * Requires PyTorch>=2.4.0 |
| 11 | + * Utilizes NumPyro for faster fully-Bayesian model fitting, requiring JAX as a dependency |
| 12 | + |
| 13 | +### API Changes (`ax/api`) |
| 14 | + |
| 15 | +* `Client.attach_data` (and therefore `Client.complete_trial`) now auto-registers metrics in `raw_data` that are not part of |
| 16 | + the optimization config as tracking metrics, matching the documented contract. Previously this raised `UserInputError` (#5135) |
| 17 | +* `Client.configure_optimization` / objective and outcome-constraint strings now support linear equality constraints (`w^T x == b`) (#5174) |
| 18 | + |
| 19 | +**Docs** |
| 20 | +* New example starting an Ax experiment from dataframe data (#5098) |
| 21 | + |
| 22 | +### Core (`ax/core`) |
| 23 | + |
| 24 | +* `Objective` and `OutcomeConstraint` are now expression-based and no longer hold `Metric` instances; |
| 25 | + metrics live only on the `Experiment`. Construct them with an expression string, e.g. |
| 26 | + `Objective(expression="ne1 + 2*ne2")` or `OutcomeConstraint(expression="qps >= 7000")` |
| 27 | + (single, scalarized, and multi-objective are all expressed this way). Old-style constructors still |
| 28 | + work but discard the `Metric` after init. `Objective.metric` is removed -- get a metric's name from |
| 29 | + the expression and look it up via `Experiment.get_metric(name)`. This is a step toward deprecating |
| 30 | + `ScalarizedObjective`, `MultiObjective`, `ScalarizedOutcomeConstraint`, and `ObjectiveThreshold` (#5000, #5122, #5045, #5041) |
| 31 | + Note: We are aware of some edge-case bugs in this setup and we may be iterating on this in future releases. |
| 32 | +* `ParameterConstraint` gains a new `equality=` kwarg for linear equality constraints (`w^T x == b`); equality constraints are honored in `SearchSpace` membership checks (#5173, #5175) |
| 33 | +* Make all `mark_*` methods on `BaseTrial` no-op when the status is unchanged, and avoid rewriting timestamps when the status is unchanged (#5097, #5074) |
| 34 | +* Runner lifecycle for search space editing: new `Runner.update` and `Runner.on_search_space_update` methods, a typed `RunnerConfig` infrastructure, and an `UNSET` sentinel (#5131, #5132, #5133, #5130) |
| 35 | +* Support for Language-in-the-Loop labeling trials, with data-freshness hashing/stamping and stale-data handling (#4986, #4992, #5144) |
| 36 | +* `AddExecutionViability` transform (lives in adapter; relies on core trial/metric plumbing) (#4547) |
| 37 | + |
| 38 | +### Generation (`ax/generators`, `ax/adapter`, `ax/generation_strategy`) |
| 39 | + |
| 40 | +* Replace Pyro with NumPyro (JAX-backed) for fully Bayesian NUTS inference -- roughly 25x faster fit on CPU with equivalent model quality (#5087) |
| 41 | +* Threaded equality constraints from `ParameterConstraint` all the way down to BoTorch (#5176, #5177, #5179, #5178, #5182) |
| 42 | +* Open-sourced the Transfer Learning stack: `TransferLearningAdapter` (registered as `Generators.BOTL`) (#5052, #5048, #5096, #5047) |
| 43 | +* Heterogeneous TL now defaults to `MultiTaskGP` + `LearnedFeatureImputation` (`ImputedMultiTaskGP`) (#5106, #5183, #5193, #5192) |
| 44 | +* Dispatch `qEUBO` for preferential BO (#5093) and support `PairwiseGP` in `ModelList` pipelines (#5092) |
| 45 | +* `GenerationStrategy.fit(experiment, data)` public method encapsulating the transition-then-fit pattern (#4922) |
| 46 | +* New `InSampleUniformGenerator` for model-free in-sample candidate selection (#4987) |
| 47 | +* `FreshLILOLabelCheck` transition criterion and hash-based filtering of stale LILO data in the adapter (#4994, #4993) |
| 48 | +* Expand the model space for numeric ordered `ChoiceParameter`s (#5210) |
| 49 | + |
| 50 | +**Breaking** |
| 51 | +* Removed the deprecated `steps=` kwarg from `GenerationStrategy.__init__` (use `nodes=`) (#5142) |
| 52 | +* Removed the deprecated `use_update` argument to `GenerationStep` (#5187) |
| 53 | +* Removed the deprecated `generated_points` argument to `RandomGenerator` (#5186) |
| 54 | +* Re-index `TorchOptConfig.objective_thresholds` from `(n_outcomes,)` to `(n_objectives,)` (#5018) |
| 55 | + |
| 56 | +### Analysis (`ax/analysis`, `ax/plot`) |
| 57 | + |
| 58 | +* New `TransferLearningAnalysis` with paste/diff comparison links (#4918, #4980) |
| 59 | +* New `UtilityRankingPlot` for preference metrics; preference metrics handled across the analysis layer (#5166, #5165) |
| 60 | +* New `NotApplicableStateAnalysisCard` (#5035, #5036, #5051, #5163) |
| 61 | +* `SensitivityAnalysisPlot` aesthetic improvements; use total-order sensitivity for high-dimensional experiments (#5015, #5115) |
| 62 | + |
| 63 | +### Storage (`ax/storage`)** |
| 64 | + |
| 65 | +* Add `step_size` to `SQAParameter` class, and as a column to the `parameter_v2` table in the DB (#5212). This will be leveraged in the next version. |
| 66 | +* SQLAlchemy 2.0 migration: migrate SQA declarative classes to SA 2.0 `Mapped[T]`, make the SQA store SA 2.0-compatible (#5205, #5201, #5169, #5203, #5206) |
| 67 | +* Support equality constraints in JSON and SQA storage (#5181) |
| 68 | + |
| 69 | +### Legacy API (`ax/service`)** |
| 70 | +Note: These are deprecated and may be removed in a future release. |
| 71 | +* `optimize()` is rewritten as a thin wrapper over `ax.api.client.Client`; the `OptimizationLoop` class is removed. The `optimize()` signature and return type are preserved (#5143) |
| 72 | +* Removed `AxClient.get_optimization_trace` -- superseded by `UtilityProgressionAnalysis` (#5168) |
| 73 | +* Search space editing on `AxClient`: new `add_parameters`, `update_parameters`, and `disable_parameters` methods to mutate the search space after trials have started; parameter constraints can be added alongside new parameters (#4945, #5023) |
| 74 | + |
| 75 | +### Orchestration (`ax/orchestration`)** |
| 76 | + |
| 77 | +* Removed `Scheduler`, `SchedulerOptions`, and `SchedulerInternalError` -- deprecated since Ax 1.0.0; use the `Orchestrator` instead (#5188) |
| 78 | + |
| 79 | + |
| 80 | + |
4 | 81 | ## [1.2.4] -- Mar 4, 2026 |
5 | 82 |
|
6 | 83 | #### Bug Fixes |
|
0 commit comments