Skip to content

Update SymbolicRegression requirement from 1 to 1, 2.0 in /docs in the all-julia-packages group across 1 directory - #153

Merged
ChrisRackauckas merged 1 commit into
mainfrom
dependabot/julia/docs/all-julia-packages-6a37853a79
Aug 26, 2026
Merged

Update SymbolicRegression requirement from 1 to 1, 2.0 in /docs in the all-julia-packages group across 1 directory#153
ChrisRackauckas merged 1 commit into
mainfrom
dependabot/julia/docs/all-julia-packages-6a37853a79

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Aug 26, 2026

Copy link
Copy Markdown
Contributor

Updates the requirements on SymbolicRegression to permit the latest version.
Updates SymbolicRegression to 2.0.0

Release notes

Sourced from SymbolicRegression's releases.

v2.0.0

2.0.0 (2026-08-25)

SymbolicRegression.jl 2.0.0 is the conclusion of a two-year transformation of the library from a fixed search pipeline into a modular PyTorch-like framework for symbolic learning, while still keeping its familiar v1 functionality and API. Operators can take any number of arguments, the search loop accepts plugins, and mutations and crossovers are first-class objects you can configure or replace. This also introduces the ability to pass "guesses" for the expressions, which mix into the populations throughout a run - which helps connect SR.jl to agentic coding loops. Finally, we get some major speed boosts from a huge reduction in allocations thanks to a reusable evaluation buffer.

Version: release 2.0.0, tag v2.0.0.

Highlights

Operators of any arity

