Compare commits

..

356 Commits

Author SHA1 Message Date
982da9dcd1 start of fitness function, coming back once I know more
Some checks failed
CI / test-clj (push) Has been cancelled
CI / test-cljs (push) Has been cancelled
2025-03-16 02:19:51 -05:00
9a465ab566 data loading done
Some checks are pending
CI / test-clj (push) Waiting to run
CI / test-cljs (push) Waiting to run
2025-03-15 01:49:00 -05:00
def7c1e965 change of imports
Some checks are pending
CI / test-clj (push) Waiting to run
CI / test-cljs (push) Waiting to run
2025-03-14 19:57:50 -05:00
acdc1ed18a utility for loading data from a csv 2025-03-14 19:56:47 -05:00
cabf5bc376 fix clj-konda errors 2025-03-14 19:46:08 -05:00
8f2ba3579b add GLD data 2025-03-14 17:09:01 -05:00
0cb349ddb1 move stock regression 2025-03-14 16:49:10 -05:00
cd39c62c22 make visible to get-stack-instructions
Some checks are pending
CI / test-clj (push) Waiting to run
CI / test-cljs (push) Waiting to run
2025-03-14 02:33:15 -05:00
c8510755e0 more functions !!!!!
Some checks are pending
CI / test-clj (push) Waiting to run
CI / test-cljs (push) Waiting to run
2025-03-14 02:06:55 -05:00
c1255c5a88 more numeric instructions
Some checks are pending
CI / test-clj (push) Waiting to run
CI / test-cljs (push) Waiting to run
2025-03-14 01:41:50 -05:00
90ff1c49de load signal file 2025-03-14 01:41:41 -05:00
239f3cb4c1 signal file init
Some checks are pending
CI / test-clj (push) Waiting to run
CI / test-cljs (push) Waiting to run
2025-03-14 00:54:31 -05:00
d59c175629 generic signal instructions 2025-03-14 00:54:22 -05:00
616b33fe20 buy/hold keyword exec stack handling 2025-03-14 00:54:13 -05:00
617b03aeb6 start of stock regression 2025-03-14 00:48:43 -05:00
2ad54d8189 buy,hold,sell comparison functions 2025-03-12 17:43:03 -05:00
4ff98629f9 add instructions, is breaking things tho? 2025-03-12 16:42:28 -05:00
a4703d60a8 more comparisons
Some checks failed
CI / test-clj (push) Has been cancelled
CI / test-cljs (push) Has been cancelled
2025-03-11 17:18:40 -05:00
265d9f8c17 jdk8
Some checks are pending
CI / test-clj (push) Waiting to run
CI / test-cljs (push) Waiting to run
2025-03-11 16:01:40 -05:00
33ccf6cad3 add java for shadow-cljs 2025-03-11 16:00:11 -05:00
7bd451b4aa add nodejs 2025-03-11 15:56:30 -05:00
c920cdaade add clojure-lsp back 2025-03-11 15:49:07 -05:00
7487d8a5b2 calva uses their own clojure-lsp
Some checks are pending
CI / test-clj (push) Waiting to run
CI / test-cljs (push) Waiting to run
2025-03-11 15:45:46 -05:00
cc0a32eeb3 update flake.lock 2025-03-11 14:40:52 -05:00
c107363d40 option to sort by max rather than min
Some checks are pending
CI / test-clj (push) Waiting to run
CI / test-cljs (push) Waiting to run
2025-03-11 14:06:22 -05:00
2261b57445 update calva version
Some checks are pending
CI / test-clj (push) Waiting to run
CI / test-cljs (push) Waiting to run
2025-03-11 13:06:37 -05:00
1144a15181 change version file
Some checks are pending
CI / test-clj (push) Waiting to run
CI / test-cljs (push) Waiting to run
2025-03-11 12:57:41 -05:00
b7939f0bfb try exporting shell
Some checks failed
CI / test-clj (push) Has been cancelled
CI / test-cljs (push) Has been cancelled
2025-03-07 13:51:03 -06:00
4c38979e20 try build inputs 2025-03-07 13:47:49 -06:00
9c671afc4a more testing
Some checks failed
CI / test-clj (push) Has been cancelled
CI / test-cljs (push) Has been cancelled
2025-03-02 00:45:57 -06:00
83cc26593a add test-argmap
Some checks failed
CI / test-clj (push) Has been cancelled
CI / test-cljs (push) Has been cancelled
2025-02-27 02:51:46 -06:00
758f2eb740 more testing with session
Some checks are pending
CI / test-clj (push) Waiting to run
CI / test-cljs (push) Waiting to run
2025-02-26 23:54:42 -06:00
b166bacfb5 more imports, play analysis tools
Some checks are pending
CI / test-clj (push) Waiting to run
CI / test-cljs (push) Waiting to run
2025-02-25 23:51:35 -06:00
b698faae08 separate argmap from -main 2025-02-25 23:51:14 -06:00
960b561e3e about this fork
Some checks are pending
CI / test-clj (push) Waiting to run
CI / test-cljs (push) Waiting to run
2025-02-25 13:58:21 -06:00
f700934f5d add default back to the flake
Some checks are pending
CI / test-clj (push) Waiting to run
CI / test-cljs (push) Waiting to run
2025-02-25 13:41:33 -06:00
406b867dfe put shellHook in mkShell call 2025-02-25 13:40:38 -06:00
c9d26d832a more attempting 2025-02-25 13:38:10 -06:00
31de7b0e0c reorganize 2025-02-25 13:36:42 -06:00
ed11d8de6c shellHook and remove standalone codium 2025-02-25 13:33:13 -06:00
c119407dec try with a v 2025-02-25 13:27:47 -06:00
747ae82cea sha256 modification
Some checks are pending
CI / test-clj (push) Waiting to run
CI / test-cljs (push) Waiting to run
2025-02-25 04:04:05 -06:00
8645aac0fd update with proper checksum 2025-02-25 04:03:18 -06:00
970b360b5b fix typo 2025-02-25 04:02:21 -06:00
eea932383d add flake.lock 2025-02-25 04:01:56 -06:00
15b1071938 flake init 2025-02-25 04:01:11 -06:00
3c900613da mention flake in readme 2025-02-25 04:01:01 -06:00
Lee Spector
97a1d381fd
Update README.md
Fix path for regression problem
2024-06-26 16:30:36 -04:00
Lee Spector
847341e4d8 Add and reorganize regression problem files 2024-01-17 15:32:12 -05:00
Lee Spector
6812f5e28c Remove problem file with issues including incorrect constants and obsolete gp arguments 2024-01-16 19:14:33 -05:00
Lee Spector
971f10941e GIT MESSAGE CORRECTION: recently added argument is :closes, not :close 2024-01-12 17:11:03 -05:00
Lee Spector
e6361ec1c0 Allow empty argmap 2024-01-12 16:31:46 -05:00
Lee Spector
70e9f81f84 Implement :close options :specified (default until recently, and now again), :balanced (default just prior to this commit), :none (which also removes instructions that open multiple code blocks) 2024-01-12 16:25:59 -05:00
Lee Spector
ddb788ad84 Clean up movement of opens ; add :closes argument 2024-01-12 15:24:13 -05:00
Lee Spector
131be83328 Flush output stream after each generation report 2024-01-10 13:06:50 -05:00
Lee Spector
71d378f49f Break just before an instruction that opens code blocks or just after a close, unless can't 2024-01-09 16:40:40 -05:00
Lee Spector
b0aee912bf Update docs 2024-01-07 12:53:34 -05:00
Lee Spector
cd73c73aa0 Specify and comment on more (all?) options for gp argmap 2024-01-07 12:47:12 -05:00
Lee Spector
3ae7123cd8 Note that informed downsampling is now enabled by default; add comments to gp argument defaults 2024-01-07 12:11:08 -05:00
Lee Spector
81ef86d4ee Rework handling of defaults to top-level gp function 2024-01-07 11:49:35 -05:00
Lee Spector
f0424979b5 Always make probability of close equal to probability that instruction set adds an open 2024-01-06 16:39:11 -05:00
Lee Spector
126b358643
Update README.md 2024-01-05 17:16:46 -05:00
Lee Spector
163bd92b7a
Update README.md 2024-01-05 17:15:38 -05:00
Lee Spector
a467dcb3f4
Update README.md 2024-01-05 17:07:02 -05:00
Lee Spector
360b943ee6 Fix test 2023-12-31 21:43:38 -05:00
Lee Spector
a10addcc9e Move opens into instructions/parentheses; implement :auto-close to set probability of adding a close from opens produced by instructions 2023-12-31 21:38:49 -05:00
Lee Spector
5eb34a811a Pass argmap to random-instruction 2023-12-31 16:02:49 -05:00
Lee Spector
d8402962f1 Remove rather than filling empty genes. 2023-12-26 17:27:41 -05:00
Lee Spector
feb5a52d25 Explicitly require clojure.set 2023-12-26 15:40:25 -05:00
Lee Spector
77b160e454 Replace :bmx-gap-probability with :bmx-gene-length-limit 2023-12-26 15:32:06 -05:00
Lee Spector
c3a748e5cc Move more bmx utility functions to utils namespace 2023-12-26 14:33:12 -05:00
Lee Spector
1eafd17b5f Fill empty genes after :bmx and :bmx-umad 2023-12-24 15:34:28 -05:00
Lee Spector
d9e5523c99 Implement :bmx-same-gene-count to select only second parents with same number of genes as first 2023-12-21 19:08:11 -05:00
Lee Spector
1e29f88405 Add :ssx-not-bmx as a temporary way to experiment with sequential segment crossover 2023-12-14 19:18:43 -08:00
Lee Spector
d318d702ed Pass argmap to bmx 2023-12-14 19:11:26 -08:00
Lee Spector
b2bcab59de Add argument for :bmx-maximum-distance; don't merge adjacent gaps 2023-12-11 15:30:55 -05:00
Lee Spector
3ce672c022 Reimpose maximum difference for bmx exchange, hardcoded to 3 2023-12-11 00:49:01 -05:00
Lee Spector
0b2024ec6e Merge adjacent gaps 2023-12-10 23:11:08 -05:00
Lee Spector
435eb59371 Reformulate bmx distance and remove distance limit 2023-12-10 20:18:05 -05:00
Lee Spector
a706babff1 Only exchange in bmx with distance <= a limit, hardcoded to 4 for now 2023-12-10 14:37:45 -05:00
Lee Spector
49f6f6de72 Add multiset-distance and unigram-bigram-distance, and use the latter in bmx 2023-12-10 12:37:23 -05:00
Lee Spector
39edec3865 Fix formatting 2023-12-10 12:13:48 -05:00
Lee Spector
0a32938c2b Add and delete gaps in :bmx, not just :bmx-umad 2023-12-08 18:39:13 -05:00
Lee Spector
9fa35c4562 Rework bmx-umad gap addition and deletion 2023-12-07 18:32:11 -05:00
Lee Spector
82657abf32 Do not consider adding at a :gap 2023-12-07 16:47:50 -05:00
Lee Spector
f6a9426751 Clarify docstring 2023-12-07 16:45:03 -05:00
Lee Spector
648c7b866a Implement :gap mutation in :bmx-umad according to :bmx-gap-change-probability 2023-12-07 11:28:21 -05:00
Lee Spector
b40aff3d6d Don't allow uniform-deletion to delete :gap 2023-12-06 20:26:04 -05:00
Lee Spector
28ab925601 For bmx, add instances of :gap in initial plushy genomes according to :bmx-gap-probability 2023-12-06 17:35:00 -05:00
Lee Spector
27857faf85 Rely on :bmx? in argmap to know when using bmx 2023-12-06 15:01:59 -05:00
Lee Spector
85a59cdbe5 Eliminate :bmx-enrichment, and because of that, argmap preprocessing for gp 2023-12-06 14:56:02 -05:00
Lee Spector
2fa6eb5671 Rename :bmx-rate to :bmx-exchange-rate, which is more descriptive 2023-12-06 14:39:30 -05:00
Lee Spector
de5aeabd5e Add question mark, so complementary mate selection for bmx is invoked with :bmx-complementary? true 2023-12-06 14:32:40 -05:00
Lee Spector
2970632c26 Implement complementary mate selection for :bmx and :bmx-umad, activated via ':bmx-complementary true' 2023-12-02 23:11:54 -05:00
Lee Spector
a0bd993281 Rename :gene to :gap 2023-12-02 23:02:07 -05:00
Lee Spector
30a87a2688 Make lexicase-selection use provided :initial-cases and return :selection-cases, both via argmap 2023-12-02 17:35:14 -05:00
Lee Spector
d0d0427dcf Fix typo that spoiled behavioral diversity calculations 2023-11-30 19:06:04 -05:00
Lee Spector
b6e506f4bd Remove autoconstructive hypervariability mutation (ah-umad) 2023-11-30 18:37:33 -05:00
Lee Spector
5c127ef21b Add and strip :gene for bmx-umad 2023-11-25 11:33:36 -05:00
Lee Spector
770dfe74b1 Report on gene counts when using bmx-umad 2023-11-25 10:16:31 -05:00
Lee Spector
98206458d8 Print solution and simplified plushies and programs 2023-11-24 18:41:39 -05:00
Lee Spector
91adcbf089 Clean up and reformat 2023-11-24 18:09:25 -05:00
Lee Spector
48658f455c Print ERC instructions as strings to avoid tripping up read-string on logs; previously (set! *default-data-reader-fn* tagged-literal) required to avoid exception 2023-11-21 22:56:04 -05:00
Lee Spector
ad20e43516 Implement bmx-umad operator; allow collection for bmx-rate 2023-11-21 16:23:26 -05:00
Lee Spector
c61934e50b Report on :best-gene-count and :average-gene-count in bmx; move gene utilities to utils 2023-11-20 21:09:06 -05:00
Lee Spector
5ce452b6ff Add bmx-rate 2023-11-20 20:48:06 -05:00
Lee Spector
d81a9ae3b6 Rename autoconstructive-crossover bmx, for best match crossover 2023-11-20 20:25:42 -05:00
Lee Spector
30daac848a Print instruction list correctly 2023-11-19 10:28:20 -05:00
Lee Spector
177f3ad1eb Print {:run-completed true} at end of run 2023-11-12 14:43:26 -05:00
Lee Spector
6c38a87460 Fix reference to example file, the name of which had changed 2023-11-12 14:42:49 -05:00
Lee Spector
8931f3d372
Merge pull request #67 from thelmuth/fix/solve-boolean
Fixed Solve Boolean problem so that it works.
2023-11-10 13:19:20 -05:00
Tom Helmuth
bf1128ad4b Fixed Solve Boolean problem so that it works. 2023-11-10 13:09:08 -05:00
Lee Spector
98d9c1f13e Clean up boolean mul problems, still experimental and not consistent with one another 2023-11-09 12:24:43 -05:00
Lee Spector
037baf9b2e Add :vary and :protect when using ah-umad 2023-11-08 19:17:16 -05:00
Lee Spector
3ccd5542ea Separate plushy pre-processing from plushy to push translation 2023-11-08 19:09:43 -05:00
Lee Spector
25e8efe255 Handle argmap adjustments outside of gp loop; add :gene when using autoconstructive crossover 2023-11-08 18:53:58 -05:00
Lee Spector
be1e2aae78 Merge remote-tracking branch 'origin/master' into autox-similarity 2023-11-08 14:00:51 -05:00
Lee Spector
ee3045128a
Merge pull request #66 from ryanboldi/remove-hyperselection
remove hacky hyperselection code
2023-11-08 01:29:57 -05:00
Ryan Boldi
7ca3767b02 remove hacky hyperselection code 2023-11-07 22:33:58 -05:00
Lee Spector
98d7126dee
Merge pull request #65 from thelmuth/fix/float-and-better-logging
Added float_div, and made logging print each value on one line instead of pretty-printed across many lines.
2023-11-07 21:37:50 -05:00
Tom Helmuth
a7ce4152a2 Updated readme 2023-11-07 20:52:52 -05:00
Tom Helmuth
e00e34402c Added float_div instruction 2023-11-07 20:43:24 -05:00
Tom Helmuth
739e975111 Merge branch 'master' into fix/float-and-better-logging 2023-11-07 20:25:10 -05:00
Tom Helmuth
1a1f442858 Tom's opinionated better logging 2023-11-07 20:23:49 -05:00
Lee Spector
fac7b03b0c
Fix definition of E 2023-11-07 20:05:01 -05:00
Lee Spector
bc7b4467c1 Allow autoconstructive crossover between any pair, swap genes based on similarity 2023-11-05 10:27:59 -05:00
Lee Spector
e488bbf9da Add EXPERIMENTAL flags 2023-11-04 16:51:20 -04:00
Lee Spector
54b9897803 Remove diploidy 2023-11-04 16:30:50 -04:00
Lee Spector
5fd533c24f Correctly handle leadin/trailing :gene 2023-11-03 12:30:14 -04:00
Lee Spector
c0bc7bc191 Select mates with same number of genes in autoconstructive crossover 2023-11-02 23:16:10 -04:00
Lee Spector
ac3690837d Add autoconstructive-crossover 2023-11-01 18:28:37 -04:00
Lee Spector
f9f1a9e22b Strip :gene when using :autoconstructive-crossover 2023-11-01 14:27:00 -04:00
Lee Spector
84be0de491 Configure mul3 for autox experiments 2023-11-01 14:22:40 -04:00
Lee Spector
f18dbeeafc Resolve merge conflicts 2023-10-29 00:41:23 -04:00
Lee Spector
a8045357fd Reformulate rate normalization for autoconstruction hypervariability 2023-10-29 00:25:20 -04:00
Lee Spector
cfbba8cbc4 Remove unused requires to data-creation 2023-10-23 10:22:08 -04:00
Lee Spector
878caa9ae4 Require org.clojure/data.csv in deps.edn 2023-10-23 10:16:01 -04:00
Lee Spector
92fd220961 Add cleanup to move shutdown-agents into tail position 2023-10-19 10:58:22 -04:00
Lee Spector
b6e7b0e86f Call shutdown-agents at end of run; reformat 2023-10-19 10:53:13 -04:00
Lee Spector
e3ba58587a Make boundaries of hypervariable segments hypervariable 2023-10-19 10:44:30 -04:00
Lee Spector
37df3432fb Switch to normalized autoconstructive hypervariation; reformat 2023-10-18 17:05:38 -04:00
Lee Spector
adf039195c
Merge pull request #63 from ryanboldi/main
pmapallv multi-collection implementation
2023-10-16 18:34:17 -04:00
Ryan Boldi
71f5b9d8de pmapallv always returns vector 2023-10-16 18:38:17 -04:00
Ryan Boldi
a315482302 implements multi collection pmapallv, and uses it in down-sampling and in hyperselection 2023-10-16 18:32:38 -04:00
Ryan Boldi
64e35d320c Update gp.cljc 2023-10-15 23:17:33 -04:00
Ryan Boldi
e9a2fe9a5b made variation operators user pmapallv 2023-10-15 23:10:12 -04:00
Ryan Boldi
ce71c6d49f Merge branch 'master' of https://github.com/lspector/propeller 2023-10-15 22:55:02 -04:00
Ryan Boldi
288faadedf Update downsample.cljc 2023-10-15 22:54:22 -04:00
Lee Spector
6bd060a189 Experiment 2023-10-15 22:54:01 -04:00
Lee Spector
eb467a33b3 Remove mapper arg that is now handled in propeller.utils/pmapallv 2023-10-15 11:10:31 -04:00
Lee Spector
e7130da06f
Merge pull request #60 from ryanboldi/main
down-sampling code, autosimplification code
2023-10-15 10:51:51 -04:00
Ryan Boldi
63ff79e1e4 Update variation.cljc 2023-10-14 21:55:58 -04:00
Ryan Boldi
d427e3a9bd move docs to right place 2023-10-14 21:46:18 -04:00
Ryan Boldi
fbf77cdb90 Merge branch 'master' 2023-10-14 21:39:44 -04:00
Lee Spector
139e395f60 Print average hypervariability when using autoconstructive hypervariability 2023-10-14 17:37:16 -04:00
Lee Spector
5103463cd8 Add doc string and clean up names 2023-10-14 17:08:20 -04:00
Lee Spector
a8d046e52e Add autoconstructive hypervariability tournaments 2023-10-14 16:43:14 -04:00
Lee Spector
9f3c6f46ff Implement autoconstructive hypervariation umad (ah-umad) 2023-10-12 14:39:26 -04:00
Lee Spector
c4070c6f43 Set up mul3 defaults for :ah-umad; note hack to :instructions 2023-10-11 19:37:10 -04:00
Lee Spector
b88ff01526 Strip :vary and :protect if using :ah-umad 2023-10-11 19:27:26 -04:00
Lee Spector
0dc286610a Remove incorrect comment 2023-10-11 18:19:08 -04:00
Lee Spector
7dcf75c433 Allow collection for :max-batch-size 2023-09-05 10:44:50 -04:00
Lee Spector
65c7f2a3fe Experiment 2023-09-04 13:07:23 -04:00
Lee Spector
ced767960c Prevent reader conditional from violating syntax outside of :clj 2023-09-03 21:43:23 -04:00
Lee Spector
a27c7f8477 Allow collections for genetic operator hyperparameters 2023-09-03 21:40:02 -04:00
Lee Spector
875c0b8e73 Rename rate to onenum, since it can be used for non-rate hyperparameters too 2023-09-03 20:54:44 -04:00
Lee Spector
fad10a85b5 Add rate function to support rate collections 2023-09-03 20:48:51 -04:00
Lee Spector
1facb741e6 Improve efficiency of motley-batch-lexicase-selection 2023-09-03 10:06:42 -04:00
Lee Spector
06e9f9445d Add motley batch lexicase selection 2023-09-02 16:38:15 -04:00
Lee Spector
a95e1ea872 Add alternation genetic operator; mul3 enhancements 2023-09-02 14:43:36 -04:00
Lee Spector
3ca6d4175f Initialize diploid genomes to pairs of same; implement diploid vumad; mess around with mul3 2023-08-31 17:17:33 -04:00
Lee Spector
aeae30d0d4 Add variable umad (vumad) genetic operator; mul3 parameter experiments 2023-08-30 16:43:49 -04:00
Lee Spector
b49ced0567 Mess with defaults 2023-08-30 15:19:00 -04:00
Lee Spector
1733ffd42e Merge branch 'master' into boolean-multipliers 2023-08-30 14:47:58 -04:00
Lee Spector
7797fc1def Document concurrency and :single-thread-mode in README 2023-08-30 13:14:32 -04:00
Lee Spector
87ba635f4f Use pmapallv for variation, which includes selection 2023-08-30 12:52:34 -04:00
Lee Spector
a2192ca37d Use pmapallv for evaluation in GP, after debugging and adding shutdown-agents 2023-08-30 12:36:47 -04:00
Lee Spector
4faf2300ee Remove most of GP function's docstring 2023-08-30 12:14:24 -04:00
Lee Spector
0aa8af7993 Add pmapallv utility function 2023-08-30 12:02:46 -04:00
Lee Spector
ee3f8372c8 Add boolean multiplier problems, with temporary default settings 2023-08-28 19:49:49 -04:00
Lee Spector
6eccd21ece
Include CLI tools version of example command lines 2023-04-16 09:11:54 -04:00
Lee Spector
fa9d0a3740 Update docs and bump version 2023-03-29 15:14:56 -04:00
Lee Spector
cb2aad6c17 Add word space 2023-03-29 14:18:10 -04:00
Lee Spector
d6283328db Remove old, incomplete fizz-buzz problem file 2023-03-29 14:14:43 -04:00
Lee Spector
42285ded02 Remove calls to shutdown-agents 2023-03-29 14:10:55 -04:00
Lee Spector
99d3e2ff0b Update docs 2023-03-28 23:14:49 -04:00
Lee Spector
47e7fdc885 Bump version 2023-03-28 23:02:32 -04:00
Lee Spector
d63044ea47 Update docs 2023-03-28 23:00:35 -04:00
Lee Spector
452de0a25a Add doc html files 2023-03-28 22:56:46 -04:00
Lee Spector
395ceac019 Update depricated clj --main to -M -m 2023-03-28 22:53:31 -04:00
Lee Spector
565ae1e79b
Merge pull request #59 from FluffyChipmunk/master
updated documentation to generate docs
2023-03-28 09:05:24 -04:00
Ashley Bao
341a5820ab updated documentation 2023-03-28 09:02:28 -04:00
Lee Spector
65af250d55
Comment out test until issue resolved 2023-03-26 21:34:00 -04:00
Lee Spector
bba21625a0
Improve wording 2023-03-26 21:29:47 -04:00
Lee Spector
83d5820c41
Add note about loading problem files 2023-03-26 21:28:04 -04:00
Lee Spector
23eb926482
Update psb2 dependency, for clj runs on PSB problems 2023-03-26 21:25:15 -04:00
Ryan Boldi
d226c82074 Merge remote-tracking branch 'upstream/master' 2023-03-24 08:50:28 -04:00
Lee Spector
9053be5a5a
Add link to GitHub Pages documentation 2023-03-23 12:47:05 -04:00
Lee Spector
26b6643ed6
Add note about loading problem file separately 2023-03-23 12:27:08 -04:00
Lee Spector
2784998196
Remove require of propeller.problems.data-creation 2023-03-23 00:38:59 -04:00
Lee Spector
98526b0e49
Remove require of propeller.problems.data-creation 2023-03-23 00:38:24 -04:00
Lee Spector
a5156b3747
Remove require of propeller.problems.data-creation 2023-03-23 00:37:59 -04:00
Lee Spector
61f2df857f
Remove require of propeller.problems.data-creation 2023-03-23 00:37:24 -04:00
Ryan Boldi
1c0805169f Merge remote-tracking branch 'upstream/master' 2023-03-17 10:45:37 -04:00
Lee Spector
9ec0ff890f
Fix -main documentation string 2023-03-16 13:09:33 -04:00
Lee Spector
63fcb33ca9
Fix -main documentation string 2023-03-16 13:08:52 -04:00
Lee Spector
c02f64dd68
Fix -main documentation string 2023-03-16 13:07:57 -04:00
Lee Spector
37020697a8
Fix -main documentation string 2023-03-16 13:07:28 -04:00
Lee Spector
87e99306f8
Fix -main documentation string 2023-03-16 13:06:07 -04:00
Lee Spector
c1c5b2ff1a
Fix -main documentation string 2023-03-16 13:05:37 -04:00
Lee Spector
8313af4eec
Fix -main documentation string 2023-03-16 13:05:14 -04:00
Lee Spector
b2f9ee1fb2
Fix -main documentation string 2023-03-16 13:04:44 -04:00
Lee Spector
bd8628695b
Fix -main documentation string 2023-03-16 13:04:04 -04:00
Lee Spector
7162d8c049
Fix -main documentation string 2023-03-16 13:03:42 -04:00
Lee Spector
78a83fe798
Fix -main documentation string 2023-03-16 13:03:21 -04:00
Lee Spector
c49a722306
Fix -main documentation string 2023-03-16 13:02:47 -04:00
Lee Spector
5a9cf36840
Fix -main documentation string 2023-03-16 13:02:17 -04:00
Lee Spector
789b624555
Fix -main documentation string 2023-03-16 13:01:50 -04:00
Lee Spector
4cc087eaa9
Fix -main documentation string 2023-03-16 12:57:09 -04:00
Lee Spector
e8a84745c8
Fix -main documentation string 2023-03-16 12:54:02 -04:00
Lee Spector
8fc7305573
Fix -main documentation string 2023-03-16 12:50:39 -04:00
Lee Spector
8b5009ccdb
Fix -main documentation string 2023-03-16 12:46:23 -04:00
Lee Spector
bcae0e4a36
Fix -main documentation string 2023-03-16 12:43:03 -04:00
Lee Spector
0d0068cd31
Fix -main documentation string 2023-03-16 12:36:58 -04:00
Lee Spector
f442a59c7d
Fix -main documentation string 2023-03-16 12:35:39 -04:00
Lee Spector
7f93ae0bf1
Fix -main documentation string 2023-03-16 12:33:33 -04:00
Lee Spector
f4a8d55b4c
Fix -main documentation string 2023-03-16 12:29:49 -04:00
Lee Spector
0622547a8c
Fix -main documentation string 2023-03-16 12:27:38 -04:00
Lee Spector
9209fa2975
Fix -main documentation string 2023-03-16 12:27:01 -04:00
Lee Spector
116eb9d625
Fix -main documentation string 2023-03-16 12:26:24 -04:00
Lee Spector
aca79750b5
Fix -main documentation string 2023-03-16 12:25:43 -04:00
Lee Spector
a076223a6e
Fix -main documentation string 2023-03-16 12:22:52 -04:00
Lee Spector
3666f51d97
Fix -main documentation string 2023-03-16 12:22:05 -04:00
Lee Spector
c0d5e4e819
Fix -main documentation string 2023-03-16 12:21:25 -04:00
Lee Spector
339857f955
Fix -main documentation string 2023-03-16 12:20:51 -04:00
Lee Spector
86e0f6e3ef
Add examples of calls to -main, documentation 2023-03-15 23:11:32 -04:00
Lee Spector
313a4d5b2f
Update README.md
Fix typos
2023-03-15 22:51:42 -04:00
Lee Spector
a68f1bdfbc
Update README.md
Add instructions for using CLI tools. Remove instructions for working at REPL, which are superseded by the instructions for using `session.cljc`.
2023-03-15 22:48:45 -04:00
Lee Spector
4eb5e93112
Update float_regression.cljc
Use float constants, no exec or boolean instructions, and epsilon lexicase selection
2023-03-07 18:30:06 -05:00
Lee Spector
340715c6e1
Update README.md 2023-03-07 11:13:11 -05:00
Lee Spector
ab70746446
Merge pull request #57 from FluffyChipmunk/master
adding documentation files
2023-02-18 16:04:01 -05:00
Ashley Bao
0df7e26621 update readme 2023-02-17 14:45:19 -05:00
Lee Spector
25f027c1a7
Merge pull request #56 from ryanboldi/more-problems
Fix comment, and bump psb2 package version to include psb1 problems
2023-02-17 12:52:36 -05:00
Ryan Boldi
f143c108da bump to latest psb2 version 2023-02-17 12:49:42 -05:00
Ryan Boldi
21fe582a54 Update simple_classification.cljc 2023-02-17 12:46:13 -05:00
Lee Spector
75aeeb0914
Merge pull request #55 from ryanboldi/more-problems
Added ryan's propeller problems
2023-02-17 12:10:19 -05:00
Ryan Boldi
23a8b0648a Merge remote-tracking branch 'upstream/master' 2023-02-17 10:21:26 -05:00
Ryan Boldi
00b82ef7b3 remove dependency on datasets 2023-02-17 10:19:39 -05:00
Ryan Boldi
5034cb6737 added ryan's problems 2023-02-17 10:09:27 -05:00
Ryan Boldi
da90f2de8e removing datasets. using psb2.core 2023-02-17 09:57:22 -05:00
Ashley Bao
f47d05e279 updated docs 2023-01-26 11:53:49 -05:00
Ashley Bao
71c8e51dea Update a guide to propeller 2023-01-25 14:33:25 -05:00
Ashley Bao
0c5c356084 script to generate docs 2023-01-25 14:26:53 -05:00
Ashley Bao
5af2daa5ad scripts to fix codox generation 2023-01-24 16:25:14 -05:00
Ashley Bao
3308ba65dd added docs for additional instructions 2023-01-24 14:38:24 -05:00
Ashley Bao
064ba4afbd a guide to propeller update 2023-01-20 15:34:18 -05:00
Ashley Bao
a07f5ba17b udpate docs 2023-01-20 15:21:08 -05:00
Ashley Bao
82a2eec301 ordering in html 2023-01-20 15:01:15 -05:00
Ashley Bao
af0e04a639 udpated docs 2023-01-20 14:58:56 -05:00
Ashley Bao
a2570b4cde updated software and push instructions 2023-01-19 15:50:28 -05:00
Ashley Bao
62f64dee66 Update Adding_Selection_Method.html 2023-01-18 17:17:05 -05:00
Ashley Bao
e1379eb6e3 Update selection method 2023-01-18 17:14:05 -05:00
Ashley Bao
fb0888edd5 update docs site 2023-01-18 17:01:12 -05:00
Ashley Bao
a00c35385f updated docs 2023-01-17 20:47:53 -05:00
Ashley Bao
b2d534b189 moved files 2023-01-16 12:38:28 -05:00
Ashley Bao
c9d424cfdf renamed to docs 2023-01-16 12:36:53 -05:00
Ashley Bao
ff61655e7e adding codox 2023-01-16 12:30:01 -05:00
Ashley Bao
e7240e01d8 created deps.edn file 2023-01-16 12:29:00 -05:00
Ashley Bao
b6b7a5bf9b added docstrings to problems 2023-01-13 17:39:28 -05:00
Lee Spector
3a04b74633
Merge pull request #54 from FluffyChipmunk/master
Added deps.edn
2023-01-12 21:20:44 -05:00
Ashley Bao
4f2db7a406 removed cache files 2023-01-12 20:45:29 -05:00
Ashley Bao
ace5afc907 update gitignore 2023-01-12 20:39:18 -05:00
Ashley Bao
204c8ae0a5 created deps.edn file 2023-01-12 19:20:12 -05:00
Ashley Bao
84f2e6a88d added docstrings
more comments in genome, gp, selection, simplification, utils, variation
2023-01-11 21:37:37 -05:00
Ryan Boldi
a8e42475b5 Update selection_test.cljc 2023-01-10 10:57:20 +01:00
Ryan Boldi
cc9e250a1b Create UBall5D.cljc 2023-01-10 10:30:14 +01:00
Ryan Boldi
2d5bc49d86 Update float_regression.cljc 2023-01-10 09:01:05 +01:00
Ashley Bao
962dd5a55b added explanation of session namespace 2023-01-09 16:42:28 -05:00
Ryan Boldi
ed37be0720 Update downsample.cljc 2023-01-09 16:28:36 +01:00
Ryan Boldi
68bab20143 prepped for integer and float regression runs 2023-01-08 15:08:29 +01:00
Ryan Boldi
d9e16aa028 implemented soft ids, where being a threshold away from solved still counts as being solved. 2023-01-08 14:26:36 +01:00
Ryan Boldi
43752ed6e0 Merge branch 'master' 2023-01-07 22:54:37 +01:00
Lee Spector
f83ad0f8ef Return 0.0 from mean of empty collection 2023-01-07 12:10:35 -05:00
Lee Spector
685bc86fc0 Fix formatting 2023-01-07 11:57:53 -05:00
Lee Spector
19d049500b Fix formatting 2023-01-07 11:55:19 -05:00
Lee Spector
9a10faaec2
Merge pull request #53 from dndang23/epsilon-lexicase-selection
Implemented epsilon-lexicase selection in selection.cljc and calculated epsilons once per generation in gp.cljc
2023-01-07 11:46:20 -05:00
dndang23
bff4da6975 Made organizational changes suggested by Ryan 2023-01-05 16:21:21 -08:00
Ryan Boldi
c40f1f70f4 added fitness proportionate selection + tests 2023-01-05 12:40:15 +01:00
Ryan Boldi
2a76d32479 Update .gitignore 2023-01-04 21:38:39 +01:00
dndang23
072b8af061 Added comments 2022-12-29 18:22:02 -05:00
dndang23
c5dd970149 Implemented epsilon-lexicase selection into propeller 2022-12-28 17:14:54 -05:00
Ryan Boldi
4625475e90 Update grade.cljc 2022-12-21 21:03:51 -05:00
Ryan Boldi
77ec7b121e Update gp.cljc 2022-12-21 21:03:49 -05:00
Ryan Boldi
e3ef43e95a overhaul to down-sampling. Separated selection from the down-sampling type.
Also, added to the docs to help startup faster
2022-12-12 11:53:14 -05:00
Ryan Boldi
b4e4552acb implemented elite/not elite vector tracking, moved tests 2022-11-17 20:23:46 -05:00
Ryan Boldi
e011fa7892 added armins function and tests 2022-11-17 20:22:51 -05:00
Ryan Boldi
1cdf6f5640 account for generation interval in eval counting 2022-11-08 15:48:12 -05:00
Ryan Boldi
f6a412d605 added evaluation tracking, automatically stopping at a consistent number of evals 2022-11-07 18:43:36 -05:00
Ryan Boldi
1f62d9ca41 fixed autods errors 2022-10-25 13:00:50 -04:00
Ryan Boldi
fc738e2154 tested and fixed auto-ds size 2022-10-18 15:45:31 -04:00
Ryan Boldi
7467f638a7 Merge branch 'biased-downsampling-exp' into auto-ds-size 2022-10-13 09:27:25 -04:00
Ryan Boldi
28b76e14ab fixed find-pair bug 2022-08-19 11:23:35 -04:00
Ryan Boldi
0ffed2b56c fix find-pair (maybe) 2022-08-16 11:13:25 -04:00
Ryan Boldi
239de881ce fixed scrabble score test-data bugs. (might revert) 2022-08-14 09:36:56 -04:00
Ryan Boldi
6ffd3bea59 grade is now easier, more aligned with comparison. Doesn't use whole string, just output letter. 2022-08-14 09:34:31 -04:00
Ryan Boldi
75fd08e1dc fixed scrabble score bug 2022-08-02 09:33:05 -04:00
Ryan Boldi
560a614afa Update find_pair.cljc 2022-07-31 09:53:38 -04:00
Ryan Boldi
27e64b2362 grade prints, scrabble score doesn't 2022-07-31 09:10:20 -04:00
Ryan Boldi
dd1fc99205 Update find_pair.cljc 2022-07-29 10:50:08 -04:00
Ryan Boldi
98d6881d68 Create find_pair.cljc 2022-07-29 10:48:50 -04:00
Ryan Boldi
98474297fb Update small_or_large.cljc 2022-06-20 22:30:08 -04:00
Ryan Boldi
39aa7a8cf3 implemented all problems but find-pair 2022-06-16 11:14:43 -04:00
Ryan Boldi
039769eaf6 gcd problem implemented 2022-06-11 10:30:51 -04:00
Ryan Boldi
cddb60c63f data parsing works for data with strings now 2022-06-11 10:24:45 -04:00
Ryan Boldi
6bc31e2d9c implemented auto downsample size 2022-06-08 08:51:16 -04:00
Ryan Boldi
72d325a609 stopped creating data 2022-06-07 10:44:50 -04:00
Ryan Boldi
b5763dcc5a added boolean flag to not end runs on success 2022-06-07 09:42:55 -04:00
Ryan Boldi
b5953d3779 Update fuel_cost.cljc 2022-06-05 21:15:23 -04:00
Ryan Boldi
6f152a0357 fixed multiple in/out problems 2022-06-05 21:15:20 -04:00
Ryan Boldi
1cc584ca44 fixed erroneous test 2022-06-05 10:27:30 -04:00
Ryan Boldi
f39d5e76cd logging indices now 2022-06-05 10:17:23 -04:00
Ryan Boldi
b591403fe8 hyperselection implementation and tests
really hacky implementation that only works with UMAD for now.
2022-06-05 10:09:05 -04:00
Ryan Boldi
17f2676a47 Delete down-sampling-data.zip 2022-06-05 10:08:07 -04:00
Ryan Boldi
3ced7bd0fd Update count-odds-test.csv 2022-06-05 10:07:20 -04:00
Ryan Boldi
032a9cc1ab added data and data-creation file, fixed issues 2022-06-05 10:07:11 -04:00
Ryan Boldi
639d08b405 added picked datasets 2022-06-03 22:09:38 -04:00
Ryan Boldi
0cc5cec53a Update data_creation.cljc 2022-06-03 22:06:38 -04:00
Ryan Boldi
42def900d6 data-creation script 2022-06-03 11:16:32 -04:00
Ryan Boldi
fa681bef44 Update simple_classification.cljc 2022-05-15 14:47:29 -04:00
Ryan Boldi
667b04312b added ability to evaluate individuals every k generations 2022-05-14 19:49:51 -04:00
Ryan Boldi
d9171bcb51 argmax NOW tiebreaks randomly 2022-05-05 14:58:15 -04:00
Ryan Boldi
4fffe9e8f3 fixed some printing errors resulting from different input representations 2022-05-05 13:58:26 -04:00
Ryan Boldi
2b234a988b breaks ties randomly 2022-05-05 13:57:59 -04:00
Ryan Boldi
49d1287335 New param, ds-parent-rate, that changes how many parents become the representative population. At 1, this is just full information. 2022-04-27 13:22:57 -04:00
Ryan Boldi
816b443658 retested max-min, and added some new logging to judge case proportions 2022-04-13 22:54:33 -04:00
Ryan Boldi
e3dfcfd58e Create simple_classification.cljc 2022-04-09 15:42:43 -04:00
Ryan Boldi
cebdd1aa20 Update complex_regression.cljc 2022-04-05 15:34:38 -04:00
Ryan Boldi
4f9ed1f267 Update complex_regression.cljc 2022-04-05 15:21:55 -04:00
Ryan Boldi
11b09c9be0 Update complex_regression.cljc 2022-04-03 23:08:49 -04:00
Ryan Boldi
336710144d Create complex_regression.cljc 2022-04-02 14:49:27 -04:00
Ryan Boldi
217f195047 Implemented max-min, which takes the maximum minimum distance into account instead of average distances 2022-03-29 15:32:34 -04:00
Ryan Boldi
bff8f0673c evals the whole population to be used for distance calculations 2022-03-28 22:08:22 -04:00
Ryan Boldi
b33ac7c0a4 evaluate all distances every k generations 2022-03-16 11:07:08 -04:00
Ryan Boldi
9b81e345df Update downsample.md 2022-03-14 19:04:37 -04:00
Ryan Boldi
43fde4c7ad Implements first case subsampling function. 2022-03-14 19:04:32 -04:00
Ryan Boldi
22b7067f10 add and test helper functions 2022-03-14 19:02:47 -04:00
Ryan Boldi
f763db91a2 only do distance calculations if parent-selection is ds-lexicase 2022-03-12 14:05:55 -05:00
Ryan Boldi
287799f194 implemented downsampling and distance measuring/updating
Features:

