Compare commits
No commits in common. "master" and "gh-pages" have entirely different histories.
|
@ -1,7 +0,0 @@
|
|||
.venv/
|
||||
modules/__pycache__/
|
||||
runs/
|
||||
*.swp
|
||||
build/
|
||||
dist/
|
||||
karoo_gp_kstaats.egg-info/
|
Binary file not shown.
19
LICENSE.md
19
LICENSE.md
|
@ -1,19 +0,0 @@
|
|||
# Karoo GP License
|
||||
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015-2018 Kai Staats (www.kaistaats.com)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
|
||||
documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
|
||||
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
recursive-include files *
|
||||
recursive-include modules *
|
||||
include *.py
|
||||
include *.md
|
||||
include *.txt
|
||||
include *.pdf
|
|
@ -1,37 +0,0 @@
|
|||
# pip archive creation
|
||||
HOWTO create and upload an archive to PyPI (pip).
|
||||
|
||||
Create accounts on the main PyPI server and the Test PyPI server:
|
||||
|
||||
* https://pypi.org/account/register/
|
||||
|
||||
* https://test.pypi.org/account/register/
|
||||
|
||||
Then run commands like this, changing the username "jebba" to your username.
|
||||
|
||||
```
|
||||
# Install dependencies
|
||||
python3 -m pip install --user --upgrade setuptools wheel twine
|
||||
|
||||
# Remove old build
|
||||
rm -rf build dist karoo_gp_*.egg-info
|
||||
|
||||
# Create Archive
|
||||
python3 setup.py sdist bdist_wheel
|
||||
|
||||
# Upload to Test Archive
|
||||
python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*
|
||||
|
||||
# Check Test Archive
|
||||
https://test.pypi.org/project/karoo_gp-jebba
|
||||
|
||||
# Install Test Archive
|
||||
python3 -m pip install --index-url https://test.pypi.org/simple/ --no-deps karoo_gp-jebba
|
||||
|
||||
# Upload to Main Archive
|
||||
python3 -m twine upload dist/*
|
||||
|
||||
# Install Main Archive
|
||||
python3 -m pip install karoo_gp-jebba
|
||||
```
|
||||
|
44
README.md
44
README.md
|
@ -1,44 +0,0 @@
|
|||
# SpaceCruft Fork
|
||||
This is a SpaceCruft fork of https://github.com/kstaats/karoo_gp
|
||||
|
||||
# Karoo GP
|
||||
|
||||
Karoo GP is an evolutionary algorithm, a genetic programming application suite written in Python which supports both
|
||||
symbolic regression and classification data analysis. It is ready to work with your datasets, is multicore and GPU
|
||||
enabled by means of the powerful library TensorFlow. The packge includes a Desktop application with an intuitive user
|
||||
interface, and a Server application which supports fully scripted runs. Output is automatically archived. Batteries
|
||||
included. No programming required.
|
||||
|
||||
For an interesting read on scalar vs vector, and CPU vs GPU performance with Karoo GP:
|
||||
https://arxiv.org/abs/1708.03157
|
||||
|
||||
Be certain to read the User Guide!!!
|
||||
|
||||
Learn more at <a href="http://kstaats.github.io/karoo_gp/">kstaats.github.io/karoo_gp/</a> ...
|
||||
|
||||
|
||||
# Debian Install
|
||||
|
||||
To install on Debian (Buster, Stable, 10):
|
||||
|
||||
```
|
||||
# Install Dependencies:
|
||||
sudo apt install python3 python3-pip python3-venv
|
||||
|
||||
# Clone repo (choose this one or upstream):
|
||||
# git clone https://github.com/kstaats/karoo_gp
|
||||
git clone https://spacecruft.org/spacecruft/karoo_gp
|
||||
|
||||
# Setup
|
||||
cd karoo_gp
|
||||
python3 -m venv .venv
|
||||
source .venv/bin/activate
|
||||
|
||||
# Install python dependencies
|
||||
pip3 install wheel
|
||||
pip3 install numpy==1.16.4 sympy==1.4 tensorflow==1.13.1 scikit-learn==0.21.2
|
||||
|
||||
# Run application
|
||||
python3 karoo_gp.py
|
||||
```
|
||||
|
|
@ -1,664 +0,0 @@
|
|||
2019 06/08
|
||||
|
||||
Finally! Full Python 3.6 support!!!
|
||||
|
||||
And with this update, a substantial number of improvements and modifications. Most are related to the user interface
|
||||
and associated menu. Namely, the (pause) menu is no longer built upon nested loops, therefore the user does not find
|
||||
him or herself unable to conduct a clean exit. The code that supports the text-based queries is reduced in its
|
||||
complexity, and in many cases made more brief. Some re-coloring of the interface text keeps like items in like
|
||||
color schemes. Simple, and does not improve performance, but looks better, overall.
|
||||
|
||||
"Per my prior note (below), I do appreciate your patience and support, and do look forward to your feedback." --kai
|
||||
|
||||
|
||||
2019 05/18
|
||||
|
||||
"My apology to the users of Karoo GP for the incredible gap between the most recent and this update. My research and
|
||||
work have for the past year taken me in other directions. This update marks my return to an active effort in working on
|
||||
Karoo, and GP applied to a growing research space. I appreciate your patience and understanding." --kai
|
||||
|
||||
NOTE: this is the *final* update to the Python 2.7 version of Karoo. All future development will be in Python 3.x.
|
||||
|
||||
And now, the updates:
|
||||
|
||||
Fixed the Test function to evaluate the Tree selected by the user.
|
||||
|
||||
Modified the menu option from 't'est to 'e'valulate from the Pause menu.
|
||||
|
||||
Added a user defined (m)in node count, (f)ull set of features, or (b)oth as the gene_pool regulator. For more about
|
||||
the "full set of features" see 2018 04/19 and the new 'swim' variable.
|
||||
|
||||
|
||||
2018 05/18
|
||||
|
||||
Fixed a bug which automically re-engaged the run after selecting a pause menu option if mid generation. Now, it again
|
||||
requires ENTER before continuing.
|
||||
|
||||
|
||||
2018 05/10
|
||||
|
||||
Returned full_path = os.path.realpath(__file__) (approx. line 342) to support bash scripting of automated runs. This
|
||||
remains commented, but can be readily re-activated (remember to comment the next line down).
|
||||
|
||||
|
||||
2018 04/22
|
||||
|
||||
1) Completed the isolation of the user interface from the base_class such that all mid-run parameter configurations and
|
||||
population summaries are now conducted in menu.pause(), and any associatede executions (Tree validation) are conducted
|
||||
fully in the base_class.
|
||||
|
||||
karoo_gp.py imports karoo_gp_base_class.py
|
||||
karoo_gp_base_class.py imports karoo_gp_pause.py
|
||||
|
||||
The user's initial run configuration is conducted in karoo_gp.py. Those settings are passed into karoo_gp_base_class.py
|
||||
where they are used to guide the run. At each 'pause' (generation, interactive, or debug display modes; or end of run)
|
||||
the user is taken into menu.pause where additional queries and configurations are conducted. Those value changes are
|
||||
returned to the base_class where they are executed. When a run is completed (Server or Desktop), the user is returned
|
||||
to the original karoo_gp.py for salutations and run termination.
|
||||
|
||||
Finally, the Karoo GP Python pasta is no longer spaghetti!
|
||||
|
||||
2) Modified the function of 'cont' such that it either continues if you yet have additional generations to go, or
|
||||
querie the user if gen_id = gen_max and the prior run is done.
|
||||
|
||||
3) Replaced 'generation_id' with 'gen_id' and 'generation_max' with 'gen_max'.
|
||||
|
||||
4) Conducted a full set of unit tests on every user interface query in menu.pause().
|
||||
|
||||
5) Cleaned up the code beneath the user interface (menu.pause), making the while-true loops consistent with those in
|
||||
karoo_gp_pause.py.
|
||||
|
||||
6) Merged 'fx_karoo_continue' into 'fx_karoo_gp' such that a simple while loop maintains an active evolutionary process
|
||||
until the either the Server script is complete, or the user has terminated the run. This allows for the simple addition
|
||||
of generations to an existing run. A far better solution than what I had previously coded.
|
||||
|
||||
7) Discovered that the loading of seed population_s is far too delicate. Even the slightest change and it fails. I have
|
||||
disabled the load function for now, until I have time to rebuild it.
|
||||
|
||||
8) Please note that all modules are now stored in modules/
|
||||
|
||||
|
||||
2018 04/19
|
||||
|
||||
Added a new kind of gene_pool filter (environmental pressure) such that you can select partial or full inclusion of
|
||||
the operands (features). While not yet incorporated into the user interface (desktop or server), the new 'swim' setting
|
||||
enables you to build consecutive gene pools that have *only* Trees that include at least one instance of each feature.
|
||||
This may be helpful for regression problems moreso than classification, as regression tends to fall to a minimum
|
||||
feature set, depending upon the nature of the solution (fixed or rolling value). I desire to merge tree_depth_min
|
||||
setting and this new 'swim' into one user defined system that controls the gene_pool.
|
||||
|
||||
Discovered 3 more functions that did not include a "Called by: ___" statement. Updated.
|
||||
|
||||
Fixed a long-standing issue of total failure if you enter 1 for the total number of generations. This setting, while
|
||||
it may seem odd, allows Karoo GP to be used to create populations of stochastic multivariate expressions based upon the
|
||||
given dataset for use in other applications. Simple fix. The population is written to the runs/ directory as with all
|
||||
other modes of operation, including Play.
|
||||
|
||||
|
||||
2018 04/12c
|
||||
|
||||
Updated the User Guide to match the Desktop and Serve merger, and modified a help print statement in the sys args of
|
||||
the Server function.
|
||||
|
||||
|
||||
2018 04/12b
|
||||
|
||||
Created the 'modules/' directory to hold karoo_base_class and in the future, more modules.
|
||||
|
||||
|
||||
2018 04/12a
|
||||
|
||||
1) Merged 'Karoo GP Server' and 'Karoo GP Main' into a single 'Karoo GP'. So, just one user script now that provides the
|
||||
user interface (TUI) or scripting (comnand line). There are now 3 ways to run Karoo:
|
||||
|
||||
a) $ run karoo_gp.py
|
||||
b) $ run karoo_gp.py [path/][dataset.csv]
|
||||
c) $ run karoo_gp.py -fil [path/][dataset.csv] -[arg] [val] -[arg] [val] ... etc.
|
||||
|
||||
Where [arg][val] are the sysargs defined in the body of karoo_gp.py and the User Guide. Both (a) and (b) will auto-
|
||||
run the Desktop interface, providing a user query for each entry and holding the user within the script until quit;
|
||||
(c) will skip the user query and go directly into execution, dropping the user back to the command line at the end of
|
||||
the run (for scripting).
|
||||
|
||||
|
||||
2) Merged the 'menu' ranges into the while loops, directly (to reduce line count).
|
||||
|
||||
3) Added the 2**(tree_depth_base +1) - 1 to the tree_depth_min calculation (could have done this a long time ago).
|
||||
|
||||
4) Auto-calc the number of trees entered into the Tournament (was previously hard coded to 7 assuming a pop 100).
|
||||
|
||||
5) Added [-evr, -evp, -evb, -evc] to the sysargs to support a change in the balance of the genetic operators mid-run.
|
||||
|
||||
6) Merged fx_evolve_branch_top_copy with fx_evolve_branch_body_copy as they were alway called sequencially and required
|
||||
the same input values.
|
||||
|
||||
7) Merged fx_evolve_tree_renum into fx_eval_generation as both are used only once, as the former was but 2 lines of code.
|
||||
|
||||
8) Finally finished commenting all "Called by: ___" statements in each function header.
|
||||
|
||||
I've been productive!
|
||||
|
||||
|
||||
2018 04/01
|
||||
|
||||
Two major updates, as follows:
|
||||
|
||||
1) I have returned to the basic structure of Karoo GP and worked to make it properly Pythonic. For those of you who
|
||||
recognised the error in my ways, I appreciate your patience. What I have updated with this v1.1 release does not
|
||||
improve performance nor stability (already rock solid), rather, it keeps properly trained developers from cringing
|
||||
when they read my code.
|
||||
|
||||
In the prior versions, I used one of the loose functions of Python that allows the initiation of a variable outside of
|
||||
the base_class. Meaning, I imported the base_class to karoo_gp_main.py and karoo_gp_server.py, called a dozen global
|
||||
variables by "gp.___" and as such initiated them from the user scripts. Yes, it works. But it caused a certain
|
||||
individual with whom I worked at the SKA to yell at me and shake her head (and I had just met her a few days prior).
|
||||
I don't like being yelled at, so I fixed it.
|
||||
|
||||
Now, all user configurations are set as local variables and their values are passed to the base_class.
|
||||
|
||||
To make thing a bit easier to read and follow, I have renamed and reorganized several functions (methods) as follows:
|
||||
|
||||
a) Created a new category for data and archiving, moving/renaming all related functions to fx_data_.
|
||||
|
||||
b) Renamed all fx_gen_ to fx_init_ as this is the initial population.
|
||||
|
||||
c) Moved the four top-level functions used to construct the next generation of trees into their own fx_nextgen_
|
||||
category: fx_karoo_reproduce, fx_nextgen_point_mutate, fx_nextgen_branch_mutate, fx_nextgen_crossover
|
||||
|
||||
The final breakdown is as follows:
|
||||
fx_karoo_ Methods to Run Karoo GP
|
||||
fx_data_ Methods to Load and Archive Data
|
||||
fx_init_ Methods to Construct the 1st Generation
|
||||
fx_eval_ Methods to Evaluate a Tree
|
||||
fx_fitness_ Methods to Train and Test a Tree for Fitness
|
||||
fx_nextgen_ Methods to Construct the next Generation
|
||||
fx_evolve_ Methods to Evolve a Population
|
||||
fx_display_ Methods to Visualize a Tree
|
||||
|
||||
That's it! --kai
|
||||
|
||||
|
||||
2018 02/27
|
||||
Updated the Python library versions and improved some explanation of Operators and Operands in the User Guide.
|
||||
|
||||
|
||||
2017 10/26
|
||||
An upgrade from Tensorflow 1.1 to 1.3 caused the Classify kernel test to break. Fixed by Iurii by replacing [] with ()
|
||||
in the 'fx_fitness_eval' method.
|
||||
|
||||
|
||||
2017 10/17
|
||||
To be consistent with the anticipated Machine Learning vocabulary, replaced the term 'label' with 'pred_labels'
|
||||
(predicted labels) in the TF graph methods.
|
||||
|
||||
|
||||
2017 08/10
|
||||
Iurii fixed a minor bug in which the MATCHING function (used only for demonstrations) would not find a match despite
|
||||
the output being (apprently) correct. This was discovered to be due to the way in which TensorFlow was handling
|
||||
floating points and precision, as follows:
|
||||
|
||||
[ -0.29999995 0.69999981 13.69999981 16.70000076 19.70000076
|
||||
22.70000076 25.70000076 28.70000076 31.70000076 34.70000076]
|
||||
|
||||
[ -0.30000001 0.69999999 13.69999981 16.70000076 19.70000076
|
||||
22.70000076 25.70000076 28.70000076 31.70000076 34.70000076]
|
||||
|
||||
As you can see, the values are close, but not equal and so a "match" was not resolved. Iurii used numpy.allclose.html
|
||||
as a reference to resolve the situation.
|
||||
|
||||
I also modified the autosave to the runs/ directory such that if you are using an external dataset (quite likely), the
|
||||
new directory (for each run) will be saved as [filename]-[date_time_stamp]/ The idea (thank you Marco) is to help keep
|
||||
multiple, automated runs organized and more readily, visually inspected by name alone.
|
||||
|
||||
|
||||
2017 07/21
|
||||
|
||||
In a rather embarrassing, live demo in which I asked for the audience to create the dataset for Karoo, I discovered a
|
||||
bug in the MATCH kernel in which a negative value in the dataset would cause that row to be discarded from the fitness
|
||||
function --FIXED.
|
||||
|
||||
I merged the 3 methods fx_fitness_train_classify, fx_fitness_train_regress, fx_fitness_train_match into fx_fitness_eval
|
||||
in order to reduce the quantity of lines of code and simplify the workflow.
|
||||
|
||||
|
||||
2017 07/03
|
||||
|
||||
I am pleased to announce that Karoo GP is now updated to include a full suite of mathematical operators. I thank the
|
||||
expert code development of Iurii Milovanov. He was instrumental in bringing TensorFlow into Karoo last year, and has
|
||||
now provided this important improvement.
|
||||
|
||||
Iurii has prpared an efficient and elegant solution for the addition of a full range of operators, adding support for
|
||||
boolean operations (a and b or c), comparison ops (a > b <= c == d) and generally speaking any function available in
|
||||
TensorFlow, as given here: https://www.tensorflow.org/api_guides/python/math_ops
|
||||
|
||||
Now there is a mapping in Karoo GP that connects an expression to the TF function:
|
||||
|
||||
OPERATOR EXAMPLE
|
||||
add a + b
|
||||
subtract a - b
|
||||
multiply a * b
|
||||
divide a / b
|
||||
pow a ** 2
|
||||
|
||||
negative -a
|
||||
logical_and a and b
|
||||
logical_or a or b
|
||||
logical_not not a
|
||||
equal a == b
|
||||
not_equal a != b
|
||||
less a < b
|
||||
less_equal a <= b
|
||||
greater a > b
|
||||
greater_equal a >= 1
|
||||
|
||||
abs abs(a)
|
||||
sign sign(a)
|
||||
square square(a)
|
||||
sqrt sqrt(a)
|
||||
pow pow(a, b)
|
||||
log log(a)
|
||||
log1p log1p(a)
|
||||
cos cos(a)
|
||||
sin sin(a)
|
||||
tan tan(a)
|
||||
acos acos(a)
|
||||
asin asin(a)
|
||||
atan atan(a)
|
||||
|
||||
Now when Karoo parses an expression like "asin(x + 10)" it first parses and transforms the args "x + 10" and passes
|
||||
the output to “tf.asin” function. So now Karoo is able to evaluate incredibly complx mathematical expressions.
|
||||
|
||||
It is important to refer to karoo_gp/files/templates/operators_list.txt to learn how to enage operators_[KERNEL].csv
|
||||
In its current form Karoo requires some operators, such as abs, cos, and sin to have a unique formating:
|
||||
|
||||
+ sin,2
|
||||
- sin,2
|
||||
* sin,2
|
||||
/ sin,2
|
||||
|
||||
In a future version of Karoo, this will be managed automatically by the recursive function which extracts the
|
||||
expression from a GP Tree.
|
||||
|
||||
|
||||
2017 06/06
|
||||
|
||||
A number of changes applied in March and April. My apologies for the delayed updates to github.
|
||||
|
||||
A timer is added. This is helpful when conducting comparisons of run times, given various configurations and datasets.
|
||||
If you go looking for this code, search for 'time.time' in _main.py for the Desktop interface, and in _base_class.py
|
||||
for the Server interface.
|
||||
|
||||
Raised tree_depth_max to 100 in _main in order to essentially remove the tree depth ceiling, allowing for the multi-
|
||||
generational increase in tree depth. While this re-introduces bloat, it does provide for a greater degree of
|
||||
experimental freedom. A reminder that the _server has always allowed for tree_depth_max to be set to any level.
|
||||
|
||||
Changed the balance of operators (reproduction, mutation, crossover) from a percentage to a fixed quantity in both the
|
||||
default settings and in the user defined alteration.
|
||||
|
||||
The User Guide is updated with some minor adjustments to wording.
|
||||
|
||||
I have removed tools/ from Karoo package, as these will be re-launched as their own set of packages and associated
|
||||
github repository. I am working to give each a proper interface and more broad functionality outside of the
|
||||
Karoo package. Stay tuned!
|
||||
|
||||
Please also note that the variable os.environ (line 28 in _base_class.py) can be set to [0, 1, 2] to trigger 3 levels
|
||||
of on-screen, TensorFlow run-time error logging. You can experiment with this to determine what is right for you.
|
||||
|
||||
The much desired trig operators will be returned to Karoo GP v1.0.4. Log and boolean operators shortly thereafter. I
|
||||
offer my apology for the delay, as I know this has inhibited some expanded uses of Karoo in the past few months.
|
||||
|
||||
|
||||
2017 02/13
|
||||
|
||||
Returned 'cwd = os.getcwd()' to 'cwd = os.path.dirname(full_path)' in fx_karoo_data_load in order to sustain chron
|
||||
compliance (sorry Marco). Then split end-of-run logging into 2 files: runtime_config.txt and test.txt. Looking to the
|
||||
future in which the test log, in particular, might be stored in such a way as to be readily parsed by an external
|
||||
script for automated comparison of multiple runs.
|
||||
|
||||
Ideas are welcomed!
|
||||
|
||||
|
||||
2017 02/09
|
||||
|
||||
The User Guide has been updated to match the functions of Karoo GP v1.0.1.
|
||||
|
||||
|
||||
2017 02/08
|
||||
|
||||
The parameters.txt file now captures the full run-time configuration of both karoo_gp_main.py and karoo_gp_server.py.
|
||||
This file is written to a unique (datetime stamp) directory in karoo_gp/runs/ at the auto-termination of _server.py
|
||||
and with the user executed 'q'uit of _main.py.
|
||||
|
||||
The final list of best fit evolved Trees and the test of the highest numbered (usually the highest performing) Tree is
|
||||
also recorded, with the test automatically executed based upon the original kernel designation. This functionality
|
||||
supports the fully hands-off execution of Karoo GP on a remote server, from a bash or Python script, for parallel or
|
||||
multiple serial evolutionary runs.
|
||||
|
||||
Thank you Marco Cavaglia for guiding the addition of this functionality to Karoo GP!
|
||||
|
||||
|
||||
2017 02/06
|
||||
|
||||
Graphics Processing Units (GPU) are now supported with the introduction of the Python library TensorFlow. The end
|
||||
result is a staggering improvement in performance. With one comparison of a 10,000 data points (rows) x 9 features
|
||||
(columns) dataset on a 40 core Intel Xeon motherboard versus a 2000 core Nvidia GPU card, the wall time was reduced
|
||||
from 50 hours to less than 4 minutes. On CPU-only computers, the performance on a single core is as much as 10x
|
||||
improved due to the vectorisation of the data and application of the C-based TensorFlow maths library.
|
||||
|
||||
To install TensorFlow, I recommend visiting https://www.tensorflow.org/get_started/ It is straight forward for Ubuntu,
|
||||
but unfortunately can be rather challenging with OSX. Have patience. Review the forums. It's worth the effort.
|
||||
|
||||
I owe many thanks to the expertise of Iurii Milovanov, a contract developer whom I engaged for this effort. While the
|
||||
number of lines of Karoo GP modified were initially less than a dozen (replacing the multi-core pprocess calls), I asked
|
||||
Iurii to also rewrite the test functions. As such, both Training and Testing are now fully GPU enabled. Thank you!
|
||||
|
||||
A number of other changes have been integrated, including:
|
||||
|
||||
- Karoo GP is now developed against Python 2.7 as provided with Ubuntu Desktop 16.04.1.
|
||||
|
||||
- A number of Python methods have been deleted, added, modified and/or renamed. In particular, in the category
|
||||
'fx_fitness_' If you have built your own code based on the Karoo methods, please review this section carefully.
|
||||
|
||||
- The user engaged 'bal'ance function (pause menu) has been rebuilt to anticipate exact quantities instead of
|
||||
percentages, enabling the user to define precisely how many of each of the four genetic operators will be applied
|
||||
with the construction of each subsequent population.
|
||||
|
||||
- Activation of the 'test' is now conducted with only the letter 't' and the option to engage a specific number of
|
||||
'c'ores is removed. Therefore, the 't'imer mode is also removed, as this was a means to discover the optimal number
|
||||
for multi-core processing which is now automated by TensorFlow.
|
||||
|
||||
- The libraries 'pprocess' and 'time' are no longer required nor imported.
|
||||
|
||||
- The population_* files (.csv) are now written into unique directories created inside of karoo_gp/runs/ with the
|
||||
launch of each run. A .txt file is also written to each directory which captures the run-time configuration of
|
||||
Karoo GP. This enables truly scriptable runs of Karoo.
|
||||
|
||||
- The Server interface to Karoo GP (karoo_gp_server.py) now terminates completely, kicking back to the command line.
|
||||
This enables bash or chron launches of multiple sequential or parallel runs, enabling the exploration of multiple
|
||||
runs with identical configuration, or that of varied configuration parameters.
|
||||
|
||||
Finally, Karoo GP is now a 1.0 release. I never know when to transition from beta to real, so please forgive me if I
|
||||
jumped the gun. But with GPU support and the revised Server script, I have find Karoo GP to be a fully functional,
|
||||
powerful machine learning tool. I hope you will agree --kai
|
||||
|
||||
|
||||
2016 09/20
|
||||
|
||||
Fixed the genetic operator (b)alance function to work with large than 100 trees per population.
|
||||
|
||||
Introduced the pause for all runtime modes in the Desktop application, such that the user can apply configurations prior
|
||||
to the run (eg: change the balance of the genetic operators or the number of engaged cores).
|
||||
|
||||
|
||||
2016 09/19b
|
||||
|
||||
After another 2 hours of trouble shooting, I learned that sympy.subs throws the 'zoo' error for a divide-by-zero if
|
||||
working with integers--and stalls (as I witnessed last year when developing Karoo), but if throws 'inf' or '-inf' if
|
||||
working with floats and continues to process unencumbered. This means the 'zoo' trap has not been used for over a year.
|
||||
It is now removed from the method fx_eval_subs().
|
||||
|
||||
|
||||
2016 09/19
|
||||
|
||||
All experiments with lambdify are on hold as it is throwing 'divide by zero' errors when no 0 exists in the data.
|
||||
|
||||
In the evaluation of this issue, I returned to the means by which I deal with 'divide by zero', independent of the
|
||||
library used to process the trees. Originally, 'result' was replaced by the value 1. But a colleague suggested that I
|
||||
might be tossing genetic material of value to future generations. So, now a tree which produces a 'divide by zero'
|
||||
error ('zoo' in .subs) is retained, but given a fitness score of 0.
|
||||
|
||||
Method fx_eval_subs() is updated to assign an 'error' tag to any tree which exhibits 'divide by zero' behaviour.
|
||||
|
||||
Method fx_fitness_eval() is updated to bypass processing of a tree which has been tagged with an 'error' tag.
|
||||
|
||||
Methods fx_test_classify(), fx_test_regress(), and fx_test_match() are each updated to send the 'tree_id' to
|
||||
fx_eval_subs() as is now required.
|
||||
|
||||
For now, it is not recommended that you use the lambdify function in fx_eval_subs(), unless you know how to fix it.
|
||||
|
||||
|
||||
2016 09/16
|
||||
|
||||
With the 09/14 update I failed to upload the new coefficients.csv file to the files/ directory. While not yet engaged,
|
||||
this will be the means by which the user can define the constants desired for the Karoo GP run. If you had run Karoo GP
|
||||
v0.9.2.0 in the past 24 hours without this file, it would have complained. My apology.
|
||||
|
||||
Also, a bit of a road map for the 2nd half of 2016, into 2017
|
||||
- validate the new (faster) sympy.lambdify and fully replace the current (slower) sympy.subs
|
||||
- replace the row-by-row dictionaries with vectors for what should be a significant performance increase
|
||||
- complete the introduction of constants in a manner more well defined than is currently supported
|
||||
- investigate replacing pprocess with the multi-core library
|
||||
- introduce Theano or Tensor Flow for GPU support
|
||||
|
||||
I welcome any assistance with these, if anyone has experience and time.
|
||||
|
||||
|
||||
2016 09/14 - version 0.9.2.0
|
||||
|
||||
In karoo_gp_base_class.py
|
||||
- Removed redundant lines in the method 'fx_karoo_data_load()'
|
||||
- Added support for the Sympy 'lambdify' function in 'fx_karoo_data_load' (see explanation below)
|
||||
- Added a draft means of catching divide-by-zero errors in the new 'lambdify' function
|
||||
- Discovered the prior 'fx_eval_subs' uncorrectly applied a value of 1 to the variable 'result' as a means to
|
||||
replace the 'zoo' function for divide by zero errors. However, this could inadvertently undermine the success of
|
||||
Classification and Regression runs. My apology for not catching this sooner.
|
||||
|
||||
"While attending the CHEAPR 2016 workshop hosted by the Center for Cosmology and Astro-Particle Physics, The Ohio State
|
||||
University, Michael Zevin of Northwestern University proposed that Karoo GP *should* be able to process trees far faster
|
||||
than what we were seeing. I looked into the Sympy functions I was at that time using. Indeed, '.subs' is noted as easy
|
||||
to use, but terribly slow as it relies upon an internal, Python mathematical library. I therefore replaced '.subs' with
|
||||
'.lambdify' which calls upon the C-based Numpy maths library. It is slated to be 500x faster than '.subs', but I am
|
||||
seeing only a 2x performance increase. Clearly, there are yet other barriers to remove.
|
||||
|
||||
In the new 'fx_eval_subs' method you will find both sympy.subs (active) and sympy.lambdify. While preliminary tests
|
||||
worked well, I witnessed an erratic outcome which I yet need to reproduce and investigate. Feel free to comment the
|
||||
.subs and uncomment the .lambdify sections and take it for a spin.
|
||||
|
||||
I believe there are 2 more steps to increase performance: removing the dictionaries which contain each row, such that
|
||||
Karoo is working directly with the Numpy array again, and then processing the array as a vector instead. But this will
|
||||
require substantial recoding.
|
||||
|
||||
I'll keep you informed ..." --kai
|
||||
|
||||
|
||||
2016 08/08 - version 0.9.1.9
|
||||
|
||||
In karoo_gp_base_class.py
|
||||
- Created a new method 'fx_eval_subs()' which conducts the SymPy subs function for both train and test data.
|
||||
- Consolidated duplicate SymPy sub calls in both Train and Test methods, at Erik H. suggestion --thank you!
|
||||
- Consolidated duplicate lines into single lines in both Train and Test methods.
|
||||
- Fixed bug in which Ramped 50/50 trees would not print in Play mode; removed Ramped 50/50 option from Play mode as
|
||||
it does not make sense for a single Tree
|
||||
|
||||
|
||||
2016 07/24 - version 0.9.1.8b
|
||||
|
||||
Sorry. Switched all references to "LOGIC" back to "BOOLEAN". Don't ask.
|
||||
|
||||
|
||||
2016 07/18 - version 0.9.1.8
|
||||
|
||||
In karoo_gp_base_class.py
|
||||
- removed some programmer's comments from experiments resolved
|
||||
- modified the screen output for the multi-class classifier such that it is more clear that p (a) is actually
|
||||
predicted (actual) with the addition of the tag "label"
|
||||
|
||||
|
||||
|
||||
2016 07/15 - version 0.9.1.7
|
||||
|
||||
In karoo_gp_base_class.py
|
||||
- Ramped Half/Half, as originally designed by John Koza is now implemented!
|
||||
- this offers a greater diversity of trees in the initial population
|
||||
- added *** Crossover *** to this method for debug display mode
|
||||
|
||||
|
||||
|
||||
2016 07/14 - version 0.9.1.6b
|
||||
|
||||
In karoo_gp_base_class.py
|
||||
- fixed 'debug' display output for branch mutation
|
||||
- fixed a few bugs in branch mutation that reduced evolutionary efficiency
|
||||
- updated all ERROR messages to be uniform in output
|
||||
- added (y/n) to "Are you certain you want to quit?" message --thanks Hunter!
|
||||
|
||||
In karoo_gp_main.py
|
||||
- reset default evolutionary balance to .1/.1/.1/.7
|
||||
|
||||
|
||||
|
||||
2016 07/13 - version 0.9.1.6
|
||||
|
||||
In karoo_gp_base_class.py
|
||||
- enabled auto counting of labels (right column) in loaded data (data_y)
|
||||
- re-ordered presentation of screen modes, in order of decreasing feedback [i, g, m, s]
|
||||
- added argparse to further enhance karoo_gp_server.py as a scriptable tool --FINALLY! :)
|
||||
|
||||
In karoo_gp_main.py
|
||||
- removed user query for number of class labels
|
||||
- re-ordered presentation of screen modes, in order of decreasing feedback [i, g, m, s]
|
||||
|
||||
In karoo_go_server.py
|
||||
- re-ordered presentation of screen modes, in order of decreasing feedback [i, g, m, s]
|
||||
- argparse to further enhance karoo_gp_server.py as a scriptable tool
|
||||
|
||||
|
||||
|
||||
2016 07/11 - version 0.9.1.5
|
||||
|
||||
In karoo_gp_base_class.py
|
||||
- renamed kernel (fitness function) type from 'a' to 'r' for regression
|
||||
- renamed all associated variable and methods to match switch from 'abs_value' to 'regression'
|
||||
- reorganised validation methods to match order of fitness functions
|
||||
- added [other] place holder to validation methods
|
||||
|
||||
In karoo_gp_main.py
|
||||
- renamed kernel (fitness function) type from 'a' to 'r' for regression
|
||||
- adjusted upper boundary for qty of generations from 1000 to 100
|
||||
|
||||
In karoo_go_server.py
|
||||
- renamed kernel (fitness function) type from 'a' to 'r' for regression
|
||||
|
||||
In files/ data_ABS.csv and functions_ABS.csv were rename data_REGRESS.csv and functions_REGRESS.csv accordingly.
|
||||
|
||||
|
||||
|
||||
2016 07/10-11 - version 0.9.1.4
|
||||
|
||||
In karoo_gp_base_class.py
|
||||
- renamed variable 'tree_depth_max' to 'tree_depth_base'
|
||||
- renamed variable 'tree_depth_adj' to 'tree_depth_max'
|
||||
- renamed variable 'gp.pop_tree_depth_max' to 'gp.pop_tree_depth_base'
|
||||
- enabled 2 children to be produced by each Crossover function
|
||||
- extensive testing of Crossover in debug to validate process
|
||||
- reduced # of crossover functions per run by 1/2
|
||||
- improved on-screen output for all 4 genetic operators
|
||||
- removed not-in-use 'accuracy' test
|
||||
- added 'Arguments required:' to each method notes
|
||||
- edited a number of method notes
|
||||
|
||||
In karoo_gp_main.py
|
||||
- renamed variables (according to karoo_gp_base_class.py)
|
||||
|
||||
In karoo_go_server.py
|
||||
- renamed variables (according to karoo_gp_base_class.py)
|
||||
|
||||
|
||||
|
||||
2016 07/08-09 - version 0.9.1.3
|
||||
|
||||
In karoo_gp_base_class.py
|
||||
- added CTRL-C catch to the (pause) menu; removes potential to accidentally kill a run when attempting to
|
||||
copy/paste an on-screen function to research notes (use the mouse instead).
|
||||
- rebuilt each (pause) menu function for improved exception handling
|
||||
- added the new gp.tree_depth_adj user defined variable to branch mutation and crossover, enabling Trees to grow
|
||||
beyond their original size which adds opportunity for more complex solutions, as well as the unavoidable bloat
|
||||
- reduced complexity of a few lines in both branch mutation and crossover methods
|
||||
- tested, tested, tested
|
||||
|
||||
In karoo_gp_main.py
|
||||
- added CTRL-C catch to the at-launch user menu.
|
||||
- renamed the method gp.fx_karoo_crossover_reproduction() to gp.fx_karoo_crossover()
|
||||
- added user input for the new global variable gp.tree_depth_adj
|
||||
|
||||
In karoo_go_server.py
|
||||
- added new gp.tree_depth_adj variable
|
||||
|
||||
|
||||
|
||||
2016 07/07 - version 0.9.1.2
|
||||
|
||||
In preparation for public launch of Karoo GP, a number of updates are complete or underway.
|
||||
|
||||
The Quick Start Tutorial is being fully revised. A number of corrections were made, but more importantly, all new
|
||||
content has been added relevant to preparation of datasets and the use of the Karoo GP Tools accordingly. The genetic
|
||||
operators descriptions now feature visuals and revised descriptions, as to many other sections.
|
||||
|
||||
In the karoo_gp/tools/ directory, all scripts have undergone updates, 2 of which now offer automated scaling and a
|
||||
user interface that in the original versions were not present, as follows:
|
||||
|
||||
karoo_data_sort.py (formerly karoo_features_sort.py)
|
||||
This script now engages the user with a query for the number of class labels and the number of data points (rows)
|
||||
for the new, randomly generated subset of the parent dataset. This script is designed to be used prior to
|
||||
karoo_normalise.py.
|
||||
|
||||
karoo_normalise.py
|
||||
This script now auto-scales to any number of columns and rows (within the limit of your computer's capability),
|
||||
and features a text-based user interface. This script is designed to be used following karoo_data_sort.py.
|
||||
|
||||
karoo_multi-classifier.py
|
||||
This script functions as before, but with a minor bug fixed in which the final class was mislabeled.
|
||||
|
||||
karoo_iris_plot.py
|
||||
This script functions as before, but with improved in-script documentation and cleaner code.
|
||||
|
||||
|
||||
In development now are a number of updates and improvements to the base_class such that Karoo GP will more readily
|
||||
conform to the GP standards, as follows:
|
||||
|
||||
1) Karoo GP currently produces only 1 offspring for each parent, where it should produce 2.
|
||||
|
||||
2) The tree generation method 'Ramped Half/Half', in its current state, produces a 50/50 split of Full and Grow
|
||||
methods, not a graduated ramp through all depths.
|
||||
|
||||
3) Karoo GP currently engages a bloat inhibitor, that is, an upper limit on tree depth which is maintained through
|
||||
all modes of mutation and crossover. This will become a user defined setting such that it can be adjusted, enabling
|
||||
growth of trees beyond the original, user defined limit.
|
||||
|
||||
4) Karoo GP will be made to launch as a single, command-line function with all required parameters included, SciKit
|
||||
Learn style.
|
||||
|
||||
|
||||
|
||||
2015 12/23 - version 0.9.1.1
|
||||
|
||||
It was discovered that when loading external datasets, Karoo was yet extracting variables (terminals) from the data in
|
||||
the files/ directory, according to the selected kernel.
|
||||
|
||||
This is fixed.
|
||||
|
||||
|
||||
|
||||
2015 11/04 - version 0.9.1.0
|
||||
|
||||
Initial development of Karoo GP began in February 2015, on a Python-based evolutionary algorithm for an MSc research
|
||||
project at the University of Cape Town (UCT) / African Institute for Mathematical Sciences (AIMS) and the Square
|
||||
Kilometer Array (SKA). The myriad debug statements evolved into the user interface while the classic Machine Learning
|
||||
test cases became the built-in example runs.
|
||||
|
||||
In the course of six months development, the code base grew to become a flexible, easy-to-use platform for Genetic
|
||||
Programming.
|
||||
|
||||
Karoo GP has been thoroughly tested on a 40-core server at the Square Kilometer Array offices in Cape Town, South
|
||||
Africa, where for one month it chewed through 10,000 rows of data for up to 50 hours without incident. It is proved
|
||||
as a fully functional, multi-core workhorse.
|
||||
|
||||
With all development to date conducted locally, this version 0.9 marks the first release to github.
|
||||
|
||||
This initial github release is private, shared with select collaborators only. Please do not distribute any part of
|
||||
the code until it is made public.
|
||||
|
||||
Kai Staats
|
||||
|
||||
www.kaistaats.com/research/
|
||||
www.kaistaats.com/film/
|
Binary file not shown.
|
@ -1,69 +0,0 @@
|
|||
1. Title: Iris Plants Database
|
||||
Updated Sept 21 by C.Blake - Added discrepency information
|
||||
|
||||
2. Sources:
|
||||
(a) Creator: R.A. Fisher
|
||||
(b) Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov)
|
||||
(c) Date: July, 1988
|
||||
|
||||
3. Past Usage:
|
||||
- Publications: too many to mention!!! Here are a few.
|
||||
1. Fisher,R.A. "The use of multiple measurements in taxonomic problems"
|
||||
Annual Eugenics, 7, Part II, 179-188 (1936); also in "Contributions
|
||||
to Mathematical Statistics" (John Wiley, NY, 1950).
|
||||
2. Duda,R.O., & Hart,P.E. (1973) Pattern Classification and Scene Analysis.
|
||||
(Q327.D83) John Wiley & Sons. ISBN 0-471-22361-1. See page 218.
|
||||
3. Dasarathy, B.V. (1980) "Nosing Around the Neighborhood: A New System
|
||||
Structure and Classification Rule for Recognition in Partially Exposed
|
||||
Environments". IEEE Transactions on Pattern Analysis and Machine
|
||||
Intelligence, Vol. PAMI-2, No. 1, 67-71.
|
||||
-- Results:
|
||||
-- very low misclassification rates (0% for the setosa class)
|
||||
4. Gates, G.W. (1972) "The Reduced Nearest Neighbor Rule". IEEE
|
||||
Transactions on Information Theory, May 1972, 431-433.
|
||||
-- Results:
|
||||
-- very low misclassification rates again
|
||||
5. See also: 1988 MLC Proceedings, 54-64. Cheeseman et al's AUTOCLASS II
|
||||
conceptual clustering system finds 3 classes in the data.
|
||||
|
||||
4. Relevant Information:
|
||||
--- This is perhaps the best known database to be found in the pattern
|
||||
recognition literature. Fisher's paper is a classic in the field
|
||||
and is referenced frequently to this day. (See Duda & Hart, for
|
||||
example.) The data set contains 3 classes of 50 instances each,
|
||||
where each class refers to a type of iris plant. One class is
|
||||
linearly separable from the other 2; the latter are NOT linearly
|
||||
separable from each other.
|
||||
--- Predicted attribute: class of iris plant.
|
||||
--- This is an exceedingly simple domain.
|
||||
--- This data differs from the data presented in Fishers article
|
||||
(identified by Steve Chadwick, spchadwick@espeedaz.net )
|
||||
The 35th sample should be: 4.9,3.1,1.5,0.2,"Iris-setosa"
|
||||
where the error is in the fourth feature.
|
||||
The 38th sample: 4.9,3.6,1.4,0.1,"Iris-setosa"
|
||||
where the errors are in the second and third features.
|
||||
|
||||
5. Number of Instances: 150 (50 in each of three classes)
|
||||
|
||||
6. Number of Attributes: 4 numeric, predictive attributes and the class
|
||||
|
||||
7. Attribute Information:
|
||||
1. sepal length in cm
|
||||
2. sepal width in cm
|
||||
3. petal length in cm
|
||||
4. petal width in cm
|
||||
5. class:
|
||||
-- Iris Setosa
|
||||
-- Iris Versicolour
|
||||
-- Iris Virginica
|
||||
|
||||
8. Missing Attribute Values: None
|
||||
|
||||
Summary Statistics:
|
||||
Min Max Mean SD Class Correlation
|
||||
sepal length: 4.3 7.9 5.84 0.83 0.7826
|
||||
sepal width: 2.0 4.4 3.05 0.43 -0.4194
|
||||
petal length: 1.0 6.9 3.76 1.76 0.9490 (high!)
|
||||
petal width: 0.1 2.5 1.20 0.76 0.9565 (high!)
|
||||
|
||||
9. Class Distribution: 33.3% for each of 3 classes.
|
|
@ -1,101 +0,0 @@
|
|||
a,b,c,s
|
||||
5.1,3.5,1.4,0
|
||||
4.9,3,1.4,0
|
||||
4.7,3.2,1.3,0
|
||||
4.6,3.1,1.5,0
|
||||
5,3.6,1.4,0
|
||||
5.4,3.9,1.7,0
|
||||
4.6,3.4,1.4,0
|
||||
5,3.4,1.5,0
|
||||
4.4,2.9,1.4,0
|
||||
4.9,3.1,1.5,0
|
||||
5.4,3.7,1.5,0
|
||||
4.8,3.4,1.6,0
|
||||
4.8,3,1.4,0
|
||||
4.3,3,1.1,0
|
||||
5.8,4,1.2,0
|
||||
5.7,4.4,1.5,0
|
||||
5.4,3.9,1.3,0
|
||||
5.1,3.5,1.4,0
|
||||
5.7,3.8,1.7,0
|
||||
5.1,3.8,1.5,0
|
||||
5.4,3.4,1.7,0
|
||||
5.1,3.7,1.5,0
|
||||
4.6,3.6,1,0
|
||||
5.1,3.3,1.7,0
|
||||
4.8,3.4,1.9,0
|
||||
5,3,1.6,0
|
||||
5,3.4,1.6,0
|
||||
5.2,3.5,1.5,0
|
||||
5.2,3.4,1.4,0
|
||||
4.7,3.2,1.6,0
|
||||
4.8,3.1,1.6,0
|
||||
5.4,3.4,1.5,0
|
||||
5.2,4.1,1.5,0
|
||||
5.5,4.2,1.4,0
|
||||
4.9,3.1,1.5,0
|
||||
5,3.2,1.2,0
|
||||
5.5,3.5,1.3,0
|
||||
4.9,3.6,1.4,0
|
||||
4.4,3,1.3,0
|
||||
5.1,3.4,1.5,0
|
||||
5,3.5,1.3,0
|
||||
4.5,2.3,1.3,0
|
||||
4.4,3.2,1.3,0
|
||||
5,3.5,1.6,0
|
||||
5.1,3.8,1.9,0
|
||||
4.8,3,1.4,0
|
||||
5.1,3.8,1.6,0
|
||||
4.6,3.2,1.4,0
|
||||
5.3,3.7,1.5,0
|
||||
5,3.3,1.4,0
|
||||
7,3.2,4.7,1
|
||||
6.4,3.2,4.5,1
|
||||
6.9,3.1,4.9,1
|
||||
5.5,2.3,4,1
|
||||
6.5,2.8,4.6,1
|
||||
5.7,2.8,4.5,1
|
||||
6.3,3.3,4.7,1
|
||||
4.9,2.4,3.3,1
|
||||
6.6,2.9,4.6,1
|
||||
5.2,2.7,3.9,1
|
||||
5,2,3.5,1
|
||||
5.9,3,4.2,1
|
||||
6,2.2,4,1
|
||||
6.1,2.9,4.7,1
|
||||
5.6,2.9,3.6,1
|
||||
6.7,3.1,4.4,1
|
||||
5.6,3,4.5,1
|
||||
5.8,2.7,4.1,1
|
||||
6.2,2.2,4.5,1
|
||||
5.6,2.5,3.9,1
|
||||
5.9,3.2,4.8,1
|
||||
6.1,2.8,4,1
|
||||
6.3,2.5,4.9,1
|
||||
6.1,2.8,4.7,1
|
||||
6.4,2.9,4.3,1
|
||||
6.6,3,4.4,1
|
||||
6.8,2.8,4.8,1
|
||||
6.7,3,5,1
|
||||
6,2.9,4.5,1
|
||||
5.7,2.6,3.5,1
|
||||
5.5,2.4,3.8,1
|
||||
5.5,2.4,3.7,1
|
||||
5.8,2.7,3.9,1
|
||||
6,2.7,5.1,1
|
||||
5.4,3,4.5,1
|
||||
6,3.4,4.5,1
|
||||
6.7,3.1,4.7,1
|
||||
6.3,2.3,4.4,1
|
||||
5.6,3,4.1,1
|
||||
5.5,2.5,4,1
|
||||
5.5,2.6,4.4,1
|
||||
6.1,3,4.6,1
|
||||
5.8,2.6,4,1
|
||||
5,2.3,3.3,1
|
||||
5.6,2.7,4.2,1
|
||||
5.7,3,4.2,1
|
||||
5.7,2.9,4.2,1
|
||||
6.2,2.9,4.3,1
|
||||
5.1,2.5,3,1
|
||||
5.7,2.8,4.1,1
|
|
|
@ -1,101 +0,0 @@
|
|||
a,b,c,d,s
|
||||
5.1,3.5,1.4,0.2,0
|
||||
4.9,3.0,1.4,0.2,0
|
||||
4.7,3.2,1.3,0.2,0
|
||||
4.6,3.1,1.5,0.2,0
|
||||
5.0,3.6,1.4,0.2,0
|
||||
5.4,3.9,1.7,0.4,0
|
||||
4.6,3.4,1.4,0.3,0
|
||||
5.0,3.4,1.5,0.2,0
|
||||
4.4,2.9,1.4,0.2,0
|
||||
4.9,3.1,1.5,0.1,0
|
||||
5.4,3.7,1.5,0.2,0
|
||||
4.8,3.4,1.6,0.2,0
|
||||
4.8,3.0,1.4,0.1,0
|
||||
4.3,3.0,1.1,0.1,0
|
||||
5.8,4.0,1.2,0.2,0
|
||||
5.7,4.4,1.5,0.4,0
|
||||
5.4,3.9,1.3,0.4,0
|
||||
5.1,3.5,1.4,0.3,0
|
||||
5.7,3.8,1.7,0.3,0
|
||||
5.1,3.8,1.5,0.3,0
|
||||
5.4,3.4,1.7,0.2,0
|
||||
5.1,3.7,1.5,0.4,0
|
||||
4.6,3.6,1.0,0.2,0
|
||||
5.1,3.3,1.7,0.5,0
|
||||
4.8,3.4,1.9,0.2,0
|
||||
5.0,3.0,1.6,0.2,0
|
||||
5.0,3.4,1.6,0.4,0
|
||||
5.2,3.5,1.5,0.2,0
|
||||
5.2,3.4,1.4,0.2,0
|
||||
4.7,3.2,1.6,0.2,0
|
||||
4.8,3.1,1.6,0.2,0
|
||||
5.4,3.4,1.5,0.4,0
|
||||
5.2,4.1,1.5,0.1,0
|
||||
5.5,4.2,1.4,0.2,0
|
||||
4.9,3.1,1.5,0.2,0
|
||||
5.0,3.2,1.2,0.2,0
|
||||
5.5,3.5,1.3,0.2,0
|
||||
4.9,3.6,1.4,0.1,0
|
||||
4.4,3.0,1.3,0.2,0
|
||||
5.1,3.4,1.5,0.2,0
|
||||
5.0,3.5,1.3,0.3,0
|
||||
4.5,2.3,1.3,0.3,0
|
||||
4.4,3.2,1.3,0.2,0
|
||||
5.0,3.5,1.6,0.6,0
|
||||
5.1,3.8,1.9,0.4,0
|
||||
4.8,3.0,1.4,0.3,0
|
||||
5.1,3.8,1.6,0.2,0
|
||||
4.6,3.2,1.4,0.2,0
|
||||
5.3,3.7,1.5,0.2,0
|
||||
5.0,3.3,1.4,0.2,0
|
||||
7.0,3.2,4.7,1.4,1
|
||||
6.4,3.2,4.5,1.5,1
|
||||
6.9,3.1,4.9,1.5,1
|
||||
5.5,2.3,4.0,1.3,1
|
||||
6.5,2.8,4.6,1.5,1
|
||||
5.7,2.8,4.5,1.3,1
|
||||
6.3,3.3,4.7,1.6,1
|
||||
4.9,2.4,3.3,1.0,1
|
||||
6.6,2.9,4.6,1.3,1
|
||||
5.2,2.7,3.9,1.4,1
|
||||
5.0,2.0,3.5,1.0,1
|
||||
5.9,3.0,4.2,1.5,1
|
||||
6.0,2.2,4.0,1.0,1
|
||||
6.1,2.9,4.7,1.4,1
|
||||
5.6,2.9,3.6,1.3,1
|
||||
6.7,3.1,4.4,1.4,1
|
||||
5.6,3.0,4.5,1.5,1
|
||||
5.8,2.7,4.1,1.0,1
|
||||
6.2,2.2,4.5,1.5,1
|
||||
5.6,2.5,3.9,1.1,1
|
||||
5.9,3.2,4.8,1.8,1
|
||||
6.1,2.8,4.0,1.3,1
|
||||
6.3,2.5,4.9,1.5,1
|
||||
6.1,2.8,4.7,1.2,1
|
||||
6.4,2.9,4.3,1.3,1
|
||||
6.6,3.0,4.4,1.4,1
|
||||
6.8,2.8,4.8,1.4,1
|
||||
6.7,3.0,5.0,1.7,1
|
||||
6.0,2.9,4.5,1.5,1
|
||||
5.7,2.6,3.5,1.0,1
|
||||
5.5,2.4,3.8,1.1,1
|
||||
5.5,2.4,3.7,1.0,1
|
||||
5.8,2.7,3.9,1.2,1
|
||||
6.0,2.7,5.1,1.6,1
|
||||
5.4,3.0,4.5,1.5,1
|
||||
6.0,3.4,4.5,1.6,1
|
||||
6.7,3.1,4.7,1.5,1
|
||||
6.3,2.3,4.4,1.3,1
|
||||
5.6,3.0,4.1,1.3,1
|
||||
5.5,2.5,4.0,1.3,1
|
||||
5.5,2.6,4.4,1.2,1
|
||||
6.1,3.0,4.6,1.4,1
|
||||
5.8,2.6,4.0,1.2,1
|
||||
5.0,2.3,3.3,1.0,1
|
||||
5.6,2.7,4.2,1.3,1
|
||||
5.7,3.0,4.2,1.2,1
|
||||
5.7,2.9,4.2,1.3,1
|
||||
6.2,2.9,4.3,1.3,1
|
||||
5.1,2.5,3.0,1.1,1
|
||||
5.7,2.8,4.1,1.3,1
|
|
|
@ -1,100 +0,0 @@
|
|||
7,3.2,4.7,0
|
||||
6.4,3.2,4.5,0
|
||||
6.9,3.1,4.9,0
|
||||
5.5,2.3,4,0
|
||||
6.5,2.8,4.6,0
|
||||
5.7,2.8,4.5,0
|
||||
6.3,3.3,4.7,0
|
||||
4.9,2.4,3.3,0
|
||||
6.6,2.9,4.6,0
|
||||
5.2,2.7,3.9,0
|
||||
5,2,3.5,0
|
||||
5.9,3,4.2,0
|
||||
6,2.2,4,0
|
||||
6.1,2.9,4.7,0
|
||||
5.6,2.9,3.6,0
|
||||
6.7,3.1,4.4,0
|
||||
5.6,3,4.5,0
|
||||
5.8,2.7,4.1,0
|
||||
6.2,2.2,4.5,0
|
||||
5.6,2.5,3.9,0
|
||||
5.9,3.2,4.8,0
|
||||
6.1,2.8,4,0
|
||||
6.3,2.5,4.9,0
|
||||
6.1,2.8,4.7,0
|
||||
6.4,2.9,4.3,0
|
||||
6.6,3,4.4,0
|
||||
6.8,2.8,4.8,0
|
||||
6.7,3,5,0
|
||||
6,2.9,4.5,0
|
||||
5.7,2.6,3.5,0
|
||||
5.5,2.4,3.8,0
|
||||
5.5,2.4,3.7,0
|
||||
5.8,2.7,3.9,0
|
||||
6,2.7,5.1,0
|
||||
5.4,3,4.5,0
|
||||
6,3.4,4.5,0
|
||||
6.7,3.1,4.7,0
|
||||
6.3,2.3,4.4,0
|
||||
5.6,3,4.1,0
|
||||
5.5,2.5,4,0
|
||||
5.5,2.6,4.4,0
|
||||
6.1,3,4.6,0
|
||||
5.8,2.6,4,0
|
||||
5,2.3,3.3,0
|
||||
5.6,2.7,4.2,0
|
||||
5.7,3,4.2,0
|
||||
5.7,2.9,4.2,0
|
||||
6.2,2.9,4.3,0
|
||||
5.1,2.5,3,0
|
||||
5.7,2.8,4.1,0
|
||||
6.3,3.3,6,1
|
||||
5.8,2.7,5.1,1
|
||||
7.1,3,5.9,1
|
||||
6.3,2.9,5.6,1
|
||||
6.5,3,5.8,1
|
||||
7.6,3,6.6,1
|
||||
4.9,2.5,4.5,1
|
||||
7.3,2.9,6.3,1
|
||||
6.7,2.5,5.8,1
|
||||
7.2,3.6,6.1,1
|
||||
6.5,3.2,5.1,1
|
||||
6.4,2.7,5.3,1
|
||||
6.8,3,5.5,1
|
||||
5.7,2.5,5,1
|
||||
5.8,2.8,5.1,1
|
||||
6.4,3.2,5.3,1
|
||||
6.5,3,5.5,1
|
||||
7.7,3.8,6.7,1
|
||||
7.7,2.6,6.9,1
|
||||
6,2.2,5,1
|
||||
6.9,3.2,5.7,1
|
||||
5.6,2.8,4.9,1
|
||||
7.7,2.8,6.7,1
|
||||
6.3,2.7,4.9,1
|
||||
6.7,3.3,5.7,1
|
||||
7.2,3.2,6,1
|
||||
6.2,2.8,4.8,1
|
||||
6.1,3,4.9,1
|
||||
6.4,2.8,5.6,1
|
||||
7.2,3,5.8,1
|
||||
7.4,2.8,6.1,1
|
||||
7.9,3.8,6.4,1
|
||||
6.4,2.8,5.6,1
|
||||
6.3,2.8,5.1,1
|
||||
6.1,2.6,5.6,1
|
||||
7.7,3,6.1,1
|
||||
6.3,3.4,5.6,1
|
||||
6.4,3.1,5.5,1
|
||||
6,3,4.8,1
|
||||
6.9,3.1,5.4,1
|
||||
6.7,3.1,5.6,1
|
||||
6.9,3.1,5.1,1
|
||||
5.8,2.7,5.1,1
|
||||
6.8,3.2,5.9,1
|
||||
6.7,3.3,5.7,1
|
||||
6.7,3,5.2,1
|
||||
6.3,2.5,5,1
|
||||
6.5,3,5.2,1
|
||||
6.2,3.4,5.4,1
|
||||
5.9,3,5.1,1
|
|
|
@ -1,101 +0,0 @@
|
|||
a,b,c,d,s
|
||||
7.0,3.2,4.7,1.4,0
|
||||
6.4,3.2,4.5,1.5,0
|
||||
6.9,3.1,4.9,1.5,0
|
||||
5.5,2.3,4.0,1.3,0
|
||||
6.5,2.8,4.6,1.5,0
|
||||
5.7,2.8,4.5,1.3,0
|
||||
6.3,3.3,4.7,1.6,0
|
||||
4.9,2.4,3.3,1.0,0
|
||||
6.6,2.9,4.6,1.3,0
|
||||
5.2,2.7,3.9,1.4,0
|
||||
5.0,2.0,3.5,1.0,0
|
||||
5.9,3.0,4.2,1.5,0
|
||||
6.0,2.2,4.0,1.0,0
|
||||
6.1,2.9,4.7,1.4,0
|
||||
5.6,2.9,3.6,1.3,0
|
||||
6.7,3.1,4.4,1.4,0
|
||||
5.6,3.0,4.5,1.5,0
|
||||
5.8,2.7,4.1,1.0,0
|
||||
6.2,2.2,4.5,1.5,0
|
||||
5.6,2.5,3.9,1.1,0
|
||||
5.9,3.2,4.8,1.8,0
|
||||
6.1,2.8,4.0,1.3,0
|
||||
6.3,2.5,4.9,1.5,0
|
||||
6.1,2.8,4.7,1.2,0
|
||||
6.4,2.9,4.3,1.3,0
|
||||
6.6,3.0,4.4,1.4,0
|
||||
6.8,2.8,4.8,1.4,0
|
||||
6.7,3.0,5.0,1.7,0
|
||||
6.0,2.9,4.5,1.5,0
|
||||
5.7,2.6,3.5,1.0,0
|
||||
5.5,2.4,3.8,1.1,0
|
||||
5.5,2.4,3.7,1.0,0
|
||||
5.8,2.7,3.9,1.2,0
|
||||
6.0,2.7,5.1,1.6,0
|
||||
5.4,3.0,4.5,1.5,0
|
||||
6.0,3.4,4.5,1.6,0
|
||||
6.7,3.1,4.7,1.5,0
|
||||
6.3,2.3,4.4,1.3,0
|
||||
5.6,3.0,4.1,1.3,0
|
||||
5.5,2.5,4.0,1.3,0
|
||||
5.5,2.6,4.4,1.2,0
|
||||
6.1,3.0,4.6,1.4,0
|
||||
5.8,2.6,4.0,1.2,0
|
||||
5.0,2.3,3.3,1.0,0
|
||||
5.6,2.7,4.2,1.3,0
|
||||
5.7,3.0,4.2,1.2,0
|
||||
5.7,2.9,4.2,1.3,0
|
||||
6.2,2.9,4.3,1.3,0
|
||||
5.1,2.5,3.0,1.1,0
|
||||
5.7,2.8,4.1,1.3,0
|
||||
6.3,3.3,6.0,2.5,1
|
||||
5.8,2.7,5.1,1.9,1
|
||||
7.1,3.0,5.9,2.1,1
|
||||
6.3,2.9,5.6,1.8,1
|
||||
6.5,3.0,5.8,2.2,1
|
||||
7.6,3.0,6.6,2.1,1
|
||||
4.9,2.5,4.5,1.7,1
|
||||
7.3,2.9,6.3,1.8,1
|
||||
6.7,2.5,5.8,1.8,1
|
||||
7.2,3.6,6.1,2.5,1
|
||||
6.5,3.2,5.1,2.0,1
|
||||
6.4,2.7,5.3,1.9,1
|
||||
6.8,3.0,5.5,2.1,1
|
||||
5.7,2.5,5.0,2.0,1
|
||||
5.8,2.8,5.1,2.4,1
|
||||
6.4,3.2,5.3,2.3,1
|
||||
6.5,3.0,5.5,1.8,1
|
||||
7.7,3.8,6.7,2.2,1
|
||||
7.7,2.6,6.9,2.3,1
|
||||
6.0,2.2,5.0,1.5,1
|
||||
6.9,3.2,5.7,2.3,1
|
||||
5.6,2.8,4.9,2.0,1
|
||||
7.7,2.8,6.7,2.0,1
|
||||
6.3,2.7,4.9,1.8,1
|
||||
6.7,3.3,5.7,2.1,1
|
||||
7.2,3.2,6.0,1.8,1
|
||||
6.2,2.8,4.8,1.8,1
|
||||
6.1,3.0,4.9,1.8,1
|
||||
6.4,2.8,5.6,2.1,1
|
||||
7.2,3.0,5.8,1.6,1
|
||||
7.4,2.8,6.1,1.9,1
|
||||
7.9,3.8,6.4,2.0,1
|
||||
6.4,2.8,5.6,2.2,1
|
||||
6.3,2.8,5.1,1.5,1
|
||||
6.1,2.6,5.6,1.4,1
|
||||
7.7,3.0,6.1,2.3,1
|
||||
6.3,3.4,5.6,2.4,1
|
||||
6.4,3.1,5.5,1.8,1
|
||||
6.0,3.0,4.8,1.8,1
|
||||
6.9,3.1,5.4,2.1,1
|
||||
6.7,3.1,5.6,2.4,1
|
||||
6.9,3.1,5.1,2.3,1
|
||||
5.8,2.7,5.1,1.9,1
|
||||
6.8,3.2,5.9,2.3,1
|
||||
6.7,3.3,5.7,2.5,1
|
||||
6.7,3.0,5.2,2.3,1
|
||||
6.3,2.5,5.0,1.9,1
|
||||
6.5,3.0,5.2,2.0,1
|
||||
6.2,3.4,5.4,2.3,1
|
||||
5.9,3.0,5.1,1.8,1
|
|
|
@ -1,101 +0,0 @@
|
|||
a,b,c,s
|
||||
5.1,3.5,1.4,0
|
||||
4.9,3,1.4,0
|
||||
4.7,3.2,1.3,0
|
||||
4.6,3.1,1.5,0
|
||||
5,3.6,1.4,0
|
||||
5.4,3.9,1.7,0
|
||||
4.6,3.4,1.4,0
|
||||
5,3.4,1.5,0
|
||||
4.4,2.9,1.4,0
|
||||
4.9,3.1,1.5,0
|
||||
5.4,3.7,1.5,0
|
||||
4.8,3.4,1.6,0
|
||||
4.8,3,1.4,0
|
||||
4.3,3,1.1,0
|
||||
5.8,4,1.2,0
|
||||
5.7,4.4,1.5,0
|
||||
5.4,3.9,1.3,0
|
||||
5.1,3.5,1.4,0
|
||||
5.7,3.8,1.7,0
|
||||
5.1,3.8,1.5,0
|
||||
5.4,3.4,1.7,0
|
||||
5.1,3.7,1.5,0
|
||||
4.6,3.6,1,0
|
||||
5.1,3.3,1.7,0
|
||||
4.8,3.4,1.9,0
|
||||
5,3,1.6,0
|
||||
5,3.4,1.6,0
|
||||
5.2,3.5,1.5,0
|
||||
5.2,3.4,1.4,0
|
||||
4.7,3.2,1.6,0
|
||||
4.8,3.1,1.6,0
|
||||
5.4,3.4,1.5,0
|
||||
5.2,4.1,1.5,0
|
||||
5.5,4.2,1.4,0
|
||||
4.9,3.1,1.5,0
|
||||
5,3.2,1.2,0
|
||||
5.5,3.5,1.3,0
|
||||
4.9,3.6,1.4,0
|
||||
4.4,3,1.3,0
|
||||
5.1,3.4,1.5,0
|
||||
5,3.5,1.3,0
|
||||
4.5,2.3,1.3,0
|
||||
4.4,3.2,1.3,0
|
||||
5,3.5,1.6,0
|
||||
5.1,3.8,1.9,0
|
||||
4.8,3,1.4,0
|
||||
5.1,3.8,1.6,0
|
||||
4.6,3.2,1.4,0
|
||||
5.3,3.7,1.5,0
|
||||
5,3.3,1.4,0
|
||||
6.3,3.3,6,1
|
||||
5.8,2.7,5.1,1
|
||||
7.1,3,5.9,1
|
||||
6.3,2.9,5.6,1
|
||||
6.5,3,5.8,1
|
||||
7.6,3,6.6,1
|
||||
4.9,2.5,4.5,1
|
||||
7.3,2.9,6.3,1
|
||||
6.7,2.5,5.8,1
|
||||
7.2,3.6,6.1,1
|
||||
6.5,3.2,5.1,1
|
||||
6.4,2.7,5.3,1
|
||||
6.8,3,5.5,1
|
||||
5.7,2.5,5,1
|
||||
5.8,2.8,5.1,1
|
||||
6.4,3.2,5.3,1
|
||||
6.5,3,5.5,1
|
||||
7.7,3.8,6.7,1
|
||||
7.7,2.6,6.9,1
|
||||
6,2.2,5,1
|
||||
6.9,3.2,5.7,1
|
||||
5.6,2.8,4.9,1
|
||||
7.7,2.8,6.7,1
|
||||
6.3,2.7,4.9,1
|
||||
6.7,3.3,5.7,1
|
||||
7.2,3.2,6,1
|
||||
6.2,2.8,4.8,1
|
||||
6.1,3,4.9,1
|
||||
6.4,2.8,5.6,1
|
||||
7.2,3,5.8,1
|
||||
7.4,2.8,6.1,1
|
||||
7.9,3.8,6.4,1
|
||||
6.4,2.8,5.6,1
|
||||
6.3,2.8,5.1,1
|
||||
6.1,2.6,5.6,1
|
||||
7.7,3,6.1,1
|
||||
6.3,3.4,5.6,1
|
||||
6.4,3.1,5.5,1
|
||||
6,3,4.8,1
|
||||
6.9,3.1,5.4,1
|
||||
6.7,3.1,5.6,1
|
||||
6.9,3.1,5.1,1
|
||||
5.8,2.7,5.1,1
|
||||
6.8,3.2,5.9,1
|
||||
6.7,3.3,5.7,1
|
||||
6.7,3,5.2,1
|
||||
6.3,2.5,5,1
|
||||
6.5,3,5.2,1
|
||||
6.2,3.4,5.4,1
|
||||
5.9,3,5.1,1
|
|
|
@ -1,101 +0,0 @@
|
|||
a,b,c,d,s
|
||||
5.1,3.5,1.4,0.2,0
|
||||
4.9,3.0,1.4,0.2,0
|
||||
4.7,3.2,1.3,0.2,0
|
||||
4.6,3.1,1.5,0.2,0
|
||||
5.0,3.6,1.4,0.2,0
|
||||
5.4,3.9,1.7,0.4,0
|
||||
4.6,3.4,1.4,0.3,0
|
||||
5.0,3.4,1.5,0.2,0
|
||||
4.4,2.9,1.4,0.2,0
|
||||
4.9,3.1,1.5,0.1,0
|
||||
5.4,3.7,1.5,0.2,0
|
||||
4.8,3.4,1.6,0.2,0
|
||||
4.8,3.0,1.4,0.1,0
|
||||
4.3,3.0,1.1,0.1,0
|
||||
5.8,4.0,1.2,0.2,0
|
||||
5.7,4.4,1.5,0.4,0
|
||||
5.4,3.9,1.3,0.4,0
|
||||
5.1,3.5,1.4,0.3,0
|
||||
5.7,3.8,1.7,0.3,0
|
||||
5.1,3.8,1.5,0.3,0
|
||||
5.4,3.4,1.7,0.2,0
|
||||
5.1,3.7,1.5,0.4,0
|
||||
4.6,3.6,1.0,0.2,0
|
||||
5.1,3.3,1.7,0.5,0
|
||||
4.8,3.4,1.9,0.2,0
|
||||
5.0,3.0,1.6,0.2,0
|
||||
5.0,3.4,1.6,0.4,0
|
||||
5.2,3.5,1.5,0.2,0
|
||||
5.2,3.4,1.4,0.2,0
|
||||
4.7,3.2,1.6,0.2,0
|
||||
4.8,3.1,1.6,0.2,0
|
||||
5.4,3.4,1.5,0.4,0
|
||||
5.2,4.1,1.5,0.1,0
|
||||
5.5,4.2,1.4,0.2,0
|
||||
4.9,3.1,1.5,0.2,0
|
||||
5.0,3.2,1.2,0.2,0
|
||||
5.5,3.5,1.3,0.2,0
|
||||
4.9,3.6,1.4,0.1,0
|
||||
4.4,3.0,1.3,0.2,0
|
||||
5.1,3.4,1.5,0.2,0
|
||||
5.0,3.5,1.3,0.3,0
|
||||
4.5,2.3,1.3,0.3,0
|
||||
4.4,3.2,1.3,0.2,0
|
||||
5.0,3.5,1.6,0.6,0
|
||||
5.1,3.8,1.9,0.4,0
|
||||
4.8,3.0,1.4,0.3,0
|
||||
5.1,3.8,1.6,0.2,0
|
||||
4.6,3.2,1.4,0.2,0
|
||||
5.3,3.7,1.5,0.2,0
|
||||
5.0,3.3,1.4,0.2,0
|
||||
6.3,3.3,6.0,2.5,1
|
||||
5.8,2.7,5.1,1.9,1
|
||||
7.1,3.0,5.9,2.1,1
|
||||
6.3,2.9,5.6,1.8,1
|
||||
6.5,3.0,5.8,2.2,1
|
||||
7.6,3.0,6.6,2.1,1
|
||||
4.9,2.5,4.5,1.7,1
|
||||
7.3,2.9,6.3,1.8,1
|
||||
6.7,2.5,5.8,1.8,1
|
||||
7.2,3.6,6.1,2.5,1
|
||||
6.5,3.2,5.1,2.0,1
|
||||
6.4,2.7,5.3,1.9,1
|
||||
6.8,3.0,5.5,2.1,1
|
||||
5.7,2.5,5.0,2.0,1
|
||||
5.8,2.8,5.1,2.4,1
|
||||
6.4,3.2,5.3,2.3,1
|
||||
6.5,3.0,5.5,1.8,1
|
||||
7.7,3.8,6.7,2.2,1
|
||||
7.7,2.6,6.9,2.3,1
|
||||
6.0,2.2,5.0,1.5,1
|
||||
6.9,3.2,5.7,2.3,1
|
||||
5.6,2.8,4.9,2.0,1
|
||||
7.7,2.8,6.7,2.0,1
|
||||
6.3,2.7,4.9,1.8,1
|
||||
6.7,3.3,5.7,2.1,1
|
||||
7.2,3.2,6.0,1.8,1
|
||||
6.2,2.8,4.8,1.8,1
|
||||
6.1,3.0,4.9,1.8,1
|
||||
6.4,2.8,5.6,2.1,1
|
||||
7.2,3.0,5.8,1.6,1
|
||||
7.4,2.8,6.1,1.9,1
|
||||
7.9,3.8,6.4,2.0,1
|
||||
6.4,2.8,5.6,2.2,1
|
||||
6.3,2.8,5.1,1.5,1
|
||||
6.1,2.6,5.6,1.4,1
|
||||
7.7,3.0,6.1,2.3,1
|
||||
6.3,3.4,5.6,2.4,1
|
||||
6.4,3.1,5.5,1.8,1
|
||||
6.0,3.0,4.8,1.8,1
|
||||
6.9,3.1,5.4,2.1,1
|
||||
6.7,3.1,5.6,2.4,1
|
||||
6.9,3.1,5.1,2.3,1
|
||||
5.8,2.7,5.1,1.9,1
|
||||
6.8,3.2,5.9,2.3,1
|
||||
6.7,3.3,5.7,2.5,1
|
||||
6.7,3.0,5.2,2.3,1
|
||||
6.3,2.5,5.0,1.9,1
|
||||
6.5,3.0,5.2,2.0,1
|
||||
6.2,3.4,5.4,2.3,1
|
||||
5.9,3.0,5.1,1.8,1
|
|
|
@ -1,150 +0,0 @@
|
|||
5.1,3.5,1.4,0.2,Iris-setosa
|
||||
4.9,3,1.4,0.2,Iris-setosa
|
||||
4.7,3.2,1.3,0.2,Iris-setosa
|
||||
4.6,3.1,1.5,0.2,Iris-setosa
|
||||
5,3.6,1.4,0.2,Iris-setosa
|
||||
5.4,3.9,1.7,0.4,Iris-setosa
|
||||
4.6,3.4,1.4,0.3,Iris-setosa
|
||||
5,3.4,1.5,0.2,Iris-setosa
|
||||
4.4,2.9,1.4,0.2,Iris-setosa
|
||||
4.9,3.1,1.5,0.1,Iris-setosa
|
||||
5.4,3.7,1.5,0.2,Iris-setosa
|
||||
4.8,3.4,1.6,0.2,Iris-setosa
|
||||
4.8,3,1.4,0.1,Iris-setosa
|
||||
4.3,3,1.1,0.1,Iris-setosa
|
||||
5.8,4,1.2,0.2,Iris-setosa
|
||||
5.7,4.4,1.5,0.4,Iris-setosa
|
||||
5.4,3.9,1.3,0.4,Iris-setosa
|
||||
5.1,3.5,1.4,0.3,Iris-setosa
|
||||
5.7,3.8,1.7,0.3,Iris-setosa
|
||||
5.1,3.8,1.5,0.3,Iris-setosa
|
||||
5.4,3.4,1.7,0.2,Iris-setosa
|
||||
5.1,3.7,1.5,0.4,Iris-setosa
|
||||
4.6,3.6,1,0.2,Iris-setosa
|
||||
5.1,3.3,1.7,0.5,Iris-setosa
|
||||
4.8,3.4,1.9,0.2,Iris-setosa
|
||||
5,3,1.6,0.2,Iris-setosa
|
||||
5,3.4,1.6,0.4,Iris-setosa
|
||||
5.2,3.5,1.5,0.2,Iris-setosa
|
||||
5.2,3.4,1.4,0.2,Iris-setosa
|
||||
4.7,3.2,1.6,0.2,Iris-setosa
|
||||
4.8,3.1,1.6,0.2,Iris-setosa
|
||||
5.4,3.4,1.5,0.4,Iris-setosa
|
||||
5.2,4.1,1.5,0.1,Iris-setosa
|
||||
5.5,4.2,1.4,0.2,Iris-setosa
|
||||
4.9,3.1,1.5,0.2,Iris-setosa
|
||||
5,3.2,1.2,0.2,Iris-setosa
|
||||
5.5,3.5,1.3,0.2,Iris-setosa
|
||||
4.9,3.6,1.4,0.1,Iris-setosa
|
||||
4.4,3,1.3,0.2,Iris-setosa
|
||||
5.1,3.4,1.5,0.2,Iris-setosa
|
||||
5,3.5,1.3,0.3,Iris-setosa
|
||||
4.5,2.3,1.3,0.3,Iris-setosa
|
||||
4.4,3.2,1.3,0.2,Iris-setosa
|
||||
5,3.5,1.6,0.6,Iris-setosa
|
||||
5.1,3.8,1.9,0.4,Iris-setosa
|
||||
4.8,3,1.4,0.3,Iris-setosa
|
||||
5.1,3.8,1.6,0.2,Iris-setosa
|
||||
4.6,3.2,1.4,0.2,Iris-setosa
|
||||
5.3,3.7,1.5,0.2,Iris-setosa
|
||||
5,3.3,1.4,0.2,Iris-setosa
|
||||
7,3.2,4.7,1.4,Iris-versicolor
|
||||
6.4,3.2,4.5,1.5,Iris-versicolor
|
||||
6.9,3.1,4.9,1.5,Iris-versicolor
|
||||
5.5,2.3,4,1.3,Iris-versicolor
|
||||
6.5,2.8,4.6,1.5,Iris-versicolor
|
||||
5.7,2.8,4.5,1.3,Iris-versicolor
|
||||
6.3,3.3,4.7,1.6,Iris-versicolor
|
||||
4.9,2.4,3.3,1,Iris-versicolor
|
||||
6.6,2.9,4.6,1.3,Iris-versicolor
|
||||
5.2,2.7,3.9,1.4,Iris-versicolor
|
||||
5,2,3.5,1,Iris-versicolor
|
||||
5.9,3,4.2,1.5,Iris-versicolor
|
||||
6,2.2,4,1,Iris-versicolor
|
||||
6.1,2.9,4.7,1.4,Iris-versicolor
|
||||
5.6,2.9,3.6,1.3,Iris-versicolor
|
||||
6.7,3.1,4.4,1.4,Iris-versicolor
|
||||
5.6,3,4.5,1.5,Iris-versicolor
|
||||
5.8,2.7,4.1,1,Iris-versicolor
|
||||
6.2,2.2,4.5,1.5,Iris-versicolor
|
||||
5.6,2.5,3.9,1.1,Iris-versicolor
|
||||
5.9,3.2,4.8,1.8,Iris-versicolor
|
||||
6.1,2.8,4,1.3,Iris-versicolor
|
||||
6.3,2.5,4.9,1.5,Iris-versicolor
|
||||
6.1,2.8,4.7,1.2,Iris-versicolor
|
||||
6.4,2.9,4.3,1.3,Iris-versicolor
|
||||
6.6,3,4.4,1.4,Iris-versicolor
|
||||
6.8,2.8,4.8,1.4,Iris-versicolor
|
||||
6.7,3,5,1.7,Iris-versicolor
|
||||
6,2.9,4.5,1.5,Iris-versicolor
|
||||
5.7,2.6,3.5,1,Iris-versicolor
|
||||
5.5,2.4,3.8,1.1,Iris-versicolor
|
||||
5.5,2.4,3.7,1,Iris-versicolor
|
||||
5.8,2.7,3.9,1.2,Iris-versicolor
|
||||
6,2.7,5.1,1.6,Iris-versicolor
|
||||
5.4,3,4.5,1.5,Iris-versicolor
|
||||
6,3.4,4.5,1.6,Iris-versicolor
|
||||
6.7,3.1,4.7,1.5,Iris-versicolor
|
||||
6.3,2.3,4.4,1.3,Iris-versicolor
|
||||
5.6,3,4.1,1.3,Iris-versicolor
|
||||
5.5,2.5,4,1.3,Iris-versicolor
|
||||
5.5,2.6,4.4,1.2,Iris-versicolor
|
||||
6.1,3,4.6,1.4,Iris-versicolor
|
||||
5.8,2.6,4,1.2,Iris-versicolor
|
||||
5,2.3,3.3,1,Iris-versicolor
|
||||
5.6,2.7,4.2,1.3,Iris-versicolor
|
||||
5.7,3,4.2,1.2,Iris-versicolor
|
||||
5.7,2.9,4.2,1.3,Iris-versicolor
|
||||
6.2,2.9,4.3,1.3,Iris-versicolor
|
||||
5.1,2.5,3,1.1,Iris-versicolor
|
||||
5.7,2.8,4.1,1.3,Iris-versicolor
|
||||
6.3,3.3,6,2.5,Iris-virginica
|
||||
5.8,2.7,5.1,1.9,Iris-virginica
|
||||
7.1,3,5.9,2.1,Iris-virginica
|
||||
6.3,2.9,5.6,1.8,Iris-virginica
|
||||
6.5,3,5.8,2.2,Iris-virginica
|
||||
7.6,3,6.6,2.1,Iris-virginica
|
||||
4.9,2.5,4.5,1.7,Iris-virginica
|
||||
7.3,2.9,6.3,1.8,Iris-virginica
|
||||
6.7,2.5,5.8,1.8,Iris-virginica
|
||||
7.2,3.6,6.1,2.5,Iris-virginica
|
||||
6.5,3.2,5.1,2,Iris-virginica
|
||||
6.4,2.7,5.3,1.9,Iris-virginica
|
||||
6.8,3,5.5,2.1,Iris-virginica
|
||||
5.7,2.5,5,2,Iris-virginica
|
||||
5.8,2.8,5.1,2.4,Iris-virginica
|
||||
6.4,3.2,5.3,2.3,Iris-virginica
|
||||
6.5,3,5.5,1.8,Iris-virginica
|
||||
7.7,3.8,6.7,2.2,Iris-virginica
|
||||
7.7,2.6,6.9,2.3,Iris-virginica
|
||||
6,2.2,5,1.5,Iris-virginica
|
||||
6.9,3.2,5.7,2.3,Iris-virginica
|
||||
5.6,2.8,4.9,2,Iris-virginica
|
||||
7.7,2.8,6.7,2,Iris-virginica
|
||||
6.3,2.7,4.9,1.8,Iris-virginica
|
||||
6.7,3.3,5.7,2.1,Iris-virginica
|
||||
7.2,3.2,6,1.8,Iris-virginica
|
||||
6.2,2.8,4.8,1.8,Iris-virginica
|
||||
6.1,3,4.9,1.8,Iris-virginica
|
||||
6.4,2.8,5.6,2.1,Iris-virginica
|
||||
7.2,3,5.8,1.6,Iris-virginica
|
||||
7.4,2.8,6.1,1.9,Iris-virginica
|
||||
7.9,3.8,6.4,2,Iris-virginica
|
||||
6.4,2.8,5.6,2.2,Iris-virginica
|
||||
6.3,2.8,5.1,1.5,Iris-virginica
|
||||
6.1,2.6,5.6,1.4,Iris-virginica
|
||||
7.7,3,6.1,2.3,Iris-virginica
|
||||
6.3,3.4,5.6,2.4,Iris-virginica
|
||||
6.4,3.1,5.5,1.8,Iris-virginica
|
||||
6,3,4.8,1.8,Iris-virginica
|
||||
6.9,3.1,5.4,2.1,Iris-virginica
|
||||
6.7,3.1,5.6,2.4,Iris-virginica
|
||||
6.9,3.1,5.1,2.3,Iris-virginica
|
||||
5.8,2.7,5.1,1.9,Iris-virginica
|
||||
6.8,3.2,5.9,2.3,Iris-virginica
|
||||
6.7,3.3,5.7,2.5,Iris-virginica
|
||||
6.7,3,5.2,2.3,Iris-virginica
|
||||
6.3,2.5,5,1.9,Iris-virginica
|
||||
6.5,3,5.2,2,Iris-virginica
|
||||
6.2,3.4,5.4,2.3,Iris-virginica
|
||||
5.9,3,5.1,1.8,Iris-virginica
|
|
|
@ -1,151 +0,0 @@
|
|||
5.1,3.5,1.4,0.2,Iris-setosa
|
||||
4.9,3.0,1.4,0.2,Iris-setosa
|
||||
4.7,3.2,1.3,0.2,Iris-setosa
|
||||
4.6,3.1,1.5,0.2,Iris-setosa
|
||||
5.0,3.6,1.4,0.2,Iris-setosa
|
||||
5.4,3.9,1.7,0.4,Iris-setosa
|
||||
4.6,3.4,1.4,0.3,Iris-setosa
|
||||
5.0,3.4,1.5,0.2,Iris-setosa
|
||||
4.4,2.9,1.4,0.2,Iris-setosa
|
||||
4.9,3.1,1.5,0.1,Iris-setosa
|
||||
5.4,3.7,1.5,0.2,Iris-setosa
|
||||
4.8,3.4,1.6,0.2,Iris-setosa
|
||||
4.8,3.0,1.4,0.1,Iris-setosa
|
||||
4.3,3.0,1.1,0.1,Iris-setosa
|
||||
5.8,4.0,1.2,0.2,Iris-setosa
|
||||
5.7,4.4,1.5,0.4,Iris-setosa
|
||||
5.4,3.9,1.3,0.4,Iris-setosa
|
||||
5.1,3.5,1.4,0.3,Iris-setosa
|
||||
5.7,3.8,1.7,0.3,Iris-setosa
|
||||
5.1,3.8,1.5,0.3,Iris-setosa
|
||||
5.4,3.4,1.7,0.2,Iris-setosa
|
||||
5.1,3.7,1.5,0.4,Iris-setosa
|
||||
4.6,3.6,1.0,0.2,Iris-setosa
|
||||
5.1,3.3,1.7,0.5,Iris-setosa
|
||||
4.8,3.4,1.9,0.2,Iris-setosa
|
||||
5.0,3.0,1.6,0.2,Iris-setosa
|
||||
5.0,3.4,1.6,0.4,Iris-setosa
|
||||
5.2,3.5,1.5,0.2,Iris-setosa
|
||||
5.2,3.4,1.4,0.2,Iris-setosa
|
||||
4.7,3.2,1.6,0.2,Iris-setosa
|
||||
4.8,3.1,1.6,0.2,Iris-setosa
|
||||
5.4,3.4,1.5,0.4,Iris-setosa
|
||||
5.2,4.1,1.5,0.1,Iris-setosa
|
||||
5.5,4.2,1.4,0.2,Iris-setosa
|
||||
4.9,3.1,1.5,0.1,Iris-setosa
|
||||
5.0,3.2,1.2,0.2,Iris-setosa
|
||||
5.5,3.5,1.3,0.2,Iris-setosa
|
||||
4.9,3.1,1.5,0.1,Iris-setosa
|
||||
4.4,3.0,1.3,0.2,Iris-setosa
|
||||
5.1,3.4,1.5,0.2,Iris-setosa
|
||||
5.0,3.5,1.3,0.3,Iris-setosa
|
||||
4.5,2.3,1.3,0.3,Iris-setosa
|
||||
4.4,3.2,1.3,0.2,Iris-setosa
|
||||
5.0,3.5,1.6,0.6,Iris-setosa
|
||||
5.1,3.8,1.9,0.4,Iris-setosa
|
||||
4.8,3.0,1.4,0.3,Iris-setosa
|
||||
5.1,3.8,1.6,0.2,Iris-setosa
|
||||
4.6,3.2,1.4,0.2,Iris-setosa
|
||||
5.3,3.7,1.5,0.2,Iris-setosa
|
||||
5.0,3.3,1.4,0.2,Iris-setosa
|
||||
7.0,3.2,4.7,1.4,Iris-versicolor
|
||||
6.4,3.2,4.5,1.5,Iris-versicolor
|
||||
6.9,3.1,4.9,1.5,Iris-versicolor
|
||||
5.5,2.3,4.0,1.3,Iris-versicolor
|
||||
6.5,2.8,4.6,1.5,Iris-versicolor
|
||||
5.7,2.8,4.5,1.3,Iris-versicolor
|
||||
6.3,3.3,4.7,1.6,Iris-versicolor
|
||||
4.9,2.4,3.3,1.0,Iris-versicolor
|
||||
6.6,2.9,4.6,1.3,Iris-versicolor
|
||||
5.2,2.7,3.9,1.4,Iris-versicolor
|
||||
5.0,2.0,3.5,1.0,Iris-versicolor
|
||||
5.9,3.0,4.2,1.5,Iris-versicolor
|
||||
6.0,2.2,4.0,1.0,Iris-versicolor
|
||||
6.1,2.9,4.7,1.4,Iris-versicolor
|
||||
5.6,2.9,3.6,1.3,Iris-versicolor
|
||||
6.7,3.1,4.4,1.4,Iris-versicolor
|
||||
5.6,3.0,4.5,1.5,Iris-versicolor
|
||||
5.8,2.7,4.1,1.0,Iris-versicolor
|
||||
6.2,2.2,4.5,1.5,Iris-versicolor
|
||||
5.6,2.5,3.9,1.1,Iris-versicolor
|
||||
5.9,3.2,4.8,1.8,Iris-versicolor
|
||||
6.1,2.8,4.0,1.3,Iris-versicolor
|
||||
6.3,2.5,4.9,1.5,Iris-versicolor
|
||||
6.1,2.8,4.7,1.2,Iris-versicolor
|
||||
6.4,2.9,4.3,1.3,Iris-versicolor
|
||||
6.6,3.0,4.4,1.4,Iris-versicolor
|
||||
6.8,2.8,4.8,1.4,Iris-versicolor
|
||||
6.7,3.0,5.0,1.7,Iris-versicolor
|
||||
6.0,2.9,4.5,1.5,Iris-versicolor
|
||||
5.7,2.6,3.5,1.0,Iris-versicolor
|
||||
5.5,2.4,3.8,1.1,Iris-versicolor
|
||||
5.5,2.4,3.7,1.0,Iris-versicolor
|
||||
5.8,2.7,3.9,1.2,Iris-versicolor
|
||||
6.0,2.7,5.1,1.6,Iris-versicolor
|
||||
5.4,3.0,4.5,1.5,Iris-versicolor
|
||||
6.0,3.4,4.5,1.6,Iris-versicolor
|
||||
6.7,3.1,4.7,1.5,Iris-versicolor
|
||||
6.3,2.3,4.4,1.3,Iris-versicolor
|
||||
5.6,3.0,4.1,1.3,Iris-versicolor
|
||||
5.5,2.5,4.0,1.3,Iris-versicolor
|
||||
5.5,2.6,4.4,1.2,Iris-versicolor
|
||||
6.1,3.0,4.6,1.4,Iris-versicolor
|
||||
5.8,2.6,4.0,1.2,Iris-versicolor
|
||||
5.0,2.3,3.3,1.0,Iris-versicolor
|
||||
5.6,2.7,4.2,1.3,Iris-versicolor
|
||||
5.7,3.0,4.2,1.2,Iris-versicolor
|
||||
5.7,2.9,4.2,1.3,Iris-versicolor
|
||||
6.2,2.9,4.3,1.3,Iris-versicolor
|
||||
5.1,2.5,3.0,1.1,Iris-versicolor
|
||||
5.7,2.8,4.1,1.3,Iris-versicolor
|
||||
6.3,3.3,6.0,2.5,Iris-virginica
|
||||
5.8,2.7,5.1,1.9,Iris-virginica
|
||||
7.1,3.0,5.9,2.1,Iris-virginica
|
||||
6.3,2.9,5.6,1.8,Iris-virginica
|
||||
6.5,3.0,5.8,2.2,Iris-virginica
|
||||
7.6,3.0,6.6,2.1,Iris-virginica
|
||||
4.9,2.5,4.5,1.7,Iris-virginica
|
||||
7.3,2.9,6.3,1.8,Iris-virginica
|
||||
6.7,2.5,5.8,1.8,Iris-virginica
|
||||
7.2,3.6,6.1,2.5,Iris-virginica
|
||||
6.5,3.2,5.1,2.0,Iris-virginica
|
||||
6.4,2.7,5.3,1.9,Iris-virginica
|
||||
6.8,3.0,5.5,2.1,Iris-virginica
|
||||
5.7,2.5,5.0,2.0,Iris-virginica
|
||||
5.8,2.8,5.1,2.4,Iris-virginica
|
||||
6.4,3.2,5.3,2.3,Iris-virginica
|
||||
6.5,3.0,5.5,1.8,Iris-virginica
|
||||
7.7,3.8,6.7,2.2,Iris-virginica
|
||||
7.7,2.6,6.9,2.3,Iris-virginica
|
||||
6.0,2.2,5.0,1.5,Iris-virginica
|
||||
6.9,3.2,5.7,2.3,Iris-virginica
|
||||
5.6,2.8,4.9,2.0,Iris-virginica
|
||||
7.7,2.8,6.7,2.0,Iris-virginica
|
||||
6.3,2.7,4.9,1.8,Iris-virginica
|
||||
6.7,3.3,5.7,2.1,Iris-virginica
|
||||
7.2,3.2,6.0,1.8,Iris-virginica
|
||||
6.2,2.8,4.8,1.8,Iris-virginica
|
||||
6.1,3.0,4.9,1.8,Iris-virginica
|
||||
6.4,2.8,5.6,2.1,Iris-virginica
|
||||
7.2,3.0,5.8,1.6,Iris-virginica
|
||||
7.4,2.8,6.1,1.9,Iris-virginica
|
||||
7.9,3.8,6.4,2.0,Iris-virginica
|
||||
6.4,2.8,5.6,2.2,Iris-virginica
|
||||
6.3,2.8,5.1,1.5,Iris-virginica
|
||||
6.1,2.6,5.6,1.4,Iris-virginica
|
||||
7.7,3.0,6.1,2.3,Iris-virginica
|
||||
6.3,3.4,5.6,2.4,Iris-virginica
|
||||
6.4,3.1,5.5,1.8,Iris-virginica
|
||||
6.0,3.0,4.8,1.8,Iris-virginica
|
||||
6.9,3.1,5.4,2.1,Iris-virginica
|
||||
6.7,3.1,5.6,2.4,Iris-virginica
|
||||
6.9,3.1,5.1,2.3,Iris-virginica
|
||||
5.8,2.7,5.1,1.9,Iris-virginica
|
||||
6.8,3.2,5.9,2.3,Iris-virginica
|
||||
6.7,3.3,5.7,2.5,Iris-virginica
|
||||
6.7,3.0,5.2,2.3,Iris-virginica
|
||||
6.3,2.5,5.0,1.9,Iris-virginica
|
||||
6.5,3.0,5.2,2.0,Iris-virginica
|
||||
6.2,3.4,5.4,2.3,Iris-virginica
|
||||
5.9,3.0,5.1,1.8,Iris-virginica
|
||||
|
|
|
@ -1,11 +0,0 @@
|
|||
coefficients
|
||||
.1
|
||||
.2
|
||||
.3
|
||||
.4
|
||||
.5
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
|
|
@ -1,151 +0,0 @@
|
|||
sl,sw,pl,pw,s
|
||||
5.1,3.5,1.4,0.2,0
|
||||
4.9,3,1.4,0.2,0
|
||||
4.7,3.2,1.3,0.2,0
|
||||
4.6,3.1,1.5,0.2,0
|
||||
5,3.6,1.4,0.2,0
|
||||
5.4,3.9,1.7,0.4,0
|
||||
4.6,3.4,1.4,0.3,0
|
||||
5,3.4,1.5,0.2,0
|
||||
4.4,2.9,1.4,0.2,0
|
||||
4.9,3.1,1.5,0.1,0
|
||||
5.4,3.7,1.5,0.2,0
|
||||
4.8,3.4,1.6,0.2,0
|
||||
4.8,3,1.4,0.1,0
|
||||
4.3,3,1.1,0.1,0
|
||||
5.8,4,1.2,0.2,0
|
||||
5.7,4.4,1.5,0.4,0
|
||||
5.4,3.9,1.3,0.4,0
|
||||
5.1,3.5,1.4,0.3,0
|
||||
5.7,3.8,1.7,0.3,0
|
||||
5.1,3.8,1.5,0.3,0
|
||||
5.4,3.4,1.7,0.2,0
|
||||
5.1,3.7,1.5,0.4,0
|
||||
4.6,3.6,1,0.2,0
|
||||
5.1,3.3,1.7,0.5,0
|
||||
4.8,3.4,1.9,0.2,0
|
||||
5,3,1.6,0.2,0
|
||||
5,3.4,1.6,0.4,0
|
||||
5.2,3.5,1.5,0.2,0
|
||||
5.2,3.4,1.4,0.2,0
|
||||
4.7,3.2,1.6,0.2,0
|
||||
4.8,3.1,1.6,0.2,0
|
||||
5.4,3.4,1.5,0.4,0
|
||||
5.2,4.1,1.5,0.1,0
|
||||
5.5,4.2,1.4,0.2,0
|
||||
4.9,3.1,1.5,0.2,0
|
||||
5,3.2,1.2,0.2,0
|
||||
5.5,3.5,1.3,0.2,0
|
||||
4.9,3.6,1.4,0.1,0
|
||||
4.4,3,1.3,0.2,0
|
||||
5.1,3.4,1.5,0.2,0
|
||||
5,3.5,1.3,0.3,0
|
||||
4.5,2.3,1.3,0.3,0
|
||||
4.4,3.2,1.3,0.2,0
|
||||
5,3.5,1.6,0.6,0
|
||||
5.1,3.8,1.9,0.4,0
|
||||
4.8,3,1.4,0.3,0
|
||||
5.1,3.8,1.6,0.2,0
|
||||
4.6,3.2,1.4,0.2,0
|
||||
5.3,3.7,1.5,0.2,0
|
||||
5,3.3,1.4,0.2,0
|
||||
7,3.2,4.7,1.4,1
|
||||
6.4,3.2,4.5,1.5,1
|
||||
6.9,3.1,4.9,1.5,1
|
||||
5.5,2.3,4,1.3,1
|
||||
6.5,2.8,4.6,1.5,1
|
||||
5.7,2.8,4.5,1.3,1
|
||||
6.3,3.3,4.7,1.6,1
|
||||
4.9,2.4,3.3,1,1
|
||||
6.6,2.9,4.6,1.3,1
|
||||
5.2,2.7,3.9,1.4,1
|
||||
5,2,3.5,1,1
|
||||
5.9,3,4.2,1.5,1
|
||||
6,2.2,4,1,1
|
||||
6.1,2.9,4.7,1.4,1
|
||||
5.6,2.9,3.6,1.3,1
|
||||
6.7,3.1,4.4,1.4,1
|
||||
5.6,3,4.5,1.5,1
|
||||
5.8,2.7,4.1,1,1
|
||||
6.2,2.2,4.5,1.5,1
|
||||
5.6,2.5,3.9,1.1,1
|
||||
5.9,3.2,4.8,1.8,1
|
||||
6.1,2.8,4,1.3,1
|
||||
6.3,2.5,4.9,1.5,1
|
||||
6.1,2.8,4.7,1.2,1
|
||||
6.4,2.9,4.3,1.3,1
|
||||
6.6,3,4.4,1.4,1
|
||||
6.8,2.8,4.8,1.4,1
|
||||
6.7,3,5,1.7,1
|
||||
6,2.9,4.5,1.5,1
|
||||
5.7,2.6,3.5,1,1
|
||||
5.5,2.4,3.8,1.1,1
|
||||
5.5,2.4,3.7,1,1
|
||||
5.8,2.7,3.9,1.2,1
|
||||
6,2.7,5.1,1.6,1
|
||||
5.4,3,4.5,1.5,1
|
||||
6,3.4,4.5,1.6,1
|
||||
6.7,3.1,4.7,1.5,1
|
||||
6.3,2.3,4.4,1.3,1
|
||||
5.6,3,4.1,1.3,1
|
||||
5.5,2.5,4,1.3,1
|
||||
5.5,2.6,4.4,1.2,1
|
||||
6.1,3,4.6,1.4,1
|
||||
5.8,2.6,4,1.2,1
|
||||
5,2.3,3.3,1,1
|
||||
5.6,2.7,4.2,1.3,1
|
||||
5.7,3,4.2,1.2,1
|
||||
5.7,2.9,4.2,1.3,1
|
||||
6.2,2.9,4.3,1.3,1
|
||||
5.1,2.5,3,1.1,1
|
||||
5.7,2.8,4.1,1.3,1
|
||||
6.3,3.3,6,2.5,2
|
||||
5.8,2.7,5.1,1.9,2
|
||||
7.1,3,5.9,2.1,2
|
||||
6.3,2.9,5.6,1.8,2
|
||||
6.5,3,5.8,2.2,2
|
||||
7.6,3,6.6,2.1,2
|
||||
4.9,2.5,4.5,1.7,2
|
||||
7.3,2.9,6.3,1.8,2
|
||||
6.7,2.5,5.8,1.8,2
|
||||
7.2,3.6,6.1,2.5,2
|
||||
6.5,3.2,5.1,2,2
|
||||
6.4,2.7,5.3,1.9,2
|
||||
6.8,3,5.5,2.1,2
|
||||
5.7,2.5,5,2,2
|
||||
5.8,2.8,5.1,2.4,2
|
||||
6.4,3.2,5.3,2.3,2
|
||||
6.5,3,5.5,1.8,2
|
||||
7.7,3.8,6.7,2.2,2
|
||||
7.7,2.6,6.9,2.3,2
|
||||
6,2.2,5,1.5,2
|
||||
6.9,3.2,5.7,2.3,2
|
||||
5.6,2.8,4.9,2,2
|
||||
7.7,2.8,6.7,2,2
|
||||
6.3,2.7,4.9,1.8,2
|
||||
6.7,3.3,5.7,2.1,2
|
||||
7.2,3.2,6,1.8,2
|
||||
6.2,2.8,4.8,1.8,2
|
||||
6.1,3,4.9,1.8,2
|
||||
6.4,2.8,5.6,2.1,2
|
||||
7.2,3,5.8,1.6,2
|
||||
7.4,2.8,6.1,1.9,2
|
||||
7.9,3.8,6.4,2,2
|
||||
6.4,2.8,5.6,2.2,2
|
||||
6.3,2.8,5.1,1.5,2
|
||||
6.1,2.6,5.6,1.4,2
|
||||
7.7,3,6.1,2.3,2
|
||||
6.3,3.4,5.6,2.4,2
|
||||
6.4,3.1,5.5,1.8,2
|
||||
6,3,4.8,1.8,2
|
||||
6.9,3.1,5.4,2.1,2
|
||||
6.7,3.1,5.6,2.4,2
|
||||
6.9,3.1,5.1,2.3,2
|
||||
5.8,2.7,5.1,1.9,2
|
||||
6.8,3.2,5.9,2.3,2
|
||||
6.7,3.3,5.7,2.5,2
|
||||
6.7,3,5.2,2.3,2
|
||||
6.3,2.5,5,1.9,2
|
||||
6.5,3,5.2,2,2
|
||||
6.2,3.4,5.4,2.3,2
|
||||
5.9,3,5.1,1.8,2
|
|
|
@ -1,11 +0,0 @@
|
|||
a,b,c,s
|
||||
0,1,2,3.0
|
||||
1,2,3,6.0
|
||||
2,3,4,9.0
|
||||
3,4,5,12.0
|
||||
4,5,6,15.0
|
||||
5,6,7,18.0
|
||||
6,7,8,21.0
|
||||
7,8,9,24.0
|
||||
8,9,10,27.0
|
||||
9,10,11,30.0
|
|
|
@ -1,6 +0,0 @@
|
|||
a,b,c,s
|
||||
0,1,2,3
|
||||
1,2,3,6
|
||||
2,3,4,9
|
||||
3,4,5,12
|
||||
4,5,6,15
|
|
|
@ -1,10 +0,0 @@
|
|||
t,r,s
|
||||
0.241,0.39,0.98
|
||||
.615,0.72,1.01
|
||||
1.00,1.00,1.00
|
||||
1.88,1.52,1.01
|
||||
11.8,5.20,0.99
|
||||
29.5,9.54,1.00
|
||||
84.0,19.18,1.00
|
||||
165,30.06,1.00
|
||||
248,39.44,1.00
|
|
|
@ -1,5 +0,0 @@
|
|||
operator, arity
|
||||
+,2
|
||||
-,2
|
||||
*,2
|
||||
/,2
|
|
|
@ -1,5 +0,0 @@
|
|||
operator, arity
|
||||
+,2
|
||||
-,2
|
||||
*,2
|
||||
/,2
|
|
|
@ -1,5 +0,0 @@
|
|||
operator, arity
|
||||
+,2
|
||||
-,2
|
||||
*,2
|
||||
/,2
|
|
|
@ -1,5 +0,0 @@
|
|||
operator, arity
|
||||
+,2
|
||||
-,2
|
||||
*,2
|
||||
/,2
|
|
|
@ -1,101 +0,0 @@
|
|||
a,b,c,s
|
||||
5.1,3.5,1.4,0
|
||||
4.9,3,1.4,0
|
||||
4.7,3.2,1.3,0
|
||||
4.6,3.1,1.5,0
|
||||
5,3.6,1.4,0
|
||||
5.4,3.9,1.7,0
|
||||
4.6,3.4,1.4,0
|
||||
5,3.4,1.5,0
|
||||
4.4,2.9,1.4,0
|
||||
4.9,3.1,1.5,0
|
||||
5.4,3.7,1.5,0
|
||||
4.8,3.4,1.6,0
|
||||
4.8,3,1.4,0
|
||||
4.3,3,1.1,0
|
||||
5.8,4,1.2,0
|
||||
5.7,4.4,1.5,0
|
||||
5.4,3.9,1.3,0
|
||||
5.1,3.5,1.4,0
|
||||
5.7,3.8,1.7,0
|
||||
5.1,3.8,1.5,0
|
||||
5.4,3.4,1.7,0
|
||||
5.1,3.7,1.5,0
|
||||
4.6,3.6,1,0
|
||||
5.1,3.3,1.7,0
|
||||
4.8,3.4,1.9,0
|
||||
5,3,1.6,0
|
||||
5,3.4,1.6,0
|
||||
5.2,3.5,1.5,0
|
||||
5.2,3.4,1.4,0
|
||||
4.7,3.2,1.6,0
|
||||
4.8,3.1,1.6,0
|
||||
5.4,3.4,1.5,0
|
||||
5.2,4.1,1.5,0
|
||||
5.5,4.2,1.4,0
|
||||
4.9,3.1,1.5,0
|
||||
5,3.2,1.2,0
|
||||
5.5,3.5,1.3,0
|
||||
4.9,3.6,1.4,0
|
||||
4.4,3,1.3,0
|
||||
5.1,3.4,1.5,0
|
||||
5,3.5,1.3,0
|
||||
4.5,2.3,1.3,0
|
||||
4.4,3.2,1.3,0
|
||||
5,3.5,1.6,0
|
||||
5.1,3.8,1.9,0
|
||||
4.8,3,1.4,0
|
||||
5.1,3.8,1.6,0
|
||||
4.6,3.2,1.4,0
|
||||
5.3,3.7,1.5,0
|
||||
5,3.3,1.4,0
|
||||
7,3.2,4.7,1
|
||||
6.4,3.2,4.5,1
|
||||
6.9,3.1,4.9,1
|
||||
5.5,2.3,4,1
|
||||
6.5,2.8,4.6,1
|
||||
5.7,2.8,4.5,1
|
||||
6.3,3.3,4.7,1
|
||||
4.9,2.4,3.3,1
|
||||
6.6,2.9,4.6,1
|
||||
5.2,2.7,3.9,1
|
||||
5,2,3.5,1
|
||||
5.9,3,4.2,1
|
||||
6,2.2,4,1
|
||||
6.1,2.9,4.7,1
|
||||
5.6,2.9,3.6,1
|
||||
6.7,3.1,4.4,1
|
||||
5.6,3,4.5,1
|
||||
5.8,2.7,4.1,1
|
||||
6.2,2.2,4.5,1
|
||||
5.6,2.5,3.9,1
|
||||
5.9,3.2,4.8,1
|
||||
6.1,2.8,4,1
|
||||
6.3,2.5,4.9,1
|
||||
6.1,2.8,4.7,1
|
||||
6.4,2.9,4.3,1
|
||||
6.6,3,4.4,1
|
||||
6.8,2.8,4.8,1
|
||||
6.7,3,5,1
|
||||
6,2.9,4.5,1
|
||||
5.7,2.6,3.5,1
|
||||
5.5,2.4,3.8,1
|
||||
5.5,2.4,3.7,1
|
||||
5.8,2.7,3.9,1
|
||||
6,2.7,5.1,1
|
||||
5.4,3,4.5,1
|
||||
6,3.4,4.5,1
|
||||
6.7,3.1,4.7,1
|
||||
6.3,2.3,4.4,1
|
||||
5.6,3,4.1,1
|
||||
5.5,2.5,4,1
|
||||
5.5,2.6,4.4,1
|
||||
6.1,3,4.6,1
|
||||
5.8,2.6,4,1
|
||||
5,2.3,3.3,1
|
||||
5.6,2.7,4.2,1
|
||||
5.7,3,4.2,1
|
||||
5.7,2.9,4.2,1
|
||||
6.2,2.9,4.3,1
|
||||
5.1,2.5,3,1
|
||||
5.7,2.8,4.1,1
|
|
|
@ -1,151 +0,0 @@
|
|||
a,b,c,s
|
||||
5.1,3.5,1.4,0
|
||||
4.9,3,1.4,0
|
||||
4.7,3.2,1.3,0
|
||||
4.6,3.1,1.5,0
|
||||
5,3.6,1.4,0
|
||||
5.4,3.9,1.7,0
|
||||
4.6,3.4,1.4,0
|
||||
5,3.4,1.5,0
|
||||
4.4,2.9,1.4,0
|
||||
4.9,3.1,1.5,0
|
||||
5.4,3.7,1.5,0
|
||||
4.8,3.4,1.6,0
|
||||
4.8,3,1.4,0
|
||||
4.3,3,1.1,0
|
||||
5.8,4,1.2,0
|
||||
5.7,4.4,1.5,0
|
||||
5.4,3.9,1.3,0
|
||||
5.1,3.5,1.4,0
|
||||
5.7,3.8,1.7,0
|
||||
5.1,3.8,1.5,0
|
||||
5.4,3.4,1.7,0
|
||||
5.1,3.7,1.5,0
|
||||
4.6,3.6,1,0
|
||||
5.1,3.3,1.7,0
|
||||
4.8,3.4,1.9,0
|
||||
5,3,1.6,0
|
||||
5,3.4,1.6,0
|
||||
5.2,3.5,1.5,0
|
||||
5.2,3.4,1.4,0
|
||||
4.7,3.2,1.6,0
|
||||
4.8,3.1,1.6,0
|
||||
5.4,3.4,1.5,0
|
||||
5.2,4.1,1.5,0
|
||||
5.5,4.2,1.4,0
|
||||
4.9,3.1,1.5,0
|
||||
5,3.2,1.2,0
|
||||
5.5,3.5,1.3,0
|
||||
4.9,3.6,1.4,0
|
||||
4.4,3,1.3,0
|
||||
5.1,3.4,1.5,0
|
||||
5,3.5,1.3,0
|
||||
4.5,2.3,1.3,0
|
||||
4.4,3.2,1.3,0
|
||||
5,3.5,1.6,0
|
||||
5.1,3.8,1.9,0
|
||||
4.8,3,1.4,0
|
||||
5.1,3.8,1.6,0
|
||||
4.6,3.2,1.4,0
|
||||
5.3,3.7,1.5,0
|
||||
5,3.3,1.4,0
|
||||
7,3.2,4.7,1
|
||||
6.4,3.2,4.5,1
|
||||
6.9,3.1,4.9,1
|
||||
5.5,2.3,4,1
|
||||
6.5,2.8,4.6,1
|
||||
5.7,2.8,4.5,1
|
||||
6.3,3.3,4.7,1
|
||||
4.9,2.4,3.3,1
|
||||
6.6,2.9,4.6,1
|
||||
5.2,2.7,3.9,1
|
||||
5,2,3.5,1
|
||||
5.9,3,4.2,1
|
||||
6,2.2,4,1
|
||||
6.1,2.9,4.7,1
|
||||
5.6,2.9,3.6,1
|
||||
6.7,3.1,4.4,1
|
||||
5.6,3,4.5,1
|
||||
5.8,2.7,4.1,1
|
||||
6.2,2.2,4.5,1
|
||||
5.6,2.5,3.9,1
|
||||
5.9,3.2,4.8,1
|
||||
6.1,2.8,4,1
|
||||
6.3,2.5,4.9,1
|
||||
6.1,2.8,4.7,1
|
||||
6.4,2.9,4.3,1
|
||||
6.6,3,4.4,1
|
||||
6.8,2.8,4.8,1
|
||||
6.7,3,5,1
|
||||
6,2.9,4.5,1
|
||||
5.7,2.6,3.5,1
|
||||
5.5,2.4,3.8,1
|
||||
5.5,2.4,3.7,1
|
||||
5.8,2.7,3.9,1
|
||||
6,2.7,5.1,1
|
||||
5.4,3,4.5,1
|
||||
6,3.4,4.5,1
|
||||
6.7,3.1,4.7,1
|
||||
6.3,2.3,4.4,1
|
||||
5.6,3,4.1,1
|
||||
5.5,2.5,4,1
|
||||
5.5,2.6,4.4,1
|
||||
6.1,3,4.6,1
|
||||
5.8,2.6,4,1
|
||||
5,2.3,3.3,1
|
||||
5.6,2.7,4.2,1
|
||||
5.7,3,4.2,1
|
||||
5.7,2.9,4.2,1
|
||||
6.2,2.9,4.3,1
|
||||
5.1,2.5,3,1
|
||||
5.7,2.8,4.1,1
|
||||
6.3,3.3,6,2
|
||||
5.8,2.7,5.1,2
|
||||
7.1,3,5.9,2
|
||||
6.3,2.9,5.6,2
|
||||
6.5,3,5.8,2
|
||||
7.6,3,6.6,2
|
||||
4.9,2.5,4.5,2
|
||||
7.3,2.9,6.3,2
|
||||
6.7,2.5,5.8,2
|
||||
7.2,3.6,6.1,2
|
||||
6.5,3.2,5.1,2
|
||||
6.4,2.7,5.3,2
|
||||
6.8,3,5.5,2
|
||||
5.7,2.5,5,2
|
||||
5.8,2.8,5.1,2
|
||||
6.4,3.2,5.3,2
|
||||
6.5,3,5.5,2
|
||||
7.7,3.8,6.7,2
|
||||
7.7,2.6,6.9,2
|
||||
6,2.2,5,2
|
||||
6.9,3.2,5.7,2
|
||||
5.6,2.8,4.9,2
|
||||
7.7,2.8,6.7,2
|
||||
6.3,2.7,4.9,2
|
||||
6.7,3.3,5.7,2
|
||||
7.2,3.2,6,2
|
||||
6.2,2.8,4.8,2
|
||||
6.1,3,4.9,2
|
||||
6.4,2.8,5.6,2
|
||||
7.2,3,5.8,2
|
||||
7.4,2.8,6.1,2
|
||||
7.9,3.8,6.4,2
|
||||
6.4,2.8,5.6,2
|
||||
6.3,2.8,5.1,2
|
||||
6.1,2.6,5.6,2
|
||||
7.7,3,6.1,2
|
||||
6.3,3.4,5.6,2
|
||||
6.4,3.1,5.5,2
|
||||
6,3,4.8,2
|
||||
6.9,3.1,5.4,2
|
||||
6.7,3.1,5.6,2
|
||||
6.9,3.1,5.1,2
|
||||
5.8,2.7,5.1,2
|
||||
6.8,3.2,5.9,2
|
||||
6.7,3.3,5.7,2
|
||||
6.7,3,5.2,2
|
||||
6.3,2.5,5,2
|
||||
6.5,3,5.2,2
|
||||
6.2,3.4,5.4,2
|
||||
5.9,3,5.1,2
|
|
|
@ -1,10 +0,0 @@
|
|||
p,a,s
|
||||
0.241,0.39,0.98
|
||||
.615,0.72,1.01
|
||||
1.00,1.00,1.00
|
||||
1.88,1.52,1.01
|
||||
11.8,5.20,0.99
|
||||
29.5,9.54,1.00
|
||||
84.0,19.18,1.00
|
||||
165,30.06,1.00
|
||||
248,39.44,1.00
|
|
|
@ -1,6 +0,0 @@
|
|||
a,b,s
|
||||
1,2,1
|
||||
2,2,4
|
||||
3,2,9
|
||||
4,2,16
|
||||
5,2,25
|
|
|
@ -1,10 +0,0 @@
|
|||
a,b,s
|
||||
4,10,20
|
||||
9,10,30
|
||||
16,10,40
|
||||
25,10,50
|
||||
36,10,60
|
||||
49,10,70
|
||||
64,10,80
|
||||
81,10,90
|
||||
100,10,100
|
|
|
@ -1,11 +0,0 @@
|
|||
a,b,c,s
|
||||
0,1,2,3
|
||||
1,2,3,6
|
||||
2,3,4,9
|
||||
3,4,5,12
|
||||
4,5,6,15
|
||||
5,6,7,18
|
||||
6,7,8,21
|
||||
7,8,9,24
|
||||
8,9,10,27
|
||||
9,10,11,30
|
|
|
@ -1,4 +0,0 @@
|
|||
a,b,c,s
|
||||
1,2,45,0.5253219888
|
||||
2,0,22,-1.9999216528
|
||||
10,3,-5,2.8366218546
|
|
|
@ -1,127 +0,0 @@
|
|||
This file contains all operators supported by Karoo GP as of v1.0.
|
||||
|
||||
Note that some operators are simply entered along with the arity (total number of elements anticipated), while others
|
||||
must be preceded by another operator due the manner in which Karoo flattens the trees into a mathematical expression.
|
||||
Else, Karoo will attempt a function such as (a)sin(b) where sin(b) is correct, but (a)sin requires an operator between
|
||||
the operand 'a' and the operator 'sin'. This will be addressed in a future update to Karoo.
|
||||
|
||||
To apply one or more operator to a given run, copy/paste the desired operators from the USE IN KAROO table(s) below,
|
||||
into the associated file for Classification (files/operators_CLASSIFY.csv) or Regression (files/operators_REGRESS.csv)
|
||||
|
||||
* OPERATOR EXAMPLE *
|
||||
add a + b
|
||||
subtract a - b
|
||||
multiply a * b
|
||||
divide a / b
|
||||
pow a ** 2
|
||||
|
||||
USE IN KAROO
|
||||
+,2
|
||||
-,2
|
||||
*,2
|
||||
/,2
|
||||
**,2
|
||||
|
||||
|
||||
* OPERATOR EXAMPLE *
|
||||
logical_and a and b
|
||||
logical_or a or b
|
||||
logical_not not a
|
||||
|
||||
USE IN KAROO
|
||||
and,2
|
||||
or,2
|
||||
not,1
|
||||
|
||||
|
||||
* OPERATOR EXAMPLE (
|
||||
abs abs(a)
|
||||
log log(a)
|
||||
log1p log1p(a)
|
||||
sign sign(a)
|
||||
square square(a)
|
||||
sqrt sqrt(a)
|
||||
|
||||
USE IN KAROO
|
||||
+ abs,2
|
||||
- abs,2
|
||||
* abs,2
|
||||
/ abs,2
|
||||
|
||||
+ log,2
|
||||
- log,2
|
||||
* log,2
|
||||
/ log,2
|
||||
|
||||
+ log1p,2
|
||||
- log1p,2
|
||||
* log1p,2
|
||||
/ log1p,2
|
||||
|
||||
+ sign,2
|
||||
- sign,2
|
||||
* sign,2
|
||||
/ sign,2
|
||||
|
||||
+ square,2
|
||||
- square,2
|
||||
* square,2
|
||||
/ square,2
|
||||
|
||||
+ sqrt,2
|
||||
- sqrt,2
|
||||
* sqrt,2
|
||||
/ sqrt,2
|
||||
|
||||
|
||||
* OPERATOR EXAMPLE *
|
||||
cos cos(a)
|
||||
sin sin(a)
|
||||
tan tan(a)
|
||||
acos acos(a)
|
||||
asin asin(a)
|
||||
atan atan(a)
|
||||
|
||||
USE IN KAROO
|
||||
+ cos,2
|
||||
- cos,2
|
||||
* cos,2
|
||||
/ cos,2
|
||||
|
||||
+ sin,2
|
||||
- sin,2
|
||||
* sin,2
|
||||
/ sin,2
|
||||
|
||||
+ tan,2
|
||||
- tan,2
|
||||
* tan,2
|
||||
/ tan,2
|
||||
|
||||
+ acos,2
|
||||
- acos,2
|
||||
* acos,2
|
||||
/ acos,2
|
||||
|
||||
+ asin,2
|
||||
- asin,2
|
||||
* asin,2
|
||||
/ asin,2
|
||||
|
||||
+ atan,2
|
||||
- atan,2
|
||||
* atan,2
|
||||
/ atan,2
|
||||
|
||||
|
||||
The following operators produce TRUE or FALSE statements, and are therefore, at this time, not supported. A future
|
||||
version of Karoo will instead output a binary 1 or 0 instead.
|
||||
|
||||
equal a == b
|
||||
not_equal a != b
|
||||
less a < b
|
||||
less_equal a <= b
|
||||
greater a > b
|
||||
greater_equal a >= 1
|
||||
|
||||
|
|
@ -0,0 +1,56 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en-us">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Karoo gp by kstaats</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" type="text/css" href="stylesheets/normalize.css" media="screen">
|
||||
<link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700' rel='stylesheet' type='text/css'>
|
||||
<link rel="stylesheet" type="text/css" href="stylesheets/stylesheet.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="stylesheets/github-light.css" media="screen">
|
||||
</head>
|
||||
<body>
|
||||
<section class="page-header">
|
||||
<h1 class="project-name">Karoo gp</h1>
|
||||
<h2 class="project-tagline">A Genetic Programming platform for Python</h2>
|
||||
<a href="https://github.com/kstaats/karoo_gp" class="btn">View on GitHub</a>
|
||||
<a href="https://github.com/kstaats/karoo_gp/zipball/master" class="btn">Download .zip</a>
|
||||
<a href="https://github.com/kstaats/karoo_gp/tarball/master" class="btn">Download .tar.gz</a>
|
||||
</section>
|
||||
|
||||
<section class="main-content">
|
||||
<p><a href="http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_desktop.png"><img src="http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_desktop-224x300.png" alt="Karoo GP by Kai Staats" width="224" height="300" hspace="20" align="left"></a> Karoo GP is a Genetic Programming (GP) suite, a subset of Machine Learning written in Python. GP provides both symbolic regression and classification analysis. Karoo GP is a scalable platform with multicore and GPU support (via TensorFlow), designed to readily work with realworld data. <em>No programming required.</em> As a teaching tool, it enables instructors to share step-by-step how an evolutionary algorithm arrives to its solution. As a hands-on learning tool, Karoo GP supports rapid, repeatable experimentation.</p>
|
||||
|
||||
<p>Karoo GP includes a Desktop application with an intuitive user interface, a fully scriptable Server application with user defined default parameters, command-line arguments, and automatically generate evolutionary population and parameter archives; a stand-alone Python script which generates randomly constructed subsets of larger datasets and another which normalises datasets; and a toy model which shows the inner workings of multiclass classification.</p>
|
||||
|
||||
<p>The included User Guide (PDF) offers system requirements, a crash-course in Genetic Programming, and use of Karoo GP for both the novice and advanced user.
|
||||
Â
|
||||
 </p>
|
||||
|
||||
<p>Features include:</p>
|
||||
|
||||
<ul>
|
||||
<li>written in Object Oriented Python with a hierarchical naming scheme for all methods</li>
|
||||
<li>multicore and GPU support through the TensorFlow library</li>
|
||||
<li><em>Desktop</em> script provides a simple user interface with menu, 5 display modes (see below), and runtime reconfiguration of parameters</li>
|
||||
<li><em>Server</em> script enables configurable runs via command-line arguments</li>
|
||||
<li>anticipates datasets as standard .csv files</li>
|
||||
<li>automatically archives the population of each generation and runtime parameters</li>
|
||||
<li>supports customised seed populations</li>
|
||||
<li>relatively simple framework for preparing custom fitness functions and evaluation routines</li>
|
||||
</ul>
|
||||
|
||||
<p>Karoo GP was developed during Staats' MSc research at the University of Cape Town / African Institute for Mathematical Sciences and the Square Kilometre Array (SKA), South Africa, is currently in use at LIGO, and owes its foundation to the "Field Guide to Genetic Programming" by Poli, Langdon, McPhee, and Koza. The Field Guide and many more GP publications and software packages are showcased at <a href="http://geneticprogramming.com/publications/">www.geneticprogramming.com</a></p>
|
||||
|
||||
<p><a href="http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_args.png"><img src="http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_args-95x128.png" alt="Karoo GP by Kai Staats" width="95" height="128"></a> <a href="http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_tree_print.png"><img src="http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_tree_print-95x128.png" alt="Karoo GP by Kai Staats" width="95" height="128"></a> <a href="http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_runtime_options.png"><img src="http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_runtime_options-95x128.png" alt="Karoo GP by Kai Staats" width="95" height="128"></a> <a href="http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_go_test.png"><img src="http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_go_test-95x128.png" alt="Karoo GP by Kai Staats" width="95" height="128"></a> <a href="http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_interactive_mode.png"><img src="http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_interactive_mode-95x128.png" alt="Karoo GP by Kai Staats" width="95" height="128"></a> <a href="http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_debug_mode.png"><img src="http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_debug_mode-95x128.png" alt="Karoo GP by Kai Staats" width="95" height="128"></a> <a href="http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_population_archive.png"><img src="http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_population_archive-105x128.png" alt="Karoo GP by Kai Staats" width="105" height="128"></a></p>
|
||||
|
||||
<footer class="site-footer">
|
||||
<span class="site-footer-owner"><a href="https://github.com/kstaats/karoo_gp">Karoo gp</a> is maintained by <a href="https://github.com/kstaats">kstaats</a>.</span>
|
||||
|
||||
<span class="site-footer-credits">This page was generated by <a href="https://pages.github.com">GitHub Pages</a> using the <a href="https://github.com/jasonlong/cayman-theme">Cayman theme</a> by <a href="https://twitter.com/jasonlong">Jason Long</a>.</span>
|
||||
</footer>
|
||||
|
||||
</section>
|
||||
|
||||
</body>
|
||||
</html>
|
253
karoo_gp.py
253
karoo_gp.py
|
@ -1,253 +0,0 @@
|
|||
# Karoo GP (desktop + server combined)
|
||||
# Use Genetic Programming for Classification and Symbolic Regression
|
||||
# by Kai Staats, MSc with TensorFlow support provided by Iurii Milovanov; see LICENSE.md
|
||||
# version 2.3 for Python 3.6
|
||||
|
||||
'''
|
||||
A word to the newbie, expert, and brave--
|
||||
Even if you are highly experienced in Genetic Programming, it is recommended that you review the 'Karoo User Guide'
|
||||
before running this application. While your computer will not burst into flames nor will the sun collapse into a black
|
||||
hole if you do not, you will likely find more enjoyment of this particular flavour of GP with a little understanding
|
||||
of its intent and design.
|
||||
|
||||
Without any command line arguments, Karoo GP relies upon user settings and the datasets located in karoo_gp/files/.
|
||||
|
||||
$ python karoo_gp_main.py
|
||||
|
||||
|
||||
If you include the path to an external dataset, it will auto-load at launch:
|
||||
|
||||
$ python karoo_gp_main.py /[path]/[to_your]/[filename].csv
|
||||
|
||||
|
||||
If you include one or more additional arguments, they will override the default values, as follows:
|
||||
|
||||
-ker [r,c,m] fitness function: (r)egression, (c)lassification, or (m)atching
|
||||
-typ [f,g,r] Tree type: (f)ull, (g)row, or (r)amped half/half
|
||||
-bas [3...10] maximum Tree depth for initial population
|
||||
-max [3...10] maximum Tree depth for entire run
|
||||
-min [3 to 2^(bas +1) - 1] minimum number of nodes
|
||||
-pop [10...1000] number of trees in each generational population
|
||||
-gen [1...100] number of generations
|
||||
-tor [7 per 100] number of trees selected for tournament
|
||||
-evr [0.0...1.0] decimal percent of pop generated through Reproduction
|
||||
-evp [0.0...1.0] decimal percent of pop generated through Point Mutation
|
||||
-evb [0.0...1.0] decimal percent of pop generated through Branch Mutation
|
||||
-evc [0.0...1.0] decimal percent of pop generated through Crossover
|
||||
|
||||
If you include any of the above flags, then you *must* also include a flag to load an external dataset.
|
||||
|
||||
-fil [path]/[to]/[data].csv an external dataset
|
||||
|
||||
|
||||
An example is given, as follows:
|
||||
|
||||
$ python karoo_gp_server.py -ker c -typ r -bas 4 -fil [path]/[to]/[data].csv
|
||||
|
||||
'''
|
||||
|
||||
import os
|
||||
import sys; sys.path.append('modules/') # add directory 'modules' to the current path
|
||||
import argparse
|
||||
import karoo_gp_base_class; gp = karoo_gp_base_class.Base_GP()
|
||||
|
||||
os.system('clear')
|
||||
print ('\n\033[36m\033[1m')
|
||||
print ('\t ** ** ****** ***** ****** ****** ****** ******')
|
||||
print ('\t ** ** ** ** ** ** ** ** ** ** ** ** **')
|
||||
print ('\t ** ** ** ** ** ** ** ** ** ** ** ** **')
|
||||
print ('\t **** ******** ****** ** ** ** ** ** *** *******')
|
||||
print ('\t ** ** ** ** ** ** ** ** ** ** ** ** **')
|
||||
print ('\t ** ** ** ** ** ** ** ** ** ** ** ** **')
|
||||
print ('\t ** ** ** ** ** ** ** ** ** ** ** ** **')
|
||||
print ('\t ** ** ** ** ** ** ****** ****** ****** **')
|
||||
print ('\033[0;0m')
|
||||
print ('\t\033[36m Genetic Programming in Python with TensorFlow - by Kai Staats, version 2.3\033[0;0m')
|
||||
print ('')
|
||||
|
||||
|
||||
#++++++++++++++++++++++++++++++++++++++++++
|
||||
# User Interface for Configuation |
|
||||
#++++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
if len(sys.argv) < 3: # either no command line argument, or only a filename is provided
|
||||
|
||||
while True:
|
||||
try:
|
||||
query = input('\t Select (c)lassification, (r)egression, (m)atching, or (p)lay (default m): ')
|
||||
if query in ['c','r','m','p','']: kernel = query or 'm'; break
|
||||
else: raise ValueError()
|
||||
except ValueError: print ('\t\033[32m Select from the options given. Try again ...\n\033[0;0m')
|
||||
except KeyboardInterrupt: sys.exit()
|
||||
|
||||
if kernel == 'p': # play mode
|
||||
while True:
|
||||
try:
|
||||
query = input('\t Select (f)ull or (g)row (default g): ')
|
||||
if query in ['f','g','']: tree_type = query or 'f'; break
|
||||
else: raise ValueError()
|
||||
except ValueError: print ('\t\033[32m Select from the options given. Try again ...\n\033[0;0m')
|
||||
except KeyboardInterrupt: sys.exit()
|
||||
|
||||
while True:
|
||||
try:
|
||||
query = input('\t Enter the depth of the Tree (default 1): ')
|
||||
if query == '': tree_depth_base = 1; break
|
||||
elif int(query) in list(range(1,11)): tree_depth_base = int(query); break
|
||||
else: raise ValueError()
|
||||
except ValueError: print ('\t\033[32m Enter a number from 1 including 10. Try again ...\n\033[0;0m')
|
||||
except KeyboardInterrupt: sys.exit()
|
||||
|
||||
tree_depth_max = tree_depth_base
|
||||
tree_depth_min = 3
|
||||
tree_pop_max = 1
|
||||
gen_max = 1
|
||||
tourn_size = 0
|
||||
display = 'm'
|
||||
# evolve_repro, evolve_point, evolve_branch, evolve_cross, tourn_size, precision, filename are not required
|
||||
|
||||
else: # if any other kernel is selected
|
||||
|
||||
while True:
|
||||
try:
|
||||
query = input('\t Select (f)ull, (g)row, or (r)amped 50/50 method (default r): ')
|
||||
if query in ['f','g','r','']: tree_type = query or 'r'; break
|
||||
else: raise ValueError()
|
||||
except ValueError: print ('\t\033[32m Select from the options given. Try again ...\n\033[0;0m')
|
||||
except KeyboardInterrupt: sys.exit()
|
||||
|
||||
while True:
|
||||
try:
|
||||
query = input('\t Enter depth of the \033[3minitial\033[0;0m population of Trees (default 3): ')
|
||||
if query == '': tree_depth_base = 3; break
|
||||
elif int(query) in list(range(1,11)): tree_depth_base = int(query); break
|
||||
else: raise ValueError()
|
||||
except ValueError: print ('\t\033[32m Enter a number from 1 including 10. Try again ...\n\033[0;0m')
|
||||
except KeyboardInterrupt: sys.exit()
|
||||
|
||||
while True:
|
||||
try:
|
||||
query = input('\t Enter maximum Tree depth (default %s): ' %str(tree_depth_base))
|
||||
if query == '': tree_depth_max = tree_depth_base; break
|
||||
elif int(query) in list(range(tree_depth_base,11)): tree_depth_max = int(query); break
|
||||
else: raise ValueError()
|
||||
except ValueError: print ('\t\033[32m Enter a number from %s including 10. Try again ...\n\033[0;0m' %str(tree_depth_base))
|
||||
except KeyboardInterrupt: sys.exit()
|
||||
|
||||
max_nodes = 2**(tree_depth_base+1)-1 # calc the max number of nodes for the given depth
|
||||
|
||||
while True:
|
||||
try:
|
||||
query = input('\t Enter minimum number of nodes for any given Tree (default 3; max %s): ' %str(max_nodes))
|
||||
if query == '': tree_depth_min = 3; break
|
||||
elif int(query) in list(range(3,max_nodes + 1)): tree_depth_min = int(query); break
|
||||
else: raise ValueError()
|
||||
except ValueError: print ('\t\033[32m Enter a number from 3 including %s. Try again ...\n\033[0;0m' %str(max_nodes))
|
||||
except KeyboardInterrupt: sys.exit()
|
||||
|
||||
#while True:
|
||||
#try:
|
||||
#query = input('\t Select (p)artial or (f)ull operator inclusion (default p): ')
|
||||
#if query == '': swim = 'p'; break
|
||||
#elif query in ['p','f']: swim = query; break
|
||||
#else: raise ValueError()
|
||||
#except ValueError: print ('\t\033[32m Select from the options given. Try again ...\n\033[0;0m')
|
||||
#except KeyboardInterrupt: sys.exit()
|
||||
|
||||
while True:
|
||||
try:
|
||||
query = input('\t Enter number of Trees in each population (default 100): ')
|
||||
if query == '': tree_pop_max = 100; break
|
||||
elif int(query) in list(range(1,1001)): tree_pop_max = int(query); break
|
||||
else: raise ValueError()
|
||||
except ValueError: print ('\t\033[32m Enter a number from 1 including 1000. Try again ...\n\033[0;0m')
|
||||
except KeyboardInterrupt: sys.exit()
|
||||
|
||||
# calculate the tournament size
|
||||
tourn_size = int(tree_pop_max * 0.07) # default 7% can be changed by selecting (g)eneration and then 'ts'
|
||||
if tourn_size < 2: tourn_size = 2 # forces some diversity for small populations
|
||||
if tree_pop_max == 1: tourn_size = 1 # in theory, supports the evolution of a single Tree - NEED TO FIX 2018 04/19
|
||||
|
||||
while True:
|
||||
try:
|
||||
query = input('\t Enter max number of generations (default 10): ')
|
||||
if query == '': gen_max = 10; break
|
||||
elif int(query) in list(range(1,101)): gen_max = int(query); break
|
||||
else: raise ValueError()
|
||||
except ValueError: print ('\t\033[32m Enter a number from 1 including 100. Try again ...\n\033[0;0m')
|
||||
except KeyboardInterrupt: sys.exit()
|
||||
|
||||
if gen_max > 1:
|
||||
while True:
|
||||
try:
|
||||
query = input('\t Display (i)nteractive, (g)eneration, (m)iminal, (s)ilent, or (d)e(b)ug (default m): ')
|
||||
if query in ['i','g','m','s','db','']: display = query or 'm'; break
|
||||
else: raise ValueError()
|
||||
except ValueError: print ('\t\033[32m Select from the options given. Try again ...\n\033[0;0m')
|
||||
except KeyboardInterrupt: sys.exit()
|
||||
|
||||
else: display = 's' # display mode is not used, but a value must be passed
|
||||
|
||||
### additional configuration parameters ###
|
||||
|
||||
evolve_repro = int(0.1 * tree_pop_max) # quantity of a population generated through Reproduction
|
||||
evolve_point = int(0.0 * tree_pop_max) # quantity of a population generated through Point Mutation
|
||||
evolve_branch = int(0.2 * tree_pop_max) # quantity of a population generated through Branch Mutation
|
||||
evolve_cross = int(0.7 * tree_pop_max) # quantity of a population generated through Crossover
|
||||
filename = '' # not required unless an external file is referenced
|
||||
precision = 6 # number of floating points for the round function in 'fx_fitness_eval'
|
||||
swim = 'p' # require (p)artial or (f)ull set of features (operators) for each Tree entering the gene_pool
|
||||
mode = 'd' # pause at the (d)esktop when complete, awaiting further user interaction; or terminate in (s)erver mode
|
||||
|
||||
|
||||
#++++++++++++++++++++++++++++++++++++++++++
|
||||
# Command Line for Configuation |
|
||||
#++++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
else: # 2 or more command line arguments are provided
|
||||
|
||||
ap = argparse.ArgumentParser(description = 'Karoo GP Server')
|
||||
ap.add_argument('-ker', action = 'store', dest = 'kernel', default = 'c', help = '[c,r,m] fitness function: (r)egression, (c)lassification, or (m)atching')
|
||||
ap.add_argument('-typ', action = 'store', dest = 'type', default = 'r', help = '[f,g,r] Tree type: (f)ull, (g)row, or (r)amped half/half')
|
||||
ap.add_argument('-bas', action = 'store', dest = 'depth_base', default = 4, help = '[3...10] maximum Tree depth for the initial population')
|
||||
ap.add_argument('-max', action = 'store', dest = 'depth_max', default = 4, help = '[3...10] maximum Tree depth for the entire run')
|
||||
ap.add_argument('-min', action = 'store', dest = 'depth_min', default = 3, help = 'minimum nodes, from 3 to 2^(base_depth +1) - 1')
|
||||
ap.add_argument('-pop', action = 'store', dest = 'pop_max', default = 100, help = '[10...1000] number of trees per generation')
|
||||
ap.add_argument('-gen', action = 'store', dest = 'gen_max', default = 10, help = '[1...100] number of generations')
|
||||
ap.add_argument('-tor', action = 'store', dest = 'tor_size', default = 7, help = '[7 for each 100] recommended tournament size')
|
||||
ap.add_argument('-evr', action = 'store', dest = 'evo_r', default = 0.1, help = '[0.0-1.0] decimal percent of pop generated through Reproduction')
|
||||
ap.add_argument('-evp', action = 'store', dest = 'evo_p', default = 0.0, help = '[0.0-1.0] decimal percent of pop generated through Point Mutation')
|
||||
ap.add_argument('-evb', action = 'store', dest = 'evo_b', default = 0.2, help = '[0.0-1.0] decimal percent of pop generated through Branch Mutation')
|
||||
ap.add_argument('-evc', action = 'store', dest = 'evo_c', default = 0.7, help = '[0.0-1.0] decimal percent of pop generated through Crossover')
|
||||
ap.add_argument('-fil', action = 'store', dest = 'filename', default = '', help = '/path/to_your/[data].csv')
|
||||
|
||||
args = ap.parse_args()
|
||||
|
||||
# pass the argparse defaults and/or user inputs to the required variables
|
||||
kernel = str(args.kernel)
|
||||
tree_type = str(args.type)
|
||||
tree_depth_base = int(args.depth_base)
|
||||
tree_depth_max = int(args.depth_max)
|
||||
tree_depth_min = int(args.depth_min)
|
||||
tree_pop_max = int(args.pop_max)
|
||||
gen_max = int(args.gen_max)
|
||||
tourn_size = int(args.tor_size)
|
||||
evolve_repro = int(float(args.evo_r) * tree_pop_max)
|
||||
evolve_point = int(float(args.evo_p) * tree_pop_max)
|
||||
evolve_branch = int(float(args.evo_b) * tree_pop_max)
|
||||
evolve_cross = int(float(args.evo_c) * tree_pop_max)
|
||||
filename = str(args.filename)
|
||||
|
||||
display = 's' # display mode is set to (s)ilent
|
||||
precision = 6 # number of floating points for the round function in 'fx_fitness_eval'
|
||||
swim = 'p' # require (p)artial or (f)ull set of features (operators) for each Tree entering the gene_pool
|
||||
mode = 's' # pause at the (d)esktop when complete, awaiting further user interaction; or terminate in (s)erver mode
|
||||
|
||||
|
||||
#++++++++++++++++++++++++++++++++++++++++++
|
||||
# Conduct the GP run |
|
||||
#++++++++++++++++++++++++++++++++++++++++++
|
||||
|
||||
gp.fx_karoo_gp(kernel, tree_type, tree_depth_base, tree_depth_max, tree_depth_min, tree_pop_max, gen_max, tourn_size, filename, evolve_repro, evolve_point, evolve_branch, evolve_cross, display, precision, swim, mode)
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -1,237 +0,0 @@
|
|||
# Karoo GP Pause Menu
|
||||
# A text-based user interface for mid-run parameter configuration and population studies
|
||||
# by Kai Staats, MSc with TensorFlow support provided by Iurii Milovanov; see LICENSE.md
|
||||
# version 2.3 for Python 3.6
|
||||
|
||||
def pause(menu_dict):
|
||||
|
||||
'''
|
||||
Pause the program execution and invok the user to make one or more valid options.
|
||||
|
||||
Called by: fx_karoo_gp
|
||||
|
||||
Arguments required: menu_dict
|
||||
'''
|
||||
|
||||
options = ['','?','help','i','m','g','s','db','ts','min','bal','l','pop','e','p','id','dir','load','w','add','q']
|
||||
|
||||
while True:
|
||||
try:
|
||||
menu = input('\n\t\033[36m (pause) \033[0;0m')
|
||||
if menu in options: break
|
||||
else: raise ValueError()
|
||||
except ValueError: print ('\n\t\033[32m Enter \033[1m?\033[0;0m\033[32m to review your options. Try again ...\033[0;0m')
|
||||
except KeyboardInterrupt: print ('\n\n\t\033[32m Enter \033[1mq\033[0;0m\033[32m to quit\033[0;0m')
|
||||
|
||||
if menu == '': menu_dict['input_a'] = 'esc' # exit (pause) with ENTER
|
||||
|
||||
elif menu == '?' or menu == 'help':
|
||||
print ('\n\t\033[32m Select from one of the following options:\033[0;0m')
|
||||
print ('\t\033[36m\033[1m i \t\033[0;0m engage Interactive display mode')
|
||||
print ('\t\033[36m\033[1m m \t\033[0;0m engage Minimal display mode')
|
||||
print ('\t\033[36m\033[1m g \t\033[0;0m engage Generation display mode')
|
||||
print ('\t\033[36m\033[1m s \t\033[0;0m engage Silent display mode')
|
||||
print ('\t\033[36m\033[1m db \t\033[0;0m engage De-Bug display mode')
|
||||
print ('')
|
||||
print ('\t\033[36m\033[1m ts \t\033[0;0m adjust tournament size')
|
||||
print ('\t\033[36m\033[1m min \t\033[0;0m adjust minimum number of nodes')
|
||||
# print ('\t\033[36m\033[1m max \t\033[0;0m adjust maximum Tree depth') # NEED TO ADD
|
||||
print ('\t\033[36m\033[1m bal \t\033[0;0m adjust balance of genetic operators')
|
||||
print ('')
|
||||
print ('\t\033[36m\033[1m l \t\033[0;0m list Trees with leading fitness scores')
|
||||
print ('\t\033[36m\033[1m pop \t\033[0;0m list Trees in current population')
|
||||
print ('\t\033[36m\033[1m e \t\033[0;0m evaluate a single Tree against the test data')
|
||||
print ('\t\033[36m\033[1m p \t\033[0;0m print a single Tree to screen')
|
||||
print ('')
|
||||
print ('\t\033[36m\033[1m id \t\033[0;0m display current generation ID')
|
||||
print ('\t\033[36m\033[1m dir \t\033[0;0m display current working directory')
|
||||
# print ('\t\033[36m\033[1m load \t\033[0;0m load population_s (seed) to replace population_a (current)') # NEED TO FIX
|
||||
print ('\t\033[36m\033[1m w \t\033[0;0m write the evolving population_b to disk')
|
||||
print ('')
|
||||
print ('\t\033[36m\033[1m add \t\033[0;0m add generations and continue your run')
|
||||
print ('\t\033[36m\033[1m q \t\033[0;0m quit Karoo GP')
|
||||
|
||||
elif menu == 'i': menu_dict['display'] = 'i'; print ('\n\t Interactive display mode engaged (for control freaks)')
|
||||
elif menu == 'g': menu_dict['display'] = 'g'; print ('\n\t Generation display mode engaged (for recovering control freaks)')
|
||||
elif menu == 'm': menu_dict['display'] = 'm'; print ('\n\t Minimal display mode engaged (for GP gurus)')
|
||||
elif menu == 's': menu_dict['display'] = 's'; print ('\n\t Silent display mode engaged (for zen masters)')
|
||||
elif menu == 'db': menu_dict['display'] = 'db'; print ('\n\t De-Bug display mode engaged (for evolutionary biologists)')
|
||||
|
||||
elif menu == 'ts': # adjust the tournament size
|
||||
while True:
|
||||
try:
|
||||
print ('\n\t The current tournament size is:', menu_dict['tourn_size'])
|
||||
query = input('\t Adjust the tournament size (suggest 7 for each 100): ')
|
||||
if query == '': break
|
||||
elif int(query) in list(range(2,menu_dict['tree_pop_max'] + 1)): menu_dict['tourn_size'] = int(query); break # rebuilt 20190603
|
||||
else: raise ValueError()
|
||||
except ValueError: print ('\n\t\033[32m Enter a number from 2 including %s. Try again ...\033[0;0m' %str(menu_dict['tree_pop_max']))
|
||||
except KeyboardInterrupt: print ('\n\n\t\033[32m Enter \033[1mq\033[0;0m\033[32m to quit\033[0;0m')
|
||||
|
||||
elif menu == 'min': # adjust the minimum number of nodes per Tree
|
||||
# max_nodes = 2**(tree_depth_base +1) - 1 # NEED TO calc to replace upper limit in range but tree_depth_base is not global - 2018 04/22
|
||||
while True:
|
||||
try:
|
||||
print ('\n\t The current minimum number of nodes is:', menu_dict['tree_depth_min'])
|
||||
query = input('\t Adjust the minimum number of nodes for all Trees (min 3): ')
|
||||
if query == '': break
|
||||
elif int(query) in list(range(3,1000)): menu_dict['tree_depth_min'] = int(query); break # rebuilt 20190603
|
||||
else: raise ValueError()
|
||||
except ValueError: print ('\n\t\033[32m Enter a number from 3 including 1000. Try again ...\033[0;0m')
|
||||
except KeyboardInterrupt: print ('\n\n\t\033[32m Enter \033[1mq\033[0;0m\033[32m to quit\033[0;0m')
|
||||
|
||||
# NEED TO ADD
|
||||
#elif menu == 'max': # adjust the maximum Tree depth
|
||||
# while True:
|
||||
# try:
|
||||
# print ('\n\t The current \033[3madjusted\033[0;0m maximum Tree depth is:', gp.tree_depth_max)
|
||||
# query = input('\n\t Adjust the global maximum Tree depth to (1 ... 10): ')
|
||||
# if int(query) not in list(range(1,11)): raise ValueError()
|
||||
# if query < gp.tree_depth_max:
|
||||
# print ('\n\t\033[32m This value is less than the current value.\033[0;0m')
|
||||
# conf = input('\n\t Are you ok with this? (y/n) ')
|
||||
# if conf == 'n': break
|
||||
# except ValueError: print ('\n\t\033[32m Enter a number from 1 including 10. Try again ...\033[0;0m')
|
||||
# except KeyboardInterrupt: print ('\n\n\t\033[32m Enter \033[1mq\033[0;0m\033[32m to quit\033[0;0m')
|
||||
|
||||
elif menu == 'bal': # adjust the balance of genetic operators'
|
||||
print ('\n\t The current balance of genetic operators is:')
|
||||
print ('\t\t Reproduction:', menu_dict['evolve_repro']); tmp_repro = menu_dict['evolve_repro']
|
||||
print ('\t\t Point Mutation:', menu_dict['evolve_point']); tmp_point = menu_dict['evolve_point']
|
||||
print ('\t\t Branch Mutation:', menu_dict['evolve_branch']); tmp_branch = menu_dict['evolve_branch']
|
||||
print ('\t\t Crossover:', menu_dict['evolve_cross'], '\n'); tmp_cross = menu_dict['evolve_cross']
|
||||
|
||||
while True:
|
||||
try:
|
||||
query = input('\t Enter quantity of Trees to be generated by Reproduction: ')
|
||||
if query == '': break
|
||||
elif int(query) in list(range(0,1000)): tmp_repro = int(query); break
|
||||
else: raise ValueError()
|
||||
except ValueError: print ('\n\t\033[32m Enter a number from 0 including %s. Try again ...\033[0;0m' %str(menu_dict['tree_pop_max']))
|
||||
except KeyboardInterrupt: print ('\n\n\t\033[32m Enter \033[1mq\033[0;0m\033[32m to quit\033[0;0m')
|
||||
|
||||
while True:
|
||||
try:
|
||||
query = input('\t Enter quantity of Trees to be generated by Point Mutation: ')
|
||||
if query == '': break
|
||||
elif int(query) in list(range(0,1000)): tmp_point = int(query); break
|
||||
else: raise ValueError()
|
||||
except ValueError: print ('\n\t\033[32m Enter a number from 0 including %s. Try again ...\033[0;0m' %str(menu_dict['tree_pop_max']))
|
||||
except KeyboardInterrupt: print ('\n\n\t\033[32m Enter \033[1mq\033[0;0m\033[32m to quit\033[0;0m')
|
||||
|
||||
while True:
|
||||
try:
|
||||
query = input('\t Enter quantity of Trees to be generated by Branch Mutation: ')
|
||||
if query == '': break
|
||||
elif int(query) in list(range(0,1000)): tmp_branch = int(query); break
|
||||
else: raise ValueError()
|
||||
except ValueError: print ('\n\t\033[32m Enter a number from 0 including %s. Try again ...\033[0;0m' %str(menu_dict['tree_pop_max']))
|
||||
except KeyboardInterrupt: print ('\n\n\t\033[32m Enter \033[1mq\033[0;0m\033[32m to quit\033[0;0m')
|
||||
|
||||
while True:
|
||||
try:
|
||||
query = input('\t Enter quantity of Trees to be generated by Crossover: ')
|
||||
if query == '': break
|
||||
elif int(query) in list(range(0,1000)): tmp_cross = int(query); break
|
||||
else: raise ValueError()
|
||||
except ValueError: print ('\n\t\033[32m Enter a number from 0 including %s. Try again ...\033[0;0m' %str(menu_dict['tree_pop_max']))
|
||||
except KeyboardInterrupt: print ('\n\n\t\033[32m Enter \033[1mq\033[0;0m\033[32m to quit\033[0;0m')
|
||||
|
||||
if tmp_repro + tmp_point + tmp_branch + tmp_cross != menu_dict['tree_pop_max']:
|
||||
print ('\n\t The sum of the above does not equal %s. Try again ...' %str(menu_dict['tree_pop_max']))
|
||||
|
||||
else:
|
||||
print ('\n\t The revised balance of genetic operators is:')
|
||||
print ('\t\t Reproduction:', tmp_repro); menu_dict['evolve_repro'] = tmp_repro
|
||||
print ('\t\t Point Mutation:', tmp_point); menu_dict['evolve_point'] = tmp_point
|
||||
print ('\t\t Branch Mutation:', tmp_branch); menu_dict['evolve_branch'] = tmp_branch
|
||||
print ('\t\t Crossover:', tmp_cross); menu_dict['evolve_cross'] = tmp_cross
|
||||
|
||||
elif menu == 'l': # display dictionary of Trees with the best fitness score
|
||||
print ('\n\t The leading Trees and their associated expressions are:')
|
||||
for n in sorted(menu_dict['fittest_dict']): print ('\t ', n, ':', menu_dict['fittest_dict'][n])
|
||||
|
||||
elif menu == 'pop': # list Trees in the current population
|
||||
if menu_dict['gen_id'] == 1: menu_dict['input_a'] = 'pop_a'
|
||||
else: menu_dict['input_a'] = 'pop_b'
|
||||
|
||||
elif menu == 'e': # evaluate a Tree against the TEST data
|
||||
if menu_dict['gen_id'] == 1: print ('\n\t\033[32m You cannot evaluate the foundation population. Be patient ...\033[0;0m')
|
||||
|
||||
else: # gen_id > 1
|
||||
while True:
|
||||
try:
|
||||
query = input('\n\t Select a Tree to evaluate: ')
|
||||
if query == '': break
|
||||
elif int(query) in list(range(1, menu_dict['pop_b_len'])): menu_dict['input_a'] = 'eval'; menu_dict['input_b'] = int(query); break
|
||||
else: raise ValueError()
|
||||
except ValueError: print ('\n\t\033[32m Enter a number from 1 including %s. Try again ...\033[0;0m' %str(menu_dict['pop_b_len'] - 1))
|
||||
except KeyboardInterrupt: print ('\n\n\t\033[32m Enter \033[1mq\033[0;0m\033[32m to quit\033[0;0m')
|
||||
|
||||
elif menu == 'p': # print a Tree to screen -- NEED TO ADD: SymPy graphical print option
|
||||
|
||||
if menu_dict['gen_id'] == 1: # first generation
|
||||
while True:
|
||||
try:
|
||||
query = input('\n\t Select a Tree to print: ')
|
||||
if query == '': break
|
||||
elif int(query) in list(range(1, menu_dict['pop_a_len'])) and menu_dict['gen_id'] == 1: menu_dict['input_a'] = 'print_a'; menu_dict['input_b'] = int(query); break
|
||||
else: raise ValueError()
|
||||
except ValueError: print ('\n\t\033[32m Enter a number from 1 including %s. Try again ...\033[0;0m' %str(menu_dict['pop_a_len'] - 1))
|
||||
except KeyboardInterrupt: print ('\n\n\t\033[32m Enter \033[1mq\033[0;0m\033[32m to quit\033[0;0m')
|
||||
|
||||
else: # second or higher generation
|
||||
while True:
|
||||
try:
|
||||
query = input('\n\t Select a Tree to print: ')
|
||||
if query == '': break
|
||||
elif int(query) in list(range(1, menu_dict['pop_b_len'])): menu_dict['input_a'] = 'print_b'; menu_dict['input_b'] = int(query); break
|
||||
else: raise ValueError()
|
||||
except ValueError: print ('\n\t\033[32m Enter a number from 1 including %s. Try again ...\033[0;0m' %str(menu_dict['pop_b_len'] - 1))
|
||||
except KeyboardInterrupt: print ('\n\n\t\033[32m Enter \033[1mq\033[0;0m\033[32m to quit\033[0;0m')
|
||||
|
||||
elif menu == 'id': print ('\n\t Current generation:', menu_dict['gen_id'])
|
||||
|
||||
elif menu == 'dir': print ('\n\t Current working directory:', menu_dict['path'])
|
||||
|
||||
# NEED TO REBUILD
|
||||
#elif menu == 'load': # load population_s to replace population_a
|
||||
# while True:
|
||||
# try:
|
||||
# query = input('\n\t Overwrite the current population with population_s? (\033[1my\033[0;0m\033[32m/\033[1mn\033[0;0m\033[32m)\033[0;0m ')
|
||||
# if query == 'y': menu_dict['input_a'] = 'load'; break
|
||||
# elif query == 'n': break
|
||||
# else: raise ValueError()
|
||||
# except ValueError: print ('\n\t\033[32m Enter (\033[1my\033[0;0m)es or (\033[1mn\033[0;0m)o. Try again ...\033[0;0m')
|
||||
# except KeyboardInterrupt: print ('\n\n\t\033[32m Enter \033[1mq\033[0;0m\033[32m to quit\033[0;0m')
|
||||
|
||||
elif menu == 'w': # write the evolving population_b to disk
|
||||
if menu_dict['gen_id'] > 1: menu_dict['input_a'] = 'write'
|
||||
else: print ('\n\t\033[36m The evolving population_b does not yet exist\033[0;0m')
|
||||
|
||||
elif menu == 'add': # add generations and continue a GP run
|
||||
|
||||
if menu_dict['gen_id'] == menu_dict['gen_max']:
|
||||
while True:
|
||||
try:
|
||||
query = input('\n\t\033[3m You are at the end of your run.\033[0;0m\n\t Add more generations to continue (1-100 or ENTER to escape): ')
|
||||
if query == '': break
|
||||
elif int(query) in list(range(1,101)): menu_dict['input_a'] = 'add'; menu_dict['input_b'] = int(query); break
|
||||
else: raise ValueError()
|
||||
except ValueError: print ('\n\t\033[32m Enter a number from 1 including 100. Try again ...\033[0;0m')
|
||||
except KeyboardInterrupt: print ('\n\n\t\033[32m Enter \033[1mq\033[0;0m\033[32m to quit\033[0;0m')
|
||||
|
||||
else: menu_dict['input_a'] = 'add'
|
||||
|
||||
elif menu == 'q': # quit (in case you didn't figure that one out :)
|
||||
while True:
|
||||
try:
|
||||
query = input('\n\t\033[32m Quit Karoo GP? (\033[1my\033[0;0m\033[32m/\033[1mn\033[0;0m\033[32m)\033[0;0m ')
|
||||
if query == 'y': menu_dict['input_a'] = 'quit'; break
|
||||
else: break
|
||||
except ValueError: print ('\n\t\033[32m Enter \033[1my\033[0;0m\033[32mes or \033[1mn\033[0;0m\033[32mo\033[0;0m')
|
||||
except KeyboardInterrupt: print ('\n\n\t\033[32m Enter \033[1mq\033[0;0m\033[32m to quit\033[0;0m')
|
||||
|
||||
return menu_dict
|
||||
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"name": "Karoo gp",
|
||||
"tagline": "A Genetic Programming platform for Python",
|
||||
"body": "<a href=\"http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_desktop.png\"><img src=\"http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_desktop-224x300.png\" alt=\"Karoo GP by Kai Staats\" width=\"224\" height=\"300\" hspace=20 align=\"left\"/></a> Karoo GP is a evolutionary algorithm, a genetic programming application suite written in Python which provides both symbolic regression and classification analysis. Karoo GP is a scalable platform with multicore support, designed to readily work with realworld data. <em>No programming required.</em> As a teaching tool, it enables instructors to share step-by-step how an evolutionary algorithm arrives to its solution. As a hands-on learning tool, Karoo GP supports rapid, repeatable experimentation.\r\n\r\nKaroo GP includes a Desktop application with an intuitive user interface, a fully scriptable Server application with user defined default parameters and command-line arguments; a stand-alone Python script which generates randomly constructed subsets of larger datasets and another which normalises datasets; and a toy model which shows the inner workings of multiclass classification.\r\n\r\nThe included User Guide (PDF) offers system requirements, a crash-course in Genetic Programming, and use of Karoo GP for both the novice and advanced user.\r\n \r\n \r\n\r\nFeatures include:\r\n<ul>\r\n\t<li>written in Object Oriented Python with a hierarchical naming scheme for all methods</li>\r\n\t<li>multi-core support (extensive testing on 24-40 CPUs)</li>\r\n\t<li><em>Desktop</em> application provides a simple user interface with menu, 5 display modes (see below), and runtime reconfiguration of parameters</li>\r\n\t<li><em>Server</em> script provides a configuration file for readily repeated GP runs and command-line arguments</li>\r\n\t<li>anticipates datasets as standard .csv files</li>\r\n\t<li>records the full population of each generation to a .csv file</li>\r\n\t<li>supports customised seed populations</li>\r\n\t<li>supports arithmetic (+, -, *, /, **, sqrt), trigonometric (cos, sin), and boolean (and, or) operators</li>\r\n\t<li>relatively simple framework for preparing custom fitness functions and evaluation routines</li>\r\n</ul>\r\n\r\nKaroo GP was developed during Staats' MSc research at the University of Cape Town / African Institute for Mathematical Sciences and the Square Kilometre Array (SKA), South Africa, and owes its foundation to the \"Field Guide to Genetic Programming\" by Poli, Langdon, McPhee, and Koza. The Field Guide and many more GP publications and software packages are showcased at <a href=\"http://geneticprogramming.com/publications/\" target=\"_blank\">www.geneticprogramming.com</a>\r\n\r\n<a href=\"http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_args.png\"><img src=\"http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_args-95x128.png\" alt=\"Karoo GP by Kai Staats\" width=\"95\" height=\"128\" /></a> <a href=\"http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_tree_print.png\"><img src=\"http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_tree_print-95x128.png\" alt=\"Karoo GP by Kai Staats\" width=\"95\" height=\"128\" /></a> <a href=\"http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_runtime_options.png\"><img src=\"http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_runtime_options-95x128.png\" alt=\"Karoo GP by Kai Staats\" width=\"95\" height=\"128\" /></a> <a href=\"http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_go_test.png\"><img src=\"http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_go_test-95x128.png\" alt=\"Karoo GP by Kai Staats\" width=\"95\" height=\"128\" /></a> <a href=\"http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_interactive_mode.png\"><img src=\"http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_interactive_mode-95x128.png\" alt=\"Karoo GP by Kai Staats\" width=\"95\" height=\"128\" /></a> <a href=\"http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_debug_mode.png\"><img src=\"http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_debug_mode-95x128.png\" alt=\"Karoo GP by Kai Staats\" width=\"95\" height=\"128\" /></a> <a href=\"http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_population_archive.png\"><img src=\"http://www.kaistaats.com/wp-content/uploads/2016/07/screenshot_karoo_gp_population_archive-105x128.png\" alt=\"Karoo GP by Kai Staats\" width=\"105\" height=\"128\" /></a>",
|
||||
"note": "Don't delete this file! It's used internally to help with page regeneration."
|
||||
}
|
|
@ -1,5 +0,0 @@
|
|||
wheel
|
||||
numpy==1.16.4
|
||||
sympy==1.4
|
||||
tensorflow==1.13.1
|
||||
scikit-learn==0.21.2
|
23
setup.py
23
setup.py
|
@ -1,23 +0,0 @@
|
|||
import setuptools
|
||||
|
||||
with open("README.md", "r") as fh:
|
||||
long_description = fh.read()
|
||||
|
||||
setuptools.setup(
|
||||
name="karoo_gp-jebba",
|
||||
version="2.3",
|
||||
author="Kai Staats",
|
||||
author_email="github@overthesun.com",
|
||||
description="evolutionary algorithm, genetic programming suite",
|
||||
long_description=long_description,
|
||||
long_description_content_type="text/markdown",
|
||||
url="https://github.com/kstaats/karoo_gp",
|
||||
packages=setuptools.find_packages(),
|
||||
classifiers=[
|
||||
"Programming Language :: Python :: 3",
|
||||
"License :: OSI Approved :: MIT License",
|
||||
"Operating System :: OS Independent",
|
||||
],
|
||||
python_requires='>=3.6',
|
||||
)
|
||||
#packages={''},
|
|
@ -0,0 +1,124 @@
|
|||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2016 GitHub, Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
.pl-c /* comment */ {
|
||||
color: #969896;
|
||||
}
|
||||
|
||||
.pl-c1 /* constant, variable.other.constant, support, meta.property-name, support.constant, support.variable, meta.module-reference, markup.raw, meta.diff.header */,
|
||||
.pl-s .pl-v /* string variable */ {
|
||||
color: #0086b3;
|
||||
}
|
||||
|
||||
.pl-e /* entity */,
|
||||
.pl-en /* entity.name */ {
|
||||
color: #795da3;
|
||||
}
|
||||
|
||||
.pl-smi /* variable.parameter.function, storage.modifier.package, storage.modifier.import, storage.type.java, variable.other */,
|
||||
.pl-s .pl-s1 /* string source */ {
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.pl-ent /* entity.name.tag */ {
|
||||
color: #63a35c;
|
||||
}
|
||||
|
||||
.pl-k /* keyword, storage, storage.type */ {
|
||||
color: #a71d5d;
|
||||
}
|
||||
|
||||
.pl-s /* string */,
|
||||
.pl-pds /* punctuation.definition.string, string.regexp.character-class */,
|
||||
.pl-s .pl-pse .pl-s1 /* string punctuation.section.embedded source */,
|
||||
.pl-sr /* string.regexp */,
|
||||
.pl-sr .pl-cce /* string.regexp constant.character.escape */,
|
||||
.pl-sr .pl-sre /* string.regexp source.ruby.embedded */,
|
||||
.pl-sr .pl-sra /* string.regexp string.regexp.arbitrary-repitition */ {
|
||||
color: #183691;
|
||||
}
|
||||
|
||||
.pl-v /* variable */ {
|
||||
color: #ed6a43;
|
||||
}
|
||||
|
||||
.pl-id /* invalid.deprecated */ {
|
||||
color: #b52a1d;
|
||||
}
|
||||
|
||||
.pl-ii /* invalid.illegal */ {
|
||||
color: #f8f8f8;
|
||||
background-color: #b52a1d;
|
||||
}
|
||||
|
||||
.pl-sr .pl-cce /* string.regexp constant.character.escape */ {
|
||||
font-weight: bold;
|
||||
color: #63a35c;
|
||||
}
|
||||
|
||||
.pl-ml /* markup.list */ {
|
||||
color: #693a17;
|
||||
}
|
||||
|
||||
.pl-mh /* markup.heading */,
|
||||
.pl-mh .pl-en /* markup.heading entity.name */,
|
||||
.pl-ms /* meta.separator */ {
|
||||
font-weight: bold;
|
||||
color: #1d3e81;
|
||||
}
|
||||
|
||||
.pl-mq /* markup.quote */ {
|
||||
color: #008080;
|
||||
}
|
||||
|
||||
.pl-mi /* markup.italic */ {
|
||||
font-style: italic;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.pl-mb /* markup.bold */ {
|
||||
font-weight: bold;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.pl-md /* markup.deleted, meta.diff.header.from-file */ {
|
||||
color: #bd2c00;
|
||||
background-color: #ffecec;
|
||||
}
|
||||
|
||||
.pl-mi1 /* markup.inserted, meta.diff.header.to-file */ {
|
||||
color: #55a532;
|
||||
background-color: #eaffea;
|
||||
}
|
||||
|
||||
.pl-mdr /* meta.diff.range */ {
|
||||
font-weight: bold;
|
||||
color: #795da3;
|
||||
}
|
||||
|
||||
.pl-mo /* meta.output */ {
|
||||
color: #1d3e81;
|
||||
}
|
||||
|
|
@ -0,0 +1,424 @@
|
|||
/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
|
||||
|
||||
/**
|
||||
* 1. Set default font family to sans-serif.
|
||||
* 2. Prevent iOS text size adjust after orientation change, without disabling
|
||||
* user zoom.
|
||||
*/
|
||||
|
||||
html {
|
||||
font-family: sans-serif; /* 1 */
|
||||
-ms-text-size-adjust: 100%; /* 2 */
|
||||
-webkit-text-size-adjust: 100%; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove default margin.
|
||||
*/
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* HTML5 display definitions
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Correct `block` display not defined for any HTML5 element in IE 8/9.
|
||||
* Correct `block` display not defined for `details` or `summary` in IE 10/11
|
||||
* and Firefox.
|
||||
* Correct `block` display not defined for `main` in IE 11.
|
||||
*/
|
||||
|
||||
article,
|
||||
aside,
|
||||
details,
|
||||
figcaption,
|
||||
figure,
|
||||
footer,
|
||||
header,
|
||||
hgroup,
|
||||
main,
|
||||
menu,
|
||||
nav,
|
||||
section,
|
||||
summary {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct `inline-block` display not defined in IE 8/9.
|
||||
* 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
|
||||
*/
|
||||
|
||||
audio,
|
||||
canvas,
|
||||
progress,
|
||||
video {
|
||||
display: inline-block; /* 1 */
|
||||
vertical-align: baseline; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Prevent modern browsers from displaying `audio` without controls.
|
||||
* Remove excess height in iOS 5 devices.
|
||||
*/
|
||||
|
||||
audio:not([controls]) {
|
||||
display: none;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address `[hidden]` styling not present in IE 8/9/10.
|
||||
* Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
|
||||
*/
|
||||
|
||||
[hidden],
|
||||
template {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Links
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Remove the gray background color from active links in IE 10.
|
||||
*/
|
||||
|
||||
a {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Improve readability when focused and also mouse hovered in all browsers.
|
||||
*/
|
||||
|
||||
a:active,
|
||||
a:hover {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
/* Text-level semantics
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Address styling not present in IE 8/9/10/11, Safari, and Chrome.
|
||||
*/
|
||||
|
||||
abbr[title] {
|
||||
border-bottom: 1px dotted;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
|
||||
*/
|
||||
|
||||
b,
|
||||
strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address styling not present in Safari and Chrome.
|
||||
*/
|
||||
|
||||
dfn {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address variable `h1` font-size and margin within `section` and `article`
|
||||
* contexts in Firefox 4+, Safari, and Chrome.
|
||||
*/
|
||||
|
||||
h1 {
|
||||
font-size: 2em;
|
||||
margin: 0.67em 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address styling not present in IE 8/9.
|
||||
*/
|
||||
|
||||
mark {
|
||||
background: #ff0;
|
||||
color: #000;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address inconsistent and variable font size in all browsers.
|
||||
*/
|
||||
|
||||
small {
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prevent `sub` and `sup` affecting `line-height` in all browsers.
|
||||
*/
|
||||
|
||||
sub,
|
||||
sup {
|
||||
font-size: 75%;
|
||||
line-height: 0;
|
||||
position: relative;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
sup {
|
||||
top: -0.5em;
|
||||
}
|
||||
|
||||
sub {
|
||||
bottom: -0.25em;
|
||||
}
|
||||
|
||||
/* Embedded content
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Remove border when inside `a` element in IE 8/9/10.
|
||||
*/
|
||||
|
||||
img {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Correct overflow not hidden in IE 9/10/11.
|
||||
*/
|
||||
|
||||
svg:not(:root) {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Grouping content
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Address margin not present in IE 8/9 and Safari.
|
||||
*/
|
||||
|
||||
figure {
|
||||
margin: 1em 40px;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address differences between Firefox and other browsers.
|
||||
*/
|
||||
|
||||
hr {
|
||||
box-sizing: content-box;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Contain overflow in all browsers.
|
||||
*/
|
||||
|
||||
pre {
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address odd `em`-unit font size rendering in all browsers.
|
||||
*/
|
||||
|
||||
code,
|
||||
kbd,
|
||||
pre,
|
||||
samp {
|
||||
font-family: monospace, monospace;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
/* Forms
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Known limitation: by default, Chrome and Safari on OS X allow very limited
|
||||
* styling of `select`, unless a `border` property is set.
|
||||
*/
|
||||
|
||||
/**
|
||||
* 1. Correct color not being inherited.
|
||||
* Known issue: affects color of disabled elements.
|
||||
* 2. Correct font properties not being inherited.
|
||||
* 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
|
||||
*/
|
||||
|
||||
button,
|
||||
input,
|
||||
optgroup,
|
||||
select,
|
||||
textarea {
|
||||
color: inherit; /* 1 */
|
||||
font: inherit; /* 2 */
|
||||
margin: 0; /* 3 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Address `overflow` set to `hidden` in IE 8/9/10/11.
|
||||
*/
|
||||
|
||||
button {
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address inconsistent `text-transform` inheritance for `button` and `select`.
|
||||
* All other form control elements do not inherit `text-transform` values.
|
||||
* Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
|
||||
* Correct `select` style inheritance in Firefox.
|
||||
*/
|
||||
|
||||
button,
|
||||
select {
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
|
||||
* and `video` controls.
|
||||
* 2. Correct inability to style clickable `input` types in iOS.
|
||||
* 3. Improve usability and consistency of cursor style between image-type
|
||||
* `input` and others.
|
||||
*/
|
||||
|
||||
button,
|
||||
html input[type="button"], /* 1 */
|
||||
input[type="reset"],
|
||||
input[type="submit"] {
|
||||
-webkit-appearance: button; /* 2 */
|
||||
cursor: pointer; /* 3 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Re-set default cursor for disabled elements.
|
||||
*/
|
||||
|
||||
button[disabled],
|
||||
html input[disabled] {
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove inner padding and border in Firefox 4+.
|
||||
*/
|
||||
|
||||
button::-moz-focus-inner,
|
||||
input::-moz-focus-inner {
|
||||
border: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Address Firefox 4+ setting `line-height` on `input` using `!important` in
|
||||
* the UA stylesheet.
|
||||
*/
|
||||
|
||||
input {
|
||||
line-height: normal;
|
||||
}
|
||||
|
||||
/**
|
||||
* It's recommended that you don't attempt to style these elements.
|
||||
* Firefox's implementation doesn't respect box-sizing, padding, or width.
|
||||
*
|
||||
* 1. Address box sizing set to `content-box` in IE 8/9/10.
|
||||
* 2. Remove excess padding in IE 8/9/10.
|
||||
*/
|
||||
|
||||
input[type="checkbox"],
|
||||
input[type="radio"] {
|
||||
box-sizing: border-box; /* 1 */
|
||||
padding: 0; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Fix the cursor style for Chrome's increment/decrement buttons. For certain
|
||||
* `font-size` values of the `input`, it causes the cursor style of the
|
||||
* decrement button to change from `default` to `text`.
|
||||
*/
|
||||
|
||||
input[type="number"]::-webkit-inner-spin-button,
|
||||
input[type="number"]::-webkit-outer-spin-button {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Address `appearance` set to `searchfield` in Safari and Chrome.
|
||||
* 2. Address `box-sizing` set to `border-box` in Safari and Chrome
|
||||
* (include `-moz` to future-proof).
|
||||
*/
|
||||
|
||||
input[type="search"] {
|
||||
-webkit-appearance: textfield; /* 1 */ /* 2 */
|
||||
box-sizing: content-box;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove inner padding and search cancel button in Safari and Chrome on OS X.
|
||||
* Safari (but not Chrome) clips the cancel button when the search input has
|
||||
* padding (and `textfield` appearance).
|
||||
*/
|
||||
|
||||
input[type="search"]::-webkit-search-cancel-button,
|
||||
input[type="search"]::-webkit-search-decoration {
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* Define consistent border, margin, and padding.
|
||||
*/
|
||||
|
||||
fieldset {
|
||||
border: 1px solid #c0c0c0;
|
||||
margin: 0 2px;
|
||||
padding: 0.35em 0.625em 0.75em;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct `color` not being inherited in IE 8/9/10/11.
|
||||
* 2. Remove padding so people aren't caught out if they zero out fieldsets.
|
||||
*/
|
||||
|
||||
legend {
|
||||
border: 0; /* 1 */
|
||||
padding: 0; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove default vertical scrollbar in IE 8/9/10/11.
|
||||
*/
|
||||
|
||||
textarea {
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
/**
|
||||
* Don't inherit the `font-weight` (applied by a rule above).
|
||||
* NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
|
||||
*/
|
||||
|
||||
optgroup {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* Tables
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Remove most spacing between table cells.
|
||||
*/
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
}
|
||||
|
||||
td,
|
||||
th {
|
||||
padding: 0;
|
||||
}
|
|
@ -0,0 +1,245 @@
|
|||
* {
|
||||
box-sizing: border-box; }
|
||||
|
||||
body {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
font-size: 16px;
|
||||
line-height: 1.5;
|
||||
color: #606c71; }
|
||||
|
||||
a {
|
||||
color: #1e6bb8;
|
||||
text-decoration: none; }
|
||||
a:hover {
|
||||
text-decoration: underline; }
|
||||
|
||||
.btn {
|
||||
display: inline-block;
|
||||
margin-bottom: 1rem;
|
||||
color: rgba(255, 255, 255, 0.7);
|
||||
background-color: rgba(255, 255, 255, 0.08);
|
||||
border-color: rgba(255, 255, 255, 0.2);
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
border-radius: 0.3rem;
|
||||
transition: color 0.2s, background-color 0.2s, border-color 0.2s; }
|
||||
.btn + .btn {
|
||||
margin-left: 1rem; }
|
||||
|
||||
.btn:hover {
|
||||
color: rgba(255, 255, 255, 0.8);
|
||||
text-decoration: none;
|
||||
background-color: rgba(255, 255, 255, 0.2);
|
||||
border-color: rgba(255, 255, 255, 0.3); }
|
||||
|
||||
@media screen and (min-width: 64em) {
|
||||
.btn {
|
||||
padding: 0.75rem 1rem; } }
|
||||
|
||||
@media screen and (min-width: 42em) and (max-width: 64em) {
|
||||
.btn {
|
||||
padding: 0.6rem 0.9rem;
|
||||
font-size: 0.9rem; } }
|
||||
|
||||
@media screen and (max-width: 42em) {
|
||||
.btn {
|
||||
display: block;
|
||||
width: 100%;
|
||||
padding: 0.75rem;
|
||||
font-size: 0.9rem; }
|
||||
.btn + .btn {
|
||||
margin-top: 1rem;
|
||||
margin-left: 0; } }
|
||||
|
||||
.page-header {
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
background-color: #159957;
|
||||
background-image: linear-gradient(120deg, #155799, #159957); }
|
||||
|
||||
@media screen and (min-width: 64em) {
|
||||
.page-header {
|
||||
padding: 5rem 6rem; } }
|
||||
|
||||
@media screen and (min-width: 42em) and (max-width: 64em) {
|
||||
.page-header {
|
||||
padding: 3rem 4rem; } }
|
||||
|
||||
@media screen and (max-width: 42em) {
|
||||
.page-header {
|
||||
padding: 2rem 1rem; } }
|
||||
|
||||
.project-name {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0.1rem; }
|
||||
|
||||
@media screen and (min-width: 64em) {
|
||||
.project-name {
|
||||
font-size: 3.25rem; } }
|
||||
|
||||
@media screen and (min-width: 42em) and (max-width: 64em) {
|
||||
.project-name {
|
||||
font-size: 2.25rem; } }
|
||||
|
||||
@media screen and (max-width: 42em) {
|
||||
.project-name {
|
||||
font-size: 1.75rem; } }
|
||||
|
||||
.project-tagline {
|
||||
margin-bottom: 2rem;
|
||||
font-weight: normal;
|
||||
opacity: 0.7; }
|
||||
|
||||
@media screen and (min-width: 64em) {
|
||||
.project-tagline {
|
||||
font-size: 1.25rem; } }
|
||||
|
||||
@media screen and (min-width: 42em) and (max-width: 64em) {
|
||||
.project-tagline {
|
||||
font-size: 1.15rem; } }
|
||||
|
||||
@media screen and (max-width: 42em) {
|
||||
.project-tagline {
|
||||
font-size: 1rem; } }
|
||||
|
||||
.main-content :first-child {
|
||||
margin-top: 0; }
|
||||
.main-content img {
|
||||
max-width: 100%; }
|
||||
.main-content h1, .main-content h2, .main-content h3, .main-content h4, .main-content h5, .main-content h6 {
|
||||
margin-top: 2rem;
|
||||
margin-bottom: 1rem;
|
||||
font-weight: normal;
|
||||
color: #159957; }
|
||||
.main-content p {
|
||||
margin-bottom: 1em; }
|
||||
.main-content code {
|
||||
padding: 2px 4px;
|
||||
font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
|
||||
font-size: 0.9rem;
|
||||
color: #383e41;
|
||||
background-color: #f3f6fa;
|
||||
border-radius: 0.3rem; }
|
||||
.main-content pre {
|
||||
padding: 0.8rem;
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
font: 1rem Consolas, "Liberation Mono", Menlo, Courier, monospace;
|
||||
color: #567482;
|
||||
word-wrap: normal;
|
||||
background-color: #f3f6fa;
|
||||
border: solid 1px #dce6f0;
|
||||
border-radius: 0.3rem; }
|
||||
.main-content pre > code {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
font-size: 0.9rem;
|
||||
color: #567482;
|
||||
word-break: normal;
|
||||
white-space: pre;
|
||||
background: transparent;
|
||||
border: 0; }
|
||||
.main-content .highlight {
|
||||
margin-bottom: 1rem; }
|
||||
.main-content .highlight pre {
|
||||
margin-bottom: 0;
|
||||
word-break: normal; }
|
||||
.main-content .highlight pre, .main-content pre {
|
||||
padding: 0.8rem;
|
||||
overflow: auto;
|
||||
font-size: 0.9rem;
|
||||
line-height: 1.45;
|
||||
border-radius: 0.3rem; }
|
||||
.main-content pre code, .main-content pre tt {
|
||||
display: inline;
|
||||
max-width: initial;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
overflow: initial;
|
||||
line-height: inherit;
|
||||
word-wrap: normal;
|
||||
background-color: transparent;
|
||||
border: 0; }
|
||||
.main-content pre code:before, .main-content pre code:after, .main-content pre tt:before, .main-content pre tt:after {
|
||||
content: normal; }
|
||||
.main-content ul, .main-content ol {
|
||||
margin-top: 0; }
|
||||
.main-content blockquote {
|
||||
padding: 0 1rem;
|
||||
margin-left: 0;
|
||||
color: #819198;
|
||||
border-left: 0.3rem solid #dce6f0; }
|
||||
.main-content blockquote > :first-child {
|
||||
margin-top: 0; }
|
||||
.main-content blockquote > :last-child {
|
||||
margin-bottom: 0; }
|
||||
.main-content table {
|
||||
display: block;
|
||||
width: 100%;
|
||||
overflow: auto;
|
||||
word-break: normal;
|
||||
word-break: keep-all; }
|
||||
.main-content table th {
|
||||
font-weight: bold; }
|
||||
.main-content table th, .main-content table td {
|
||||
padding: 0.5rem 1rem;
|
||||
border: 1px solid #e9ebec; }
|
||||
.main-content dl {
|
||||
padding: 0; }
|
||||
.main-content dl dt {
|
||||
padding: 0;
|
||||
margin-top: 1rem;
|
||||
font-size: 1rem;
|
||||
font-weight: bold; }
|
||||
.main-content dl dd {
|
||||
padding: 0;
|
||||
margin-bottom: 1rem; }
|
||||
.main-content hr {
|
||||
height: 2px;
|
||||
padding: 0;
|
||||
margin: 1rem 0;
|
||||
background-color: #eff0f1;
|
||||
border: 0; }
|
||||
|
||||
@media screen and (min-width: 64em) {
|
||||
.main-content {
|
||||
max-width: 64rem;
|
||||
padding: 2rem 6rem;
|
||||
margin: 0 auto;
|
||||
font-size: 1.1rem; } }
|
||||
|
||||
@media screen and (min-width: 42em) and (max-width: 64em) {
|
||||
.main-content {
|
||||
padding: 2rem 4rem;
|
||||
font-size: 1.1rem; } }
|
||||
|
||||
@media screen and (max-width: 42em) {
|
||||
.main-content {
|
||||
padding: 2rem 1rem;
|
||||
font-size: 1rem; } }
|
||||
|
||||
.site-footer {
|
||||
padding-top: 2rem;
|
||||
margin-top: 2rem;
|
||||
border-top: solid 1px #eff0f1; }
|
||||
|
||||
.site-footer-owner {
|
||||
display: block;
|
||||
font-weight: bold; }
|
||||
|
||||
.site-footer-credits {
|
||||
color: #819198; }
|
||||
|
||||
@media screen and (min-width: 64em) {
|
||||
.site-footer {
|
||||
font-size: 1rem; } }
|
||||
|
||||
@media screen and (min-width: 42em) and (max-width: 64em) {
|
||||
.site-footer {
|
||||
font-size: 1rem; } }
|
||||
|
||||
@media screen and (max-width: 42em) {
|
||||
.site-footer {
|
||||
font-size: 0.9rem; } }
|
Loading…
Reference in New Issue