v0.24.0
What's Changed
- Experimental support for program synthesis / graph-like expressions instead of trees (#271)
- BREAKING: many types now have a third type parameter, declaring the type of node. For example,
PopMember{T,L}
is nowPopMember{T,L,N}
forN
the type of expression. - Can now specify a
node_type
in creation ofOptions
. Thisnode_type <: AbstractExpressionNode
can be aGraphNode
which will result in expressions that care share nodes – and therefore have a lower complexity. - Two new mutations:
form_connection
andbreak_connection
– which control the merging and breaking of shared nodes in expressions. These are experimental.
- BREAKING: many types now have a third type parameter, declaring the type of node. For example,
- BREAKING: The
Dataset
struct has had many of its field declared immutable (for memory safety). If you had relied on the mutability of the struct to set parameters after initializing it, you will need to modify your code. - BREAKING: LoopVectorization.jl moved to a package extension. Need to install it separately (#287).
- DEPRECATED: 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
).
- Bumper.jl support added. Passing
bumper=true
toOptions()
will result in using bump-allocation for evaluation which can get speeds equivalent to LoopVectorization and sometimes even better due to better management of allocations. (#287) - Upgraded Optim.jl to 1.9.
- Upgraded DynamicQuantities to 0.13
- Upgraded DynamicExpressions to 0.16
- The main search loop 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
Full Changelog: v0.23.3...v0.24.0