- Tests!
- maintain index of all training-cases
- update distance of training-cases after every evaluation (only update cases that are in the downsample)
- when an individual passes all of the DS cases, the population is re-evaluated on all training-cases to see if they pass all of them. If so, evolution is completed and training is complete. (they are then tested on held out test set and performance is reported)
2022-03-12 13:59:47 -05:00
Ryan Boldi
83c7e440f6 added step function to math utils 2022-03-12 13:55:47 -05:00
Ryan Boldi
72e31b5c4d made defaults use UMAD 100% of the time 2022-03-12 13:55:31 -05:00
Ryan Boldi
d1044f1ab4 Update simplification.cljc 2022-03-07 14:04:58 -05:00
Ryan Boldi
32f374635a Update utils_test.cljc 2022-03-06 23:33:50 -05:00
Ryan Boldi
4a03a19190 Merge branch 'master' of https://www.github.com/lspector/propeller into downsample 2022-03-06 23:27:00 -05:00
Ryan Boldi
527f115168 downsample takes training-data as arg 2022-03-06 23:24:13 -05:00
Ryan Boldi
45b19fbd3e implement assign-indices-to-data and select-downsample-random and tests 2022-03-03 21:43:44 -05:00
Ryan Boldi
8c074a4ba8 update documentation to include simplification 2022-03-03 21:29:42 -05:00
179 changed files with 1009113 additions and 797 deletions

3
.gitignore vendored
View File

@ -23,6 +23,7 @@ notes
/temp
*~
q
scratch.clj
# Clojure Script
.shadow-cljs/
@ -33,3 +34,5 @@ node_modules/
# https://github.com/thelmuth/program-synthesis-benchmark-datasets
/data
**/.DS_Store
*.edn
/.cpcache/

View File

@ -0,0 +1,24 @@
{:input1 1, :output1 "1"}
{:input1 2, :output1 "2"}
{:input1 3, :output1 "Fizz"}
{:input1 4, :output1 "4"}
{:input1 5, :output1 "Buzz"}
{:input1 6, :output1 "Fizz"}
{:input1 7, :output1 "7"}
{:input1 8, :output1 "8"}
{:input1 9, :output1 "Fizz"}
{:input1 10, :output1 "Buzz"}
{:input1 11, :output1 "11"}
{:input1 12, :output1 "Fizz"}
{:input1 13, :output1 "13"}
{:input1 14, :output1 "14"}
{:input1 15, :output1 "FizzBuzz"}
{:input1 16, :output1 "16"}
{:input1 17, :output1 "17"}
{:input1 18, :output1 "Fizz"}
{:input1 19, :output1 "19"}
{:input1 20, :output1 "Buzz"}
{:input1 49995, :output1 "FizzBuzz"}
{:input1 49998, :output1 "Fizz"}
{:input1 49999, :output1 "49999"}
{:input1 50000, :output1 "Buzz"}

