From ac1f4f1d003503e2964f84c4271ee1bfdc02d0db Mon Sep 17 00:00:00 2001 From: Hugo Freire Date: Thu, 26 Mar 2026 18:57:17 +0100 Subject: [PATCH] Add NEAT+CTRNN Lunar Lander with lateral control Co-Authored-By: Claude Opus 4.6 (1M context) --- .claude/scheduled_tasks.lock | 1 + .github/workflows/ci.yml | 57 +++ .gitignore | 10 + .travis.yml | 30 -- Cargo.toml | 15 +- README.md | 117 ++--- build.rs | 27 ++ docs/results/lunar_lander.gif | Bin 0 -> 394010 bytes examples/function_approximation.rs | 19 +- examples/lunar_lander_worker.py | 101 +++++ examples/openai_lunar_lander.rs | 680 ++++++++++++++++++++++++----- examples/simple_sample.rs | 8 +- examples/telemetry_helper/mod.rs | 2 +- examples/test_champion.rs | 211 +++++++++ graphs/approximation.js | 10 +- src/environment.rs | 65 ++- src/gene.rs | 7 +- src/genome.rs | 197 +++++++-- src/lib.rs | 3 + src/mutation.rs | 4 +- src/mutation_config.rs | 161 +++++++ src/organism.rs | 85 +++- src/population.rs | 200 +++++++-- src/specie.rs | 162 +++++-- src/species_evaluator.rs | 152 +++---- tests/rustneat_tests.rs | 59 ++- 26 files changed, 1957 insertions(+), 426 deletions(-) create mode 100644 .claude/scheduled_tasks.lock create mode 100644 .github/workflows/ci.yml delete mode 100644 .travis.yml create mode 100644 build.rs create mode 100644 docs/results/lunar_lander.gif create mode 100644 examples/lunar_lander_worker.py create mode 100644 examples/test_champion.rs create mode 100644 src/mutation_config.rs diff --git a/.claude/scheduled_tasks.lock b/.claude/scheduled_tasks.lock new file mode 100644 index 0000000..6875019 --- /dev/null +++ b/.claude/scheduled_tasks.lock @@ -0,0 +1 @@ +{"sessionId":"0e42f8a2-416e-4d3f-9ea6-c2764947b5a3","pid":14267,"acquiredAt":1774543530483} \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..d55383b --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,57 @@ +name: CI + +on: + push: + branches: [master, feature/*] + pull_request: + branches: [master] + +env: + CARGO_TERM_COLOR: always + RUST_BACKTRACE: 1 + +jobs: + fmt: + name: Format + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + with: + components: rustfmt + - run: cargo fmt -- --check + + test: + name: Test (${{ matrix.os }}, ${{ matrix.toolchain }}) + needs: fmt + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + toolchain: [stable, beta] + + steps: + - uses: actions/checkout@v4 + + - name: Install Rust + uses: dtolnay/rust-toolchain@master + with: + toolchain: ${{ matrix.toolchain }} + + - name: Cache cargo + uses: actions/cache@v4 + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + target/ + key: ${{ runner.os }}-${{ matrix.toolchain }}-cargo-${{ hashFiles('**/Cargo.lock') }} + + - name: Build + run: cargo build --release --verbose + + - name: Run tests + run: cargo test --release --verbose diff --git a/.gitignore b/.gitignore index b7bca7a..4c13e78 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,13 @@ Cargo.lock # Fmt **/*.rs.bk + +# Local files +CURRENT_FEATURE.md +best_config.json +champion.json +champion_backup.json +experiment_results.json +plan.md +CLAUDE.md +AGENT.md diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 0031a6c..0000000 --- a/.travis.yml +++ /dev/null @@ -1,30 +0,0 @@ -sudo: false -language: rust -rust: - - stable - - beta -os: - - linux - - osx -cache: cargo -before_cache: - - cargo prune -env: - global: - - PATH=$PATH:$HOME/.cargo/bin - - RUST_BACKTRACE=1 -before_script: - - | - (which cargo-install-update && cargo install-update cargo-update) || cargo install cargo-update && - (which cargo-prune && cargo install-update cargo-prune) || cargo install cargo-prune - - rustup component add rustfmt-preview - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export OPENSSL_INCLUDE_DIR=`brew --prefix openssl`/include; fi - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export OPENSSL_LIB_DIR=`brew --prefix openssl`/lib; fi - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export DEP_OPENSSL_INCLUDE=`brew --prefix openssl`/include; fi -script: - - if [ "${TRAVIS_RUST_VERSION}" = stable ]; then - ( - cargo fmt -- --check - ); - fi - - cargo test --release diff --git a/Cargo.toml b/Cargo.toml index e5a746b..a147369 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,7 @@ license = "MIT" name = "rustneat" repository = "https://github.com/TLmaK0/rustneat" version = "0.3.0" +edition = "2018" [dependencies] conv = "0.3.2" @@ -20,18 +21,16 @@ rulinalg = "0.3.4" rusty_dashed = { version = "0.2.2", optional = true } open = { version = "1.2.1", optional = true } clippy = { version = "0.0.103", optional = true } -serde = { version = "1.0", optional = true } -serde_derive = { version = "1.0", optional = true } +serde = { version = "1.0", features = ["derive"], optional = true } serde_json = { version = "1.0", optional = true } -cpython = { version = "0.6", optional = true } -python3-sys = { version = "0.6", optional = true } +pyo3 = { version = "0.22", features = ["auto-initialize"], optional = true } ctrlc = { version = "3.1.4", optional = true } [features] default = [] -telemetry = ["rusty_dashed", "open", "serde", "serde_derive", "serde_json"] -openai = ["cpython", "python3-sys", "ctrlc"] +telemetry = ["rusty_dashed", "open", "serde", "serde_json"] +openai = ["pyo3", "ctrlc", "serde", "serde_json"] ctrnn_telemetry = [] [[example]] @@ -50,3 +49,7 @@ name = "function_approximation" [[example]] name = "ctrnn" + +[[example]] +name = "test_champion" +required-features = ["openai"] diff --git a/README.md b/README.md index c0657e1..80f32ca 100644 --- a/README.md +++ b/README.md @@ -1,82 +1,87 @@ -Working-in-progress - ### Rust NEAT -[![travis-ci](https://img.shields.io/travis/TLmaK0/rustneat/master.svg)](https://travis-ci.org/TLmaK0/rustneat) +[![CI](https://github.com/TLmaK0/rustneat/actions/workflows/ci.yml/badge.svg)](https://github.com/TLmaK0/rustneat/actions/workflows/ci.yml) [![Gitter](https://img.shields.io/gitter/room/nwjs/nw.js.svg)](https://gitter.im/rustneat/rustneat) Implementation of **NeuroEvolution of Augmenting Topologies NEAT** http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf -This implementations uses a **CTRNN** based on**On the Dynamics of Small Continuous-Time Recurrent Neural Network** (Beer, 1995) http://www.cs.uvm.edu/~jbongard/2014_CS206/Beer_CTRNNs.pdf +This implementation uses a **CTRNN** (Continuous-Time Recurrent Neural Network) based on **On the Dynamics of Small Continuous-Time Recurrent Neural Network** (Beer, 1995) http://www.cs.uvm.edu/~jbongard/2014_CS206/Beer_CTRNNs.pdf + +### CTRNN time constant (τ) + +The time constant τ controls neuron response speed — like biological membrane resistance time. What matters is the ratio `dt/τ` where `dt=0.01` is the simulation step. Configurable via `MutationConfig::tau`: + +- **Small τ** (e.g. 0.01): `dt/τ = 1.0` — neurons react instantly, state resets each step. Network behaves as **feedforward**. Use for stateless problems like XOR. +- **Large τ** (e.g. 0.1): `dt/τ = 0.1` — neurons update only 10% per step, retaining 90% of previous state. Network has **temporal memory**. Use for control tasks like Lunar Lander where the agent integrates information over time. +- **Very large τ** (e.g. 1.0): `dt/τ = 0.01` — neurons barely respond, very strong inertia. Needs many steps to react to new inputs. + +## Telemetry Dashboard ![telemetry](docs/img/rustneat.png) -## Install Rust +```bash +cargo run --release --example simple_sample --features=telemetry +``` -`curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh` -`source $HOME/.cargo/env` +Then go to `http://localhost:3000` to see how the neural network evolves. -## Run test +![telemetry](docs/results/cart_pole_dashboard.gif) -To speed up tests, run them with `--release` (XOR classification/simple_sample should take less than a minute) +## Cart Pole -`cargo test --release` -## Run example +![cart pole](docs/results/cart_pole.gif) -`cargo run --release --example simple_sample --features=telemetry` +## Lunar Lander -then go to `http://localhost:3000` to see how neural network evolves +NEAT+CTRNN agent evolved to land on the OpenAI Gym LunarLander-v3 environment using discrete actions with independent threshold-based output control. -![telemetry](docs/results/cart_pole_dashboard.gif) +![lunar lander](docs/results/lunar_lander.gif) -## Run openai tests +### Results +- **Verified average reward**: +70 (fitness 570 with +500 offset) +- **Peak reward**: +278 (fitness 778) +- **Solved threshold**: average reward +200 -![telemetry](docs/results/cart_pole.gif) +The agent uses 2 independent CTRNN outputs (main thruster, lateral direction) with lateral priority — a key insight for CTRNN control problems where argmax causes state lock-in. -Install python dependencies +### Run ```bash -sudo apt install python3 -sudo apt install python3-pip -sudo apt install libpython3.8-dev -sudo apt-get remove swig -sudo apt-get install swig3.0 -sudo ln -s /usr/bin/swig3.0 /usr/bin/swig -sudo pip3 install gym -sudo pip3 install gym[box2d] -sudo apt install python3-opengl +cargo build --release --example openai_lunar_lander --features openai +./target/release/examples/openai_lunar_lander ``` -Run test +### Test champion +```bash +cargo build --release --example test_champion --features openai +./target/release/examples/test_champion ``` -cargo run --release --example openai --features=openai,telemetry -``` - -### Windows Openai -https://github.com/openai/gym/issues/11#issuecomment-242950165 +## Install Rust + +```bash +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +source $HOME/.cargo/env ``` -Update to the latest version of Windows (>version 1607, "Anniversary Update") -Enable Windows Subsystem for Linux (WSL) -Open cmd, run bash -Install python & gym (using sudo, and NOT PIP to install gym). So by now you should probably be able to run things and get really nasty graphics related errors. This is because WSL doesn't support any displays, so we need to fake it. -Install vcXsrv, and run it (you should just have a little tray icon) -In bash run "export DISPLAY=:0" Now when you run it you should get a display to pop-up, there may be issues related to graphics drivers. Sadly, this is where the instructions diverge if you don't have an NVIDIA graphics card. -Get the drivers: "sudo apt-get install nvidia-319 nvidia-settings-319 nvidia-prime" -Run! + +## Run tests + +To speed up tests, run them with `--release` (XOR classification/simple_sample should take less than a minute): + +```bash +cargo test --release ``` ## Sample usage -Create a new cargo project: +Create a new cargo project and add rustneat to Cargo.toml: -Add rustneat to Cargo.toml -``` +```toml [dependencies] rustneat = "0.2.1" ``` -Then use the library i.e. to implement the above example, use the library as follows: +Then use the library to implement XOR classification: ```rust extern crate rustneat; @@ -117,23 +122,23 @@ fn main() { } println!("{:?}", champion.unwrap().genome); } - ``` -# Develop -Check style guidelines with: +## Develop -`rustup component add rustfmt-preview` -`cargo fmt` +Check style guidelines with: -# Thanks -Thanks for the icon nerves by Delwar Hossain from the Noun Project +```bash +rustup component add rustfmt-preview +cargo fmt +``` -# References: -**NeuroEvolution of Augmenting Topologies NEAT** http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf +## References -**On the Dynamics of Small Continuous-Time Recurrent Neural Network** (Beer, 1995) http://www.cs.uvm.edu/~jbongard/2014_CS206/Beer_CTRNNs.pdf +- **NeuroEvolution of Augmenting Topologies NEAT** http://nn.cs.utexas.edu/downloads/papers/stanley.ec02.pdf +- **On the Dynamics of Small Continuous-Time Recurrent Neural Network** (Beer, 1995) http://www.cs.uvm.edu/~jbongard/2014_CS206/Beer_CTRNNs.pdf +- **An Investigation into the Dynamics of a Continuous Time Recurrent Neural Network Node** http://www.tinyblueplanet.com/easy/FCSReport.pdf -**An Investigation into the Dynamics of a Continuous Time Recurrent Neural Network Node** http://www.tinyblueplanet.com/easy/FCSReport.pdf +## Thanks -**http://indy9000.github.io/posts/analysis-of-a-simple-ctrnn.html** http://indy9000.github.io/posts/analysis-of-a-simple-ctrnn.html +Thanks for the icon nerves by Delwar Hossain from the Noun Project diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..ec5047b --- /dev/null +++ b/build.rs @@ -0,0 +1,27 @@ +use std::process::Command; + +fn main() { + // Only run for the openai feature (which uses PyO3) + #[cfg(feature = "openai")] + { + // Get Python library path from python3-config + let output = Command::new("python3") + .args(&[ + "-c", + "import sysconfig; print(sysconfig.get_config_var('LIBDIR'))", + ]) + .output() + .expect("Failed to get Python library path"); + + let libdir = String::from_utf8(output.stdout) + .expect("Invalid UTF-8 from Python") + .trim() + .to_string(); + + // Tell the linker to add this path to rpath so the binary can find libpython at runtime + println!("cargo:rustc-link-arg=-Wl,-rpath,{}", libdir); + + // Also add standard Python lib search path + println!("cargo:rustc-link-search=native={}", libdir); + } +} diff --git a/docs/results/lunar_lander.gif b/docs/results/lunar_lander.gif new file mode 100644 index 0000000000000000000000000000000000000000..9fc8cf01a3549fdc441a65c003ec7f7a43948cfc GIT binary patch literal 394010 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 z zr0M#nya$1&mr74bp!Q@0PxGdJYijzMu}|}K$z_GDH>CIX?QJaSlKSw8hA|=wm0A!^ zFL8Im&P4c2=mNcpoK5?wC~ik-l%N}ef|va`amhrGEyO-fmE&wF(&LFsg;=Q96n%mw zZM2GMqF_L@qkb*OJMo_;*NX+JG} zP72mbUM+Kj^Aq&Td=kmKO?~mnjA_1B(V+Jcr?z9m+AV5yld)XD#Myc&?1GyrislHwB}6aE#q3 zj^2|Xp5wN}nIslBW796^6H#o!V~JLwtk-du^%XS`Zq3gx_a67E?D@#h&O@s+(CxU; z7;C9LteyjGa?N8bQYTPi)#zlrXQxCO{}_`&;=wQYrG;iQ;)>YABARNZBrf-~V_MYU4@4^rNc6g$CJD z5g1?Tarv*a-S$tFiKn%Y*}ZmJ?$T${6kDd}?Y!$TzU(FW@|@fU5(Qdi4VI?Et&_D& zZnOERGv8x7IaF_k3lG#diWxVS^>E!|+eg6o3iJxFeS9qB;zc=X8&DjdZ{9Pe z@g(xX5^t-x=W800-a$UgCu~XiH_bLCW_m4-*G~;}Dve-6KEKHKtN#45VDG!nuZj{B zzf6|>_f~=Zr~Pf8{|j#Yub<;oL4D9mYOze(OvaEdb6HTY?9^%IVA#=0FXt!FOjobM z7fPm4_=$1{x4wgXM)hcCkFW0hvHsLE>gB}VK-c->!#!s-g*(|}hgDNQRG1o0D5Ds1 zZSsmG#`P;~P+QV3@(0#22sUAmPF+fCDp=lt-@?FufCm2j>~C*xZ*2wLX*Zjjn}Nd} z=H#zkyY^>G-7g>fe-8q{u*{AfJN^;@tSata4)RF*vkxiUE6{o|G<+~H4!0#LN9 zca4({T0dTX_EWj{5Lal^F4zS~>_7Y5zccX8EB1EkYaedR24uUp-9>l%3U8ZB+pNof zLIA6IZn(j0i(T<%J5c=zp8EM~DEDQ39gJi`4W1TxP-DM!*4nP@<=ekJj2s6o!~B>N zgF%3c`6);9JbO~E4LQYzlmb%S)bmgE%~2O)z=Pk3c*4pw$p)7N=9EF{ClOfMO%D-G zBT0CO2v~O2nMDvx_nDaN2ElGX3YZ#4m>BPds?2axxoOg1QijH055;gV+II$J|6hx4@&+;sIt*k2w6|Y7DtUGmm~`J) zaJv@%{^i3BI)g=Pm++{OvopOXw0-(eEhZb&MIE?R!x1+3<*X}$AIcuPL|wvz-0rV? z4GBBPqz98L?_F?*tIWDKWcjM|fC`p}S9bz(-u!Bk@MRsZi@T`gd=%YmDcjG5@5H4Ppo{JNpD@%B$H|7Ox(XrQYYQ|3%s-)DRuxBr<}av~d%=Bs%=wtK-ap zvz_lnuK&xnlUO|EmXok$xWHY>r%{uMytol`^6r3-m5-6R{pfyy0VL%fGO_Dnw#?`- zu0>3@;xtJo@=HKKkV_`Un!P~6F%gv%FZ;S8v0A;-KrJ{)T5`aC|J1o-0!sjVxJ%>u z#ju%Y-&8l;s%1aBUd$D*RDCNj*vq;{1tn#|uAU^3&Oc`+5|+==#%r%%OwVC3+QtsmA=x63(2f!iE4 z+QL>G11J$SA>9`F-Dj@9yS?LLBA@u1=Ak~F$K*>rO694yOa-^3hB6B8N5v2%Xz6O1 zr0IIG;w49ieO21@Q+N`%X;p4^+leOVhsi`&g_>{;p~_~F+BLSpckELfd@2v8&fiBS z&qPTp<-T+KFl?1I@Dzz_7TaT28K%>sc)r@=;}cDrFvg0#{#;HqYV=FSRZqg16mxju zM@Ey}Ch`JV8)CG!-qY|H7IbPQpkD|}&|1U+(mi~Luz~9>IzQ6pt=c2X%0iL;zMmd2Q z$A?-*1J`<(mFJV|BhILAT8yDrpX0v^(7@Hs-jMzCCq|Iv+U>-?u;cRuljL&U2c3O; z8s<;Vq?YTyBHr2mX#Uiqcd8BxEoPmOW)Pa!Itu-pP3Bg{Ibp_&l9)6iVfPd9K?occC=a*HhdugW1!&d3=V+Bf zH z>d2?o#6YI}gOFzra_cQ;)q#=^n%XRJi69yW;DZScDnm6k3L)vm8S4A%>-y;Fdf>G7 zg7J-2k^x2yU^oaE_8r4>;O;Gf!c7`mk-=}pb-Y>`BdtFgN>D+N*aLDQwTT! z)Id)U6`lSI#cefcqXP&okdezQrWT<7*_6-Cze7MPbm~!OP)F^Hj+KmD?+Kw}ZpL6( z7qo7>JskTGB%mHFW!Dyzges?+@=uZ+#8Q<#S^9?8O(3}Cw)Ia&4-xHU?5jNA&TUM6 zs2=?2xFaUUsy$THuw87F&SgS& z|3}pnuw$og!tdSCnEFAnZt6jems)&iMMt;mq+9p1-s@WSfsA=vC_s&C@i-V8i(DC^k zI3M*}7(z)|&Z$KCD-~=ytS1NBl0*Y&`;rx2MvO|FRW4;W9u74sHH*VLq2hEUJ5O;? zp4i=%yVgk8vcVqtkVCYC@-j2q?U`Q!7p=xkf`Rgr0m>1fDUJsQoA*rlMi`I>T|{p_ z!ENU74=E#t2KU|VReCzQ__C2T6&*pFQq z7uwEFdn$W-#$x?OR5Rn79E09orYoiuL~eU|JW+$7C|B+2(1^+OYEa4Q6avP)IBpX1 zW-Qx-``6#Fou@Fi@TlF2qE{YGm#f*Lj30}|x)Jm;*&XqrxA_7)vf9ORy*Wu6(`Sql zHoUV0P-OmoH%_s77E7%DR7U%#SzfN~2{y0U4y8X`Fm9naga;A7rYEL{;5O<_xU!~R5movX|_tW zFqw>K{<^&J`gZwuvv*t@#sy_wjOm^=vUUscLVug~z^)Y3fh^!8Aai}z$^8?vUw>9F zexfYkAmC4w1;`1MmX;P47Q*?zwa6nbE)HJu`ZMeR;rqir%abHOF5d!)0%9jti*Hub ze#=?>HEBOsuK0DK`qoy!RDAa(xZMC#U$9mY=n5wRzK8PRsS=;%3c4TU3g8%|md~95 ze8o1qGw#-vKlR5 zAS7UJ0`!c7fXaY^fYeetYTf!icnb_@AplHR8K;qqqXFyyfCD51sHJovh6a8H20o_R zk$PIbu%w}@;|{9nv^2J?k`-7rs413;Je+kDd{kBJfKx$1K}$i_5{?6I+^7No2bHD( zDL_q(h&G@pL^eRkgIb6q4*-V{p9)CiQ{w?*{9Lj;JdlSFjst?V61WWq$;!Ku1zhfq zrLq>FmyQ+m(yee8^uP2gtT+kLMh6jGuhlxJeX-&{X92l*l7+xH)+$+Ho+jbdCGoiy zA}e;iej;NnRI%koqQQwh7Mr!h-@WTi?S#pSu{tp`)(tjSLPonz%N><>tO{okc3tq- zJ0N}j@FJftTU1YpO)T}2OU8_mW?b#ETj*xabkY4tw0kJSsTm^>Df;+Nb~+5Pl- zedsu0CW7%;pwR4if9VPKyDugxLhhUndVXq=p-@cfgWFPfUsL1f3Ux^ZrhUGGpXX=B zp9ib@{oXF!_pJN*9np=)a#bEi6^fT-@F z%(-N>XT$TfB7}tw8?j;3r{YYo^uokV8@;aEPzgax$=R?DMD7C|0?vfYN~>DSj_tgL zV0RDnM(DC`q^x)Kd-?g%VcOq|Qm{%pIb%tA^_Q&mhI?)$X-dAH^7mZyu608{LU`jO zLIa1AY?}&f+YGmIOOBV8Rlm5+M?2czg*8OY-8u(mzZwRRr{vWcgf1|Sl1fj16g*;> z#w^jMK__t0tg1uuTvd)*uA=lq5=Kao=he3ZP_}aGN8FTaYg$uhT2NJ~Vp! zoDEIOn@0Yt6BHpj4^=CpnarFt_1E?ml+mSY^h)ev?FtUYml22)HXOQ=FSZs~gpuu#eSDJeFwyuAc%kjQ=Yd#}$a=jMNYS+Qa0HfFbk3Pr5EJ07wALi(87 zbmgn+RL;G4+EhEGBBR^qHrFQ{c-P=Gz&>NuIxCC1CY}CmA^0AexvIPa_xs1ZeNL^c zI5$qVPZQ!FX$4}jV@!h2a^K(BY(>fL(R}}37tQ~l0XtU73SpIX`cnI%_C4ZC6|R3J zzNzTUokL&d3!juyEaZ2tL)nX2(Q8yNz39xLh%AuVFQXNPIc*Yo7mC^OSWnqN$#mXK zy3$$cBlxaO3^X}~)tG=x`z~BwU&m=(%2bkfGVXX-#~IDm07^JZ|EVtvH=WA__M<@(D8aPzOL7AjbeZCP+D28>fLL0~0*Nn;2oY1GNRO7Xe1s z^mM&-b=`j;O*FS*)xvc&+yQg}f{U86GfbLjC~N^f3^_TXinODwj44Pq0>(s2)C7ak z1ZE2=b%GY*hxSRSHVbHCjmnq^@pAo8;YaN-;0GcL?6hEE;iM)YSRv3tZPJAi3n;t? z2?$z9bNTxaggXRXWXb-&hAzB($wE47p-aL{S+pHrMw!J4B>-JO2*T>9ld_9o+-vTt ztvB;+F6F&_tP`;qBKwVa8LIZ%e8aue$30cZD3fgD)xjyVxyJhDoJQ&~^`PO#tRSrn zkNZ&7{q3(~))~nf`w7SFDjlo0Hbpdry)b|NtQ`a$H7iR8STl(fOaXPV^y}IBYu_%K zUFa>cJGb@iJcF>bWKg4VZ^Mi{81>WF;P%9-Hd5z3J=MMW?*a*@Ncl zUq6FZAyXxKF+9l*O*ayS)Qqq;(sUOS^-WWl9EqcSboma~Zt|iHs=hydG*KX#J5fMn ze_5=oSoUPefuTCJduT%0a2E1R-QrmK@XZ#Y?ET@`e%81}cQ3P3L%TEM^fj+N65QNV zlq3fn1+bKIZpS#Pw1aLEc;Z;nCRFVkyeO&g}(z{W~&*~?mQe5YNnYUiY}xu74in4V`_1*TmjR^OIIf-+;&F6eH5 zu@$A)gALp;#UdeCY4T)Dsms|I6E5SWWx38BzH)e`#*>{ip-p30!4@(MZyVs=K`!cjf6)6?4jNGVr`bF3^hUXC80g zE6McknvvnO#cPET=X<8SWqXR`ST`&i$qtZ7c`pU5IyVvKRcxf>5m)RD(%s)N)n;pl&%;PO5 zUtYcNfVHrL2G3W*|Nf8Phq!7x(SgqE*8f3MN8*ysLWa=)A7~Z&9|m34>MT9whMzj! zsL(}}NRMSA^~VV2ZoH%o7?b_Kc`5%hjEO}h$*F5F@8yI*vpv1i?a}VN2z*gvxW7_i zR=*G<{c@z^0|Yo20pO7QM}XrWdOQB(Lw(vd=1}W_S92S%IJ1g2el~Ob zh&gqhKFs{a&MtS8H_Nt+5>B6 z(U0kk6L5gT30)L#*PB5Sjd>hol;O$uLP=GK1Gor8U2h$?jT3dBgywz1*R8{Rk zh64r`z{~-p7&%#jtRxX`O#to*`k8TUGsFqVV z>U=)Guo5ylZdokmkbFd8YfG+0i>Bfh{gQ<|sLWs9g)jU#f9l0jLaw~~;G_z-jJ>q| zdH1O>jW)#|}GtF*~YnN=|4g_3DxUI@I z0{canE3s&xp{JCwJD!KQk`110W~U6gq>o&`Iy-*7vYz>!&5&MqN2$5g(=*APHd94b z&-a_uruhoX*UAy2g8&LsG~Ja&vV8e}(lZzG22 zg~L4SS}@TV3cEV?^^~*=c}N8%JB9F$6O7yH-MVq1jxJ5<6jqE>nvs{B%etQ*lgWJ( zxxm1$*b26Fs)S66iOvP792C~86BWgk&G+qFMdM0D6(epR#HyK^IW{8 zI&$Hr?{!;OT9qtTqh0uc>G}!H%~t#y@0Yq&<<1zNy)si$_6&P03fC`Qz+Ialv5z!@r5-vQWKPZ<{3ORp()bPKpXcpm*0` z+IVfzH(QX3i?hhut_GSERjpU@AMpY1qsP`)?ey-`=tIntHU=qs+~)Ib&SJu3?wliP z(djIyFkQb!G59#b)=QIAb-+HywjamW#K=t;ma#@=_3L))#&A`C#_o*ZkYhh5ahr+b z;#~IgmJ>VDJJ1gGs08)$gB(Hf%B80oUK-S8A!JA!qnWN(Jv^j0+J`MpwN;FoGp@Q? zl=FF}Uo_5)^WsO<-uVH)9e4RWdn{8wj-1fIi>hdQ5M@TomGW2%cd91vK1r?ot(C*ayGKF-zl$+oQhtJlnI>SJ_)s0)&2C~X)Ko(Lr z(38Au1EDe+Pz@tk<@<3S=m#5!zf(QblWbiLY#?i+B(Mi$)jzt$u4r|Iz{BR;7MqgI zmW3;2j7L{^jg`q;s1F&cYyfr-TdPz6GvJ+pRf1!+s0oG{&gREK^)a9}9LYx=iTSqX z8Med>Ym3CysUWb#w}LdF!9FrE%EFYg($xf5j05I`LtyomWO^84E(rU8=>ujoY>YDi zi(zK64|0*3Ko(LED>28$0WJfJ4K&f+2O^}K^n&!Y{D0swpeV^^Beig##Av9x!l*+@ z(FO({TJqj1Qcj9;7Sx#nGs%rukSUQ6*#z(gu#Liu2E2d^x*0)W6i^$$2?BrzKd%gs zWT5qUE+|R@TS&Q3V$^LQUTTzt0}vcY79MJ26DVz3Ta^sT9pLcj&!__c3@|AVawIna zqamjLD}Vt;aCw0kQ;Avu7@(Lj;|DP&0JXW=XQ*nQ+^2WXdP=`W$U?OacBg{gO;25t z$(3`gw7xyIyXx5GkQc)babM~{t%Ltv%}5o0M2mnyI)1?OrDcg_8R^*mIM!j6fG0fz zcaPei2RRb13#~UN<4gqfQ+pKXnAR5)e`Aq*1{e*$c!#m5vRd-|tGg9;M~|p6l;!lC zaR6fl2VSI@YGHXtFV|do|GZg^mt$hlYrR`jtlYM~NOyi!$?X-SXN?WJA4a7Y;EyPM z1RfBM2TS?(LS?f1AP>lUb&_!I`Qg)kR=@qxtL0>U!&vM2jin`NnOZthHRY~o6he|e zYcH1DR)kRQzN;t(32uB#frvx_ELD`5hH|e^kaC^32VBNMEP33T*8-BP8{i= zGHy$X_9L@&*{9O2{0X9OLwnM6cmP*V4%aTMt-h?{q0l}cpgJ$)m9>ST7Wp%O}rQgxX> z;ziAqG5QwiVyE_enuaX(nNC8dV&j#p(oKX0MlIbFgmx_xLJLaY!^yHm(F z7{kD6*q<39H#w`;B2_y_*R9XxG<}KWR)*=n%6*fLU86s-(Trznl~KEBLIh_LW`9Sh zDW9$UD2`3JNVT7}+w<#Wi@z0H zwPmKn9$7LY9wa|2WcXzo#o>`4?bU-~HXt>PByiR~8}yp2g-&WxNi7}kuRS2kj7G!4Y2~y^vLEU0@ka}1w0i@D-(xb( zChO8?`x!TJCtLfI>W(exd#>6+Kx@S~4U%TZI`scB1oD#+WHq(&OE1W3N#x(yL8!eH z4`Kglgy(YY^K$3&w!t-xQ9o?~!!FcS3+i`%W5?#Ul{vy?L1k@wl)o#09}oh8D2_Fb z5V))Y#8-SAE`eGoPumMr-~l;Le^gKkmqir&f-SZstMCJ$juksdE>u66h^HJ#M;r)8ff3b?oNfyk4{`zkAwXrZ zF-=>Wd4*yvq$mrsSPOg{&`}^wg>(?OLx7+{g(CZbBg7ORZh{Y|+Cg@~M2D?$HVGF+ z#2qv<+7F^ERNf=l)bIcvy9-2F0Q&)Ek(PZSx*l3uTh@kHHmN~X7JAA-AlRxZ?+n*h z0A&SmAfQN6b|c8N;DH?#PPoDZh_J9S>#09p&=3*qJvN39nE zzyq{HQ;RFuK&uqhhzccGVCv)V<0}AxP+Ke9Zvq#p4L>0e^CLeX5CNOV^4@pr zcI&mL0|fF3Mj&^~{ieS$9|_{CajACutow0VP;1wl5sbw$0wG0)5|~;9?FPL`K1ZD7 z?JiT+^=jrmZHx;9b4lc3$qZv9c}AmHnOsHpn-Mo{<5GjE6h~e~91^S~$?pIZN8Ka7 zh|H)e+lP=HWN#b#$l^Gs7lKN0NaW~9#w~UMJIL%f`?ma>p4sj4V}Rm#^*gN%dybZy zQDI-x*GZAsz{5+a9)Z_C%}-kGn2pT7_k3Yy{HV$KFWz!{OJ2NrzQe9fdKTSOYkBA! zpg0H&P5l%hnnU4TI`ksaqZE#H@poAL+_E@j$MA&F1T>2}Co;n=!B*-?1pinvV}o4= z!6b5U#4O6YR4hfii!Wa0sl>u9)PbJK0nvL;^2f8DHMw_i1XX3T=_%o7<1>X%b66aD ziK*NeW?PTxXDiH~H|F)R?zG`=8C4t13l{qngEmCi$0>enRA%J!4WZmtAr1_^EWED6 zk$??8zpHqI?L?)G;Dd#ve*HxO=E<_SrvCQzv^LQ!#ryeZV@mkfWtZsR|2CK;T~8!U zoefklVk)NOF5xOLdXZqS@QN>evd*VS6=nf44aPjLidSw}1c#uHlcH-vcOmOd<=&oO ze^M3AwzTmINxxO_&2|^lNh5#sBV=xil);el+lJ|9`=7@}B4%Zzo`-*Z+hqPCl!7%6 zH%6h-k*dra<0b~$_?@vBdUln%?rNEjZqnc!yJFIs7JXB5P?5;i1PzAExO9!aiIODI zE&1!1MAI|p2%=#HvnD*mMR(kFt!86K&b^UcEj4EY`UgdhX zm^L2wn$QGvcA{sZNJwfH12=A>e`b9Xa^iXUVsOfAe{ksn4t?eIIyN)0oB~!!e|`)D zpHK7BMJBN_Y#8AorA==~lhM`l^`=VAv#sSgi4xAcmbmk#Jf!@))2%$)3KqwToXSij zlp|de)JU__YW>Am*=;#|bHx}rDDp3!$0=3(e(g=8+E5ScwoJ|*TP6NKXq$pQRe!_v z4v(NZfK7f^DjAlK} z&UM0n0XzPtK;u7aLEXK3cW7wnYEt&EU`M3)Gq@{bE%!kMAD|cO*WwCrp{@zMETau7 z*+K2f*bHq!trdShPI8|Q>2168h{XKd*%R>~vdAe#l1@OW^ZM(j5 z5D2`esXD5wID@_{6=h&PwFESWoSd18l#7gv45-Eea}*L1dh+6y)PX2y0$FT>A*ikd z^v9~91CSlS(?PAykOGSoKz9+~QUJsUwLk*{@-F~(piqMA*#tpw7RW82Hv?p6ms2o| z?4U9Wh%Rtz)|yI7SWo%>f5nALwQ~F=><|L5j!t%A%RuRuQ`DK{hY87h_**$zSw+vDb1t?$ec7dM z`->+}OZQy?eU?$189D4{88f8=6%X#e92io)<=!pEQ{-#4FA`iEBI?$)TBvm%1(De; zni(9Kj)pl~dmA(?H)L&%N)1ESfdY+PJ0fqjN#tz3vYS=ZveA8mlw{Vlu`7toKFJQu zN5-T;ky!=No4abwn_;5g2?;S4tWMb_{T0kTW#mUe%%@Ej?5DhkxIgr>m|!3N$@czf_u`T3!{#EYK4v_`2G+Ntv0AcKd86){uYf^~H`GU;3p#Ow%z4 zANiu3Qr+nICfCq0kwZp$0y%_7=Ss@GtFIbFKQ}z<*sxw^!8+*eb^Rt(5*w{gD6^51 z{2W0le&{A6znwHtd?vEr(8+l;6`64y5vvu;m@y5`F|^O*kdYeZ9_rH?;@-t7c_0_V zgiZ+$OZ?5<8dx;w`BL$U%n6|;r|lN* zBot$|!NdM0J%?VMpotRQMisNuSn`2geeQ+!=yN&NEdy;s{PVMdPO0nKMU&M}CT!S; zR2iz8sWiSXI$Sa68)uj7fV3L(WX}S75*H6Msq{?)T+~{R* zQ_0g!-uiixTO+zn%+7i?-qyU;W(svN(Gns)N^t_k{G~%|nH6$fTesa+jKsArWM9A!!RW95JXNk}zfl1j-f z{o|YWKryq@^Z$h%f7Mz2w*?wMg{E>Y3hX#9W&DZ5dg~(`I*mV(HZmYRdV2ooY*d@!JDJQF zTD4Q}7dGmJceO;V1YkgS*9Z+KP1w2(e+xbSB}d2K3ofgS$3LUFP<j%c=UOGS2VhhCSdnpjoS} z_9ZLk4X`!2yn5kk3uR{ktZ=c(hx4)!tzn((XbB+;DzlLdt12rH11jKzwG{`;Y&%P+ z{CX|d0b>nVVR5v`vA4(uv07>uHn45Lu25)J(#|}?hLmPy9&Z7m3>aucf#@x$>9RD9 z2XKQ#q^@B=-5dv~aTlnhlVG|ZOkV*D2duLI^~4734&Y)4Mv*?mm`9P4p|ujDCPtu z9a54;auVi1XIXW6h@o{seYTje0m#4r^Z~lNVEsi%ND;^`0D!=DQhqKuP}xO=8$v)~ z0c{@ivt>B=xkSt)YmPUfKd76lFaRXU+DtQ{8U-4boXHm%IO8c~`qb9JN;wSdW)&nE%& z@JVv24K7J2rp0Em&Sx(kC;+4Md(OBw zyX||3@wk*A@>sHWga|PnBc`8SiWx}CZpOgWVam^8LDz}Flk)mYPf~>T{+I1n8D20#*z?OD_ccrSJ@5OcalAZHe0*Oz9k{;8$w7WOCja^ zxMq-g_I$mb@8$FTe2(|=zK-jM>-rDQZQwHmeFr(e;-(267lIkh>wNrxOwu;H79UtpLiN^-N znZdUm%0;9_N&Kd>C%xa>o#tR_FPsyuGb*cPKCgh&2#|cX-g9Jvfw$4}==&-{_*jVo zlRZ~N`O{r`zGzIIq#(k_l#OY_6$2k-t4WnC3z?VjX(Q=VUBMt+A^f=k_I&tTJ=aw{ zUqM+$-_ZCCrn_Me_-)8p(faRQLSY*#J*~(hF&dS|>pdL1foN#V`&49wdUsBAv#CN` z3M2o8O5&u78cFnpDboY(?r8%Pxx|U?7G!8gq7naAIj%7Fy1j`V7&n~iDF1_$TaynJ zBv7U7B>}w?4P5+cE#k@3^pS%0n9pZ58I@d{i?AaD8oj=!G~$broAYCd>Q4d>AdhI& zZ{P?qU1VdF;kl}$O+4VIs(BK18}p`!!jw7LmtgD>&wua&eVEVzv7OA^$=;IppC?8t zcdx@w^b@Qs$*Q9QbwSGW?>V+6W3>sN%Ug=nG7#G1HP&D1B{WPOOg!Sh?ya%%5my~m zdM5m-#(8UiYN=ccYTxZ0`W^Y9+zA0kzkhYPO(KZzMCo^K?kjna!dYQc_~Y9|%f`k3 zKes9WCpjJuv69z^oM%qT>PzqQEkS*24Ply2 z5)cNC$JaJ{YKruqg*xVw4ye3Mn}p*fnG5LbL)^umWe@2UCvpa4J8k@;o*US0RRjAPYaIU?khCJ#~+U?G#D7w;ur)v zV|B|G@;6qi4fo}?iW^WHzePxCg%z6MxVPW=XQX2p?(y@o@^|{fYbo9Ve2=Tp$|gX3 z*jMecuLLS&bvFeZS9Wi`29(E6t1FP*VO6pmAwBo=#IiMyYIpn|B!yBP)*0JLXO~hP zR!a3QgD9njTwT}}C*$qrzEfVPU7%2rk7tyEs93E+W)kOxp6s`A@t zOC7-FfT&=yveY9ApnRZ^BKl%tnjq>yJ+45fl=b{7pl-VyErk*uKydKFkz8CNa5(?6 z<^b!PG|&eP3=YHxzPzlcttdT8e$p_&3Bq_NLGYn1UQIp4b)zWuPpNLP^^G~B^EATB!Z3p-kW z4wi3GWZTa+40~}cVEV!#D&-?f7p7B09~Q-j&M?2|aBiKwy7%j@``kybRlIFUklxGX zt{M@K^ij(%ShImw(RWS~qI_J+krZ|ArFVkZV7j|~y+2pLu5^`y>CNx{#PtcT+5N+2 zHP=5!C=F=Sw;4X00Cn3bju{3dpDR?iRTg3uO|}l)x%kff&caJIJ5%LR&DVepW+c|H z;?-zNn4O(^$AlOuf^YjeD%%$%8vAvPfb54_Vi1$oh`6D~=tBl^{pN}Fvhx6!k^CTSJ9LybMFN(HITS%0c7!6z(2;03X{6y{PPGMw=Mc(6{D_2D?4TixKo5^_(l$ z569?^%ageGSBsBP3PE61?)t?BcJ;ExnZa}Adl!c~C3fGbqhOK~0p;VI5mTdV{%toC zrL<{F^Qa1$^IOq-OeMNFF2Xe;_-br@E>f74f{C7cZ6p)~I&YVaUq{_2Ob_!rg6)zx zNzQLVU^@Ih)ZFs+H}SM7ml)%^A#U>VuHMjFBOZnsxRSmJzM@IsAX6nlHsq-#Grt9k zE932&Xo(#3(I_@X`5z35m1g5S`*#VC@%3_O_aLk8Nqf!aG4Z+8_D3S~d6L!&?J(8H zaZI&WbYv#=ihCo+!cdbv3PX%7+y(P~ez@uELNkrpj>=|UV>>RR^~aHtY?8;Sxr}&? zMh1n&u0$RPp%m97 z&yUrZ6g8}mGQDWMt|W@cl0EPR+*clX=(AfYh4qJ1>@=#rO+G!4+9;Coe*cLteX`P6 z*<&R=?vwo`&NfgWSV3WsvT@N-DZ@XUlBS}*_`~6fUz3<$5Dpnucb7pXoF%(2`~~d4 za|!!@lG>n=LVq(leq)2Z+{rSKX^QAl&s=*QQX9K1Fo!_GgWXfgP@LrQyejW5j?RF8 ztnHNAf1tAhB|O4obzlXg-H+d9y%k{5FJ$Em(bmXnp~&bl@9&aYsjmR-@tRJ6&Xb<^ zzg2rwR8(BLbZI4E`p@OZAF~}l8!Ri3kH0i!|FY)|hCVx}vm+}`$12GIfk>&#BT$O; zmkSHXaIA=pzxW*&+-(7q9PE#j0U-I`Mo72jIoq83O>fW$AK;#{oaaadClz}Ou;=~D z)CjnztQHu+{-COkr3=eagw#CqXDQZWe@Fpt#%gbLS6AJp zro0tgSO8TFNDcrcm6tPAk|N288%s-}fx96t4qiq=D%nxbWodpVZz@<4kgAFuUR~f%>wW7{dnzcHIpJqha%w>`6{3(!0%X>%NdUMBF8) z_3Gx=PlmVc7Uk{3w;i4sdH7D{Ayx%(=O#gff@n@S$sU2Ia^o)HkH_-$@? zUoc}^(SvnInOqTE7v;!(VLZ{uF7~Jz7X-Wj53(IUZWnR#dwJURaAY508HgSmDr84V zjJ{pVCzBM=Afr%8DLg!L#O<^W>+QT2PTBiGgg8B!Qb)84i3=y&fUn9sAlo#-nnc`n zbUS-I%QS;<^N4z=v}RgZ+h*2g%23vYA@v9zhG&>)40^&+hLC$fDuL|#wHus;GCCudRs)uM<&;b z052m9u9e_ZF7l>mop^DQBID&6c)CY!`W~`-f^Hv%8>W=pn9nR4?by>I>~05|E1Ck? z^0H$^+i@ZpAN}q%a6P%uy)M^l1bc_;1~-RBW0ygjsPD*UvUFf$HxhyF2vU@vWI-~@ zth*D`zH`m<3p0jWMiNVf2R(T#bi2iq*KH7)a&413THYVdW5nd&jxiv93sHRARWtLN z^Vwp#aga-4k5C4p?$uyw z`rZVUo#OT3eVEMXQdnNz&iQekHB&7b`nMBW*)wkTsEt;yb+-8Es~9XV{cuENVe;&@ z&ufZJk%g$K-WNzF(ToAO$;`{`Gxa_hNemWW2aRV!M6kVnVKSWn^+D3snpMbmPfZ1U&|o$zkONSFz7!zvSddy*AqI8EAv*kq?1aF9|4#2G7HT8 zs!Pr+HC?Lz&zz1NlC!{f(-i zMK}IKcE-P!6f5_WKbjhUQWd{XngzQ5bT^JJcUGwBjivPHAqZglTa2S~6-Er|#Zn6^ z0C)~z#P&MTR!{1vwUs;6yULwa!=u0FIe^;OWmiQDb9imLT7mezJnO=tuK#6>mK zwyCOGLohLDbesg8RyGhfY}g)Qu;*asJ@3*9-8)(VMJid07OVi zKMbN9fd%>E67Pa;In~^ldbNcwGwf|F6y4B2rRtucx$w%`O3Ep(nn`UjnBo@xr6YvHY|f>Jkw}0g4@7HEMq2QD%D?S2P$3uO6AW42 zy2jzrUm4`o2Dv*FI|tt~N?{`g8@8@n7V7Lt@>dh(E8K;VWP`PJ7_8*n; z*N>2o*vR13&zvPj-_Let&z(_O-`N!U2#ji&T7sZ+P0()R-SCEY_)|t>LTL3Ph+@Hj z;VArC)Q1ey8ZM%UmuE#7 zrwZ!*-iwzn6ps2w-*Gc9e>J?F2aQ4@WQ5x}G#Gg-kMuK(#gIV=)Gr8hQM77aT-Y$> z$=1RfZ58tR>inS^1bRP7g2Wjo!1F-+F^c;h(sLrOk#}boeXGn_SjZ(l(^+`vEj0>4 zhHszTSeV-EG2d!4eSv{d;W|@XyzVQYO%#)|>BH-et03B?PHLdmAanv1aLSCVmgIs> ztya_BzEvJA+|gODy4&PiD%(X=9?;`u&cYYnjD_~WxX;U~%RMLV7QS{-+sH$EKwi|W za5|vZ+G2mCsAWW33nF@l+Ma>ak?2I;WAFhcM9{>v!M^Cd!DS=mxs5QcqXCFHbF-0r z3Ri82=(kVoBFSquW1p2r6>rQgP@3qt_N88Oi=1xz={uYDZMNLl=o((I%cbheOrOur zk^&1B?jLheysG2^-J*~m-~5$yaJ+j`tT+~C-Dg5%(i$tmxo28)=@LU22`cWwjQ`!+ zC;#&u4enEt+5jNtWx}|W7=>u(3jR!AfU4MVbX(Ag`KpxW*^+-&ie2WGvb7v06^eiN z*hN=*G%mPkDs!sUNRv^)>_~P>R#T80W;v??`mrzR#ORLGbNr3g_;0+Pq^GB+q@(~w z`hQ$*{Na+a!Yf^Zez`qb(icl{jiqYJ@_g!VJ_e8&tM$c_n*nfN-piPDU;8_tqe88w zfNk^T>xo?@O=3V**ySD76)OXZiQ1k6kBLjh6DUVVKZ4B8i9 zN&$ewK>Hv@0~}KfsDmm_U|Ve^EQ(U~1{qORRZHMqC@Y%*aRCw=v?)~(*Pvla!N|F^ z^p@qs1~j57FF^#es(||?DXIrlhJ=tF2x=@-OE&;FW4(Y1&>Dg~N}wf6O^QNV18~1U zQWQuGz)OcZD(viRtO!qZ}Z9h3SQ|i9lK-xHls+^lOz@M?<=K;k;4`&w) zyXPIE#zeDS&mzTUdX+nC<|YI)hy$wp5b-NLw?>{2>3DFwui?yM?8BnLGk$NH03)5J zxmZB@k)O$fJ9kcGnG9!W6vqC5VxlRc>n$@hjI@5Nq4b4thU4I{^ez{Kz(ZtfU$_99 zhu{|cQ-3S|2X-0#WV+7YW?tDn-7#e3)z%%Ti9RXBmaJ(%E8h0<5kUO<@D?ZAtvxFQ zlQj&Ei9^Y>3Bv+e`VD0tR)dmkFx<NhA?4Z|&3E51Ha`B#;w0@kIvWq!X zQnyQI&Bn-KOD0%e#B)o*4mu&va}?&Q7JNH}v!YOuGK-a1O7-J0Ph8NntUP)|oVy^c zl=+3Iv}V_hCRIlL-2lMx+5s*%IN@%#;cSpqOI9u0c_s62BS+W9 zx0aE}o1|MudeOXoE9{K$n4t!fy=s(9#8b;=KEi@{=nbaO=d3v&o9Mh1CTll*YB2bq z&dl$6$Spzlg@ARmtVgdUS%%yf%*<~_XNj$=o-8LCsEn&JQO+GnS8CKq4+ur(&%55o ze$5DtRlTyHY9t&&sw9j02GWPawNreUlp~WW)=+X59Ht&^$_!pZ*;KSY5jBK)yH4p; z5YRY@_@1@GZl?NS9Qn2q9r@3L%M4XG+%JA5Vv&o8G1=!wKp>=RTC!cpiINy8nGQEt zE7k_)qYAXrtod%1pT;etdD!I5-&2l+UCZSkFUe z>S8%^Fj85-Rg^6zk4Y9^$L25*BG8e?ys5R0W3T_BtMYf5(SM;sPMkP#?AWp2=2})aR!%^i4iFxtbyWZ~9qhXP z>mWxbb*SY&l;YU&dp~x0*sadjk>+sxw&V_VVt;B6YItM0AA9+?6bGP+F54Tc%CS&# zW7T@QO}2|Q1!O$H4$F4y9KhzFNfByq<(J#a$_@*S1@^1q0aaIM$CTv=M--4HcBWZY zrmO4D1c6nXwZzV0E?J!JO-+P1`{{1MIM@TvCAi*sQu2ghaI! zJ;0v(MrEj(0(=gz%%ZMfuOx2<6bQJX&=d%$!h)6xP#qw=0aOPB9HkypXi-t1I>gs& zL&p@z>e#Se031+cf%bqR9J~-04BB?5wp4)d0OeRf=m3FH5F1?{cm?zB?5r%D%*+6n z&IWMl|9Y-v<%XhvVh%B^_oo{Q$ZxCxX;Ib{1X!hXYody~Ou(`NNdXGv!O{&yuEOb2 zXFm4GAZixNJ1?$m7GQ0X)H zTF2?$HBeMxZ}JUp#kQR_q1eP`JvuLVwFXHKmR@zrU`Cr2J0~ibINh4Ax^-{2yHP#* zP&phviGLd@bF|135IXdv1eC?s*PV8{b?ws|CeAs!qZE;SeXYsq99ERUyn`*NCb@SW zo1`ZN^%|CR-q!0i&?inVs$P2q5MY~v1=Q>#9gl*3Y;H>3nizskKZHxqeb*7J2DlW2 zJ%NSJr&wh02?k7aeys$b0Ep1>kv|!>o$QYgdJefA@0_0ExnxuQVT`~u>LaFla55*-M(2-Rh-Wb#A!D478vt-w7QaIW5@lOfeoS(TIn#t@J`Ig z(}8eO;{~{(WO#dr_wsi$a%eQPhD7r2?C{6S#q_#1^Ae}aONBaW2}XQbY5i`Gw|`v} z;aczFI~KKB>~;gY#tj#@7T#UGb$GeRE-r!=Ilh){q^JWYG0FQV!FWz{-)8u(W^?NMSIaA9qp-pwoImCa+UVLivg(sI&QD;a8`fKR&a(}D zewTZP&l~S*By+VZmo7Ld+^oEx4WHLS$4^c^4rXZJ|Eoa$xb*rPmd3A9 zIUw8<)1om=Z*llza%Mew7pg$DF=*NG_)e$zj82yBDE*rMGkSxzDZhH2WkqlNbsO&A z>Wx(iQgC1a@6t{Sv>*F3INC$SfziOD!1q`Rj;>mfU2#8}SDjXVrZ~V|1;f>N2$HUd?yesKEWO^)*!L5M6eqL0dJvhkppn*qsSQP^H zs6E(ygGwwb2bQ1HZ@;rSEMiy74@i3~cV<_R=R3@bcbJsgnP-7Z3zQl)C0h{_z_`2} zK4+PF4n;d?mlnty0V6HI05J{*9tbtpanckDb%3cBu+svnvH(K5l<0u^Dgee|5Dcy> zpreA{e9}t})dTd#H(Flw$O`8x5Q-g?Qc_iAa?+SH4n7|R%mJFupJQzj5y8ZtxVuR3RD z%mx)>9R&0J>}o(EWWeU4$M><+uFBDel*0;jZ~fOMS$!iG=a}8n!k_fI5Cl7CarMKS z+R!bH7v`j71Mh&$#@;hx+E1C8*cK>Y3Bzg zDF;Sm)}`*TxOwS0co{Brig=Cc1%AStYUHD$o7b2k)M&dr0SF|<+X6q?o zi=27L%q#aQ*gS+k;<}5eR*F?0As`zff<11r(CWf%ZIV>WL$1}?aFtScWPuK0qVjD< z3d`%=d!%Rm>%r@9lR7>#x^BTY_L!j5$aUd~GUw`IlS~h>X2Zw};vU>#BT@~*7DWNg zT6YYGhR)P}b~hAaX!C1TGY~@HhVM|-pgq8!K_5X!X1rIzrM*f(ZGo&;Uuu)FE0SF*rN#sqJRSv7M>WZMeqNvI=9G_ z(_f{4jl{RANKatYx#(vSTim>}1~ z9WHXmWzA9HiD3P1eVG(h4wnCQJbqo4|3z6m*l~`3s5h2Z;mqW>Jkf^-?^PEYFm1tnX)`FrRndPQZG+5q&gRm{;}=;pM`O3@C>RlO9Ol}5^6 zCscmg8QZ~S<<}t|hg_i3e;-Pssf*}Zu z9x*oh8R`H>7h~)(a8@C13C3+X1X!fFO-J-}-Jp(&)-TKTH0T#tqSaB_t*Pz+(xQOM z0R#syKA?^Ygyg^hBnPlL8;ZTK zyE)5fn#1Qn+xifVAiHN%Z9W%W9+ZcN?oOj>4vUx9n%f#gjBD+LX4+FP?|OLW+(Ulr zaxe+^q?t~$P%=(})GMdEHJVSwtJ8BA1mm!f*`qs2stix{egYC5$~P{vC&z0zym}2f zD*j}3OmK>&_w46)T~VKoClwc!1%4~=dGqm@n6R|8eLr;)?r5!+N@m#B_=UNz6Qv(d z@85MB_4V`A`*(uw97!{QA3#S%K_{INDO)$daT0V?T#PIwaN&Zow+DJd1$JrM?L5Te zpCmt~Lg^pgqH?wi+ODrJdEn5UEHDjoNs?gOSQ;!~rxt>&#J3}=6VmwtM~qPh3j&Tp{%mJBaXbvU1E;G)9$3*4_TY)4u9-^Ly&`Et|NKqN;n zOp)oVMAL;<$rlOm>hVGg^}1FAHo57EvG-TDeyAGFI2eXakk|nW##Ro>Z0O>y^GIjm z*Kc%*)O_r=VV~ux&k`2=rh*munojwBsR|D6cEA=H?8GL-=0FD`n&DAGTc)aq6<<2=I8G!XvI5G&ABetUG}mk!tXwOw4~8I$?+Z#a zRAOwRBXgd9op1K|b*^v$mt(_Z4*t#clkJy`qujEMGY|nexR05H(GVA8-?Cjv+U~6l;I`#qVkL@;RoviY=+d$k7;C;}b z9ZsYoAV_wYl~9RbNw((Hs0V~2O$34j8eO5bR>0_rl{tWR(DyKcSp-dWETu** zEy1zG)+E)^^fa}y0;uOdr)f=1PTCSOfikheCDMjg%nbpk1A>A9rvnsMAk~3A0Wu%p z&_bQ2Jq*C-Mz}+U`Uh!TFj}euFh?<4e8HxhvF<61&R!JC1EuQ$VL3E*=<4c%%Zje* zE?{t|Y_!~@=%%D(0;~<7I%xM58JR6Bkq$uM0IEYmSQh|CX{tk5Kn>U#0=)9zl!8Er zQ1ha~G~oe62QW2&wLujg>?`muDtQ#B4t5Y91!on209)1`)Q-w>!h;@~b^F8f%ZWwi z&z6UA6dN{r;pfVVS|O;ZOkG)8SvepS)0SM)nG4lao~t=ucImv7dj3gOsR8xGA~f^* zoM!QkZnv#I0#!bJ13D)NS0D&FVaHMH3F9=(*&SD+rG4$M?ER2k41gS$orC9QwU0gx zZOb&E*j*V*^?iQzpvNLH$8>IY9G=f#?nXh0wStvXzCP{5B7Lo>-|j6rRpS!A5Lg~x z8Ujxy1&*tlK$gdDMthu^vErM${hAKP$Pf(1~T#i4u-h&1PcTEE+;_J2*Ex&|y9QGT$glCRoiPdc!b_ zBYG6MpGRA*$OcKwt(Ykg)-8d%lwe+$3XiQo-}f;xj4CLZ&s`4=$7qBZz}Yjy=ndh` z5y!_dJH?aZIWq#fnK&-0gb!6uq@~2e$$_OtnoOfX%z{UdAyE>C$P$KJ>SP}k(HD4~ z#{8>CLVarBKFEjMk<9(k`h#|b9UDX75{3eY;2{LbBMGieTv`Gzy`{$zu8-xHlcxL{ zHMaGhD-K64By4_zKhPl`g895g_!OzKRn*fZpNXTtGfydMM~1(rd|QX()FaM*cNVTl zwYqgi6Mj=L70luO2(cuMo=BnX8r==WhOLuB_fbW=;r6YE+@V@%p zYzDH>2@T08vAqG75h~6*4#}NT8QXIdN64m+;@t|XLg)%D*0YL{#kns?p;df2UZ=ko zY2fe+o9wi3F`%E)yl^e&ng%L>(FW!g=1-CD7`*iD^QI=cHKLJ~5;31!jo(u%6gsc(yKAOO(l>@_Fu9F> zr}H4d5>%qFj&ATemOO^7`x&k28idyUa$-rti8HVtQ;`%N>|1NxngBnP5GIEtvsnLc z$OD8tdW(d6GEL30nHUAT=wQ#8ERLpCwLdQTqBd5Ji5cOehMsKJWmL7R2^9fDqJez^VN@*-^% zVy)NB1C$KK2n@cj;{d!dzf-YUH+D6#;}M-Yoj?8je_4*uR0vI!ti(ME3JQQO$;rt9 zLWDNR^3R3HQ+xYUJ6BmDe=`6Fw@`W*dbjN1%yWTVRnu^e`~}wvrWH zwK5CjNR~bHLi7$ht0kjkyLpbi#Th$`OprnaQ*MsLVn7)C83Xy5MUAnxwzjc|ryXHz zOcSh(5>|FwXfDZWfns4AX=WM%d=Lm7Mu;>egn+{fIJp36VnP6mZ%g%AJpPy^Rmy;g zSz}`eN@`{p4$xsx%f%?b2nP+afFuZ1alt|r7h?>tMZglAF9zd7K!svA2k4{stpq^O zXs^w>o_gBuIy%leo19S^UZCruqoV^U6}6qJfGAI)RW8765O9BW`R8UDMy0m{@x9N5+9kXE-(FxHW-~vdOz(s3+cbRMX6T-^r^*p0Z%eF-5tnip{+#ZW4MJD_KQ+_j2zib{$zQtx z&#RqkaQ5bv4k4W*s*oJHG0utS^%AbIYKF^MRwrzgO26bW1U6aTz_7dAW0BiB=p1%B zT>0?gx=tE$(z5mP^BbY-#7=gRB@+w+>18`>Zj1%)stJPC``iHimT$wisu__9V-T9u z_o7gQxob!VmPxK}`(=Ygaw{L&{rsV8bAh9L=*a98%)9zD@W~wa&RG&c}SeX^* z#_i(U1eg`tAonW(VV|G!f(mFS}g3!dwinT-dks%{q>A7N&g}75*7|1JL zrMx{h7nIzh(oV7NS$CQzxQD$Qy1+agQYUcE+YOvnV>l|wNYp~M4WG_Wi{Dqq}y_y?jf^*v=xAz!Q+?WyM}SihX=0s30v~$YErveqC;#RDyt; za9N45R<@OuN3gAeJ^F(-Vp#BgnEYDaxQH=|5uQ$cG&ij{%NBhU<4WPohAmDrNa4ud z=P5iFx$c+3%f`;z&m|NZX9Rdiy_Z#eSvG!=gV!wUmva?Mj=_ zelWk9#r|`X_IaCT{yEvjpg&Ro#<&QJ5-zU zBUB#$U?!u~XZ1N^CvYV!t(a^NSDt#v4awk|v789uP2pnRl#x{8HxVjZA^u;@oQed~ z!}7Gz^2EgG=T!qd6&bfT?Eie)1y(4~f^SyK`W)kFS}63SwOQ-t=UBg(Lg9D#7TxEc zSQo9II5zx+D|^2f|+TU%RGQ&VGO zV_jWcZEbB$P0g)aw}2FBYooh)lkWQU>($lOD}~#Y+YG>XtT-dI9t_BXoIZUzDk=(K zOT)wILPJA?gM)*Df>u%?e?+IRaK%;=#eUmrIpo^2g7i4#{BUWp#TigNAe`7ir=CBu zJyxh5zuF?drBIh_5s*Liw7m&>w!5uvx|%JqOjm*-&bGxXA_VX}R>B}OD`fSFg$fS? zF%SqI=44j1EIF3CFE(ZgG*5)4H>jQnG|K{%#%h^C6AzU}M%JbYfFA~MU%(Kd&fC)( zFwoJ(+>i{p9{A$~<71#nYh-i?k`{)C2?PRA4g}l@V}qlBfNs3yI79_A*o)Qo$8HHQ z0HBV|-e{C3IKzPUELzt`PtP4xUO@g-N8JN7X7%*kbah;Ty3p3%p{?x%P^FscpjB(D zt*s6822`en$mm3n`v84f(11~rCdtcTL913;0_?$UrZ!z5)d36VPgWa1p8}!q3jmP4h%(h6sR!0Ye0wUY1ww!TQ_p18{$^L#PUb zIy;+JcWfH*H-<<{JhaKODsy`7UgYZ53zPgx=CoSQ)V`5&)cReOmnp6FlIo_14>P)9 zW$67x&8PpR&Ig(TIS`?WO)wTRyR<8xs2O9w>A*yDj|nw%%0DWiFyKe9b*RL*>GJK7 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%0A}5>e^l(!W`1z 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 TJ<2h8{sPz8 i64 { + x.pow(3) - (3 * x) + 2 + } +} + impl Environment for FunctionApproximation { fn test(&self, organism: &mut Organism) -> f64 { let mut output = vec![0f64]; @@ -24,7 +30,7 @@ impl Environment for FunctionApproximation { for x in -10..11 { organism.activate(vec![x as f64 / 10f64], &mut output); - distance += ((x as f64).powf(2f64) - (output[0] * 100f64)).abs(); + distance += (self.funct(x) as f64 - (output[0] * 100f64)).abs(); outputs.push([x, (output[0] * 100f64) as i64]); } @@ -42,7 +48,7 @@ impl Environment for FunctionApproximation { fn main() { let mut population = Population::create_population(150); - let mut environment = FunctionApproximation; + let environment = FunctionApproximation; let mut champion: Option = None; #[cfg(feature = "telemetry")] @@ -55,7 +61,12 @@ fn main() { telemetry!( "approximation1", 1.0, - format!("{:?}", (-10..11).map(|x| [x, x * x]).collect::>()) + format!( + "{:?}", + (-10..11) + .map(|x| [x, environment.funct(x)]) + .collect::>() + ) ); #[cfg(feature = "telemetry")] @@ -63,7 +74,7 @@ fn main() { while champion.is_none() { population.evolve(); - population.evaluate_in(&mut environment); + population.evaluate_in(&environment); for organism in &population.get_organisms() { if organism.fitness >= 96f64 { champion = Some(organism.clone()); diff --git a/examples/lunar_lander_worker.py b/examples/lunar_lander_worker.py new file mode 100644 index 0000000..4bca0fd --- /dev/null +++ b/examples/lunar_lander_worker.py @@ -0,0 +1,101 @@ +import gymnasium as gym +import numpy as np +import sys + +# The rustneat_py module is passed as a global +rustneat_py = None + +# Persistent environment (one per worker process) +_worker_env = None + +def set_rustneat_module(module): + global rustneat_py + rustneat_py = module + +def init_worker(): + """Initialize worker-specific resources (called once per worker).""" + global _worker_env + # Create persistent environment for this worker + _worker_env = gym.make('LunarLander-v3', render_mode=None) + +def run_single_episode(organism, env, max_steps=500): + """Run a single episode and return (reward, behavior_descriptor).""" + # Reset CTRNN state at the start of each episode + organism.reset_state() + + reset_result = env.reset() + observation = reset_result[0] if isinstance(reset_result, tuple) else reset_result + total_reward = 0.0 + done = False + steps = 0 + action_counts = [0, 0, 0, 0] # noop, left, main, right + + while not done and steps < max_steps: + # Activate neural network (calls Rust implementation) + # 2 outputs: [main_desire, lateral_direction] + outputs = organism.activate(observation.tolist()) + + # Lateral priority action selection: + # - lateral < 0.33 → left (priority, main ignored) + # - lateral > 0.66 → right (priority, main ignored) + # - else: main > 0.5 → main + # - else: noop + lateral = outputs[1] + if lateral < 0.33: + action = 1 # left thruster + elif lateral > 0.66: + action = 3 # right thruster + elif outputs[0] > 0.5: + action = 2 # main thruster + else: + action = 0 # noop + + # Step environment + observation, reward, terminated, truncated, _ = env.step(action) + done = terminated or truncated + total_reward += reward + steps += 1 + action_counts[action] += 1 + + # Behavior descriptor: final state [x, y, vx, vy] + action distribution [noop%, left%, main%, right%] + total_actions = max(sum(action_counts), 1) + action_dist = [c / total_actions for c in action_counts] + behavior = [float(observation[0]), float(observation[1]), + float(observation[2]), float(observation[3])] + action_dist + + return total_reward, behavior + + +def evaluate_organism(genome_data, render=False, max_steps=400, num_episodes=1): + """Evaluate organism fitness using rustneat_py for neural network activation. + + Returns (fitness, behavior_descriptor) where behavior is the average final state. + """ + global _worker_env + + genes = genome_data['genes'] + neurons_len = genome_data['neurons_len'] + + # Create organism using rustneat_py (Rust implementation) + organism = rustneat_py.create_organism(genes, neurons_len) + + if render: + # For rendering, just run one episode with visualization + env = gym.make('LunarLander-v3', render_mode='human') + reward, behavior = run_single_episode(organism, env, max_steps) + env.close() + return reward + 500, behavior + else: + # Run multiple episodes and average for more stable fitness + total_reward = 0.0 + behaviors = [] + for _ in range(num_episodes): + reward, behavior = run_single_episode(organism, _worker_env, max_steps) + total_reward += reward + behaviors.append(behavior) + total_reward /= num_episodes + avg_behavior = np.mean(behaviors, axis=0).tolist() + + # Transform to positive fitness: Lunar Lander returns [-500, 300] + # Adding 500 shifts to [0, 800] which NEAT can handle properly + return total_reward + 500, avg_behavior diff --git a/examples/openai_lunar_lander.rs b/examples/openai_lunar_lander.rs index 67b392c..fe59b5b 100644 --- a/examples/openai_lunar_lander.rs +++ b/examples/openai_lunar_lander.rs @@ -1,142 +1,477 @@ -extern crate cpython; extern crate ctrlc; -extern crate python3_sys as ffi; +extern crate pyo3; +extern crate rand; extern crate rustneat; +extern crate serde; +extern crate serde_json; -use cpython::{NoArgs, ObjectProtocol, PyObject, Python}; -use ffi::PySys_SetArgv; -use rustneat::{Environment, Organism, Population}; -use std::cmp::Ordering; -use std::ffi::CString; +use pyo3::prelude::*; +use pyo3::types::{IntoPyDict, PyModule}; +use pyo3::PyResult; +use rustneat::{Environment, Gene, Genome, MutationConfig, Organism, Population}; +use serde::{Deserialize, Serialize}; +use std::fs; +use std::path::Path; use std::process; -use std::{ - ops::{Deref, DerefMut}, - sync::Mutex, -}; + +/// Compute novelty score: average distance to k-nearest neighbors +fn compute_novelty(behavior: &[f64], all_behaviors: &[&Vec], k: usize) -> f64 { + let mut distances: Vec = all_behaviors + .iter() + .map(|other| { + behavior + .iter() + .zip(other.iter()) + .map(|(a, b)| (a - b).powi(2)) + .sum::() + .sqrt() + }) + .collect(); + + distances.sort_by(|a, b| a.partial_cmp(b).unwrap_or(std::cmp::Ordering::Equal)); + + // Skip distance=0 (self) and take k nearest + let nearest: Vec = distances + .iter() + .filter(|&&d| d > 1e-10) + .take(k) + .cloned() + .collect(); + + if nearest.is_empty() { + return 0.0; + } + + nearest.iter().sum::() / nearest.len() as f64 +} + +const CONFIG_FILE: &str = "best_config.json"; +const CHAMPION_FILE: &str = "champion.json"; + +/// Serializable champion genome +#[derive(Debug, Clone, Serialize, Deserialize)] +struct ChampionFile { + fitness: f64, + generation: usize, + neurons_len: usize, + genes: Vec<(usize, usize, f64, bool, bool)>, // (in, out, weight, enabled, bias) +} + +impl ChampionFile { + fn save(&self, path: &str) { + let content = serde_json::to_string_pretty(self).unwrap(); + fs::write(path, content).expect("Failed to save champion"); + println!("Champion saved to {}", path); + } + + fn from_organism(organism: &Organism, fitness: f64, generation: usize) -> Self { + let genes = organism + .genome + .get_genes() + .iter() + .map(|g| { + ( + g.in_neuron_id(), + g.out_neuron_id(), + g.weight(), + g.enabled(), + g.is_bias(), + ) + }) + .collect(); + ChampionFile { + fitness, + generation, + neurons_len: organism.genome.len(), + genes, + } + } +} + +/// Serializable configuration file +#[derive(Debug, Clone, Serialize, Deserialize)] +struct ConfigFile { + weight_mutation_rate: f64, + add_connection_rate: f64, + add_neuron_rate: f64, + toggle_expression_rate: f64, + weight_perturbation_rate: f64, + toggle_bias_rate: f64, + compatibility_threshold: f64, + #[serde(skip_serializing_if = "Option::is_none")] + best_fitness: Option, + #[serde(default = "default_weight_init_range")] + weight_init_range: f64, + #[serde(default = "default_weight_mutate_power")] + weight_mutate_power: f64, +} + +fn default_weight_init_range() -> f64 { + 3.0 +} +fn default_weight_mutate_power() -> f64 { + 1.5 +} + +impl ConfigFile { + fn load(path: &str) -> Option { + if Path::new(path).exists() { + let content = fs::read_to_string(path).ok()?; + serde_json::from_str(&content).ok() + } else { + None + } + } + + fn to_mutation_config(&self) -> MutationConfig { + MutationConfig::new() + .weight_mutation_rate(self.weight_mutation_rate) + .add_connection_rate(self.add_connection_rate) + .add_neuron_rate(self.add_neuron_rate) + .toggle_expression_rate(self.toggle_expression_rate) + .weight_perturbation_rate(self.weight_perturbation_rate) + .toggle_bias_rate(self.toggle_bias_rate) + .compatibility_threshold(self.compatibility_threshold) + .weight_init_range(self.weight_init_range) + .weight_mutate_power(self.weight_mutate_power) + .tau(0.1) + .step_time(0.5) + .build() + } +} #[cfg(feature = "telemetry")] mod telemetry_helper; -struct LunarLander { - env: PyObject, +// ============================================================================ +// PyO3 Wrapper for rustneat - exposes Organism to Python workers +// ============================================================================ + +#[pyclass] +struct PyOrganism { + organism: Organism, +} + +#[pymethods] +impl PyOrganism { + fn activate(&mut self, inputs: Vec) -> PyResult> { + let mut outputs = vec![0.0; 2]; // [main_desire, lateral_direction] + self.organism.activate(inputs, &mut outputs); + Ok(outputs) + } + + fn reset_state(&mut self) { + self.organism.reset_state(); + } } +#[pyfunction] +fn create_organism( + genes: Vec<(usize, usize, f64, bool, bool)>, + neurons_len: usize, +) -> PyResult { + // Reconstruct genes from serialized data + let gene_vec: Vec = genes + .into_iter() + .map(|(in_id, out_id, weight, enabled, is_bias)| { + Gene::new(in_id, out_id, weight, enabled, is_bias) + }) + .collect(); + + // Reconstruct genome with proper neuron count (neurons_len = last_neuron_id + 1) + let last_neuron_id = if neurons_len > 0 { neurons_len - 1 } else { 0 }; + let genome = Genome::from_genes(gene_vec, last_neuron_id); + let organism = Organism::new(genome); + + Ok(PyOrganism { organism }) +} + +#[pymodule] +fn rustneat_py(m: &Bound) -> PyResult<()> { + m.add_class::()?; + m.add_function(wrap_pyfunction!(create_organism, m)?)?; + Ok(()) +} + +// ============================================================================ +// Lunar Lander Environment with Multiprocessing +// ============================================================================ + struct LunarLanderMultiprocess { - lunar_lander_pool: Mutex>, + pool: Py, + worker_module: Py, + /// Novelty archive: stores behavior descriptors from past evaluations + novelty_archive: std::sync::RwLock>>, + /// Latest behaviors from most recent batch evaluation + latest_behaviors: std::sync::RwLock>>, } +const NOVELTY_ARCHIVE_MAX: usize = 2000; +const NOVELTY_K: usize = 15; // k-nearest neighbors for novelty score +const NOVELTY_WEIGHT: f64 = 0.1; // 0.0 = pure fitness, 1.0 = pure novelty + impl LunarLanderMultiprocess { fn new() -> LunarLanderMultiprocess { - let cpus = LunarLanderMultiprocess::threads(); - let lunar_lander_pool = (0..cpus) - .map(|_| LunarLander::new()) - .collect::>(); - LunarLanderMultiprocess { - lunar_lander_pool: Mutex::new(lunar_lander_pool), - } + Python::with_gil(|py| { + let cpus = num_cpus::get(); + // Match workers to CPUs (CPU-bound Box2D simulation) + let workers = cpus; + + // Import multiprocessing + let mp = py.import_bound("multiprocessing").unwrap(); + + // Create the rustneat_py module inline + let module = PyModule::new_bound(py, "rustneat_py").unwrap(); + rustneat_py(&module).unwrap(); + let rustneat_py_module = module; + + // Load worker code from external Python file + let worker_code = include_str!("lunar_lander_worker.py"); + + // Create worker module + let worker_module = PyModule::from_code_bound( + py, + &worker_code, + "lunar_lander_worker.py", + "lunar_lander_worker", + ) + .unwrap(); + + // Inject rustneat_py module into worker + worker_module + .call_method1("set_rustneat_module", (rustneat_py_module,)) + .unwrap(); + + // Get the init_worker function for pool initialization + let init_worker_fn = worker_module.getattr("init_worker").unwrap(); + + // Create multiprocessing pool with 2x workers and initializer + println!( + "Creating pool with {} workers (1x CPUs) with persistent environments", + workers + ); + let pool = mp + .call_method( + "Pool", + (workers,), + Some(&[("initializer", init_worker_fn)].into_py_dict_bound(py)), + ) + .unwrap() + .unbind(); + + LunarLanderMultiprocess { + pool, + worker_module: worker_module.unbind().into(), + novelty_archive: std::sync::RwLock::new(Vec::new()), + latest_behaviors: std::sync::RwLock::new(Vec::new()), + } + }) } pub fn lunar_lander_test(&self, organism: &mut Organism, render: bool) -> f64 { - let lunar_lander = { - self.lunar_lander_pool - .lock() - .unwrap() - .deref_mut() - .pop() - .unwrap() - }; - let result = lunar_lander.lunar_lander_test(organism, render); - self.lunar_lander_pool.lock().unwrap().push(lunar_lander); - return result; + let (fitness, _behavior) = self.lunar_lander_test_with_behavior(organism, render); + fitness + } + + pub fn lunar_lander_test_with_behavior( + &self, + organism: &mut Organism, + render: bool, + ) -> (f64, Vec) { + Python::with_gil(|py| { + let neurons_len = organism.genome.len(); + + let genes_list = organism + .genome + .get_genes() + .iter() + .map(|gene| { + ( + gene.in_neuron_id(), + gene.out_neuron_id(), + gene.weight(), + gene.enabled(), + gene.is_bias(), + ) + }) + .collect::>(); + + let builtins = py.import_bound("builtins").unwrap(); + let dict = builtins.call_method0("dict").unwrap(); + dict.set_item("genes", genes_list).unwrap(); + dict.set_item("neurons_len", neurons_len).unwrap(); + + let worker_fn = self + .worker_module + .bind(py) + .getattr("evaluate_organism") + .unwrap(); + let pool = self.pool.bind(py); + let async_result = pool + .call_method1("apply", (worker_fn, (dict, render))) + .unwrap(); + + let result: (f64, Vec) = async_result.extract().unwrap(); + result + }) } fn close(&self) { - for lunar_lander in self.lunar_lander_pool.lock().unwrap().deref() { - lunar_lander.close(); - } + Python::with_gil(|py| { + let pool = self.pool.bind(py); + pool.call_method0("close").unwrap(); + pool.call_method0("join").unwrap(); + }); } fn threads() -> usize { - //TODO: use multiple processes. Gil still blocking threads. num_cpus::get() } } +const EVALS_PER_ORGANISM: usize = 1; + impl Environment for LunarLanderMultiprocess { fn test(&self, organism: &mut Organism) -> f64 { self.lunar_lander_test(organism, false) } - fn threads(&self) -> usize { - LunarLanderMultiprocess::threads() - } -} + fn test_batch(&self, organisms: &mut [Organism]) { + if organisms.is_empty() { + return; + } -impl LunarLander { - fn new() -> LunarLander { - let gil = Python::acquire_gil(); - let argv = CString::new("").unwrap().as_ptr(); + // Collect indices of organisms that need evaluation (skip elite copies) + let to_evaluate: Vec = organisms + .iter() + .enumerate() + .filter(|(_, org)| !org.preserve_fitness) + .map(|(i, _)| i) + .collect(); - unsafe { - PySys_SetArgv(0, argv as *mut *mut i32); + if to_evaluate.is_empty() { + return; } - let py = gil.python(); - let gym = py.import("gym").unwrap(); - gym.get(py, "logger") - .unwrap() - .call_method(py, "set_level", (40,), None) - .unwrap(); + Python::with_gil(|py| { + let mut batch_data: Vec<_> = Vec::with_capacity(to_evaluate.len() * EVALS_PER_ORGANISM); - let env = gym.call(py, "make", ("LunarLander-v2",), None).unwrap(); + for &idx in &to_evaluate { + let organism = &organisms[idx]; + let neurons_len = organism.genome.len(); + let genes_list = organism + .genome + .get_genes() + .iter() + .map(|gene| { + ( + gene.in_neuron_id(), + gene.out_neuron_id(), + gene.weight(), + gene.enabled(), + gene.is_bias(), + ) + }) + .collect::>(); - LunarLander { env: env } - } + for _ in 0..EVALS_PER_ORGANISM { + let builtins = py.import_bound("builtins").unwrap(); + let dict = builtins.call_method0("dict").unwrap(); + dict.set_item("genes", &genes_list).unwrap(); + dict.set_item("neurons_len", neurons_len).unwrap(); + batch_data.push((dict, false)); + } + } - pub fn close(&self) { - let gil = Python::acquire_gil(); - let py = gil.python(); - self.env.call_method(py, "close", NoArgs, None).unwrap(); - } + let worker_fn = self + .worker_module + .bind(py) + .getattr("evaluate_organism") + .unwrap(); + let pool = self.pool.bind(py); - pub fn lunar_lander_test(&self, organism: &mut Organism, render: bool) -> f64 { - let gil = Python::acquire_gil(); - let py = gil.python(); + // Extract (fitness, behavior) tuples + let results = pool + .call_method1("starmap", (worker_fn, batch_data)) + .unwrap(); + let results_list: Vec<(f64, Vec)> = results.extract().unwrap(); - let mut observation: Vec = - extract_observation(py, self.env.call_method(py, "reset", NoArgs, None).unwrap()); - let mut total_reward = 0f64; + // Collect behaviors and fitness + let mut batch_behaviors: Vec> = Vec::new(); + let mut fitness_values: Vec = Vec::new(); - let mut output = vec![0f64, 0f64, 0f64, 0f64]; - while { - if render { - self.env.call_method(py, "render", NoArgs, None).unwrap(); + for (i, &idx) in to_evaluate.iter().enumerate() { + let start = i * EVALS_PER_ORGANISM; + let mut avg_fitness = 0.0; + let mut avg_behavior = vec![0.0; 8]; + for j in start..start + EVALS_PER_ORGANISM { + avg_fitness += results_list[j].0; + for (k, v) in results_list[j].1.iter().enumerate() { + if k < avg_behavior.len() { + avg_behavior[k] += v; + } + } + } + avg_fitness /= EVALS_PER_ORGANISM as f64; + for v in &mut avg_behavior { + *v /= EVALS_PER_ORGANISM as f64; + } + + fitness_values.push(avg_fitness); + batch_behaviors.push(avg_behavior); + // Store raw fitness first, novelty adjustment below + organisms[idx].fitness = avg_fitness; } - let out_exp = output.clone().into_iter().map(|v| v.exp()); - let sum_exp: f64 = out_exp.clone().sum(); - let softmax = out_exp.map(|e| e / sum_exp); - let value = softmax - .enumerate() - .max_by(|(_, a), (_, b)| a.partial_cmp(b).unwrap_or(Ordering::Equal)) - .map(|(index, _)| index) - .unwrap(); - organism.activate(observation.clone(), &mut output); - let (observation_tmp, reward, done) = extract_step_result( - py, - self.env.call_method(py, "step", (value,), None).unwrap(), - ); - observation = observation_tmp; - total_reward += reward; + // Compute novelty scores using k-nearest neighbors + let archive = self.novelty_archive.read().unwrap(); + let all_behaviors: Vec<&Vec> = + archive.iter().chain(batch_behaviors.iter()).collect(); + + if all_behaviors.len() > NOVELTY_K { + for (i, &idx) in to_evaluate.iter().enumerate() { + let behavior = &batch_behaviors[i]; + let novelty = compute_novelty(behavior, &all_behaviors, NOVELTY_K); + let raw_fitness = fitness_values[i]; + + // Combined fitness: blend raw fitness with novelty + // Normalize novelty to similar scale as fitness (~0-800) + let novelty_scaled = novelty * 200.0; // scale factor + organisms[idx].fitness = + (1.0 - NOVELTY_WEIGHT) * raw_fitness + NOVELTY_WEIGHT * novelty_scaled; + } + } + + // Add behaviors to archive (randomly sample to keep bounded) + drop(archive); + let mut archive = self.novelty_archive.write().unwrap(); + for behavior in &batch_behaviors { + if archive.len() < NOVELTY_ARCHIVE_MAX { + archive.push(behavior.clone()); + } else { + // Replace random entry + let idx = rand::random::() % NOVELTY_ARCHIVE_MAX; + archive[idx] = behavior.clone(); + } + } - !done - } {} - total_reward + // Store latest behaviors for logging + *self.latest_behaviors.write().unwrap() = batch_behaviors; + }); + } + + fn threads(&self) -> usize { + LunarLanderMultiprocess::threads() } } +// ============================================================================ +// Main +// ============================================================================ + fn main() { - let max_fitness = 300f64; + // Fitness is offset by +500 (Lunar Lander returns [-500,300] -> [0,800]) + let max_fitness = 800f64; #[allow(unused_must_use)] { @@ -149,22 +484,155 @@ fn main() { #[cfg(feature = "telemetry")] telemetry_helper::enable_telemetry(format!("?max_fitness={}", max_fitness).as_str(), true); - let mut population = Population::create_population_initialized(150, 8, 4); - let mut environment = LunarLanderMultiprocess::new(); + // Load config from file or use defaults + let mut population = if let Some(config_file) = ConfigFile::load(CONFIG_FILE) { + println!("Loaded config from {}", CONFIG_FILE); + println!( + " add_connection_rate: {:.4}", + config_file.add_connection_rate + ); + println!(" add_neuron_rate: {:.4}", config_file.add_neuron_rate); + println!( + " weight_mutation_rate: {:.4}", + config_file.weight_mutation_rate + ); + if let Some(fitness) = config_file.best_fitness { + println!(" (tuned with fitness: {:.2})", fitness); + } + println!(); + let config = config_file.to_mutation_config(); + println!(); + Population::create_population_initialized_with_config(150, 8, 2, config) + } else { + println!("No {} found, using default config\n", CONFIG_FILE); + let mut config = MutationConfig::default(); + config.add_connection_rate = 0.20; + config.add_neuron_rate = 0.10; + config.weight_mutation_rate = 0.80; + config.toggle_expression_rate = 0.005; + config.compatibility_threshold = 1.5; + config.weight_init_range = 3.0; + config.weight_mutate_power = 1.5; + config.tau = 0.1; + config.step_time = 0.5; + Population::create_population_initialized_with_config(150, 8, 2, config) + }; + + let environment = LunarLanderMultiprocess::new(); let mut champion: Option = None; let mut generations = 0; + let mut best_fitness = 300.0; // Typical starting fitness (-200 + 500 offset) + let mut last_verified_fitness = 0.0; // Track last fitness we verified to avoid re-verifying same champion + let improvement_threshold = 20.0; // Show render when fitness improves by at least 20 points + + println!("Starting evolution..."); + println!("Target fitness: {}", max_fitness); + println!( + "Improvement threshold for rendering: +{} points\n", + improvement_threshold + ); + + // Performance tracking + use std::time::Instant; + let start_time = Instant::now(); + let mut last_stats_time = Instant::now(); + let mut last_stats_gen = 0; + while champion.is_none() { population.evolve(); - population.evaluate_in(&mut environment); + population.evaluate_in(&environment); + generations += 1; + + // Show performance stats every 50 generations + if generations % 50 == 0 { + let elapsed = last_stats_time.elapsed().as_secs_f64(); + let gens_since_last = generations - last_stats_gen; + let gen_per_sec = gens_since_last as f64 / elapsed; + let total_elapsed = start_time.elapsed().as_secs_f64(); + let avg_gen_per_sec = generations as f64 / total_elapsed; + + println!( + "\n[Performance] Gen {}: {:.1} gen/s (avg: {:.1} gen/s, total time: {:.1}min)", + generations, + gen_per_sec, + avg_gen_per_sec, + total_elapsed / 60.0 + ); + + last_stats_time = Instant::now(); + last_stats_gen = generations; + } + + // Log adaptive mutation status every 50 generations + if generations % 50 == 0 && population.epochs_without_improvements() > 10 { + println!( + "[Adaptive] Population stagnant for {} epochs, mutation rates boosted", + population.epochs_without_improvements() + ); + } + match population.champion { Some(_) => { let tmp_champion = population.champion.clone().unwrap(); - if generations == 30 { - environment.lunar_lander_test(&mut tmp_champion.clone(), true); - generations = 0; + let current_fitness = tmp_champion.fitness; + + // Print progress every generation + println!( + "Gen {}: Best fitness = {:.2} (species: {})", + generations, + current_fitness, + population.species.len() + ); + + // Only verify when fitness exceeds a meaningful threshold AND champion has changed + // With +500 offset: >550 is decent, >600 is good, >700 is landing + if current_fitness > 550.0 + && current_fitness > best_fitness + improvement_threshold + && current_fitness > last_verified_fitness + { + last_verified_fitness = current_fitness; // Mark as verified + + println!( + "\n=== POTENTIAL IMPROVEMENT: {:.2} -> {:.2} (+{:.2}) ===", + best_fitness, + current_fitness, + current_fitness - best_fitness + ); + println!("Verifying with 5 additional tests..."); + + // Evaluate multiple times to verify it's not just luck + let mut total_fitness = current_fitness; + for i in 1..=5 { + let test_fitness = + environment.lunar_lander_test(&mut tmp_champion.clone(), false); + println!(" Test {}/5: {:.2}", i, test_fitness); + total_fitness += test_fitness; + } + let average_fitness = total_fitness / 6.0; + + println!("Average fitness: {:.2}", average_fitness); + + // Only count as real improvement if average is better + if average_fitness > best_fitness + improvement_threshold { + println!("✓ CONFIRMED IMPROVEMENT! Rendering best attempt...\n"); + environment.lunar_lander_test(&mut tmp_champion.clone(), true); + best_fitness = average_fitness; + + // Save champion genome + let champion_data = ChampionFile::from_organism( + &tmp_champion, + current_fitness, + generations, + ); + champion_data.save(CHAMPION_FILE); + } else { + println!("✗ Not consistent enough. Continuing evolution...\n"); + } } if tmp_champion.fitness >= max_fitness { + println!("\n=== TARGET FITNESS REACHED! ==="); + println!("Verifying with second test...\n"); //check again. At least 2 successfully landing if environment.lunar_lander_test(&mut tmp_champion.clone(), true) >= max_fitness { @@ -172,9 +640,10 @@ fn main() { } } } - None => {} + None => { + println!("Gen {}: No champion yet", generations); + } } - generations += 1; } let result = champion.unwrap(); @@ -182,20 +651,3 @@ fn main() { println!("{:?}", result.genome); environment.close(); } - -fn extract_step_result(py: Python, object: PyObject) -> (Vec, f64, bool) { - ( - extract_observation(py, object.get_item(py, 0).unwrap()), - object.get_item(py, 1).unwrap().extract::(py).unwrap(), - object.get_item(py, 2).unwrap().extract::(py).unwrap(), - ) -} - -fn extract_observation(py: Python, object: PyObject) -> Vec { - let mut vec: Vec = Vec::new(); - // TODO: should be a better way to do this - for n in 0..8 { - vec.push(object.get_item(py, n).unwrap().extract::(py).unwrap()); - } - vec -} diff --git a/examples/simple_sample.rs b/examples/simple_sample.rs index 3e6f524..b0db99d 100644 --- a/examples/simple_sample.rs +++ b/examples/simple_sample.rs @@ -23,9 +23,7 @@ impl Environment for XORClassification { organism.activate(vec![1f64, 1f64], &mut output); distance += (0f64 - output[0]).powi(2); - let fitness = 16f64 / (1f64 + distance); - - fitness + 16f64 / (1f64 + distance) } } @@ -37,11 +35,11 @@ fn main() { std::thread::sleep(std::time::Duration::from_millis(2000)); let mut population = Population::create_population(150); - let mut environment = XORClassification; + let environment = XORClassification; let mut champion: Option = None; while champion.is_none() { population.evolve(); - population.evaluate_in(&mut environment); + population.evaluate_in(&environment); for organism in &population.get_organisms() { if organism.fitness > 15.5f64 { champion = Some(organism.clone()); diff --git a/examples/telemetry_helper/mod.rs b/examples/telemetry_helper/mod.rs index 448f386..ea4b1ef 100644 --- a/examples/telemetry_helper/mod.rs +++ b/examples/telemetry_helper/mod.rs @@ -17,7 +17,7 @@ pub fn enable_telemetry(query_string: &str, open: bool) { dashboard.add_graph("fitness1", "fitness", 0, 0, 4, 4); dashboard.add_graph("network1", "network", 4, 0, 4, 4); dashboard.add_graph("species1", "species", 0, 4, 4, 4); - dashboard.add_graph("approximation1", "approximation", 4, 4, 2, 2); + dashboard.add_graph("approximation1", "approximation", 4, 4, 4, 4); run_server(dashboard, query_string, open); } diff --git a/examples/test_champion.rs b/examples/test_champion.rs new file mode 100644 index 0000000..99a41fb --- /dev/null +++ b/examples/test_champion.rs @@ -0,0 +1,211 @@ +extern crate pyo3; +extern crate rustneat; +extern crate serde; +extern crate serde_json; + +use pyo3::prelude::*; +use pyo3::types::IntoPyDict; +use rustneat::{Gene, Genome, Organism}; +use serde::Deserialize; +use std::fs; + +const CHAMPION_FILE: &str = "champion.json"; + +#[derive(Debug, Deserialize)] +struct ChampionFile { + fitness: f64, + generation: usize, + neurons_len: usize, + genes: Vec<(usize, usize, f64, bool, bool)>, +} + +impl ChampionFile { + fn load(path: &str) -> Option { + let content = fs::read_to_string(path).ok()?; + serde_json::from_str(&content).ok() + } + + fn to_organism(&self) -> Organism { + let gene_vec: Vec = self + .genes + .iter() + .map(|(i, o, w, e, b)| Gene::new(*i, *o, *w, *e, *b)) + .collect(); + let last_neuron_id = if self.neurons_len > 0 { + self.neurons_len - 1 + } else { + 0 + }; + let genome = Genome::from_genes(gene_vec, last_neuron_id); + let mut org = Organism::new(genome); + org.tau = 0.1; + org.step_time = 0.5; + org + } +} + +fn run_episode( + organism: &mut Organism, + py: Python, + gym: &Bound, + render_mode: &str, +) -> (f64, Vec) { + let kwargs = [("render_mode", render_mode)].into_py_dict_bound(py); + let env = gym + .call_method("make", ("LunarLander-v3",), Some(&kwargs)) + .expect("Failed to create environment"); + + let reset_result = env.call_method0("reset").unwrap(); + let observation: Vec = reset_result.get_item(0).unwrap().extract().unwrap(); + + organism.reset_state(); + let mut obs = observation; + let mut done = false; + let mut episode_reward = 0.0; + let mut steps = 0; + let max_steps = 500; + let mut frames: Vec = Vec::new(); + + let record = render_mode == "rgb_array"; + + while !done && steps < max_steps { + if record { + let frame = env.call_method0("render").unwrap(); + frames.push(frame.unbind()); + } + + let mut outputs = vec![0.0f64; 2]; + organism.activate(obs.clone(), &mut outputs); + + let lateral = outputs[1]; + let action = if lateral < 0.33 { + 1 + } else if lateral > 0.66 { + 3 + } else if outputs[0] > 0.5 { + 2 + } else { + 0 + }; + + let step_result = env.call_method1("step", (action,)).unwrap(); + obs = step_result.get_item(0).unwrap().extract().unwrap(); + let reward: f64 = step_result.get_item(1).unwrap().extract().unwrap(); + let terminated: bool = step_result.get_item(2).unwrap().extract().unwrap(); + let truncated: bool = step_result.get_item(3).unwrap().extract().unwrap(); + + episode_reward += reward; + done = terminated || truncated; + steps += 1; + } + + if record { + let frame = env.call_method0("render").unwrap(); + frames.push(frame.unbind()); + } + + env.call_method0("close").ok(); + (episode_reward, frames) +} + +fn main() { + let args: Vec = std::env::args().collect(); + let record_mode = args.iter().any(|a| a == "--record"); + + println!("Loading champion from {}...", CHAMPION_FILE); + + let champion_data = ChampionFile::load(CHAMPION_FILE).expect("Failed to load champion.json"); + + println!("Champion info:"); + println!(" Fitness: {:.2}", champion_data.fitness); + println!(" Generation: {}", champion_data.generation); + println!(" Neurons: {}", champion_data.neurons_len); + println!(" Genes: {}", champion_data.genes.len()); + println!(); + + let mut organism = champion_data.to_organism(); + + pyo3::prepare_freethreaded_python(); + + Python::with_gil(|py| { + let gym = py + .import_bound("gymnasium") + .expect("Failed to import gymnasium"); + + if record_mode { + // Record mode: run multiple attempts, save best as GIF + println!("Recording mode: running 20 attempts...\n"); + let mut best_reward = f64::NEG_INFINITY; + let mut best_frames: Vec = Vec::new(); + + for i in 1..=20 { + let (reward, frames) = run_episode(&mut organism, py, &gym, "rgb_array"); + println!(" Attempt {}: reward = {:.2}", i, reward); + if reward > best_reward { + best_reward = reward; + best_frames = frames; + } + } + + println!( + "\nBest reward: {:.2} ({} frames)", + best_reward, + best_frames.len() + ); + println!("Saving GIF..."); + + let pil = py.import_bound("PIL.Image").expect("Failed to import PIL"); + let mut images: Vec = Vec::new(); + for frame in &best_frames { + let img = pil.call_method1("fromarray", (frame.bind(py),)).unwrap(); + images.push(img.unbind()); + } + + if !images.is_empty() { + let first = images[0].bind(py); + let rest: Vec<&Bound> = images[1..].iter().map(|i| i.bind(py)).collect(); + let save_kwargs = [ + ("save_all", true.into_py(py).into_bound(py)), + ( + "append_images", + pyo3::types::PyList::new_bound(py, &rest).into_any(), + ), + ("duration", 33i32.into_py(py).into_bound(py)), + ("loop", 0i32.into_py(py).into_bound(py)), + ] + .into_py_dict_bound(py); + + let output_path = "docs/results/lunar_lander.gif"; + first + .call_method("save", (output_path,), Some(&save_kwargs)) + .unwrap(); + println!("Saved to {}", output_path); + } + } else { + // Normal test mode + println!("Running 10 test episodes...\n"); + let mut total_reward = 0.0; + let num_tests = 10; + + for i in 1..=num_tests { + let (reward, _) = run_episode(&mut organism, py, &gym, ""); + let fitness = reward + 500.0; + total_reward += fitness; + println!( + "Test {}/{}: Fitness = {:.2} (reward = {:.2})", + i, num_tests, fitness, reward + ); + } + + let avg_fitness = total_reward / num_tests as f64; + println!("\n=== RESULTS ==="); + println!("Average fitness: {:.2}", avg_fitness); + println!("Stored fitness: {:.2}", champion_data.fitness); + + // Visual demo + println!("\nRunning visual demo..."); + let (reward, _) = run_episode(&mut organism, py, &gym, "human"); + println!("Visual demo fitness: {:.2}", reward + 500.0); + } + }); +} diff --git a/graphs/approximation.js b/graphs/approximation.js index 0d83717..35aa022 100644 --- a/graphs/approximation.js +++ b/graphs/approximation.js @@ -2,11 +2,13 @@ var svg, paths = []; var lineChart; +var register = true; + function approximation_init(id){ svg = d3.select('#' + id).append('svg'); var width = $('#' + id).children().width() / 2; var rangeX = [-width, width]; - var height = $('#' + id).children().height(); + var height = $('#' + id).children().height() / 2; var rangeY = [0, height]; for(var n=0; n<10; n++ ) { @@ -32,6 +34,12 @@ function approximation(id, value){ functionApproximations.push(value); + if (!register) return; + else { + register = false; + setTimeout(function() { register = true; }, 2000); + } + paths[0].attr("d", lineChart(functionToApproximate)); for(var n=0; n < functionApproximations.length; n++ ){ diff --git a/src/environment.rs b/src/environment.rs index 68a551e..572e5f5 100644 --- a/src/environment.rs +++ b/src/environment.rs @@ -1,14 +1,65 @@ -use organism::Organism; +use crate::organism::Organism; /// A trait that is implemented by user to allow test of the Environment. +/// +/// # Usage +/// +/// There are two ways to implement this trait: +/// +/// ## Option 1: Individual evaluation (simple) +/// Override `test()` to evaluate one organism at a time: +/// ```ignore +/// impl Environment for MyEnv { +/// fn test(&self, organism: &mut Organism) -> f64 { +/// // evaluate and return fitness +/// } +/// } +/// ``` +/// +/// ## Option 2: Batch evaluation (efficient for vectorized environments) +/// Override `test_batch()` to evaluate all organisms together, useful for +/// GPU acceleration or vectorized simulators like gymnasium's VectorEnv: +/// ```ignore +/// impl Environment for MyVectorEnv { +/// fn test_batch(&self, organisms: &mut [Organism]) { +/// // Evaluate all organisms in parallel using VectorEnv +/// // Set organism.fitness for each +/// } +/// } +/// ``` pub trait Environment: Sync { - /// This test will return the value required by this enviroment to test - /// against - fn test(&self, organism: &mut Organism) -> f64; + /// Evaluate a single organism and return its fitness. + /// + /// Override this method for simple sequential evaluation. + /// If you only use `test_batch()`, you don't need to override this. + fn test(&self, _organism: &mut Organism) -> f64 { + unimplemented!( + "Override test() for individual evaluation or test_batch() for batch evaluation" + ) + } + + /// Batch evaluation of multiple organisms. + /// + /// Default implementation calls `test()` sequentially. + /// Override this method for efficient batch evaluation, e.g., using + /// gymnasium's VectorEnv to run multiple environments in parallel. + /// + /// When overriding, you must set `organism.fitness` for each organism. + /// Note: Skip organisms with `preserve_fitness = true` (elite copies). + fn test_batch(&self, organisms: &mut [Organism]) { + for organism in organisms.iter_mut() { + if !organism.preserve_fitness { + organism.fitness = self.test(organism); + } + } + } - /// Returns the number of threads to use on evaluation. - /// Implement this method to use single thread environment returning 1. + /// Returns the number of threads to use for evaluation. + /// + /// When threads > 1, organisms are divided into chunks and each chunk + /// is passed to `test_batch()` in a separate thread. + /// Return 1 for single-threaded evaluation (all organisms in one batch). fn threads(&self) -> usize { - return num_cpus::get(); + num_cpus::get() } } diff --git a/src/gene.rs b/src/gene.rs index 5fcbce9..664e449 100644 --- a/src/gene.rs +++ b/src/gene.rs @@ -73,10 +73,15 @@ impl Gene { } } - /// Generate a weight + /// Generate a weight in [-1, 1] pub fn generate_weight() -> f64 { rand::random::>().0 * 2f64 - 1f64 } + + /// Generate a weight in [-range, range] + pub fn generate_weight_in_range(range: f64) -> f64 { + rand::random::>().0 * 2.0 * range - range + } /// Connection in -> pub fn in_neuron_id(&self) -> usize { self.in_neuron_id diff --git a/src/genome.rs b/src/genome.rs index b840034..8f97c7a 100644 --- a/src/genome.rs +++ b/src/genome.rs @@ -1,5 +1,5 @@ -use gene::Gene; -use mutation::Mutation; +use crate::gene::Gene; +use crate::mutation::Mutation; use rand::{self, Closed01}; use std::cmp; @@ -11,14 +11,32 @@ pub struct Genome { last_neuron_id: usize, } -const MUTATE_CONNECTION_WEIGHT: f64 = 0.90f64; -const MUTATE_ADD_CONNECTION: f64 = 0.005f64; -const MUTATE_ADD_NEURON: f64 = 0.004f64; -const MUTATE_TOGGLE_EXPRESSION: f64 = 0.001f64; -const MUTATE_CONNECTION_WEIGHT_PERTURBED_PROBABILITY: f64 = 0.90f64; -const MUTATE_TOGGLE_BIAS: f64 = 0.01; +pub(crate) const MUTATE_CONNECTION_WEIGHT: f64 = 0.90f64; +pub(crate) const MUTATE_ADD_CONNECTION: f64 = 0.005f64; +pub(crate) const MUTATE_ADD_NEURON: f64 = 0.004f64; +pub(crate) const MUTATE_TOGGLE_EXPRESSION: f64 = 0.001f64; +pub(crate) const MUTATE_CONNECTION_WEIGHT_PERTURBED_PROBABILITY: f64 = 0.90f64; +pub(crate) const MUTATE_TOGGLE_BIAS: f64 = 0.01; +pub(crate) const COMPATIBILITY_THRESHOLD: f64 = 3f64; impl Genome { + /// Create a genome from serialized gene data + pub fn from_genes(genes: Vec, last_neuron_id: usize) -> Genome { + let mut genome = Genome { + genes: Vec::new(), + last_neuron_id, + }; + for gene in genes { + // Directly add gene without validation since we're reconstructing + match genome.genes.binary_search(&gene) { + Ok(pos) => genome.genes[pos].set_enabled(), + Err(_) => genome.genes.push(gene), + } + } + genome.genes.sort(); + genome + } + ///Add initial input and output neurons interconnected pub fn new_initialized(input_neurons: usize, output_neurons: usize) -> Genome { let mut genome = Genome::default(); @@ -30,26 +48,44 @@ impl Genome { genome } + /// Create genome with input/output neuron IDs but NO connections. + /// NEAT will discover connections through mutation. + pub fn new_unconnected(input_neurons: usize, output_neurons: usize) -> Genome { + Genome { + genes: Vec::new(), + last_neuron_id: if input_neurons + output_neurons > 0 { + input_neurons + output_neurons - 1 + } else { + 0 + }, + } + } + /// May add a connection &| neuron &| mutat connection weight &| /// enable/disable connection pub fn mutate(&mut self) { - if rand::random::>().0 < MUTATE_ADD_CONNECTION || self.genes.is_empty() { - self.mutate_add_connection(); + self.mutate_with_config(&crate::mutation_config::MutationConfig::default()); + } + + /// Mutate using specific mutation rates from config + pub fn mutate_with_config(&mut self, config: &crate::mutation_config::MutationConfig) { + if rand::random::>().0 < config.add_connection_rate || self.genes.is_empty() { + self.mutate_add_connection_with_config(config); }; - if rand::random::>().0 < MUTATE_ADD_NEURON { + if rand::random::>().0 < config.add_neuron_rate { self.mutate_add_neuron(); }; - if rand::random::>().0 < MUTATE_CONNECTION_WEIGHT { - self.mutate_connection_weight(); + if rand::random::>().0 < config.weight_mutation_rate { + self.mutate_connection_weight_with_config(config); }; - if rand::random::>().0 < MUTATE_TOGGLE_EXPRESSION { + if rand::random::>().0 < config.toggle_expression_rate { self.mutate_toggle_expression(); }; - if rand::random::>().0 < MUTATE_TOGGLE_BIAS { + if rand::random::>().0 < config.toggle_bias_rate { self.mutate_toggle_bias(); }; } @@ -65,18 +101,48 @@ impl Genome { fn mate_genes(&self, other: &Genome) -> Genome { let mut genome = Genome::default(); + // NEAT paper: 40% of crossovers use average weights for matching genes + let use_average_weights = rand::random::() < 0.4; + for gene in &self.genes { - genome.add_gene({ - //Only mate half of the genes randomly - if rand::random::() > 0.5f64 { + let mut child_gene = match other.genes.binary_search(gene) { + Ok(position) => { + // Matching gene in both parents + if use_average_weights { + // Inherit average weight from both parents + let mut avg_gene = *gene; + avg_gene.set_weight((gene.weight() + other.genes[position].weight()) / 2.0); + avg_gene + } else if rand::random::() > 0.5 { + *gene + } else { + other.genes[position] + } + } + Err(_) => { + // Disjoint/excess gene: inherit from fitter parent (self) *gene + } + }; + + // NEAT rule: if gene is disabled in either parent, 25% chance offspring has it disabled + // (reduced from 75% to allow more gene reactivation) + let other_gene_disabled = other + .genes + .binary_search(gene) + .ok() + .map(|pos| !other.genes[pos].enabled()) + .unwrap_or(false); + + if !gene.enabled() || other_gene_disabled { + if rand::random::() < 0.25 { + child_gene.set_disabled(); } else { - match other.genes.binary_search(gene) { - Ok(position) => other.genes[position], - Err(_) => *gene, - } + child_gene.set_enabled(); } - }); + } + + genome.add_gene(child_gene); } genome } @@ -101,6 +167,13 @@ impl Genome { } fn mutate_add_connection(&mut self) { + self.mutate_add_connection_with_config(&crate::mutation_config::MutationConfig::default()); + } + + fn mutate_add_connection_with_config( + &mut self, + config: &crate::mutation_config::MutationConfig, + ) { let mut rng = rand::thread_rng(); let neuron_ids_to_connect = { if self.last_neuron_id == 0 { @@ -109,15 +182,35 @@ impl Genome { rand::seq::sample_iter(&mut rng, 0..self.last_neuron_id + 1, 2).unwrap() } }; - self.add_connection(neuron_ids_to_connect[0], neuron_ids_to_connect[1]); + let gene = Gene::new( + neuron_ids_to_connect[0], + neuron_ids_to_connect[1], + Gene::generate_weight_in_range(config.weight_init_range), + true, + false, + ); + self.add_gene(gene); } fn mutate_connection_weight(&mut self) { + self.mutate_connection_weight_with_config( + &crate::mutation_config::MutationConfig::default(), + ); + } + + fn mutate_connection_weight_with_config( + &mut self, + config: &crate::mutation_config::MutationConfig, + ) { for gene in &mut self.genes { - ::connection_weight( - gene, - rand::random::() < MUTATE_CONNECTION_WEIGHT_PERTURBED_PROBABILITY, - ); + if rand::random::() < config.weight_perturbation_rate { + // Perturbation: add small random value + let perturbation = Gene::generate_weight_in_range(config.weight_mutate_power); + gene.set_weight(gene.weight() + perturbation); + } else { + // Replace with new random weight + gene.set_weight(Gene::generate_weight_in_range(config.weight_init_range)); + } } } @@ -181,7 +274,12 @@ impl Genome { /// Compare another Genome for species equality // TODO This should be impl Eq pub fn is_same_specie(&self, other: &Genome) -> bool { - self.compatibility_distance(other) < 1f64 + self.is_same_specie_with_threshold(other, COMPATIBILITY_THRESHOLD) + } + + /// Compare another Genome for species equality using a custom threshold + pub fn is_same_specie_with_threshold(&self, other: &Genome, threshold: f64) -> bool { + self.compatibility_distance(other) < threshold } /// Total weigths of all genes @@ -233,7 +331,11 @@ impl Genome { }); // if no matching genes then are completely different - w = if n3 == 0 { 1f64 } else { w / n3 as f64 }; + w = if n3 == 0 { + COMPATIBILITY_THRESHOLD + } else { + w / n3 as f64 + }; // compatibility distance (c2 * d as f64 / n as f64) + c3 * w @@ -301,8 +403,8 @@ mod tests { genome1.add_gene(Gene::new(0, 0, 1f64, true, false)); genome1.add_gene(Gene::new(0, 1, 1f64, true, false)); let mut genome2 = Genome::default(); - genome2.add_gene(Gene::new(0, 0, 5f64, true, false)); - genome2.add_gene(Gene::new(0, 1, 5f64, true, false)); + genome2.add_gene(Gene::new(0, 0, 20f64, true, false)); + genome2.add_gene(Gene::new(0, 1, 20f64, true, false)); genome2.add_gene(Gene::new(0, 2, 1f64, true, false)); genome2.add_gene(Gene::new(0, 3, 1f64, true, false)); assert!(!genome1.is_same_specie(&genome2)); @@ -344,7 +446,7 @@ mod tests { let mut genome1 = Genome::default(); genome1.add_gene(Gene::new(0, 0, 5f64, true, false)); let mut genome2 = Genome::default(); - genome2.add_gene(Gene::new(0, 0, 15f64, true, false)); + genome2.add_gene(Gene::new(0, 0, 25f64, true, false)); assert!(!genome1.is_same_specie(&genome2)); } @@ -365,4 +467,33 @@ mod tests { assert_eq!(genome1.genes[5].in_neuron_id(), 1); assert_eq!(genome1.genes[5].out_neuron_id(), 4); } + + #[test] + fn crossover_disabled_gene_should_stay_disabled_25_percent() { + // Parent 1 has disabled gene, parent 2 has enabled gene + let mut genome1 = Genome::default(); + genome1.add_gene(Gene::new(0, 1, 1.0, false, false)); // disabled + + let mut genome2 = Genome::default(); + genome2.add_gene(Gene::new(0, 1, 1.0, true, false)); // enabled + + // Run many trials to check probability + let trials = 1000; + let mut disabled_count = 0; + for _ in 0..trials { + let child = genome1.mate(&genome2, true); + if !child.genes[0].enabled() { + disabled_count += 1; + } + } + + // Should be approximately 25% disabled (allow ±10% margin) + // (reduced from NEAT's 75% to allow more gene reactivation) + let disabled_ratio = disabled_count as f64 / trials as f64; + assert!( + disabled_ratio > 0.15 && disabled_ratio < 0.35, + "Expected ~25% disabled, got {}%", + disabled_ratio * 100.0 + ); + } } diff --git a/src/lib.rs b/src/lib.rs index 7bdabbf..17f8a6b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -40,6 +40,7 @@ pub use self::ctrnn::Ctrnn; pub use self::environment::Environment; pub use self::gene::Gene; pub use self::genome::Genome; +pub use self::mutation_config::MutationConfig; pub use self::organism::Organism; pub use self::population::Population; pub use self::specie::Specie; @@ -53,6 +54,8 @@ mod gene; /// A collection of genes pub mod genome; mod mutation; +/// Configurable mutation rates +pub mod mutation_config; /// A genome plus fitness pub mod organism; /// A collection of species with champion diff --git a/src/mutation.rs b/src/mutation.rs index b08fc6f..b8f8a4b 100644 --- a/src/mutation.rs +++ b/src/mutation.rs @@ -1,4 +1,4 @@ -use gene::Gene; +use crate::gene::Gene; pub trait Mutation {} @@ -56,7 +56,7 @@ impl dyn Mutation { #[cfg(test)] mod tests { use super::*; - use gene::Gene; + use crate::gene::Gene; #[test] fn mutate_toggle_gene_should_toggle() { diff --git a/src/mutation_config.rs b/src/mutation_config.rs new file mode 100644 index 0000000..f72e3be --- /dev/null +++ b/src/mutation_config.rs @@ -0,0 +1,161 @@ +use crate::genome::{ + COMPATIBILITY_THRESHOLD, MUTATE_ADD_CONNECTION, MUTATE_ADD_NEURON, MUTATE_CONNECTION_WEIGHT, + MUTATE_CONNECTION_WEIGHT_PERTURBED_PROBABILITY, MUTATE_TOGGLE_BIAS, MUTATE_TOGGLE_EXPRESSION, +}; + +/// Configuration for mutation rates in NEAT +/// +/// Allows customizing mutation probabilities per problem. +/// Use `MutationConfig::default()` for standard NEAT values defined in `genome.rs`. +#[derive(Debug, Clone, Copy)] +pub struct MutationConfig { + /// Probability of mutating connection weights + pub weight_mutation_rate: f64, + /// Probability of adding a new connection + pub add_connection_rate: f64, + /// Probability of adding a new neuron + pub add_neuron_rate: f64, + /// Probability of toggling a connection's enabled state + pub toggle_expression_rate: f64, + /// Probability of perturbing vs replacing weight + pub weight_perturbation_rate: f64, + /// Probability of toggling bias + pub toggle_bias_rate: f64, + /// Compatibility threshold for speciation + pub compatibility_threshold: f64, + /// Probability of mutating vs crossing over (0.0 = all crossover, 1.0 = all mutation) + pub mutation_probability: f64, + /// Range for initial weight generation: [-weight_init_range, weight_init_range] + pub weight_init_range: f64, + /// Power of weight perturbation: random value in [-weight_mutate_power, weight_mutate_power] + pub weight_mutate_power: f64, + /// CTRNN neuron time constant τ (default 0.01). + /// Represents how fast neurons respond — like biological membrane resistance time. + /// Small τ (e.g. 0.01): neurons react instantly, network behaves as feedforward. + /// Large τ (e.g. 0.1-1.0): neurons have inertia, network retains temporal memory. + /// What matters is the ratio dt/τ where dt=0.01 is the simulation step. + pub tau: f64, + /// Simulated time per activate() call in seconds (default 0.1). + /// With dt=0.01, this means 10 Euler integration steps per activation. + /// More time = more steps = more accurate convergence but slower execution. + pub step_time: f64, +} + +impl Default for MutationConfig { + fn default() -> Self { + MutationConfig { + weight_mutation_rate: MUTATE_CONNECTION_WEIGHT, + add_connection_rate: MUTATE_ADD_CONNECTION, + add_neuron_rate: MUTATE_ADD_NEURON, + toggle_expression_rate: MUTATE_TOGGLE_EXPRESSION, + weight_perturbation_rate: MUTATE_CONNECTION_WEIGHT_PERTURBED_PROBABILITY, + toggle_bias_rate: MUTATE_TOGGLE_BIAS, + compatibility_threshold: COMPATIBILITY_THRESHOLD, + mutation_probability: 0.4, + weight_init_range: 1.0, + weight_mutate_power: 1.0, + tau: 0.01, + step_time: 0.1, + } + } +} + +impl MutationConfig { + /// Create a new configuration with custom values + pub fn new() -> MutationConfigBuilder { + MutationConfigBuilder::default() + } +} + +/// Builder for MutationConfig +#[derive(Debug, Clone, Copy)] +pub struct MutationConfigBuilder { + config: MutationConfig, +} + +impl Default for MutationConfigBuilder { + fn default() -> Self { + MutationConfigBuilder { + config: MutationConfig::default(), + } + } +} + +impl MutationConfigBuilder { + /// Set weight mutation rate + pub fn weight_mutation_rate(mut self, rate: f64) -> Self { + self.config.weight_mutation_rate = rate; + self + } + + /// Set add connection rate + pub fn add_connection_rate(mut self, rate: f64) -> Self { + self.config.add_connection_rate = rate; + self + } + + /// Set add neuron rate + pub fn add_neuron_rate(mut self, rate: f64) -> Self { + self.config.add_neuron_rate = rate; + self + } + + /// Set toggle expression rate + pub fn toggle_expression_rate(mut self, rate: f64) -> Self { + self.config.toggle_expression_rate = rate; + self + } + + /// Set weight perturbation rate + pub fn weight_perturbation_rate(mut self, rate: f64) -> Self { + self.config.weight_perturbation_rate = rate; + self + } + + /// Set toggle bias rate + pub fn toggle_bias_rate(mut self, rate: f64) -> Self { + self.config.toggle_bias_rate = rate; + self + } + + /// Set compatibility threshold + pub fn compatibility_threshold(mut self, threshold: f64) -> Self { + self.config.compatibility_threshold = threshold; + self + } + + /// Set mutation vs crossover probability (0.4 = 40% mutation, 60% crossover) + pub fn mutation_probability(mut self, prob: f64) -> Self { + self.config.mutation_probability = prob; + self + } + + /// Set weight initialization range [-range, range] + pub fn weight_init_range(mut self, range: f64) -> Self { + self.config.weight_init_range = range; + self + } + + /// Set weight mutation perturbation power [-power, power] + pub fn weight_mutate_power(mut self, power: f64) -> Self { + self.config.weight_mutate_power = power; + self + } + + /// Set CTRNN time constant + pub fn tau(mut self, tau: f64) -> Self { + self.config.tau = tau; + self + } + + /// Set CTRNN integration time per activate() call + pub fn step_time(mut self, step_time: f64) -> Self { + self.config.step_time = step_time; + self + } + + /// Build the configuration + pub fn build(self) -> MutationConfig { + self.config + } +} diff --git a/src/organism.rs b/src/organism.rs index 6cdbd5e..680cbac 100644 --- a/src/organism.rs +++ b/src/organism.rs @@ -1,5 +1,5 @@ -use ctrnn::{Ctrnn, CtrnnNeuralNetwork}; -use genome::Genome; +use crate::ctrnn::{Ctrnn, CtrnnNeuralNetwork}; +use crate::genome::Genome; use std::cmp; use std::cmp::Ordering; @@ -10,6 +10,38 @@ use std::cmp::Ordering; pub struct Organism { pub genome: Genome, pub fitness: f64, + /// Fitness adjusted by species size (fitness sharing) + pub adjusted_fitness: f64, + /// If true, skip evaluation and preserve current fitness (used for elitism) + pub preserve_fitness: bool, + /// Persistent CTRNN state across activate() calls within an episode + ctrnn_state: Vec, + /// CTRNN neuron time constant τ (default 0.01). + /// Small τ = feedforward (instant response), large τ = temporal memory (slow response). + pub tau: f64, + /// Simulated time per activate() call in seconds (default 0.1). + /// Number of Euler steps = step_time / dt where dt=0.01. + pub step_time: f64, +} + +impl Ord for Organism { + fn cmp(&self, other: &Self) -> Ordering { + other.fitness.partial_cmp(&self.fitness).unwrap() + } +} + +impl Eq for Organism {} + +impl PartialEq for Organism { + fn eq(&self, other: &Self) -> bool { + self.fitness == other.fitness + } +} + +impl PartialOrd for Organism { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } } impl Ord for Organism { @@ -38,27 +70,52 @@ impl Organism { Organism { genome: genome, fitness: 0f64, + adjusted_fitness: 0f64, + preserve_fitness: false, + ctrnn_state: vec![], + tau: 0.01, + step_time: 0.1, } } /// Return a new Orgnaism by mutating this Genome and fitness of zero pub fn mutate(&self) -> Organism { let mut new_genome = self.genome.clone(); new_genome.mutate(); - Organism::new(new_genome) + let mut child = Organism::new(new_genome); + child.tau = self.tau; + child.step_time = self.step_time; + child + } + /// Return a new Organism by mutating with specific config + pub fn mutate_with_config(&self, config: &crate::mutation_config::MutationConfig) -> Organism { + let mut new_genome = self.genome.clone(); + new_genome.mutate_with_config(config); + let mut child = Organism::new(new_genome); + child.tau = self.tau; + child.step_time = self.step_time; + child } /// Mate this organism with another pub fn mate(&self, other: &Organism) -> Organism { - Organism::new( + let mut child = Organism::new( self.genome .mate(&other.genome, self.fitness < other.fitness), - ) + ); + child.tau = self.tau; + child.step_time = self.step_time; + child } + /// Reset the internal CTRNN state (call at the start of each episode) + pub fn reset_state(&mut self) { + self.ctrnn_state = vec![]; + } + /// Activate this organism in the NN pub fn activate(&mut self, sensors: Vec, outputs: &mut Vec) { let neurons_len = self.genome.len(); let sensors_len = sensors.len(); - let tau = vec![0.01; neurons_len]; + let tau = vec![self.tau; neurons_len]; let theta = self.get_bias(); let mut i = sensors.clone(); @@ -71,11 +128,16 @@ impl Organism { let wji = self.get_weights(); + // Initialize state if needed (first call or after reset_state()) + if self.ctrnn_state.len() != neurons_len { + self.ctrnn_state = vec![0.0; neurons_len]; + } + let activations = Ctrnn::default().activate_nn( - 0.1, + self.step_time, 0.01, &CtrnnNeuralNetwork { - y: &vec![0.0; neurons_len], + y: &self.ctrnn_state.clone(), tau: &tau, wji: &wji, theta: &theta, @@ -83,6 +145,9 @@ impl Organism { }, ); + // Persist state for next activate() call + self.ctrnn_state = activations.clone(); + if sensors_len < neurons_len { let outputs_activations = activations.split_at(sensors_len).1.to_vec(); @@ -116,12 +181,12 @@ impl Organism { } #[cfg(test)] -use gene::Gene; +use crate::gene::Gene; #[cfg(test)] mod tests { use super::*; - use genome::Genome; + use crate::genome::Genome; #[test] fn should_propagate_signal_without_hidden_layers() { diff --git a/src/population.rs b/src/population.rs index 8dc4922..395ae3d 100644 --- a/src/population.rs +++ b/src/population.rs @@ -1,7 +1,7 @@ +use crate::environment::Environment; +use crate::genome::Genome; +use crate::organism::Organism; use conv::prelude::*; -use environment::Environment; -use genome::Genome; -use organism::Organism; use std::cmp::Ordering; #[cfg(feature = "telemetry")] use std::time::{SystemTime, UNIX_EPOCH}; @@ -12,8 +12,9 @@ use rusty_dashed; #[cfg(feature = "telemetry")] use serde_json; -use specie::Specie; -use species_evaluator::SpeciesEvaluator; +use crate::mutation_config::MutationConfig; +use crate::specie::Specie; +use crate::species_evaluator::SpeciesEvaluator; /// All species in the network #[derive(Debug)] @@ -24,9 +25,13 @@ pub struct Population { epochs_without_improvements: usize, /// champion of the population pub champion: Option, + /// Mutation configuration + pub mutation_config: MutationConfig, } -const MAX_EPOCHS_WITHOUT_IMPROVEMENTS: usize = 10; +const MAX_EPOCHS_WITHOUT_IMPROVEMENTS: usize = 50; +const STAGNATION_THRESHOLD: usize = 15; // Remove species after 15 generations without improvement +const SPECIES_ELITISM: usize = 2; // Protect top 2 species from stagnation removal impl Population { /// Create a new population of size X. @@ -36,6 +41,7 @@ impl Population { champion_fitness: 0f64, champion: None, epochs_without_improvements: 0usize, + mutation_config: MutationConfig::default(), }; population.create_organisms(population_size); @@ -53,12 +59,52 @@ impl Population { champion_fitness: 0f64, champion: None, epochs_without_improvements: 0usize, + mutation_config: MutationConfig::default(), }; population.create_organisms_initialized(population_size, input_neurons, output_neurons); population } + /// Create a population with custom mutation configuration + pub fn create_population_initialized_with_config( + population_size: usize, + input_neurons: usize, + output_neurons: usize, + config: MutationConfig, + ) -> Population { + let mut population = Population { + species: vec![], + champion_fitness: 0f64, + champion: None, + epochs_without_improvements: 0usize, + mutation_config: config, + }; + + population.create_organisms_initialized(population_size, input_neurons, output_neurons); + population + } + + /// Create a population with unconnected genomes (no initial connections). + /// NEAT will discover connections through structural mutation. + pub fn create_population_unconnected_with_config( + population_size: usize, + input_neurons: usize, + output_neurons: usize, + config: MutationConfig, + ) -> Population { + let mut population = Population { + species: vec![], + champion_fitness: 0f64, + champion: None, + epochs_without_improvements: 0usize, + mutation_config: config, + }; + + population.create_organisms_unconnected(population_size, input_neurons, output_neurons); + population + } + /// Find total of all organisms in the population pub fn size(&self) -> usize { self.species @@ -66,15 +112,63 @@ impl Population { .fold(0usize, |total, specie| total + specie.organisms.len()) } + /// Compute adaptive mutation config based on population-level stagnation. + /// After 10 epochs without improvement, structural mutation rates scale up, + /// capped at 5x at 40 epochs. + fn adaptive_config(&self) -> MutationConfig { + const STAGNATION_START: usize = 5; + const STAGNATION_FULL: usize = 20; + const MAX_MULTIPLIER: f64 = 5.0; + + let stagnation = self.epochs_without_improvements; + if stagnation <= STAGNATION_START { + return self.mutation_config; + } + + let progress = ((stagnation - STAGNATION_START) as f64) + / ((STAGNATION_FULL - STAGNATION_START) as f64); + let multiplier = 1.0 + (MAX_MULTIPLIER - 1.0) * progress.min(1.0); + + // Scale mutation_probability from base up to 0.8 when fully stagnant + let base_mut_prob = self.mutation_config.mutation_probability; + let adaptive_mut_prob = + (base_mut_prob + (0.8 - base_mut_prob) * progress.min(1.0)).min(0.8); + + MutationConfig { + add_connection_rate: (self.mutation_config.add_connection_rate * multiplier).min(0.30), + add_neuron_rate: (self.mutation_config.add_neuron_rate * multiplier).min(0.20), + toggle_expression_rate: (self.mutation_config.toggle_expression_rate * multiplier) + .min(0.25), + toggle_bias_rate: (self.mutation_config.toggle_bias_rate * multiplier).min(0.10), + weight_mutation_rate: self.mutation_config.weight_mutation_rate, + weight_perturbation_rate: self.mutation_config.weight_perturbation_rate, + compatibility_threshold: self.mutation_config.compatibility_threshold, + mutation_probability: adaptive_mut_prob, + weight_init_range: self.mutation_config.weight_init_range, + weight_mutate_power: self.mutation_config.weight_mutate_power, + tau: self.mutation_config.tau, + step_time: self.mutation_config.step_time, + } + } + /// Create offspring by mutation and mating. May create new species. pub fn evolve(&mut self) { self.generate_offspring(); } - /// TODO - pub fn evaluate_in(&mut self, environment: &mut dyn Environment) { + /// Evaluate all organisms in the population using the given environment. + pub fn evaluate_in(&mut self, environment: &dyn Environment) { let champion = SpeciesEvaluator::new(environment).evaluate(&mut self.species); + // Apply fitness sharing and update stagnation tracking + for specie in &mut self.species { + specie.adjust_fitness(); + specie.update_stagnation(); + } + + // Remove stagnant species (but protect top 2 by fitness) + self.remove_stagnant_species(STAGNATION_THRESHOLD, SPECIES_ELITISM); + #[cfg(feature = "telemetry")] telemetry!("fitness1", 1.0, format!("{}", self.champion_fitness)); @@ -89,10 +183,38 @@ impl Population { ); self.epochs_without_improvements = 0usize; self.champion = Some(champion.clone()); + self.champion_fitness = champion.fitness; } self.champion_fitness = champion.fitness; } + /// Remove species that haven't improved for too long + fn remove_stagnant_species(&mut self, max_generations: usize, protect_top_n: usize) { + if self.species.len() <= protect_top_n { + return; + } + + // Sort by champion fitness descending to identify top species + self.species.sort_by(|a, b| { + b.calculate_champion_fitness() + .partial_cmp(&a.calculate_champion_fitness()) + .unwrap_or(Ordering::Equal) + }); + + // Mark which species to keep (top N are protected) + let mut to_remove = vec![]; + for (i, specie) in self.species.iter().enumerate() { + if i >= protect_top_n && specie.is_stagnant(max_generations) { + to_remove.push(i); + } + } + + // Remove stagnant species (in reverse order to preserve indices) + for i in to_remove.into_iter().rev() { + self.species.remove(i); + } + } + /// Return all organisms of the population pub fn get_organisms(&self) -> Vec { self.species @@ -115,14 +237,16 @@ impl Population { let num_of_organisms = self.size(); let organisms = self.get_organisms(); + let config = self.adaptive_config(); if self.epochs_without_improvements > MAX_EPOCHS_WITHOUT_IMPROVEMENTS { let mut best_species = self.get_best_species(); let num_of_selected = best_species.len(); for specie in &mut best_species { - specie.generate_offspring( + specie.generate_offspring_with_config( num_of_organisms.checked_div(num_of_selected).unwrap(), &organisms, + &config, ); } self.epochs_without_improvements = 0; @@ -140,7 +264,7 @@ impl Population { (specie_fitness * organisms_by_average_fitness).round() as usize }; if offspring_size > 0 { - specie.generate_offspring(offspring_size, &organisms); + specie.generate_offspring_with_config(offspring_size, &organisms, &config); } else { specie.remove_organisms(); } @@ -152,15 +276,16 @@ impl Population { return self.species.clone(); } + // Sort by champion fitness descending (best first) self.species.sort_by(|specie1, specie2| { - if specie1.calculate_champion_fitness() > specie2.calculate_champion_fitness() { - Ordering::Greater - } else { - Ordering::Less - } + specie2 + .calculate_champion_fitness() + .partial_cmp(&specie1.calculate_champion_fitness()) + .unwrap_or(Ordering::Equal) }); - self.species[1..2].to_vec().clone() + // Return the top 2 species + self.species[0..2].to_vec() } fn speciate(&mut self) { @@ -194,11 +319,12 @@ impl Population { next_specie_id += 1; } + let threshold = self.mutation_config.compatibility_threshold; for organism in organisms { match self .species .iter_mut() - .find(|specie| specie.match_genome(organism)) + .find(|specie| specie.match_genome_with_threshold(organism, threshold)) { Some(specie) => { specie.add(organism.clone()); @@ -225,10 +351,31 @@ impl Population { let mut organisms = vec![]; while organisms.len() < population_size { - organisms.push(Organism::new(Genome::new_initialized( - input_neurons, - output_neurons, - ))); + let mut org = Organism::new(Genome::new_initialized(input_neurons, output_neurons)); + org.tau = self.mutation_config.tau; + org.step_time = self.mutation_config.step_time; + organisms.push(org); + } + + let mut specie = Specie::new(organisms.first().unwrap().genome.clone()); + specie.organisms = organisms; + self.species.push(specie); + } + + fn create_organisms_unconnected( + &mut self, + population_size: usize, + input_neurons: usize, + output_neurons: usize, + ) { + self.species = vec![]; + let mut organisms = vec![]; + + while organisms.len() < population_size { + let mut org = Organism::new(Genome::new_unconnected(input_neurons, output_neurons)); + org.tau = self.mutation_config.tau; + org.step_time = self.mutation_config.step_time; + organisms.push(org); } let mut specie = Specie::new(organisms.first().unwrap().genome.clone()); @@ -242,14 +389,14 @@ impl Population { } #[cfg(test)] -use gene::Gene; +use crate::gene::Gene; #[cfg(test)] mod tests { use super::*; - use genome::Genome; - use organism::Organism; - use specie::Specie; + use crate::genome::Genome; + use crate::organism::Organism; + use crate::specie::Specie; #[test] fn population_should_be_able_to_speciate_genomes() { @@ -257,12 +404,11 @@ mod tests { genome1.add_gene(Gene::new(0, 0, 1f64, true, false)); genome1.add_gene(Gene::new(0, 1, 1f64, true, false)); let mut genome2 = Genome::default(); - genome1.add_gene(Gene::new(0, 0, 1f64, true, false)); - genome1.add_gene(Gene::new(0, 1, 1f64, true, false)); genome2.add_gene(Gene::new(1, 1, 1f64, true, false)); genome2.add_gene(Gene::new(1, 0, 1f64, true, false)); let mut population = Population::create_population(2); + population.mutation_config.compatibility_threshold = 1.0; let organisms = vec![Organism::new(genome1), Organism::new(genome2)]; let mut specie = Specie::new(organisms.first().unwrap().genome.clone()); specie.organisms = organisms; diff --git a/src/specie.rs b/src/specie.rs index 58679d9..904c010 100644 --- a/src/specie.rs +++ b/src/specie.rs @@ -1,8 +1,8 @@ +use crate::genome::Genome; +use crate::mutation_config::MutationConfig; +use crate::organism::Organism; use conv::prelude::*; -use genome::Genome; -use organism::Organism; use rand; -use rand::distributions::{IndependentSample, Range}; use rand::Rng; /// A species (several organisms) and associated fitnesses @@ -19,9 +19,8 @@ pub struct Specie { pub id: i64, } -const MUTATION_PROBABILITY: f64 = 0.25f64; -const INTERSPECIE_MATE_PROBABILITY: f64 = 0.001f64; -const BEST_ORGANISMS_THRESHOLD: f64 = 1f64; +const INTERSPECIE_MATE_PROBABILITY: f64 = 0.15f64; // Increased from 0.03 to escape local optima +const BEST_ORGANISMS_THRESHOLD: f64 = 0.5f64; // Only top 50% can reproduce impl Specie { /// Create a new species from a Genome @@ -47,6 +46,12 @@ impl Specie { self.representative.is_same_specie(&organism.genome) } + /// Check if another organism is of the same species using a custom threshold. + pub fn match_genome_with_threshold(&self, organism: &Organism, threshold: f64) -> bool { + self.representative + .is_same_specie_with_threshold(&organism.genome, threshold) + } + /// Get the most performant organism pub fn calculate_champion_fitness(&self) -> f64 { self.organisms.iter().fold(0f64, |max, organism| { @@ -58,6 +63,29 @@ impl Specie { }) } + /// Update stagnation tracking. Call after evaluation. + /// Returns true if species improved this generation. + pub fn update_stagnation(&mut self) -> bool { + let current_best = self.calculate_champion_fitness(); + if current_best > self.champion_fitness { + self.champion_fitness = current_best; + self.age_last_improvement = self.age; + true + } else { + false + } + } + + /// Check if species has stagnated (no improvement for max_generations) + pub fn is_stagnant(&self, max_generations: usize) -> bool { + self.age > self.age_last_improvement + max_generations + } + + /// Get generations since last improvement + pub fn generations_without_improvement(&self) -> usize { + self.age.saturating_sub(self.age_last_improvement) + } + /// Work out average fitness of this species pub fn calculate_average_fitness(&mut self) -> f64 { let organisms_count = self.organisms.len().value_as::().unwrap(); @@ -86,10 +114,25 @@ impl Specie { &mut self, num_of_organisms: usize, population_organisms: &[Organism], + ) { + self.generate_offspring_with_config( + num_of_organisms, + population_organisms, + &MutationConfig::default(), + ); + } + + /// Generate offspring with a specific mutation config (supports adaptive mutation) + pub fn generate_offspring_with_config( + &mut self, + num_of_organisms: usize, + population_organisms: &[Organism], + base_config: &MutationConfig, ) { self.age += 1; - let copy_champion = if num_of_organisms > 5 { 1 } else { 0 }; + // Always copy champion (elitism) + let copy_champion = if num_of_organisms > 1 { 1 } else { 0 }; let mut organisms_to_mate = (self.organisms.len() as f64 * BEST_ORGANISMS_THRESHOLD) as usize; @@ -100,17 +143,45 @@ impl Specie { self.organisms.sort(); self.organisms.truncate(organisms_to_mate); - let mut rng = rand::thread_rng(); let mut offspring: Vec = { + // Fitness-proportionate selection (roulette wheel) using adjusted_fitness + let mut rng = rand::thread_rng(); + + // Calculate total adjusted fitness for roulette wheel + let total_adjusted_fitness: f64 = self + .organisms + .iter() + .map(|o| o.adjusted_fitness.max(0.0)) + .sum(); + let mut selected_organisms = vec![]; - let range = Range::new(0, self.organisms.len()); for _ in 0..num_of_organisms - copy_champion { - selected_organisms.push(range.ind_sample(&mut rng)); + if total_adjusted_fitness <= 0.0 { + // Fallback to uniform selection if no positive fitness + selected_organisms.push(rng.gen_range(0, self.organisms.len())); + } else { + // Roulette wheel selection + let spin = rng.gen_range(0.0, total_adjusted_fitness); + let mut cumulative = 0.0; + let mut selected = 0; + for (i, organism) in self.organisms.iter().enumerate() { + cumulative += organism.adjusted_fitness.max(0.0); + if cumulative >= spin { + selected = i; + break; + } + } + selected_organisms.push(selected); + } } selected_organisms .iter() .map(|organism_pos| { - self.create_child(&self.organisms[*organism_pos], population_organisms) + self.create_child( + &self.organisms[*organism_pos], + population_organisms, + base_config, + ) }) .collect::>() }; @@ -125,7 +196,10 @@ impl Specie { } }); - offspring.push(champion.unwrap()); + // Mark champion copy to preserve its fitness (skip re-evaluation) + let mut elite = champion.unwrap(); + elite.preserve_fitness = true; + offspring.push(elite); } self.organisms = offspring; } @@ -146,7 +220,6 @@ impl Specie { /// Clear existing organisms in this species. pub fn remove_organisms(&mut self) { - self.adjust_fitness(); self.organisms = vec![]; } @@ -155,24 +228,36 @@ impl Specie { self.organisms.is_empty() } - /// TODO + /// Apply fitness sharing: divide each organism's fitness by species size + /// This prevents large species from dominating the population pub fn adjust_fitness(&mut self) { - // TODO: adjust fitness + let species_size = self.organisms.len() as f64; + if species_size == 0.0 { + return; + } + for organism in &mut self.organisms { + organism.adjusted_fitness = organism.fitness / species_size; + } } - /// Create a new child by mutating and existing one or mating two genomes. - fn create_child(&self, organism: &Organism, population_organisms: &[Organism]) -> Organism { - if rand::random::() < MUTATION_PROBABILITY || population_organisms.len() < 2 { - self.create_child_by_mutation(organism) + /// Create a new child by crossover+mutation or mutation only. + /// Per NEAT paper: 75% crossover (then mutate), 25% mutation only. + fn create_child( + &self, + organism: &Organism, + population_organisms: &[Organism], + config: &MutationConfig, + ) -> Organism { + if rand::random::() < config.mutation_probability || population_organisms.len() < 2 { + // 25%: mutation only (asexual reproduction) + organism.mutate_with_config(config) } else { - self.create_child_by_mate(organism, population_organisms) + // 75%: crossover then mutate + let child = self.create_child_by_mate(organism, population_organisms); + child.mutate_with_config(config) } } - fn create_child_by_mutation(&self, organism: &Organism) -> Organism { - organism.mutate() - } - fn create_child_by_mate( &self, organism: &Organism, @@ -194,8 +279,8 @@ impl Specie { #[cfg(test)] mod tests { use super::*; - use genome::Genome; - use organism::Organism; + use crate::genome::Genome; + use crate::organism::Organism; use std::f64::EPSILON; #[test] @@ -216,4 +301,29 @@ mod tests { assert!((specie.calculate_average_fitness() - 15f64).abs() < EPSILON); } + + #[test] + fn adjust_fitness_should_divide_by_species_size() { + let mut specie = Specie::new(Genome::default()); + + let mut organism1 = Organism::new(Genome::default()); + organism1.fitness = 30.0; + + let mut organism2 = Organism::new(Genome::default()); + organism2.fitness = 60.0; + + let mut organism3 = Organism::new(Genome::default()); + organism3.fitness = 90.0; + + specie.add(organism1); + specie.add(organism2); + specie.add(organism3); + + specie.adjust_fitness(); + + // Each fitness should be divided by species size (3) + assert!((specie.organisms[0].adjusted_fitness - 10.0).abs() < EPSILON); + assert!((specie.organisms[1].adjusted_fitness - 20.0).abs() < EPSILON); + assert!((specie.organisms[2].adjusted_fitness - 30.0).abs() < EPSILON); + } } diff --git a/src/species_evaluator.rs b/src/species_evaluator.rs index e1b7862..b6eb9b4 100644 --- a/src/species_evaluator.rs +++ b/src/species_evaluator.rs @@ -1,100 +1,106 @@ -use crossbeam::{self, Scope}; -use environment::Environment; -use genome::Genome; -use organism::Organism; -use specie::Specie; +use crate::environment::Environment; +use crate::genome::Genome; +use crate::organism::Organism; +use crate::specie::Specie; +use crossbeam; use std::sync::mpsc; -use std::sync::mpsc::{Receiver, Sender}; -/// Calculate fitness and champions for a species +/// Evaluates all organisms across species using the environment pub struct SpeciesEvaluator<'a> { threads: usize, - environment: &'a mut dyn Environment, + environment: &'a dyn Environment, } impl<'a> SpeciesEvaluator<'a> { - /// Take an environment that will test organisms. - pub fn new(environment: &mut dyn Environment) -> SpeciesEvaluator { + /// Create a new evaluator with the given environment. + pub fn new(environment: &'a dyn Environment) -> SpeciesEvaluator<'a> { SpeciesEvaluator { threads: environment.threads(), - environment: environment, + environment, } } - /// return champion fitness + /// Evaluate all organisms and return the champion pub fn evaluate(&self, species: &mut Vec) -> Organism { - let mut champion: Organism = Organism::new(Genome::default()); + if self.threads <= 1 { + // Single-threaded: iterate directly over species, no drain needed + self.evaluate_single(species) + } else { + // Multi-threaded: need to collect all organisms for parallel chunking + self.evaluate_parallel(species) + } + } - for specie in species { - if specie.organisms.is_empty() { - continue; - } + fn evaluate_single(&self, species: &mut Vec) -> Organism { + let mut champion = Organism::new(Genome::default()); - let organisms_by_thread = (specie.organisms.len() + self.threads - 1) / self.threads; // round up - let (tx, rx): (Sender, Receiver) = mpsc::channel(); - crossbeam::scope(|scope| { - let threads_used = self.dispatch_organisms( - specie.organisms.as_mut_slice(), - organisms_by_thread, - 0, - &tx, - scope, - ); - for _ in 0..threads_used { - let champion_candidate = rx.recv().unwrap(); - if champion_candidate.fitness > champion.fitness { - champion = champion_candidate; + for specie in species.iter_mut() { + if !specie.organisms.is_empty() { + self.environment.test_batch(&mut specie.organisms); + for org in &specie.organisms { + if org.fitness > champion.fitness { + champion = org.clone(); } } - }); + } } + champion } - fn dispatch_organisms<'b>( - &'b self, - organisms: &'b mut [Organism], - organisms_by_thread: usize, - threads_used: usize, - tx: &Sender, - scope: &Scope<'b>, - ) -> usize { - if organisms.len() <= organisms_by_thread { - self.evaluate_organisms(organisms, tx.clone(), scope); - } else { - match organisms.split_at_mut(organisms_by_thread) { - (thread_organisms, remaining_organisms) => { - self.evaluate_organisms(thread_organisms, tx.clone(), scope); - if remaining_organisms.len() > 0 { - return self.dispatch_organisms( - remaining_organisms, - organisms_by_thread, - threads_used + 1, - tx, - scope, - ); - } - } - } + fn evaluate_parallel(&self, species: &mut Vec) -> Organism { + // Save original sizes to restore later + let original_sizes: Vec = species.iter().map(|s| s.organisms.len()).collect(); + + // Drain all organisms into a single vec for parallel chunking + let mut all_organisms: Vec = species + .iter_mut() + .flat_map(|s| s.organisms.drain(..)) + .collect(); + + if all_organisms.is_empty() { + return Organism::new(Genome::default()); } - threads_used + 1 - } - fn evaluate_organisms<'b>( - &'b self, - organisms: &'b mut [Organism], - tx: Sender, - scope: &Scope<'b>, - ) { - scope.spawn(move || { - let mut champion = Organism::new(Genome::default()); - for organism in &mut organisms.iter_mut() { - organism.fitness = self.environment.test(organism); - if organism.fitness > champion.fitness { - champion = organism.clone(); - } + let chunk_size = (all_organisms.len() + self.threads - 1) / self.threads; + let (tx, rx) = mpsc::channel(); + + crossbeam::scope(|scope| { + for chunk in all_organisms.chunks_mut(chunk_size) { + let tx = tx.clone(); + let env = self.environment; + + scope.spawn(move || { + env.test_batch(chunk); + + // Find local champion + let mut local_champion = Organism::new(Genome::default()); + for org in chunk.iter() { + if org.fitness > local_champion.fitness { + local_champion = org.clone(); + } + } + tx.send(local_champion).unwrap(); + }); } - tx.send(champion).unwrap(); }); + + // Find global champion + let num_chunks = (all_organisms.len() + chunk_size - 1) / chunk_size; + let mut champion = Organism::new(Genome::default()); + for _ in 0..num_chunks { + let local_champion = rx.recv().unwrap(); + if local_champion.fitness > champion.fitness { + champion = local_champion; + } + } + + // Restore organisms back to their species + let mut drain_iter = all_organisms.into_iter(); + for (specie, &size) in species.iter_mut().zip(original_sizes.iter()) { + specie.organisms = drain_iter.by_ref().take(size).collect(); + } + + champion } } diff --git a/tests/rustneat_tests.rs b/tests/rustneat_tests.rs index 26b4726..f555141 100644 --- a/tests/rustneat_tests.rs +++ b/tests/rustneat_tests.rs @@ -12,27 +12,6 @@ mod test { } } - struct XORClassification; - - impl Environment for XORClassification { - fn test(&self, organism: &mut Organism) -> f64 { - let mut output = vec![0f64]; - let mut distance: f64; - organism.activate(vec![0f64, 0f64], &mut output); - distance = (0f64 - output[0]).powi(2); - organism.activate(vec![0f64, 1f64], &mut output); - distance += (1f64 - output[0]).powi(2); - organism.activate(vec![1f64, 0f64], &mut output); - distance += (1f64 - output[0]).powi(2); - organism.activate(vec![1f64, 1f64], &mut output); - distance += (0f64 - output[0]).powi(2); - - let fitness = 16f64 / (1f64 + distance); - - fitness - } - } - #[test] fn should_be_able_to_generate_a_population() { let population = Population::create_population(150); @@ -51,34 +30,54 @@ mod test { #[test] fn population_can_be_tested_on_environment() { let mut population = Population::create_population(10); - let mut environment = MyEnvironment; - population.evaluate_in(&mut environment); + let environment = MyEnvironment; + population.evaluate_in(&environment); assert!(population.get_organisms()[0].fitness == 0.1234f64); } + struct XORClassification; + + impl Environment for XORClassification { + fn test(&self, organism: &mut Organism) -> f64 { + let mut output = vec![0f64]; + let mut distance: f64; + organism.activate(vec![0f64, 0f64], &mut output); + distance = (0f64 - output[0]).powi(2); + organism.activate(vec![0f64, 1f64], &mut output); + distance += (1f64 - output[0]).powi(2); + organism.activate(vec![1f64, 0f64], &mut output); + distance += (1f64 - output[0]).powi(2); + organism.activate(vec![1f64, 1f64], &mut output); + distance += (0f64 - output[0]).powi(2); + + 16f64 / (1f64 + distance) + } + } + #[test] fn network_should_be_able_to_solve_xor_classification() { let mut population = Population::create_population(150); - let mut environment = XORClassification; + let environment = XORClassification; let mut champion_option: Option = None; while champion_option.is_none() { population.evolve(); - population.evaluate_in(&mut environment); + population.evaluate_in(&environment); for organism in &population.get_organisms() { - if organism.fitness > 15.9f64 { + if organism.fitness > 15.5f64 { champion_option = Some(organism.clone()); } } } let champion = champion_option.as_mut().unwrap(); let mut output = vec![0f64]; + champion.reset_state(); // match initial state of evolution (zeros) champion.activate(vec![0f64, 0f64], &mut output); - assert!(output[0] < 0.1f64); + assert!(output[0] < 0.2f64); champion.activate(vec![0f64, 1f64], &mut output); - assert!(output[0] > 0.9f64); + assert!(output[0] > 0.8f64); champion.activate(vec![1f64, 0f64], &mut output); - assert!(output[0] > 0.9f64); + assert!(output[0] > 0.8f64); champion.activate(vec![1f64, 1f64], &mut output); - assert!(output[0] < 0.1f64); + assert!(output[0] < 0.2f64); } }