Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(py)Brush v1.0: islands! #55

Merged
merged 211 commits into from
Jun 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
211 commits
Select commit Hold shift + click to select a range
6159a28
Merge pull request #45 from cavalab/initializing_weights
gAldeia Aug 8, 2023
ddc280c
Regressor now uses MSE (instead of squashed version of the metric)
gAldeia Aug 11, 2023
9939d07
Fixed wrong use of validation partition and MDCM
gAldeia Aug 11, 2023
38c3c6a
Merge pull request #48 from cavalab/toggle_weight_on_off
gAldeia Aug 15, 2023
dc328bb
Added mutation trace back
gAldeia Aug 15, 2023
c6ccde4
Uniform weight initialization between mutation options and cx
gAldeia Aug 15, 2023
f29d94d
If mutation/cx fails, then the parent is inserted in offspring
gAldeia Aug 30, 2023
9d1d153
Marked get_model functions as const
gAldeia Aug 30, 2023
29ae79e
Additional check before doing PTC2
gAldeia Aug 30, 2023
fdf0469
Mutation classes. bug fix in subtree mutation
gAldeia Aug 30, 2023
1e35e2d
Updated tests
gAldeia Aug 30, 2023
2aac8b0
Switched `append(value)` to `extend([value])`
gAldeia Aug 31, 2023
d6e9778
Better way to make sure PTC2, make_program and subtree will work
gAldeia Aug 31, 2023
9044d5a
Improved find_spot and removed template in base class
gAldeia Aug 31, 2023
1082720
Printing more informations for debug
gAldeia Aug 31, 2023
cb8e3ec
Bug fixes. Avoiding re-fit. cloning expressions
gAldeia Sep 11, 2023
732a579
Simple interface to clone a program and return a copy
gAldeia Sep 11, 2023
20ef18d
Testing clone method
gAldeia Sep 11, 2023
e9424a7
Implementation of simple GA with tournament selection
gAldeia Sep 11, 2023
c1e4366
Initial structure to implement an Island GA. taskflow added as depend.
gAldeia Sep 26, 2023
058579b
Changed GA so it doesnt require a new file
gAldeia Sep 26, 2023
099d9bf
Fixed include of non-existing file
gAldeia Sep 27, 2023
f238ebd
Changed `get_params` to have same arguments as base class from sklearn
gAldeia Sep 27, 2023
91ba367
Fixed bug fit with a dataframe but predict with an np.array
gAldeia Sep 28, 2023
9b2d716
Predict now use types from training data
gAldeia Sep 28, 2023
d4324a0
`predict_proba` returns 2d array for binary classification
gAldeia Sep 29, 2023
52611bb
Fixed wrong comparison when throwing an error while copying from a re…
gAldeia Sep 29, 2023
f42590d
Bug fix - binary clf programs being created without `logistic` as root
gAldeia Oct 2, 2023
9a6c7f1
New fix. Some classification programs still being modified
gAldeia Oct 3, 2023
74f9d3a
Improved counting nodes
gAldeia Oct 3, 2023
8f2b332
Changed max arity in test_variation
gAldeia Oct 3, 2023
f0fa367
MeanLabel node
gAldeia Oct 4, 2023
2170146
Fixed `algorithm`==`ga` not returning the best individual
gAldeia Oct 5, 2023
547bfdc
Added multiclass dataset (currently brush can do only binary clf)
gAldeia Oct 5, 2023
c25fedd
Changed MeanLabel to be a terminal (not an operator)
gAldeia Oct 5, 2023
2a579b9
python implementation of island model. fixed api and tests
gAldeia Oct 8, 2023
a634a3d
Adding necessary functions if the user don't specify them
gAldeia Oct 9, 2023
cf81e1b
Implemented base for `And` and `Or` operators
gAldeia Oct 9, 2023
45b8de3
Using boolean operators in test (not working yet)
gAldeia Oct 9, 2023
35513d2
Merge branch 'mutation_trace' of https://github.com/cavalab/brush int…
gAldeia Oct 9, 2023
7f47454
Implemented boolean operators. Improved print of meanLabel and SplitOn
gAldeia Oct 11, 2023
0b950e0
Included boolean operators in tests
gAldeia Oct 11, 2023
e1fd0ca
Option to use nsga or ga with island divisions
gAldeia Oct 11, 2023
f747d63
Added comparison test of weights between cloned and original program
gAldeia Oct 11, 2023
5e6d3f9
Fixed error causing tests to fail when inserting Logistic in the sear…
gAldeia Oct 11, 2023
b2f495a
Merge pull request #49 from cavalab/meanLabel_operator
gAldeia Oct 11, 2023
5210708
Merge branch 'mutation_trace' into island_GA
gAldeia Oct 11, 2023
eaa4c6c
Merge pull request #50 from cavalab/island_GA
gAldeia Oct 11, 2023
d70339a
Implemented complexity. User can specify objectives
gAldeia Oct 11, 2023
cdfa39b
Merge pull request #51 from cavalab/complexity
gAldeia Oct 11, 2023
7243f06
Fixed zero complexities
gAldeia Oct 12, 2023
d079365
Making constant features have zero weight
gAldeia Oct 12, 2023
672b9ca
New tests
gAldeia Oct 12, 2023
9000430
Merge pull request #52 from cavalab/complexity
gAldeia Oct 12, 2023
6586934
Renamed initialization methods
gAldeia Oct 17, 2023
ce56086
Merge branch 'mutation_trace' of https://github.com/cavalab/brush int…
gAldeia Oct 17, 2023
aa9655e
New complexity measures
gAldeia Oct 17, 2023
06c642c
Non-zero probability for terminals if they are not nan
gAldeia Oct 18, 2023
ae55ad9
Bug fix in crossover attempts
gAldeia Oct 18, 2023
87ce49e
Added `weights_init` parameter into pybind wrapper
gAldeia Oct 18, 2023
06caed0
Updated missing bind
gAldeia Oct 18, 2023
94daa7e
Improved how `get_dot_model` prints `MeanLabel`
gAldeia Oct 18, 2023
30718c3
Fixed strategy to pick best solution when there's no validation split
gAldeia Oct 18, 2023
0218150
Using weights_init argument properly
gAldeia Oct 19, 2023
050a38a
Fixed complexity not taking into account the node weights
gAldeia Oct 19, 2023
ec627b1
Changed classification default metric
gAldeia Oct 19, 2023
1b3bb75
Avoid creating clones of programs
gAldeia Oct 19, 2023
981726c
Increased minimal probability of changing
gAldeia Oct 19, 2023
825264a
Improved log. Fixed warnings in pytest.
gAldeia Oct 23, 2023
aee7b30
Dont show `MeanLabel` in MeanLabel nodes
gAldeia Oct 23, 2023
8c0979d
Fixed meanlabel. Updated how we initialize weights
gAldeia Oct 24, 2023
7c1d83f
Stop reinserting the same expression if mutation fails
gAldeia Nov 1, 2023
f341896
Stop reinserting parents into offspring. Fixed island indexes for that
gAldeia Nov 2, 2023
1794950
Updated
gAldeia Nov 2, 2023
69cc07e
Fixed not inserting value into list of failed variations
gAldeia Nov 2, 2023
5510c86
Basic files to implement island model
gAldeia Nov 2, 2023
6556d76
Individuals. Now program compiles again
gAldeia Nov 3, 2023
7383776
Starting to implement Individual
gAldeia Nov 3, 2023
a984c20
Merge pull request #53 from cavalab/mutation_trace
gAldeia Nov 3, 2023
a9b469d
Population and Selection templated for ProgramType
gAldeia Nov 3, 2023
bfa4d1c
Implementation of individual class
gAldeia Nov 6, 2023
7de001a
Population implemented with island indexes control
gAldeia Nov 6, 2023
cd73a62
Files for implementing nsga2
gAldeia Nov 6, 2023
b510472
Draft of nsga2 selection implementation
gAldeia Nov 7, 2023
f7469ee
Added TODOs
gAldeia Nov 7, 2023
22b9fe9
Added TODOs
gAldeia Nov 7, 2023
877fa0f
Select and Survive now takes the island range as argument
gAldeia Nov 7, 2023
3c31499
nsga2 with islands
gAldeia Nov 7, 2023
8a2d920
Parameters implemented (but not effectively used yet)
gAldeia Nov 7, 2023
392aa7c
Starting to implement Variation class
gAldeia Nov 7, 2023
47820fe
Commented broken tests
gAldeia Nov 8, 2023
e6da3e3
Removed previous mutation and crossover interfaces with python
gAldeia Nov 8, 2023
5beec86
Individual uses search space to create programs
gAldeia Nov 8, 2023
232ee98
Migration methods
gAldeia Nov 8, 2023
e5a6d7a
Updating python wrapper (almost finishing it!)
gAldeia Nov 8, 2023
9ea4bb4
Generation basic operations almost done (evaluator is missing)
gAldeia Nov 8, 2023
5e862b3
Starting to implement evaluation
gAldeia Nov 8, 2023
9f7f11c
Evaluation implemented
gAldeia Nov 9, 2023
37952eb
Setting and using individual objective values
gAldeia Nov 13, 2023
ecfc12d
Evaluation now has the option to not re-fit the individual
gAldeia Nov 13, 2023
d76cfd0
Generation and fit methods
gAldeia Nov 13, 2023
4216e90
Moving the python implementation out of cpp src. Starting to rewrite it
gAldeia Nov 13, 2023
fdde3b2
Renamed variable
gAldeia Nov 13, 2023
dd8ae26
Bug fix in cx. improved spot selection in cx. cx and mut are now public
gAldeia Nov 14, 2023
cec5354
Default values for mutation probs. New comments with TODOs
gAldeia Nov 14, 2023
95efb07
Individual constructor
gAldeia Nov 14, 2023
eafb245
all previous cpp tests are pdated and working!
gAldeia Nov 14, 2023
5f7957a
Templated selection. Bug fixes.
gAldeia Nov 15, 2023
c9d763a
Tests for population (working! I just dont know if they are correct yet)
gAldeia Nov 15, 2023
446f22d
Rewriting to store island ind indexes --- instead of (start_idx, end_…
gAldeia Nov 16, 2023
186895b
Fixed printing individuals in population
gAldeia Nov 17, 2023
6f2b13c
Update to work with island indexes
gAldeia Nov 17, 2023
a68acfc
Clean up. Moving to finish pending TODOs and fix python wrapper
gAldeia Nov 20, 2023
344b93e
Moving python files outside src directory
gAldeia Dec 12, 2023
bf81b8b
Improved individuals, parameters, types and variation
gAldeia Dec 12, 2023
3ecfb44
Lots of new bindings. Rework to make previous keep working
gAldeia Dec 12, 2023
99ba4ce
Updated tests to run with all the rework
gAldeia Dec 12, 2023
37c73d0
Updated DEAP to use brush's individuals
gAldeia Feb 7, 2024
63b0b5f
Updated python wrapper to use Brush's individual class
gAldeia Feb 7, 2024
618af55
Updated tests to work with Brush's individuals
gAldeia Feb 7, 2024
9429021
Updated variation operators to operate completely in C++
gAldeia Feb 7, 2024
ce83807
Implemented interface to evaluate in c++
gAldeia Feb 9, 2024
5f392e2
Fixed evaluator not working for classification
gAldeia Feb 10, 2024
774c448
Fitness evaluation is now in c++
gAldeia Feb 10, 2024
3388f5a
Fixed ceres version (newer is crashing due google docs dep)
gAldeia Feb 23, 2024
b6dcd9b
Implemented working selection and survival in cpp
gAldeia Feb 23, 2024
f1bcdce
Updated wrapper to use cpp instead of deap sel and surv
gAldeia Feb 23, 2024
95fec29
Updated test
gAldeia Feb 23, 2024
6d9369b
Lexicase selection. Fix migration. Sel, surv, and migration bindings.
gAldeia Feb 26, 2024
02c5058
Bug fix in lexicase selecting from the wrong island
gAldeia Feb 27, 2024
baaf37c
pop variation entirely in cpp
gAldeia Feb 27, 2024
e5aed9c
added annotation with todo
gAldeia Mar 2, 2024
de84b3c
Replacing population in update is now better
gAldeia Mar 2, 2024
9a0f36a
Island algorithm with taskflow implemented
gAldeia Mar 2, 2024
6d3c3cc
Updated tests, bindings, and wrapper
gAldeia Mar 2, 2024
d1f5d25
Fixed core dump due to parallel calculations
Mar 10, 2024
61f9e59
Assert in eval (for debug reasons). Will be removed later
not-gAldeia Mar 10, 2024
23fbd84
added some comments
not-gAldeia Mar 10, 2024
d768db9
Fixed core dumps. Forcing unused indexes in pop to be nullptr
not-gAldeia Mar 10, 2024
4ede2fd
Replaced creator.Individual with brush's individual
gAldeia Mar 12, 2024
0b2ab96
Renamed cpp's estimator to engine
gAldeia Mar 12, 2024
b0b27fd
fixed population and selection implementations
gAldeia Mar 12, 2024
e7259c6
trying to solve GIL problem
not-gAldeia Mar 12, 2024
f0e3d43
Fixed variator not being initialize
not-gAldeia Mar 13, 2024
2474025
Cleaning up some TODOs
not-gAldeia Mar 13, 2024
17cb266
fixed typo
gAldeia Mar 13, 2024
cde53e5
cleaning and refactoring
gAldeia Mar 13, 2024
d7e47ab
fixed bind fitness not working
gAldeia Mar 13, 2024
84dd495
Starting to implement pure c++ BrushEstimator
gAldeia Mar 15, 2024
f9a7070
n_jobs and random_state in engine. new tests.
gAldeia Mar 19, 2024
a3c9650
TODO: check selection implementation
gAldeia Mar 19, 2024
8759c09
Saving and load population
gAldeia Mar 19, 2024
92e152e
Merge branch 'island_GA' of https://github.com/cavalab/brush into isl…
gAldeia Mar 19, 2024
f1ab6b1
Resolve offspring bottleneck
gAldeia Mar 20, 2024
28067b0
Fixed PTC2 creating huge trees when max_depth is a high number
gAldeia Apr 2, 2024
9f6be61
Missing if statement in search space ptc2
gAldeia Apr 2, 2024
1efedd3
Fixed tree creation with logistic/softmax when not specified in funct…
gAldeia Apr 10, 2024
4af5d4d
OffsetSum (sum with W as argument, not as weight)
gAldeia Apr 10, 2024
a9b4cab
Fixed bad logic when adding Logistic to search space
gAldeia Apr 12, 2024
3908eb2
Better dot models for OffsetSum
gAldeia Apr 14, 2024
f96c594
Minor changes
gAldeia Apr 14, 2024
39a1e16
Implemented max_stall
gAldeia Apr 14, 2024
2c438e0
Improving PTC2 to work with strong typed programs. Fixed infinite loo…
gAldeia Apr 14, 2024
7c364ea
Implemented max_time
gAldeia Apr 15, 2024
c2d3648
OffsetSum as an unary operator
gAldeia Apr 16, 2024
4f077a7
Logistic(Add(Const, <>))
gAldeia Apr 16, 2024
dad0ba8
is_fitted_ flag to avoid re-fitting individuals
gAldeia Apr 16, 2024
69d569e
Fixed constants having higher complexity than they should
gAldeia Apr 16, 2024
7976fe2
Improved dot model for OffsetSum nodes
gAldeia Apr 16, 2024
658b68d
Fixed scorer_ not visible to python
gAldeia Apr 16, 2024
abd7841
Fixed bad logic when calculating complexity of constant terminals
gAldeia Apr 21, 2024
d3f20dd
Logfile and verbosity. Lots of new TODOs to fix!
gAldeia Apr 21, 2024
8c48695
Starting to implement archive
gAldeia Apr 22, 2024
b6476de
Notebook to test the island implementation
gAldeia Apr 23, 2024
e06cd7c
comments print statements
gAldeia Apr 23, 2024
be98ce5
Cleaning some TODOs. Organizing files
gAldeia Apr 24, 2024
1341183
Fixed bad minimization of fitness. Classification working
gAldeia Apr 24, 2024
5ee9393
get_rank instead of just rank (was failing to install in older python…
gAldeia Apr 24, 2024
c64fad7
Cleaning more TODOs
gAldeia Apr 24, 2024
ddeb6fd
Fit, predict and predict_proba for individual classes
gAldeia Apr 25, 2024
ee5379d
Engine bindings for fit and predict. Engine serialization
gAldeia Apr 25, 2024
160b39a
Merge branch 'master' of https://github.com/cavalab/brush into island_GA
gAldeia Apr 25, 2024
bd6a5d4
Deleted test notebook
gAldeia Apr 25, 2024
d3538e3
Fixed missing taskflow. simple test to see if validation is being used
gAldeia Apr 25, 2024
fe84d8d
Working (but slightly incorrect) implementation of archive
gAldeia May 2, 2024
12a8772
Archive implementation. Individual ids. New TODOs to solve
gAldeia May 3, 2024
78314fc
fixed missing val_from_arch parameter and pybrush breaking
gAldeia May 4, 2024
7ea90c2
Updated examples in readme
gAldeia Jun 5, 2024
4381134
removing unused file
gAldeia Jun 5, 2024
cd9436c
cleaning a lot of comments and TODOs
gAldeia Jun 5, 2024
30e7bad
adding some new TODOs
gAldeia Jun 5, 2024
29afbe7
Instructions to build docs locally
gAldeia Jun 5, 2024
62aff7a
Updated example notebooks and started writing new ones
gAldeia Jun 5, 2024
f036a2d
Fixed bug when passing a list of functions
gAldeia Jun 5, 2024
9375c88
more cleaning. Implemented string representation for fitness
gAldeia Jun 5, 2024
cbcfcbe
Final adjustments to save/load pop and use archive
gAldeia Jun 6, 2024
e021f13
Fix print statement when using archive
gAldeia Jun 6, 2024
17de2b0
Removed useless lambda function
gAldeia Jun 6, 2024
6fd411d
Spacing
gAldeia Jun 6, 2024
3112a18
new example notebooks!!
gAldeia Jun 6, 2024
6be28de
Added new files. Now it is time to write documentation
gAldeia Jun 6, 2024
452ad67
Todo: version for docs should be set automatically
gAldeia Jun 6, 2024
3506898
Implemented average_precision_score metric in cpp
gAldeia Jun 7, 2024
6af5ce0
Fixed python docs not being found
gAldeia Jun 7, 2024
d675707
Documentation. setting n_classes in cpp side
gAldeia Jun 11, 2024
ae0a886
Documentation
gAldeia Jun 11, 2024
e1b2f19
Improved variation. Fixed lots of TODOs. implemented get_size in tree…
gAldeia Jun 11, 2024
dd1eb30
Updated tedts to work with new variation
gAldeia Jun 11, 2024
f5d26eb
Fixed bad doxygen instructions
gAldeia Jun 11, 2024
5210dd7
lots of docs
gAldeia Jun 11, 2024
f70d32e
Documentation for Engine class (just the class definition, not its me…
gAldeia Jun 11, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
*.vscode
*.html

# files generated by running the test suite
tests/cpp/__*

tags
build/
operon/
Expand Down
40 changes: 36 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,13 +98,16 @@ In addition, Brush provides functionality that allows you to feed in more compli
```python
# load data
import pandas as pd

df = pd.read_csv('docs/examples/datasets/d_enc.csv')
X = df.drop(columns='label')
y = df['label']

# import and make a regressor
from brush import BrushRegressor
est = BrushRegressor()
from pybrush import BrushRegressor

# you can set verbosity=1 to see the progress bar
est = BrushRegressor(verbosity=1)

# use like you would a sklearn regressor
est.fit(X,y)
Expand All @@ -118,15 +121,18 @@ print('score:', est.score(X,y))
```python
# load data
import pandas as pd

df = pd.read_csv('docs/examples/datasets/d_analcatdata_aids.csv')
X = df.drop(columns='target')
y = df['target']

# import and make a classifier
from brush import BrushClassifier
est = BrushClassifier()
from pybrush import BrushClassifier
est = BrushClassifier(verbosity=1)

# use like you would a sklearn classifier
est.fit(X,y)

y_pred = est.predict(X)
y_pred_proba = est.predict_proba(X)

Expand Down Expand Up @@ -237,4 +243,30 @@ If you are developing the cpp code and want to build the cpp tests, run the foll
./install tests
```

## Building the docs locally

To build the documentation you will need some additional requirements.
Before proceeding, make sure you have the python wrapper installed, as the documentation have some sample notebooks that will run the code.

First go to the `docs` folder:

```bash
cd docs/
```

Then, install additional python packages in the same environemnt as brush is intalled with:

```bash
conda activate brush
pip install -r requirements.txt
```

Now just run:

```bash
make html
```

The static website is located in `-build/html`

<!-- end development -->
6 changes: 3 additions & 3 deletions docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ def configureDoxyfile(input_dir, output_dir):
with open('Doxyfile', 'w') as fp2:
fp2.write(filedata)


## Only trigger readthedocs build if running on readthedocs servers:
# read_the_docs_build = os.environ.get('READTHEDOCS', None) == 'True'

Expand All @@ -58,7 +57,7 @@ def configureDoxyfile(input_dir, output_dir):
author = 'William La Cava and Joseph D. Romano'

# The full version, including alpha/beta/rc tags
release = '0.1a'
release = '0.1a' # TODO: use versionstr here


# -- General configuration ---------------------------------------------------
Expand Down Expand Up @@ -112,7 +111,8 @@ def configureDoxyfile(input_dir, output_dir):
breathe_default_project = "brush"
breathe_default_members = ('members', 'undoc-members')
breathe_projects_source = {
"brush": ("../src/", list(glob('../src/', recursive=True)))
"brush" : ("../src/", list(glob('../src/', recursive=True)) ),
"pybrush": ("../pybrush/", list(glob('../pybrush/', recursive=True)) ),
}

html_theme_options = {
Expand Down
5 changes: 5 additions & 0 deletions docs/cpp_api/archive.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Archive
=======

.. doxygenstruct:: Brush::Pop::Archive
:members:
9 changes: 9 additions & 0 deletions docs/cpp_api/engine.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
Engine (and parameters)
=======================

.. doxygenstruct:: Brush::Parameters
:members:

.. doxygenclass:: Brush::Engine
:members:

8 changes: 8 additions & 0 deletions docs/cpp_api/evaluation.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
Evaluation
==========

.. doxygenclass:: Brush::Eval::Evaluation
:members:

.. doxygenclass:: Brush::Eval::Scorer
:members:
6 changes: 6 additions & 0 deletions docs/cpp_api/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,11 @@ search_space
program
node
nodetypes
individual
evaluation
population
variation
selection
archive
engine
```
8 changes: 8 additions & 0 deletions docs/cpp_api/individual.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
Individual and Fitness
======================

.. doxygenclass:: Brush::Pop::Individual
:members:

.. doxygenstruct:: Brush::Fitness
:members:
5 changes: 5 additions & 0 deletions docs/cpp_api/population.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Population
==========

.. doxygenclass:: Brush::Pop::Population
:members:
14 changes: 14 additions & 0 deletions docs/cpp_api/selection.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
Selection
=========

.. doxygenclass:: Brush::Sel::Selection
:members:

.. doxygenclass:: Brush::Sel::SelectionOperator
:members:

.. doxygenclass:: Brush::Sel::NSGA2
:members:

.. doxygenclass:: Brush::Sel::Lexicase
:members:
6 changes: 5 additions & 1 deletion docs/cpp_api/variation.rst
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
Variation (Crossover/Mutation)
==============================

.. doxygenfile:: variation.h
.. doxygenclass:: Brush::Var::MutationBase
:members:

.. doxygenclass:: Brush::Var::Variation
:members:
Loading
Loading