File diff suppressed because it is too large Load Diff

View File

@ -2,35 +2,86 @@
Yet another Push-based genetic programming system in Clojure.
Propeller is a component of several active research projects and it is subject to change as a part of these activities.
See the git commit comments for guidance with respect to recent changes.
Some documentation is available at [https://lspector.github.io/propeller/](https://lspector.github.io/propeller/), but this should be evaluated in the context of the commit messages and current source code.
## About this fork
This is mainly for personal use to develop inside of Nix environment. Check out the original on package on [github](https://github.com/lspector/propeller).
### How to jack into the project
Once you've ran `nix develop` and vscodium has appeared, click the REPL
button in the bottom left of the screen. Click
`Start your project with a REPL and connect (a.k.a Jack-in)`, select
`Leiningen`, and don't select a profile, instead click `OK`. A window should appear to the right with Calva's REPL.
Head over to `src/propeller/session.cljc` as described below and click
`ctrl + alt + c` then `Enter` to source the session file.
## Usage
If you have installed [leiningen](https://leiningen.org), which is a tool
for running Clojure programs, then you can run Propeller on a genetic
programming problem that is defined within this project from the command
line with the command `lein run -m <namespace>`, replacing `<namespace>`
If you are working in a Clojure IDE with an integrated REPL, the first
thing you may want to do is to open `src/propeller/session.cljc` and
evaluate the namespace declaration and the commented-out expressions
therein. These demonstrate core components of Propeller including
complete genetic programming runs. When conducting complete genetic
programming runs this way (using `gp/gp`), depending on your IDE you
may need to explicitly open and load the problem file before evaluating
the calls to `require` and `gp/gp`.
To run Propeller from the command line, on a genetic programming problem
that is defined within this project, you will probably want to use either
the Clojure [CLI tools](https://clojure.org/guides/deps_and_cli) or
[leiningen](https://leiningen.org). In the examples below, the leiningen
and CLI commands are identical except that the former begin with
`lein run -m`, while the latter begin with `clj -M -m`.
To start a run use `clj -M -m <namespace>` or
`lein run -m <namespace>`, replacing `<namespace>`
with the actual namespace that you will find at the top of the problem file.
For example, you can run the simple-regression genetic programming problem with:
For example, you can run the integer-regression genetic programming problem with:
```
lein run -m propeller.problems.simple-regression
clj -M -m propeller.problems.regression.integer-regression
```
or
```
lein run -m propeller.problems.regression.integer-regression
```
Additional command-line arguments may
be provided to override the default key/value pairs specified in the
problem file, for example:
```
clj -M -m propeller.problems.regression.integer-regression :population-size 100
```
or
```
lein run -m propeller.problems.simple-regression :population-size 100
lein run -m propeller.problems.regression.integer-regression :population-size 100
```
On Unix operating systems, including MacOS, you can use something
like the following to send output both to the terminal
and to a text file (called `outfile` in this example):
```
lein run -m propeller.problems.simple-regression | tee outfile
clj -M -m propeller.problems.regression.integer-regression | tee outfile
```
or
```
lein run -m propeller.problems.regression.integer-regression | tee outfile
```
If you want to provide command line arguments that include
@ -41,24 +92,22 @@ value for the `:variation` argument, which is a clojure map
containing curly brackets that may confuse your shell:
```
lein run -m propeller.problems.simple-regression :variation "{:umad 1.0}"
clj -M -m propeller.problems.regression.integer-regression :variation "{:umad 1.0}"
```
To run a genetic programming problem from a REPL, start
your REPL for the project (e.g. with `lein repl` at the
command line when in the project directory, or through your
IDE) and then do something like the following (which in
this case runs the simple-regression problem with
`:population-size` 100):
or
```
(require 'propeller.problems.simple-regression)
(in-ns 'propeller.problems.simple-regression)
(-main :population-size 100 :variation {:umad 1.0})
lein run -m propeller.problems.regression.integer-regression :variation "{:umad 1.0}"
```
If you want to run the problem with the default parameters,
then you should call `-main` without arguments, as `(-main)`.
For many genetic operator hyperparameters, collections may be provided in place of single values. When this is done, a random element of the collection will be chosen (with each being equally likely) each time the operator is used. When specied at the command line, these collections will also have to be quoted, for example with `:umad-rate "[0.01 0.05 0.1]"` to mean that UMAD rates of 0.01, 0.05, and 0.1 can be used.
By default, Propeller will conduct many processes concurrently on multiple
cores using threads. If you want to disable this behavior (for example, during
debugging) then provide the argument `:single-thread-mode` with the value `true`.
Threads are not available in Javascript, so no processes are run concurrnetly
when Propeller is run in Clojurescript.
## CLJS Usage
@ -94,8 +143,9 @@ Calling `(-main)` will run the default genetic programming problem.
## Description
Propel is an implementation of the Push programming
language and the PushGP genetic programming system in Clojure.
Propeller is an implementation of the Push programming
language and the PushGP genetic programming system in Clojure, based
on Tom Helmuth's little PushGP implementation [propel](https://github.com/thelmuth/propel).
For more information on Push and PushGP see
[http://pushlanguage.org](http://pushlanguage.org).

14
deps.edn Normal file
View File

@ -0,0 +1,14 @@
{:paths ["src" "target/classes"],
:deps
{org.clojure/clojure #:mvn{:version "1.10.0"},
org.clojure/clojurescript #:mvn{:version "1.9.946"},
org.clojure/test.check #:mvn{:version "1.1.0"},
net.clojars.schneau/psb2 #:mvn{:version "1.1.1"}
org.clojure/data.csv #:mvn{:version "1.0.1"}},
:mvn/repos {}
:codox {:extra-deps {codox/codox {:mvn/version "0.10.8"}}
:exec-fn codox.main/generate-docs
:exec-args {:doc-paths ["src/docs_src"]
:output-path "docs"
:metadata {:doc "FIXME: write docs" :doc/format :markdown}}
}}

View File

@ -1,32 +0,0 @@
# Introduction to Propeller
TODO: write [great documentation](http://jacobian.org/writing/what-to-write/)
# Simplification
To use Propeller's auto-simplification system, simply include the following four command line arguments when running a problem:
```clojure
:simplification? true
```
Toggle auto-simplification
```clojure
:simplification-k 4
```
This is the upper bound for elements deleted from the plushy every step. Every step, a number in $[1, k]$ of elements is deleted from the plushy representation of the solution.
```clojure
:simplification-steps 1000
```
Number of simplification steps to perform
```clojure
:simplification-verbose? true
```
whether or not to output simplification info into the output of the evolutionary run.
The output with verbose adds the following lines to the output:
```clojure
{:start-plushy-length 42, :k 4}
{:final-plushy-length 13, :final-plushy (:in1 :in1 :integer_quot :in1 :in1 :exec_dup :in1 :integer_mult close :exec_dup :integer_add 1 :integer_add)}
```

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

116
docs/Adding_Problem.html Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

14
docs/Genome.html Normal file

File diff suppressed because one or more lines are too long

134
docs/Intro.html Normal file

File diff suppressed because one or more lines are too long

15
docs/Selection.html Normal file

File diff suppressed because one or more lines are too long

20
docs/Simplification.html Normal file

File diff suppressed because one or more lines are too long

38
docs/Variation.html Normal file

File diff suppressed because one or more lines are too long

551
docs/css/default.css Normal file
View File

@ -0,0 +1,551 @@
body {
font-family: Helvetica, Arial, sans-serif;
font-size: 15px;
}
pre, code {
font-family: Monaco, DejaVu Sans Mono, Consolas, monospace;
font-size: 9pt;
margin: 15px 0;
}
h1 {
font-weight: normal;
font-size: 29px;
margin: 10px 0 2px 0;
padding: 0;
}
h2 {
font-weight: normal;
font-size: 25px;
}
h5.license {
margin: 9px 0 22px 0;
color: #555;
font-weight: normal;
font-size: 12px;
font-style: italic;
}
.document h1, .namespace-index h1 {
font-size: 32px;
margin-top: 12px;
}
#header, #content, .sidebar {
position: fixed;
}
#header {
top: 0;
left: 0;
right: 0;
height: 22px;
color: #f5f5f5;
padding: 5px 7px;
}
#content {
top: 32px;
right: 0;
bottom: 0;
overflow: auto;
background: #fff;
color: #333;
padding: 0 18px;
}
.sidebar {
position: fixed;
top: 32px;
bottom: 0;
overflow: auto;
}
.sidebar.primary {
background: #e2e2e2;
border-right: solid 1px #cccccc;
left: 0;
width: 250px;
}
.sidebar.secondary {
background: #f2f2f2;
border-right: solid 1px #d7d7d7;
left: 251px;
width: 200px;
}
#content.namespace-index, #content.document {
left: 251px;
}
#content.namespace-docs {
left: 452px;
}
#content.document {
padding-bottom: 10%;
}
#header {
background: #3f3f3f;
box-shadow: 0 0 8px rgba(0, 0, 0, 0.4);
z-index: 100;
}
#header h1 {
margin: 0;
padding: 0;
font-size: 18px;
font-weight: lighter;
text-shadow: -1px -1px 0px #333;
}
#header h1 .project-version {
font-weight: normal;
}
.project-version {
padding-left: 0.15em;
}
#header a, .sidebar a {
display: block;
text-decoration: none;
}
#header a {
color: #f5f5f5;
}
.sidebar a {
color: #333;
}
#header h2 {
float: right;
font-size: 9pt;
font-weight: normal;
margin: 4px 3px;
padding: 0;
color: #bbb;
}
#header h2 a {
display: inline;
}
.sidebar h3 {
margin: 0;
padding: 10px 13px 0 13px;
font-size: 19px;
font-weight: lighter;
}
.sidebar h3 a {
color: #444;
}
.sidebar h3.no-link {
color: #636363;
}
.sidebar ul {
padding: 7px 0 6px 0;
margin: 0;
}
.sidebar ul.index-link {
padding-bottom: 4px;
}
.sidebar li {
display: block;
vertical-align: middle;
}
.sidebar li a, .sidebar li .no-link {
border-left: 3px solid transparent;
padding: 0 10px;
white-space: nowrap;
}
.sidebar li .no-link {
display: block;
color: #777;
font-style: italic;
}
.sidebar li .inner {
display: inline-block;
padding-top: 7px;
height: 24px;
}
.sidebar li a, .sidebar li .tree {
height: 31px;
}
.depth-1 .inner { padding-left: 2px; }
.depth-2 .inner { padding-left: 6px; }
.depth-3 .inner { padding-left: 20px; }
.depth-4 .inner { padding-left: 34px; }
.depth-5 .inner { padding-left: 48px; }
.depth-6 .inner { padding-left: 62px; }
.sidebar li .tree {
display: block;
float: left;
position: relative;
top: -10px;
margin: 0 4px 0 0;
padding: 0;
}
.sidebar li.depth-1 .tree {
display: none;
}
.sidebar li .tree .top, .sidebar li .tree .bottom {
display: block;
margin: 0;
padding: 0;
width: 7px;
}
.sidebar li .tree .top {
border-left: 1px solid #aaa;
border-bottom: 1px solid #aaa;
height: 19px;
}
.sidebar li .tree .bottom {
height: 22px;
}
.sidebar li.branch .tree .bottom {
border-left: 1px solid #aaa;
}
.sidebar.primary li.current a {
border-left: 3px solid #a33;
color: #a33;
}
.sidebar.secondary li.current a {
border-left: 3px solid #33a;
color: #33a;
}
.namespace-index h2 {
margin: 30px 0 0 0;
}
.namespace-index h3 {
font-size: 16px;
font-weight: bold;
margin-bottom: 0;
}
.namespace-index .topics {
padding-left: 30px;
margin: 11px 0 0 0;
}
.namespace-index .topics li {
padding: 5px 0;
}
.namespace-docs h3 {
font-size: 18px;
font-weight: bold;
}
.public h3 {
margin: 0;
float: left;
}
.usage {
clear: both;
}
.public {
margin: 0;
border-top: 1px solid #e0e0e0;
padding-top: 14px;
padding-bottom: 6px;
}
.public:last-child {
margin-bottom: 20%;
}
.members .public:last-child {
margin-bottom: 0;
}
.members {
margin: 15px 0;
}
.members h4 {
color: #555;
font-weight: normal;
font-variant: small-caps;
margin: 0 0 5px 0;
}
.members .inner {
padding-top: 5px;
padding-left: 12px;
margin-top: 2px;
margin-left: 7px;
border-left: 1px solid #bbb;
}
#content .members .inner h3 {
font-size: 12pt;
}
.members .public {
border-top: none;
margin-top: 0;
padding-top: 6px;
padding-bottom: 0;
}
.members .public:first-child {
padding-top: 0;
}
h4.type,
h4.dynamic,
h4.added,
h4.deprecated {
float: left;
margin: 3px 10px 15px 0;
font-size: 15px;
font-weight: bold;
font-variant: small-caps;
}
.public h4.type,
.public h4.dynamic,
.public h4.added,
.public h4.deprecated {
font-size: 13px;
font-weight: bold;
margin: 3px 0 0 10px;
}
.members h4.type,
.members h4.added,
.members h4.deprecated {
margin-top: 1px;
}
h4.type {
color: #717171;
}
h4.dynamic {
color: #9933aa;
}
h4.added {
color: #508820;
}
h4.deprecated {
color: #880000;
}
.namespace {
margin-bottom: 30px;
}
.namespace:last-child {
margin-bottom: 10%;
}
.index {
padding: 0;
font-size: 80%;
margin: 15px 0;
line-height: 16px;
}
.index * {
display: inline;
}
.index p {
padding-right: 3px;
}
.index li {
padding-right: 5px;
}
.index ul {
padding-left: 0;
}
.type-sig {
clear: both;
color: #088;
}
.type-sig pre {
padding-top: 10px;
margin: 0;
}
.usage code {
display: block;
color: #008;
margin: 2px 0;
}
.usage code:first-child {
padding-top: 10px;
}
p {
margin: 15px 0;
}
.public p:first-child, .public pre.plaintext {
margin-top: 12px;
}
.doc {
margin: 0 0 26px 0;
clear: both;
}
.public .doc {
margin: 0;
}
.namespace-index .doc {
margin-bottom: 20px;
}
.namespace-index .namespace .doc {
margin-bottom: 10px;
}
.markdown p, .markdown li, .markdown dt, .markdown dd, .markdown td {
line-height: 22px;
}
.markdown li {
padding: 2px 0;
}
.markdown h2 {
font-weight: normal;
font-size: 25px;
margin: 30px 0 10px 0;
}
.markdown h3 {
font-weight: normal;
font-size: 20px;
margin: 30px 0 0 0;
}
.markdown h4 {
font-size: 15px;
margin: 22px 0 -4px 0;
}
.doc, .public, .namespace .index {
max-width: 680px;
overflow-x: visible;
}
.markdown pre > code {
display: block;
padding: 10px;
}
.markdown pre > code, .src-link a {
border: 1px solid #e4e4e4;
border-radius: 2px;
}
.markdown code:not(.hljs), .src-link a {
background: #f6f6f6;
}
pre.deps {
display: inline-block;
margin: 0 10px;
border: 1px solid #e4e4e4;
border-radius: 2px;
padding: 10px;
background-color: #f6f6f6;
}
.markdown hr {
border-style: solid;
border-top: none;
color: #ccc;
}
.doc ul, .doc ol {
padding-left: 30px;
}
.doc table {
border-collapse: collapse;
margin: 0 10px;
}
.doc table td, .doc table th {
border: 1px solid #dddddd;
padding: 4px 6px;
}
.doc table th {
background: #f2f2f2;
}
.doc dl {
margin: 0 10px 20px 10px;
}
.doc dl dt {
font-weight: bold;
margin: 0;
padding: 3px 0;
border-bottom: 1px solid #ddd;
}
.doc dl dd {
padding: 5px 0;
margin: 0 0 5px 10px;
}
.doc abbr {
border-bottom: 1px dotted #333;
font-variant: none;
cursor: help;
}
.src-link {
margin-bottom: 15px;
}
.src-link a {
font-size: 70%;
padding: 1px 4px;
text-decoration: none;
color: #5555bb;
}