Pass an OperatorEnum keyed by arity, and ternary or higher-degree operators become real tree nodes (#471, #472, #464). Before v2 the enum had exactly a unary and a binary slot, so piecewise logic such as a > 0 ? b : c had to be approximated by nests of binary operators that the search rarely found.

using SymbolicRegression
using SymbolicRegression: machine, fit!, predict, report
scalar_ifelse(a, b, c) = a > 0 ? b : c
X = randn(3, 100)
y = [X[1, i] > 0 ? 2*X[2, i] : X[3, i] for i in 1:100]
model = SRRegressor(
operators=OperatorEnum(
1 => (),
2 => (+, -, *, /),
3 => (scalar_ifelse,),
),
niterations=35,
)
mach = machine(model, X', y)
fit!(mach)
report(mach)

binary_operators and unary_operators still work, and they remain mutually exclusive with operators=. Constraints are now degree-indexed: an N-argument operator takes an N-tuple, with -1 meaning unconstrained, and unary operators default to -1 as before. Operator and connection mutations, append/delete/rotate operations, crossover, simplification, constraint checking, and dimensional analysis operate over the generalized tree, whose node type became Node{T,D} in DynamicExpressions (#127). The lower-level swap_operands helper accepts nodes of any degree greater than one, while SwapOperandsMutation remains enabled only when the tree contains a binary node.

A composable plugin interface

Plugins are the new extension point for the search loop (#645, #663). A plugin is a small struct subtyping AbstractPlugin: an immutable configuration paired with mutable runtime state created by init_plugin_state. Hooks cover lifecycle events (on_search_start!, on_generation_end!, on_cycle_start!/on_cycle_end!, on_mutation_end!, on_search_end!), selection and acceptance biases (tournament_cost_multiplier, mutation_acceptance_multiplier), mutation conditioning (condition_mutation!), and population seeding (init_member). Plugins can also contribute weighted mutation and crossover defaults through plugin_mutations and plugin_crossovers, which explicit mutations=/crossovers= entries override. Multiple plugins compose in tuple order, and extending the search no longer means forking the package.

using SymbolicRegression
using SymbolicRegression: AbstractPlugin, AbstractMutation, MutationEvent
struct MutationCounterPlugin <: AbstractPlugin end
mutable struct MutationCounterState
accepted::Int
rejected::Int
</tr></table>

... (truncated)

Changelog

Sourced from SymbolicRegression's changelog.

2.0.0 (2026-08-24)

Version 2.0 restructures SymbolicRegression.jl around composable parts: a plugin interface for the search loop, first-class mutation and crossover objects, and operators of arbitrary arity over the Node{T,D} tree from DynamicExpressions 2.x. New capabilities include user-provided guesses that mix into the populations throughout the search, generic optimizable template parameters, an MLJ-free tabular workflow, and a reusable evaluation arena that cut allocations sharply on this project's own benchmark. Defaults changed for batching, crossover probability, and adaptive mutation weights; see Changed defaults and Breaking changes.

This entry consolidates the v2 prerelease line (v2.0.0-alpha.1 through v2.0.0-beta.9) by theme. The per-release entries remain in the repository history.

Composable plugins

The search loop gained a public plugin interface (#645, commit 94cb307). A plugin pairs an immutable configuration struct (subtyping AbstractPlugin) with mutable runtime state returned by init_plugin_state, and opts into whichever hooks it needs. Plugins compose in tuple order via Options(; plugins=(p1, p2)); explicit mutations=/crossovers= entries take precedence over plugin-contributed defaults (#663, commit c3617af). The interface is experimental and marked as such in the documentation.

Built-in plugins:

  • AdaptiveParsimonyPlugin: biases tournament selection and mutation acceptance away from over-represented complexities; enabled by default, configured by the existing use_frequency keywords.
  • AdaptiveMutationWeightsPlugin: learns multiplicative factors on top of configured mutation weights (#678); enabled by default.
  • SimulatedAnnealingPlugin: carries the annealing schedule, which previously lived in the core loop; enabled by default when annealing=true, the default. The port preserves the temperature schedule bit for bit, verified by identical hall-of-fame hashes across the refactor (#652).
  • MutationBurstPlugin: retries rejected mutations and can chain further mutations after an acceptance (#645). Experimental; MutationBurstPlugin(retry_attempts=1, compound_max_steps=1) reproduces the previous single-attempt inner loop without consuming an extra RNG draw.

Hook categories, each dispatching on the plugin type with no-op defaults:

  • Lifecycle observers: on_search_start!, on_search_end!, on_generation_end! (fires on the head node when a completed cycle arrives), on_cycle_start!/on_cycle_end! (worker side), and on_mutation_end! (receives the mutation as a typed argument plus a MutationEvent).
  • Multipliers: tournament_cost_multiplier and mutation_acceptance_multiplier, composed multiplicatively across plugins.
  • Conditioners: condition_mutation! and prepare_mutation_context for per-call mutation contexts introduced alongside the plugin work in #645.
  • Factories: init_plugin_state per (plugin, output), fork_plugin_state for the per-population worker state created before its first dispatch (defaulting to deepcopy), refresh_worker_plugin_state for later updates, and init_member for population seeding.
  • Operation defaults: plugin_mutations and plugin_crossovers.

on_generation_end! runs serially on the head node; on_cycle_end! and on_mutation_end! run on workers against state retained for that population across dispatches, so cross-worker aggregation needs Channel/RemoteChannel. A worked tutorial lives at examples/plugin_tutorial.jl and on the Plugins documentation page.

First-class mutations and crossovers

Mutations became weighted objects rather than fixed internal functions (#610; finalized in commits 850d8c2 and e68fe14, with override alignment in c3242b2). Pass mutations=[ConstantMutation(perturbation_factor=0.1) => 0.05] to replace a default weight by type, or default_mutations=() to remove every automatic entry. Custom mutations subtype AbstractMutation, extend SymbolicRegression.mutate!, and return a MutationResult{N,P}.

Crossovers received the same treatment (#664, commit e6484d4): AbstractCrossover, SubtreeCrossover, a crossovers= weighted mapping with default_crossovers=(), and a CrossoverResult{N} contract. Constraint failures retry the sampled crossover up to max_tries, passing a 1-based attempt keyword so expensive crossovers can bail out on retries (#666).

New and notable mutation types:

  • FeatureMutation: rewiring a leaf to a different input column is its own weighted move (default 0.1), instead of an accident of delete-then-add (#475, commit 84ba961). Template expressions now also mutate only up to the number of available features (commit 738165e).
  • BacksolveMutation: experimental repair step that inverts the evaluation path above a target subtree and sparse-fits a replacement by greedy forward selection over a library of strong subtrees from the population, constrained by the remaining complexity budget (#573, thanks @​ayagh19; commit de86fef, library hardening in 46a1ad2). Off by default.

The effective weighted mutations constructed by Options() are ConstantMutation() => 0.0346, OperatorMutation() => 0.293, FeatureMutation() => 0.1, SwapOperandsMutation() => 0.198, RotateTreeMutation() => 4.26, AddNodeMutation() => 2.47, InsertNodeMutation() => 0.0112, DeleteNodeMutation() => 0.870, SimplifyMutation() => 0.00209, RandomizeMutation() => 0.000502, DoNothingMutation() => 0.273, OptimizeMutation() => 0.0, BacksolveMutation() => 0.0, FormConnectionMutation() => 0.5, and BreakConnectionMutation() => 0.1. The last two operate only on graph-backed expressions.

Supporting refactor: AbstractPopMember generalizes the member type used across selection, mutation, and crossover (#540), and next-generation dispatch gained a function barrier per mutation type plus shallow copies for the immutable weight pairs (commits 5feb572 and 225f951).

... (truncated)

Commits

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore <dependency name> major version will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)
  • @dependabot ignore <dependency name> minor version will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)
  • @dependabot ignore <dependency name> will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)
  • @dependabot unignore <dependency name> will remove all of the ignore conditions of the specified dependency
  • @dependabot unignore <dependency name> <ignore condition> will remove the ignore condition of the specified dependency and ignore conditions

Updates the requirements on [SymbolicRegression](https://github.com/astroautomata/SymbolicRegression.jl) to permit the latest version.

Updates `SymbolicRegression` to 2.0.0
- [Release notes](https://github.com/astroautomata/SymbolicRegression.jl/releases)
- [Changelog](https://github.com/astroautomata/SymbolicRegression.jl/blob/master/CHANGELOG.md)
- [Commits](astroautomata/SymbolicRegression.jl@v1.0.0...v2.0.0)

---
updated-dependencies:
- dependency-name: SymbolicRegression
  dependency-version: 2.0.0
  dependency-type: direct:production
  dependency-group: all-julia-packages
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file julia Pull requests that update julia code labels Aug 26, 2026
@ChrisRackauckas
ChrisRackauckas merged commit bc22610 into main Aug 26, 2026
3 of 4 checks passed
@dependabot
dependabot Bot deleted the dependabot/julia/docs/all-julia-packages-6a37853a79 branch August 26, 2026 04:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file julia Pull requests that update julia code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant