Skip to content

Releases: MilesCranmer/PySR

v0.19.0

22 Jun 02:19
1327c58
Compare
Choose a tag to compare

What's Changed

Full Changelog: v0.18.5...v0.19.0

v0.18.5

16 Jun 16:43
c2ab38b
Compare
Choose a tag to compare

What's Changed

New features

  • Per-variable custom complexities by @MilesCranmer in #649

    model.fit(X, y, complexity_of_variables=[1, 3])
    # run a search with feature 1 having complexity 1 and feature 2 with complexity 3
  • Automatically suggest similar parameters by @MilesCranmer in #620

Other

Full Changelog: v0.18.4...v0.18.5

Backend changes

New features

Other

Full Changelog: MilesCranmer/SymbolicRegression.jl@v0.24.4...v0.24.5

New Contributors

v0.18.4

04 May 22:33
6dfed1b
Compare
Choose a tag to compare

Frontend changes

  • Add dimensionless constants mode; update Python version constraints; upgrade juliacall to 0.9.20 (#608) (@MilesCranmer)
  • Fix sign typo in example docs (#611) (@hvaara)

Full Changelog: v0.18.3...v0.18.4

Backend changes

Full Changelog: MilesCranmer/SymbolicRegression.jl@v0.24.2...v0.24.4

New Contributors

v0.18.3

26 Apr 09:16
df788e5
Compare
Choose a tag to compare

Frontend changes

  • Automated update to backend: v0.24.3 by @github-actions in #605

Full Changelog: v0.18.2...v0.18.3

Backend changes

Full Changelog: MilesCranmer/SymbolicRegression.jl@v0.24.1...v0.24.2

v0.18.2

15 Apr 04:38
6ed46e1
Compare
Choose a tag to compare

Frontend changes

Full Changelog: v0.18.1...v0.18.2

Backend changes

Merged pull requests:

Closed issues:

Full Changelog: MilesCranmer/SymbolicRegression.jl@v0.24.1...v0.24.2

v0.18.1

26 Mar 17:55
09bfff6
Compare
Choose a tag to compare

What's Changed

Full Changelog: v0.18.0...v0.18.1

v0.18.0

24 Mar 04:42
564993f
Compare
Choose a tag to compare

Frontend changes

Backend changes

Filtered to only include relevant ones for Python frontend. Also note that not all backend features, like graph-based expressions/program synthesis, are supported yet, so I don't mention those changes yet.

  • (BREAKING) The swap_operands mutation contributed by @foxtran now has a default weight of 0.1 rather than 0.0.

  • (BREAKING) The Dataset struct has had many of its field declared immutable, as a safety precaution.

    • If you had relied on the mutability of the struct to set parameters after initializing it, or had changed any properties of the dataset within a loss function (which actually would break assumptions outside the loss function anyways), you will need to modify your code. Note you can always copy fields of the dataset to variables and then modify those variables
  • LoopVectorization.jl has been moved to a package extension. PySR will install automatically at first use of turbo=True rather than by default, which means faster install time and startup time.

    • Note that LoopVectorization will no longer result in improved performance in Julia 1.11 and thus turbo=True will have no effect on that version (due to internal changes in Julia), which is why I have instead done the following:
  • Bumper.jl support added. Passing bumper=true to PySRRegressor() will result in faster performance.

    • Uses bump allocation (see rust package bumpalo for a good explanation) in the expression evaluation which can get speeds equivalent to LoopVectorization and sometimes even better due to better management of allocations rather than relying on garbage collection. Seems like a pretty good alternative, and doesn't rely on manipulating Julia internals for performance (MilesCranmer/SymbolicRegression.jl#287)
  • Various fixes to distributed compute; confirmed Slurm support again!

  • Now prefer to use new keyword-based constructors for nodes:

    Node{T}(feature=...)        # leaf referencing a particular feature column
    Node{T}(val=...)            # constant value leaf
    Node{T}(op=1, l=x1)         # operator unary node, using the 1st unary operator
    Node{T}(op=1, l=x1, r=1.5)  # binary unary node, using the 1st binary operator

    rather than the previous constructors Node(op, l, r) and Node(T; val=...) (though those will still work; just with a depwarn). If you did any construction of nodes manually, note the new syntax. (Old syntax will still work though)

  • Formatting overhaul of backend (MilesCranmer/SymbolicRegression.jl#278)

  • Upgraded Optim to 1.9

  • Upgraded DynamicQuantities to 0.13

  • Upgraded DynamicExpressions to 0.16

  • The main search loop in the backend has been greatly refactored for readability and improved type inference. It now looks like this (down from a monolithic ~1000 line function)

    function _equation_search(
        datasets::Vector{D}, ropt::RuntimeOptions, options::Options, saved_state
    ) where {D<:Dataset}
        _validate_options(datasets, ropt, options)
        state = _create_workers(datasets, ropt, options)
        _initialize_search!(state, datasets, ropt, options, saved_state)
        _warmup_search!(state, datasets, ropt, options)
        _main_search_loop!(state, datasets, ropt, options)
        _tear_down!(state, ropt, options)
        return _format_output(state, ropt)
    end

Backend changes: MilesCranmer/SymbolicRegression.jl@v0.23.1...v0.24.1

New Contributors

Full Changelog: v0.17.4...v0.18.0

v0.17.4

21 Mar 03:10
efffd9b
Compare
Choose a tag to compare

Small patch to Julia version to avoid buggy libgomp in 1.10.1 and 1.10.2.

Full Changelog: v0.17.3...v0.17.4

v0.17.3

20 Mar 19:59
66185b9
Compare
Choose a tag to compare

What's Changed

  • Bump juliacall from 0.9.15 to 0.9.19 by @dependabot in #569
    • Upstreamed patching of seval to support multiple expressions
  • remove repeated operator by @RaulPL in #573

New Contributors

Full Changelog: v0.17.2...v0.17.3

v0.17.2

12 Mar 00:00
c1fd3fb
Compare
Choose a tag to compare

What's Changed

New Contributors

Full Changelog: v0.17.1...v0.17.2