97
docs/css/highlight.css Normal file
View File

@ -0,0 +1,97 @@
/*
github.com style (c) Vasily Polovnyov <vast@whiteants.net>
*/
.hljs {
display: block;
overflow-x: auto;
padding: 0.5em;
color: #333;
background: #f8f8f8;
}
.hljs-comment,
.hljs-quote {
color: #998;
font-style: italic;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-subst {
color: #333;
font-weight: bold;
}
.hljs-number,
.hljs-literal,
.hljs-variable,
.hljs-template-variable,
.hljs-tag .hljs-attr {
color: #008080;
}
.hljs-string,
.hljs-doctag {
color: #d14;
}
.hljs-title,
.hljs-section,
.hljs-selector-id {
color: #900;
font-weight: bold;
}
.hljs-subst {
font-weight: normal;
}
.hljs-type,
.hljs-class .hljs-title {
color: #458;
font-weight: bold;
}
.hljs-tag,
.hljs-name,
.hljs-attribute {
color: #000080;
font-weight: normal;
}
.hljs-regexp,
.hljs-link {
color: #009926;
}
.hljs-symbol,
.hljs-bullet {
color: #990073;
}
.hljs-built_in,
.hljs-builtin-name {
color: #0086b3;
}
.hljs-meta {
color: #999;
font-weight: bold;
}
.hljs-deletion {
background: #fdd;
}
.hljs-addition {
background: #dfd;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}

63
docs/index.html Normal file

File diff suppressed because one or more lines are too long

2
docs/js/highlight.min.js vendored Normal file

File diff suppressed because one or more lines are too long

4
docs/js/jquery.min.js vendored Normal file

File diff suppressed because one or more lines are too long

112
docs/js/page_effects.js Normal file
View File

@ -0,0 +1,112 @@
function visibleInParent(element) {
var position = $(element).position().top
return position > -50 && position < ($(element).offsetParent().height() - 50)
}
function hasFragment(link, fragment) {
return $(link).attr("href").indexOf("#" + fragment) != -1
}
function findLinkByFragment(elements, fragment) {
return $(elements).filter(function(i, e) { return hasFragment(e, fragment)}).first()
}
function scrollToCurrentVarLink(elements) {
var elements = $(elements);
var parent = elements.offsetParent();
if (elements.length == 0) return;
var top = elements.first().position().top;
var bottom = elements.last().position().top + elements.last().height();
if (top >= 0 && bottom <= parent.height()) return;
if (top < 0) {
parent.scrollTop(parent.scrollTop() + top);
}
else if (bottom > parent.height()) {
parent.scrollTop(parent.scrollTop() + bottom - parent.height());
}
}
function setCurrentVarLink() {
$('.secondary a').parent().removeClass('current')
$('.anchor').
filter(function(index) { return visibleInParent(this) }).
each(function(index, element) {
findLinkByFragment(".secondary a", element.id).
parent().
addClass('current')
});
scrollToCurrentVarLink('.secondary .current');
}
var hasStorage = (function() { try { return localStorage.getItem } catch(e) {} }())
function scrollPositionId(element) {
var directory = window.location.href.replace(/[^\/]+\.html$/, '')
return 'scroll::' + $(element).attr('id') + '::' + directory
}
function storeScrollPosition(element) {
if (!hasStorage) return;
localStorage.setItem(scrollPositionId(element) + "::x", $(element).scrollLeft())
localStorage.setItem(scrollPositionId(element) + "::y", $(element).scrollTop())
}
function recallScrollPosition(element) {
if (!hasStorage) return;
$(element).scrollLeft(localStorage.getItem(scrollPositionId(element) + "::x"))
$(element).scrollTop(localStorage.getItem(scrollPositionId(element) + "::y"))
}
function persistScrollPosition(element) {
recallScrollPosition(element)
$(element).scroll(function() { storeScrollPosition(element) })
}
function sidebarContentWidth(element) {
var widths = $(element).find('.inner').map(function() { return $(this).innerWidth() })
return Math.max.apply(Math, widths)
}
function calculateSize(width, snap, margin, minimum) {
if (width == 0) {
return 0
}
else {
return Math.max(minimum, (Math.ceil(width / snap) * snap) + (margin * 2))
}
}
function resizeSidebars() {
var primaryWidth = sidebarContentWidth('.primary')
var secondaryWidth = 0
if ($('.secondary').length != 0) {
secondaryWidth = sidebarContentWidth('.secondary')
}
// snap to grid
primaryWidth = calculateSize(primaryWidth, 32, 13, 160)
secondaryWidth = calculateSize(secondaryWidth, 32, 13, 160)
$('.primary').css('width', primaryWidth)
$('.secondary').css('width', secondaryWidth).css('left', primaryWidth + 1)
if (secondaryWidth > 0) {
$('#content').css('left', primaryWidth + secondaryWidth + 2)
}
else {
$('#content').css('left', primaryWidth + 1)
}
}
$(window).ready(resizeSidebars)
$(window).ready(setCurrentVarLink)
$(window).ready(function() { persistScrollPosition('.primary')})
$(window).ready(function() {
$('#content').scroll(setCurrentVarLink)
$(window).resize(setCurrentVarLink)
})

4
docs/propeller.core.html Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

8
docs/propeller.gp.html Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

28
docs/propeller.utils.html Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

27
flake.lock generated Normal file
View File

@ -0,0 +1,27 @@
{
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1741600792,
"narHash": "sha256-yfDy6chHcM7pXpMF4wycuuV+ILSTG486Z/vLx/Bdi6Y=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "ebe2788eafd539477f83775ef93c3c7e244421d3",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-24.11",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}

42
flake.nix Normal file
View File

@ -0,0 +1,42 @@
{
description = "A flake for developing in a clojure environment with vscode";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11";
};
outputs = { nixpkgs, ... }:
let system = "x86_64-linux"; in
{
devShells."${system}".default =
let
pkgs = nixpkgs.legacyPackages."${system}";
in
pkgs.mkShellNoCC {
buildInputs = [ pkgs.bashInteractive ];
packages = with pkgs; [
clojure
clojure-lsp
leiningen
nodejs
jdk8
(vscode-with-extensions.override {
vscode = vscodium;
vscodeExtensions = pkgs.vscode-utils.extensionsFromVscodeMarketplace [
{
name = "calva";
publisher = "betterthantomorrow";
version = "2.0.490";
sha256 = "sha256-PCEzSWahrTHXeGFrFShvbXrnoq3AtuVkoohKLxBGDRA=";
}
];
})
];
shellHook = ''
export SHELL=${pkgs.lib.getExe pkgs.bashInteractive}
echo "starting codium"
codium .
'';
};
};
}

12
package-lock.json generated
View File

@ -907,9 +907,9 @@
"dev": true
},
"node_modules/qs": {
"version": "6.11.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
"integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
"version": "6.10.1",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz",
"integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==",
"dev": true,
"dependencies": {
"side-channel": "^1.0.4"
@ -2096,9 +2096,9 @@
"dev": true
},
"qs": {
"version": "6.11.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
"integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
"version": "6.10.1",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz",
"integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==",
"dev": true,
"requires": {
"side-channel": "^1.0.4"

View File

@ -1,4 +1,4 @@
(defproject net.clojars.lspector/propeller "0.3.0"
(defproject net.clojars.lspector/propeller "0.3.2"
:description "Yet another Push-based genetic programming system in Clojure."
:url "https://github.com/lspector/propeller"
:license {:name "EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0"
@ -6,8 +6,13 @@
:dependencies [[org.clojure/clojure "1.10.0"]
[org.clojure/clojurescript "1.9.946"]
[org.clojure/test.check "1.1.0"]
[net.clojars.schneau/psb2 "1.1.0"]]
[net.clojars.schneau/psb2 "1.1.1"]
[org.clojure/data.csv "1.0.1"]]
:profiles {:profiling {:dependencies [[com.clojure-goes-fast/clj-async-profiler "0.5.1"]]}}
:main ^:skip-aot propeller.core
:repl-options {:init-ns propeller.core}
:jvm-opts ^:replace [])
:jvm-opts ^:replace []
:plugins [[lein-codox "0.10.8"]]
:codox {:output-path "docs"
:metadata {:doc "FIXME: write docs" :doc/format :markdown}
:doc-paths ["src/docs_src"]})

73
scripts/FunctionsToMD.py Normal file
View File

@ -0,0 +1,73 @@
# Takes Push instructions defined through (def-instruction and
# puts their documentation into a markdown file in docs_src
import os
from mdutils.mdutils import MdUtils
mdFile = MdUtils(file_name='src/docs_src/Additional_Instructions')
mdFile.new_header(level=1, title='Additional Instructions')
os.chdir('..')
instructionFiles = os.listdir('src/propeller/push/instructions')
instructionFiles.remove('vector.cljc')
instructionFiles.remove('polymorphic.cljc')
print(instructionFiles)
hasDefInstruction = False
for file in instructionFiles:
mdFile.new_header(level=1, title=file)
try:
print(file)
# opening and reading the file
file_read = open('src/propeller/push/instructions/'+file, "r")
# set search text
text = "(def-instruction"
# reading file content line by line.
lines = file_read.readlines()
# looping through each line in the file
# if the line contains "\(def-instruction", go through lines above that line and add
# the Clojure comments to a list which is later written into markdown file.
for count, line in enumerate(lines):
new_list = []
# print(line)
# print(count)
if text in line:
hasDefInstruction = True
# print(line)
mdFile.new_header(level=2, title=lines[count+1].strip())
isComment = True
inc = 1
while isComment:
if lines[count-inc].startswith(';;'):
new_list.append(lines[count-inc].replace(';', '').strip())
# print(lines[count-inc])
inc = inc + 1
else:
isComment = False
new_list.reverse()
for comment in new_list:
mdFile.write(comment+' ')
functionInfo = lines[count+1].strip() + lines[count-1].replace(';', '').strip()
# print(functionInfo)
new_list.append(functionInfo)
# closing file after reading
file_read.close()
# the input string doesn't
# found in the text file
if not hasDefInstruction:
print("\n\"" + text + "\" is not found in \"" + file + "\"!")
mdFile.new_paragraph('')
else:
print("There is"+text)
# entering except block
# if input file doesn't exist
except:
print("\nThe file doesn't exist!")
mdFile.new_table_of_contents()
mdFile.create_md_file()

6
scripts/GenerateDocs.sh Executable file
View File

@ -0,0 +1,6 @@
#!/bin/sh
pip install mdutils
lein codox
python3 FunctionsToMD.py
python3 HTMLFix.py

27
scripts/HTMLFix.py Normal file
View File

@ -0,0 +1,27 @@
# fixes ordered lists in codox-generated HTML for specific files
import os
os.chdir('..')
htmlFiles = ['Adding_Genetic_Operators.html', 'Adding_Problem.html', 'Adding_Selection_Method.html']
for file in htmlFiles:
with open('docs/'+file, 'r') as f:
OL = "ol>"
countOL = 0
newline = []
for line in f.readlines():
if OL in line:
countOL = countOL + 1
if countOL != 2 and countOL != 3 and countOL != 6 and countOL != 7:
newline.append(line)
else:
newline.append(line)
with open('docs/'+file, 'w') as f:
for line in newline:
f.writelines(line)

View File

@ -0,0 +1,202 @@
# A Guide to Propeller
**Propeller** is an implementation of the Push programming language and the PushGP genetic programming system in Clojure.
For more information on Push and PushGP see http://pushlanguage.org.
## Overview
**Propeller** is a Push-based genetic programming system in Clojure.
<!-- TOC -->
* [A Guide to Propeller](#a-guide-to-propeller)
* [Overview](#overview)
* [What can you do with Propeller?](#what-can-you-do-with-propeller)
* [Installation](#installation)
* [How do I run Propeller on a problem?](#how-do-i-run-propeller-on-a-problem)
* [An Example](#an-example)
* [Can you use a REPL?](#can-you-use-a-repl)
* [Tutorials](#tutorials)
* [Contributing](#contributing)
* [License](#license)
* [Citation](#citation)
* [Contact](#contact)
<!-- TOC -->
### What can you do with Propeller?
You can evolve a Push program to solve a problem.
You can also use the Push interpreter to evaluate Push programs in other projects,
for example in agent-based evolutionary simulations in which
agents are controlled by evolving Push programs.
## Installation
If you have installed [leiningen](https://leiningen.org), which is a tool
for running Clojure programs, then you can run Propeller on a genetic
programming problem that is defined within this project from the command
line with the command `lein run -m <namespace>`, replacing `<namespace>`
with the actual namespace that you will find at the top of the problem file.
If you have installed [Clojure](https://clojure.org/guides/install_clojure#java), you can run Propeller on a genetic programming
problem with the command `clj -M -m <namespace>`, replacing `<namespace>` with
the actual namespace that you will find at the top of the problem file.
The examples below use leiningen, but you can replace `lein run -m` with `clj -M -m` to run the same problem.
A specific example is provided later below.
## How do I run Propeller on a problem?
To run Propeller on a problem, you want to call the `-main` function in the problem file using leiningen.
The `-main` function will create a map of arguments from the input and run the main genetic programming loop.
Below is the general format to run a problem through the command-line:
```
lein run -m [namespace of the problem file you want to test]
```
Additional command-line arguments may
be provided to override the default key/value pairs specified in the
problem file,
```
lein run -m [namespace of the problem file you want to test] [key and value] [key and value]...
```
The possible keys come from the table below:
| Key | Description |
|----------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `:instructions` | List of possible Push instructions used to create a plushy |
| `:error-function` | The error function used to evaluate individuals, specified in the given problem's namespace |
| `:training-data` | Map of inputs and desired outputs used to evaluate individuals of the form: {:input1 first-input :input2 second-input ... :output1 first-output ...} |
| `:testing-data` | Map of inputs and desired outputs not in the training-data to test generalizability of a program that fits the `training-data`. The map is of the form: {:input1 first-input :input2 second-input ... :output1 first-output ...} |
| `:max-generations` | Maximum number of generations |
| `:population-size` | Size of population in a generation |
| `:max-initial-plushy-size` | Maximum number of Push instructions in the initial plushy |
| `:step-limit` | The maximum number of steps that a Push program will be executed by `interpret-program` |
| `:parent-selection` | Function from `propeller.selection` that determines method of parent selection method. Propeller includes `:tournament-selection`, `:lexicase-selection`, and `:epsilon-lexicase-selection`. |
| `:tournament-size` | If using a tournament selection method, the number of individuals in each tournaments used to determine parents |
| `:umad-rate` | Rate (decimal between 0 and 1) of uniform mutation by addition and deletion (UMAD) genetic operator |
| `:variation` | Map with genetic operators as keys and probabilities as values. For example, {:umad 0.3 :crossover 0.7}. This would mean that when the system needs to generate a child, it will use UMAD 30% of the time and crossover 70% of the time. The probabilities should sum to 1. |
| `:elitism` | When true, will cause the individual with the lowest error in the population to survive, without variation, into the next generation. |
When you run a problem, you will get a report each generation with the following information:
```
:generation
:best-plushy
:best-program
:best-total-error
:best-errors
:best-behaviors
:genotypic-diversity
:behavioral-diversity
:average-genome-length
:average-total-error
```
### An Example
For example, you can run the simple-regression genetic programming problem with:
```
lein run -m propeller.problems.simple-regression
```
This will run simple-regression with the default set of arguments in the `simple-regression` problem file.
```
{:instructions instructions
:error-function error-function
:training-data (:train train-and-test-data)
:testing-data (:test train-and-test-data)
:max-generations 500
:population-size 500
:max-initial-plushy-size 100
:step-limit 200
:parent-selection :lexicase
:tournament-size 5
:umad-rate 0.1
:variation {:umad 0.5 :crossover 0.5}
:elitism false}
```
You can override the default key/value pairs with additional arguments. For example:
```
lein run -m propeller.problems.simple-regression :population-size 100
```
On Unix operating systems, including MacOS, you can use something
like the following to send output both to the terminal
and to a text file (called `outfile` in this example):
```
lein run -m propeller.problems.simple-regression | tee outfile
```
If you want to provide command line arguments that include
characters that may be interpreted by your command line shell
before they get to Clojure, then enclose those in double
quotes, like in this example that provides a non-default
value for the `:variation` argument, which is a clojure map
containing curly brackets that may confuse your shell:
```
lein run -m propeller.problems.simple-regression :variation "{:umad 1.0}"
```
### Can you use a REPL?
Yes!
To run a genetic programming problem from a REPL, start
your REPL for the project (e.g. with `lein repl` at the
command line when in the project directory, or through your
IDE) and then do something like the following (which in
this case runs the simple-regression problem with
`:population-size` 100):
```
(require 'propeller.problems.simple-regression)
(in-ns 'propeller.problems.simple-regression)
(-main :population-size 100 :variation {:umad 1.0})
```
If you want to run the problem with the default parameters,
then you should call `-main` without arguments, as `(-main).
## Tutorials
- [Adding genetic operators](Adding_Genetic_Operators.md)
- [Adding selection methods](Adding_Selection_Method.md)
- [Adding a new problem](Adding_Problem.md)
- [Generating Documentation](Generating_Documentation.md)
## Contributing
You can report a bug on the [GitHub issues page](https://github.com/lspector/propeller/issues).
The best way to contribute to Propeller is to fork the [main GitHub repository](https://github.com/lspector/propeller) and submit a pull request.
Propeller provides a way to automatically [generate documentation](Generating_Documentation.md) for any contributions
you might make.
## License
**Eclipse Public License 2.0**
This commercially-friendly copyleft license provides the ability to commercially license binaries;
a modern royalty-free patent license grant; and the ability for linked works to use other licenses, including commercial ones.
## Citation
We are in the process of creating a DOI, but in the meantime,
we ask that you cite the [link to the repository](https://github.com/lspector/propeller) if you use Propeller.
## Contact
To discuss Propeller, Push, and PushGP, you can join the [Push-Language Discourse](https://discourse.pushlanguage.org/).

View File

@ -0,0 +1,62 @@
# Adding Genetic Operators
In addition to the already-included genetic operators, you can add your own!
## Variation Genetic Operators
1. Go to `propeller.variation.cljc`
2. Define a genetic operator function
3. In `propeller.variation/new-individual`, add the new genetic operator in the `new-individual` function under the `case` call
``` clojure
(defn new-individual
"Returns a new individual produced by selection and variation of
individuals in the population."
[pop argmap]
...
(case op
...
:new-genetic-operator
(-> (:plushy (selection/select-parent pop argmap))
(new-genetic-operator ))
...
:else
(throw #?(:clj (Exception. (str "No match in new-individual for " op))
:cljs (js/Error
(str "No match in new-individual for " op))))))})
```
4. When running a problem, specify the genetic operator in `:variation`.
For example:
```
lein run -m propeller.problems.simple-regression :variation "{:new-genetic-operator 1.0}"
```
## Selection Genetic Operators
1. Go to `propeller.selection.cljc`
2. Define a genetic operator function
3. In `propeller.selection.cljc`, add the new genetic operator in the `select-parent` function under the `case` call.
```clojure
(defn select-parent
"Selects a parent from the population using the specified method."
[pop argmap]
(case (:parent-selection argmap)
...
:new-genetic-operator (:new-genetic-operator )
...
))
```
4. When running a problem, specify the selection method in `:parent-selection`
For example:
```
lein run -m propeller.problems.simple-regression :parent-selection :new-genetic-operator
```

View File

@ -0,0 +1,121 @@
# Adding a Problem
In general, a problem file has 3 components: `train-and-test-data`, `instructions`, `error-function`, and `-main`.
1. To add a new problem, you need training and test data. For Problem Synthesis Benchmark Problems (PSB2),
you can fetch datasets using `psb2.core/fetch-examples`.
```clojure
(defn fetch-examples
"Fetches and returns training and test data from a PSB2 problem.
Returns a map of the form {:train training-examples :test testing-examples}
where training-examples and testing-examples are lists of training and test
data. The elements of these lists are maps of the form:
{:input1 first-input :input2 second-input ... :output1 first-output ...}
The training examples will include all hard-coded edge cases included in the suite,
along with enough random cases to include `n-train` cases.
Note that this function loads large datasets and can be slow, 30-120 seconds.
Parameters:
`datasets-directory` - Location of the PSB2 datasets as downloaded from https://zenodo.org/record/4678739
`problem-name` - Name of the PSB2 problem, lowercase and seperated by dashes.
- Ex: indices-of-substring
`n-train` - Number of training cases to return
`n-test` - Number of test cases to return"
[datasets-directory problem-name n-train n-test]
```
2. Define the possible Push instructions to be used to create plushys. It should be a non-lazy list of
instructions from `push/instructions`, input instructions, close, and constants (including functions that produce constants).
3. Define an error function that will evaluate plushys and add `:behaviors parsed-outputs`,
`:errors`, and `:total-error` to the individual
4. Define the function `-main` with a map of default arguments.
## Example of a Problem
```clojure
(ns propeller.problems.PSB2.solve-boolean
(:require [psb2.core :as psb2]
[propeller.genome :as genome]
[propeller.push.interpreter :as interpreter]
[propeller.utils :as utils]
[propeller.push.instructions :refer [get-stack-instructions]]
[propeller.push.state :as state]
[propeller.gp :as gp]
#?(:cljs [cljs.reader :refer [read-string]])))
; =========== PROBLEM DESCRIPTION ================================
; SOLVE BOOLEAN from PSB2
; Given a string representing a Boolean
; expression consisting of T, F, |, and &, evaluate it and return
; the resulting Boolean.
;
; Source: https://arxiv.org/pdf/2106.06086.pdf
; ==================================================================
(def train-and-test-data (psb2/fetch-examples "data" "solve-boolean" 200 2000))
(def instructions
(utils/not-lazy
(concat
;;; stack-specific instructions
(get-stack-instructions #{:exec :integer :boolean :char :string :print})
;;; input instructions
(list :in1)
;;; close
(list 'close)
;;; ERCs (constants)
(list true false \t \f \& \|))))
(defn error-function
[argmap data individual]
(let [program (genome/plushy->push (:plushy individual) argmap)
inputs (map (fn [i] (get i :input1)) data)
correct-outputs (map (fn [i] (get i :output1)) data)
outputs (map (fn [input]
(state/peek-stack
(interpreter/interpret-program
program
(assoc state/empty-state :input {:in1 input})
(:step-limit argmap))
:boolean))
inputs)
parsed-outputs (map (fn [output]
(try (read-string output)
#?(:clj (catch Exception e 1000.0)
:cljs (catch js/Error. e 1000.0))))
outputs)
errors (map (fn [correct-output output]
(if (= output :no-stack-item)
10000
(if (= correct-output output)
0
1)))
correct-outputs
parsed-outputs)]
(assoc individual
:behaviors parsed-outputs
:errors errors
:total-error #?(:clj (apply +' errors)
:cljs (apply + errors)))))
(defn -main
"Runs propel-gp, giving it a map of arguments."
[& args]
(gp/gp
(merge
{:instructions instructions
:error-function error-function
:training-data (:train train-and-test-data)
:testing-data (:test train-and-test-data)
:max-generations 300
:population-size 1000
:max-initial-plushy-size 250
:step-limit 2000
:parent-selection :lexicase
:tournament-size 5
:umad-rate 0.1
:variation {:umad 1.0 :crossover 0.0}
:elitism false}
(apply hash-map (map #(if (string? %) (read-string %) %) args)))))
```

View File

@ -0,0 +1,20 @@
# Adding a Selection Method
1. Define a selection method function in `propeller.selection` that selects an individual from the population
2. Add the selection method in `propeller.selection/select-parent` under the `case` call:
```clojure
(defn select-parent
"Selects a parent from the population using the specified method."
[pop argmap]
(case (:parent-selection argmap)
:new-selection-method (new-selection-method )))
```
3. When runnning a problem, specify the selection method in `:parent-selection`.
For example:
```
lein run -m propeller.problems.simple-regression :parent-selection :new-selection-method"
```

Some files were not shown because too many files have changed in this diff Show More