Initial files added
This commit is contained in:
parent
84cdfe83c4
commit
d3d0b9ba83
|
|
@ -0,0 +1,26 @@
|
||||||
|
{
|
||||||
|
"name": "MabeLabRS Dev",
|
||||||
|
"dockerComposeFile": "../docker-compose.yml",
|
||||||
|
"service": "dev",
|
||||||
|
"workspaceFolder": "/work",
|
||||||
|
"features": {
|
||||||
|
"ghcr.io/devcontainers/features/common-utils:2": {}
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"terminal.integrated.defaultProfile.linux": "bash",
|
||||||
|
"rust-analyzer.cargo.useRustcWrapperForBuildScripts": true
|
||||||
|
},
|
||||||
|
"customizations": {
|
||||||
|
"vscode": {
|
||||||
|
"extensions": [
|
||||||
|
"rust-lang.rust-analyzer",
|
||||||
|
"tamasfe.even-better-toml",
|
||||||
|
"serayuzgur.crates",
|
||||||
|
"matklad.rust-analyzer",
|
||||||
|
"ms-azuretools.vscode-docker"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"remoteUser": "dev"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
target
|
||||||
|
**/target
|
||||||
|
**/*.rs.bk
|
||||||
|
**/*.swp
|
||||||
|
**/*.swo
|
||||||
|
**/.DS_Store
|
||||||
|
.git
|
||||||
|
.gitignore
|
||||||
|
.forgejo
|
||||||
|
node_modules
|
||||||
|
.idea
|
||||||
|
.vscode
|
||||||
|
**/.cache
|
||||||
|
.sccache
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
name: CI
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ main, porting ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ main, porting ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
rust:
|
||||||
|
runs-on: docker
|
||||||
|
container:
|
||||||
|
image: mabelabrs-dev:latest
|
||||||
|
# If your Forgejo runner can't pull local images, add a previous step
|
||||||
|
# to `docker build -f Dockerfile.dev -t mabelabrs-dev:latest .`
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Build
|
||||||
|
run: cargo build --workspace --all-targets
|
||||||
|
- name: Clippy
|
||||||
|
run: cargo clippy --workspace --all-targets -- -D warnings
|
||||||
|
- name: Test
|
||||||
|
run: cargo test --workspace --all-features --no-fail-fast
|
||||||
|
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
# Acknowledgements
|
||||||
|
|
||||||
|
MabeLabRS is a Rust port inspired by:
|
||||||
|
|
||||||
|
- **MABE2** (https://github.com/mercere99/MABE2)
|
||||||
|
Copyright (c) 2016–present Charles Ofria and MABE contributors
|
||||||
|
Licensed under the MIT License.
|
||||||
|
|
||||||
|
- **Empirical** (https://github.com/devosoft/Empirical)
|
||||||
|
Copyright (c) 2014–present Charles Ofria and Empirical contributors
|
||||||
|
Licensed under the MIT License.
|
||||||
|
|
||||||
|
This project is independent and not officially affiliated with the upstream
|
||||||
|
projects, but it draws architectural concepts and design inspiration from them.
|
||||||
|
|
||||||
|
We gratefully acknowledge the work of the original authors and contributors.
|
||||||
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
[workspace]
|
||||||
|
members = [
|
||||||
|
"crates/mabelabrs-core",
|
||||||
|
"crates/mabelabrs-world",
|
||||||
|
"crates/mabelabrs-eval",
|
||||||
|
"crates/mabelabrs-io",
|
||||||
|
"crates/mabelabrs-utils",
|
||||||
|
"crates/mabelabrs-ffi",
|
||||||
|
]
|
||||||
|
resolver = "2"
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
# Determinism Policy
|
||||||
|
|
||||||
|
MabeLabRS emphasizes reproducibility of artificial life experiments.
|
||||||
|
|
||||||
|
## Randomness
|
||||||
|
- Use `rand_chacha::ChaCha8Rng` (fast, reproducible).
|
||||||
|
- Seeds must be explicit and logged in experiment manifests.
|
||||||
|
|
||||||
|
## Floating-point
|
||||||
|
- Default: `f64`.
|
||||||
|
- Avoid nondeterministic parallel reductions; when needed, gate behind
|
||||||
|
the `fast-math` feature.
|
||||||
|
- Golden tests should tolerate ≤ 1e-12 relative error in float comparisons.
|
||||||
|
|
||||||
|
## Collections
|
||||||
|
- Use `BTreeMap`/`BTreeSet` when deterministic ordering is required.
|
||||||
|
- Use `indexmap::IndexMap`/`IndexSet` for hash-backed structures
|
||||||
|
that preserve insertion order.
|
||||||
|
|
||||||
|
## Parallelism
|
||||||
|
- Sequential by default.
|
||||||
|
- `rayon` parallelism only behind `parallel` feature flag.
|
||||||
|
- Golden tests must run with `--no-default-features` to guarantee determinism.
|
||||||
|
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
# Developer image: Rust + build tools + sccache + minimal deps
|
||||||
|
FROM rust:1-bookworm
|
||||||
|
|
||||||
|
# Install useful build deps and tooling
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
clang cmake pkg-config libssl-dev git ca-certificates curl \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# sccache speeds up incremental builds across container runs
|
||||||
|
ENV SCCACHE_DIR=/root/.cache/sccache
|
||||||
|
RUN cargo install sccache
|
||||||
|
|
||||||
|
# Configure rustc to use sccache by default
|
||||||
|
ENV RUSTC_WRAPPER=/usr/local/cargo/bin/sccache
|
||||||
|
ENV CARGO_INCREMENTAL=0
|
||||||
|
|
||||||
|
# Optional: set a default toolchain (can be overridden by rust-toolchain.toml)
|
||||||
|
RUN rustup component add clippy rustfmt
|
||||||
|
|
||||||
|
# Create a non-root user (optional; comment out if you prefer root)
|
||||||
|
RUN useradd -m -u 1000 dev
|
||||||
|
USER dev
|
||||||
|
WORKDIR /work
|
||||||
|
|
||||||
|
# Cache hints: create empty project files so first build primes caches
|
||||||
|
COPY --chown=dev:dev Cargo.toml ./
|
||||||
|
COPY --chown=dev:dev crates/mabelabrs-core/Cargo.toml crates/mabelabrs-core/Cargo.toml
|
||||||
|
COPY --chown=dev:dev crates/mabelabrs-world/Cargo.toml crates/mabelabrs-world/Cargo.toml
|
||||||
|
COPY --chown=dev:dev crates/mabelabrs-eval/Cargo.toml crates/mabelabrs-eval/Cargo.toml
|
||||||
|
COPY --chown=dev:dev crates/mabelabrs-io/Cargo.toml crates/mabelabrs-io/Cargo.toml
|
||||||
|
COPY --chown=dev:dev crates/mabelabrs-utils/Cargo.toml crates/mabelabrs-utils/Cargo.toml
|
||||||
|
COPY --chown=dev:dev crates/mabelabrs-ffi/Cargo.toml crates/mabelabrs-ffi/Cargo.toml
|
||||||
|
|
||||||
|
# Final copy happens at runtime via bind mount; this stage just primes caches.
|
||||||
|
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
# Build stage
|
||||||
|
FROM rust:1-bookworm as builder
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
clang cmake pkg-config libssl-dev git ca-certificates curl \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# sccache optional in release, but still useful for CI
|
||||||
|
RUN cargo install sccache
|
||||||
|
ENV RUSTC_WRAPPER=/usr/local/cargo/bin/sccache
|
||||||
|
|
||||||
|
WORKDIR /work
|
||||||
|
# Copy manifests first to leverage Docker layer caching
|
||||||
|
COPY Cargo.toml Cargo.lock ./
|
||||||
|
COPY crates/mabelabrs-core/Cargo.toml crates/mabelabrs-core/Cargo.toml
|
||||||
|
COPY crates/mabelabrs-world/Cargo.toml crates/mabelabrs-world/Cargo.toml
|
||||||
|
COPY crates/mabelabrs-eval/Cargo.toml crates/mabelabrs-eval/Cargo.toml
|
||||||
|
COPY crates/mabelabrs-io/Cargo.toml crates/mabelabrs-io/Cargo.toml
|
||||||
|
COPY crates/mabelabrs-utils/Cargo.toml crates/mabelabrs-utils/Cargo.toml
|
||||||
|
COPY crates/mabelabrs-ffi/Cargo.toml crates/mabelabrs-ffi/Cargo.toml
|
||||||
|
|
||||||
|
# Create empty src to allow dependency build caching
|
||||||
|
RUN mkdir -p crates/mabelabrs-utils/src && echo "fn main(){}" > crates/mabelabrs-utils/src/main.rs
|
||||||
|
|
||||||
|
# Build deps
|
||||||
|
RUN cargo build -p mabelabrs-utils --release || true
|
||||||
|
|
||||||
|
# Now copy the whole source and do the real build
|
||||||
|
COPY . .
|
||||||
|
RUN cargo build -p mabelabrs-utils --release
|
||||||
|
|
||||||
|
# Runtime stage (distroless-ish; use slim for better debugability)
|
||||||
|
FROM debian:bookworm-slim
|
||||||
|
|
||||||
|
# If your CLI needs SSL/DNS, keep these minimal libs
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
ca-certificates libssl3 && rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
COPY --from=builder /work/target/release/mabelabrs-utils /usr/local/bin/mabelabrs-utils
|
||||||
|
|
||||||
|
ENTRYPOINT ["/usr/local/bin/mabelabrs-utils"]
|
||||||
|
CMD ["--help"]
|
||||||
|
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
Copyright 2025 Wesley R. Elsberry and MabeLabRS Contributors
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2025 Wesley R. Elsberry and MabeLabRS Contributors
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
SHELL := /bin/bash
|
||||||
|
|
||||||
|
.PHONY: build test clippy fmt ci shell clean release
|
||||||
|
|
||||||
|
# Open an interactive shell in the dev container
|
||||||
|
shell:
|
||||||
|
\tdocker compose run --rm dev bash
|
||||||
|
|
||||||
|
build:
|
||||||
|
\tdocker compose run --rm dev bash -lc "cargo build --workspace --all-targets"
|
||||||
|
|
||||||
|
test:
|
||||||
|
\tdocker compose run --rm dev bash -lc "cargo test --workspace --all-features --no-fail-fast"
|
||||||
|
|
||||||
|
clippy:
|
||||||
|
\tdocker compose run --rm dev bash -lc "cargo clippy --workspace --all-targets -- -D warnings"
|
||||||
|
|
||||||
|
fmt:
|
||||||
|
\tdocker compose run --rm dev bash -lc "cargo fmt --all"
|
||||||
|
|
||||||
|
ci: fmt clippy build test
|
||||||
|
|
||||||
|
release:
|
||||||
|
\tdocker compose build release
|
||||||
|
|
||||||
|
clean:
|
||||||
|
\trm -rf target || true
|
||||||
|
\tdocker compose down --volumes --remove-orphans || true
|
||||||
|
|
||||||
180
README.md
180
README.md
|
|
@ -1,2 +1,180 @@
|
||||||
# MABELab-RS
|
# MabeLabRS — a Rust port of MABE2
|
||||||
|
|
||||||
|
**MabeLabRS** is a Rust re-implementation of the MSU **MABE2** artificial life framework, aiming for:
|
||||||
|
- **API parity** where sensible, with a modern Rust design (traits, enums, safe concurrency).
|
||||||
|
- **Determinism** for research reproducibility (seeded RNG, stable iteration order).
|
||||||
|
- **Portability** to the web (WASM) for teaching demos (evo-edu.org) and outreach (TalkOrigins).
|
||||||
|
|
||||||
|
> Upstream: MABE2 (C++, MIT) — https://github.com/mercere99/MABE2
|
||||||
|
> This project is an independent port; see **License & Attribution** below.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Project status
|
||||||
|
|
||||||
|
- 🚧 **Pre-alpha (porting in progress)** — core traits and module skeletons are landing first.
|
||||||
|
- 🎯 Goals: organism + genome abstractions, worlds/topologies, evaluators, experiment runner, config I/O, parity tests.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Workspace layout
|
||||||
|
|
||||||
|
- mabelabrs/
|
||||||
|
- ├─ Cargo.toml # [workspace]
|
||||||
|
- ├─ rust-toolchain.toml # pin stable or MSRV
|
||||||
|
- ├─ LICENSE-APACHE
|
||||||
|
- ├─ LICENSE-MIT
|
||||||
|
- ├─ ACKNOWLEDGEMENTS.md
|
||||||
|
- ├─ README.md
|
||||||
|
- ├─ crates/
|
||||||
|
- │ ├─ mabelabrs-core/ # genomes, organisms, traits, RNG & schedulers
|
||||||
|
- │ ├─ mabelabrs-world/ # populations, environments, spatial/graph topologies
|
||||||
|
- │ ├─ mabelabrs-eval/ # tasks, fitness functions, analyzers
|
||||||
|
- │ ├─ mabelabrs-io/ # serde configs, logging, (bincode/json) state
|
||||||
|
- │ ├─ mabelabrs-utils/ # CLI runner, experiment manifests
|
||||||
|
- │ └─ mabelabrs-ffi/ # optional C++ bridge to MABE2 for parity (feature-gated)
|
||||||
|
- ├─ tests/
|
||||||
|
- │ ├─ golden/ # small deterministic fixtures
|
||||||
|
- │ └─ parity/ # cross-lang checks (behind ffi feature)
|
||||||
|
- ├─ benches/ # criterion benches for hotspots
|
||||||
|
- └─ porting/ # LLM-driven port tooling (only on porting branch)
|
||||||
|
- ├─ TRANSLATION_GLOSSARY.md
|
||||||
|
- ├─ STYLE.md
|
||||||
|
- ├─ DETERMINISM.md
|
||||||
|
- ├─ UNSAFE_POLICY.md
|
||||||
|
- ├─ prompts/
|
||||||
|
- └─ tools/ # scripts to run local LLM, compile, test, open PRs
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Why Rust?
|
||||||
|
|
||||||
|
- **Memory safety** and clear ownership models for complex evolutionary simulations.
|
||||||
|
- **Deterministic** iteration and seeded RNG for reproducibility.
|
||||||
|
- **Great tooling** (cargo, clippy, criterion, proptest) and easy WASM targets for classroom demos.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Quick start
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# clone
|
||||||
|
git clone <your-forgejo-url>/MabeLabRS.git
|
||||||
|
cd MabeLabRS
|
||||||
|
|
||||||
|
# build all crates
|
||||||
|
cargo build
|
||||||
|
|
||||||
|
# run tests
|
||||||
|
cargo test
|
||||||
|
|
||||||
|
# optional parity tests (requires C++ MABE2 + ffi feature)
|
||||||
|
cargo test -p mabelabrs-ffi --features ffi
|
||||||
|
|
||||||
|
|
||||||
|
Feature flags:
|
||||||
|
|
||||||
|
ffi — enable C++ bridge for cross-language parity tests.
|
||||||
|
|
||||||
|
fast-math — allow non-deterministic float reductions (off by default).
|
||||||
|
|
||||||
|
Determinism
|
||||||
|
|
||||||
|
RNG: rand_chacha (documented seed in experiment manifest).
|
||||||
|
|
||||||
|
Order-sensitive collections: indexmap where iteration order matters.
|
||||||
|
|
||||||
|
Parallelism: gated by feature flags (rayon), default serial to preserve bit-for-bit comparable runs.
|
||||||
|
|
||||||
|
Using with evo-edu.org / TalkOrigins
|
||||||
|
|
||||||
|
WASM builds will be provided as examples under examples/wasm/ for web-hosted demos and teaching modules.
|
||||||
|
|
||||||
|
Naming and metadata optimized for search discoverability: MabeLabRS / mabelabrs-* crates.
|
||||||
|
|
||||||
|
Contributing
|
||||||
|
|
||||||
|
Discuss issues in the tracker; claim a module before starting.
|
||||||
|
|
||||||
|
Follow STYLE.md and UNSAFE_POLICY.md.
|
||||||
|
|
||||||
|
Every PR must:
|
||||||
|
|
||||||
|
compile (cargo check),
|
||||||
|
|
||||||
|
be formatted (cargo fmt),
|
||||||
|
|
||||||
|
lint cleanly (cargo clippy -- -D warnings),
|
||||||
|
|
||||||
|
include tests for added behavior.
|
||||||
|
|
||||||
|
Deterministic tests belong in tests/golden/. Heavier regression and parity tests go in tests/parity/.
|
||||||
|
|
||||||
|
We welcome LLM-assisted contributions only if the result compiles and includes tests. Please include the prompt and model info in the PR description for provenance.
|
||||||
|
|
||||||
|
Branch strategy
|
||||||
|
|
||||||
|
main: always buildable; docs + examples meant for users.
|
||||||
|
|
||||||
|
porting: long-lived branch for translation scripts, FFI harnesses, and staged module ports.
|
||||||
|
|
||||||
|
Feature branches: feat/<module> or fix/<area>; merge into porting, and periodically milestone-merge porting → main when a vertical slice is stable (e.g., genome+mutation+simple world).
|
||||||
|
|
||||||
|
Protect main and porting with required checks.
|
||||||
|
|
||||||
|
License & Attribution
|
||||||
|
|
||||||
|
Port license: Dual MIT OR Apache-2.0 (choose at your option).
|
||||||
|
See LICENSE-MIT and LICENSE-APACHE.
|
||||||
|
|
||||||
|
Upstream attribution:
|
||||||
|
This project is a Rust port inspired by MABE2 (MIT) and conceptually by the Empirical library (MIT).
|
||||||
|
Copyright and license notices from upstream are preserved in ACKNOWLEDGEMENTS.md.
|
||||||
|
|
||||||
|
You may use MabeLabRS under the terms of MIT or Apache-2.0.
|
||||||
|
|
||||||
|
Citation
|
||||||
|
|
||||||
|
If you use MabeLabRS in academic work, please cite MABE2 as appropriate and this repository (commit or release tag). A CITATION.cff will be added at first release.
|
||||||
|
|
||||||
|
Roadmap (short)
|
||||||
|
|
||||||
|
Core traits: Genome, Organism, Evaluator, World, Scheduler
|
||||||
|
|
||||||
|
Config & manifests (serde + JSON/TOML)
|
||||||
|
|
||||||
|
Minimal world & evaluator example with golden tests
|
||||||
|
|
||||||
|
Optional ffi parity tests against MABE2
|
||||||
|
|
||||||
|
WASM demo example for evo-edu.org
|
||||||
|
|
||||||
|
First alpha release on crates.io
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Container-first workflow
|
||||||
|
|
||||||
|
This repo ships with a containerized toolchain for **development**, **testing**, and **releases**.
|
||||||
|
|
||||||
|
### Quick start (Dev container)
|
||||||
|
```bash
|
||||||
|
# one-time build of the dev image (with Rust toolchain, sccache, tools)
|
||||||
|
docker compose build dev
|
||||||
|
|
||||||
|
# launch an interactive dev shell with your repo mounted at /work
|
||||||
|
docker compose run --rm dev bash
|
||||||
|
|
||||||
|
# inside the container
|
||||||
|
cargo build
|
||||||
|
cargo test
|
||||||
|
cargo clippy -- -D warnings
|
||||||
|
|
||||||
|
# Generative AI Notice
|
||||||
|
|
||||||
|
This project is planned to be largely conducted through the use of generative AI tools,
|
||||||
|
including OpenAI ChatGPT. While the plan is to conduct testing, be aware that
|
||||||
|
generative AI may not be entirely accurate in its outputs, and determine suitability
|
||||||
|
to purpose incorporating this information.
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
# MabeLabRS Style Guide
|
||||||
|
|
||||||
|
## Code formatting
|
||||||
|
- Use `cargo fmt` with `rustfmt.toml` in repo root.
|
||||||
|
- Line width: 100.
|
||||||
|
- Always use `#[derive(Debug, Clone, PartialEq, Eq)]` on simple data types.
|
||||||
|
|
||||||
|
## Naming
|
||||||
|
- Crates: `mabelabrs-*` prefix.
|
||||||
|
- Traits: `CamelCase`, no `I` prefix.
|
||||||
|
- Structs: `CamelCase`.
|
||||||
|
- Enums: `CamelCase` with variant `CamelCase`.
|
||||||
|
- Functions: `snake_case`.
|
||||||
|
|
||||||
|
## Error handling
|
||||||
|
- Return `Result<T, E>` from fallible functions.
|
||||||
|
- Use `thiserror` for error enums.
|
||||||
|
- Avoid panics, except in tests or truly unrecoverable states.
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
- All public items must have `///` doc comments.
|
||||||
|
- Modules should have a top-level `//!` doc comment.
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
- Unit tests inline in modules (`#[cfg(test)]`).
|
||||||
|
- Integration tests in `/tests`.
|
||||||
|
- Deterministic golden tests in `/tests/golden`.
|
||||||
|
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
# Translation Glossary: C++ → Rust
|
||||||
|
|
||||||
|
This glossary defines consistent mappings from MABE2 / Empirical idioms
|
||||||
|
to MabeLabRS Rust code. It should be updated as the port progresses.
|
||||||
|
|
||||||
|
## Memory / Pointers
|
||||||
|
- `std::unique_ptr<T>` → `Box<T>`
|
||||||
|
- `std::shared_ptr<T>` → `Arc<T>` (multi-thread safe), or `Rc<T>` (single-thread)
|
||||||
|
- `std::weak_ptr<T>` → `Weak<T>` (Arc/Rc)
|
||||||
|
- raw pointer (owning) → `Box<T>`
|
||||||
|
- raw pointer (borrowed) → `&T` or `&mut T`
|
||||||
|
|
||||||
|
## Optional / Variants
|
||||||
|
- `std::optional<T>` → `Option<T>`
|
||||||
|
- `std::variant<A,B>` → `enum { A(A), B(B) }`
|
||||||
|
|
||||||
|
## Containers
|
||||||
|
- `std::vector<T>` → `Vec<T>`
|
||||||
|
- `std::map<K,V>` → `BTreeMap<K,V>` (ordered, deterministic)
|
||||||
|
- `std::unordered_map<K,V>` → `HashMap<K,V>` or `IndexMap<K,V>` (deterministic)
|
||||||
|
- `std::set<T>` → `BTreeSet<T>`
|
||||||
|
|
||||||
|
## Interfaces / Inheritance
|
||||||
|
- C++ abstract base class → Rust `trait`
|
||||||
|
- C++ pure virtual function → `fn ...;` in trait
|
||||||
|
- C++ virtual function → default method in trait
|
||||||
|
|
||||||
|
## Errors
|
||||||
|
- Error codes / exceptions → `Result<T, E>` with `thiserror` derive
|
||||||
|
|
||||||
|
## Utilities
|
||||||
|
- C++ RNG (emp::Random) → `rand_chacha::ChaCha8Rng` seeded via manifest
|
||||||
|
- Empirical Config → `serde` + `toml/json`
|
||||||
|
- Empirical Signals/Actions → strongly typed Rust event bus (observer pattern)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
# Unsafe Code Policy
|
||||||
|
|
||||||
|
MabeLabRS is committed to safe Rust. Unsafe is allowed only when:
|
||||||
|
|
||||||
|
- It is proven necessary for performance in critical loops, and
|
||||||
|
- There is no safe alternative without excessive overhead, and
|
||||||
|
- The code is isolated in a single module with:
|
||||||
|
- Comments explaining invariants,
|
||||||
|
- Unit tests covering invariants,
|
||||||
|
- Reviewed by at least one maintainer.
|
||||||
|
|
||||||
|
All unsafe blocks must be justified with a doc comment.
|
||||||
|
|
||||||
|
Tools:
|
||||||
|
- Run `cargo geiger` in CI to track unsafe usage.
|
||||||
|
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
[package]
|
||||||
|
name = "mabelabrs-core"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
license = "MIT OR Apache-2.0"
|
||||||
|
description = "Core traits and data structures for MabeLabRS"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
|
thiserror = "1.0"
|
||||||
|
rand_chacha = "0.3"
|
||||||
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
//! Evaluator abstraction.
|
||||||
|
|
||||||
|
use crate::organism::Organism;
|
||||||
|
use crate::genome::Genome;
|
||||||
|
|
||||||
|
/// Trait for evaluating organisms in a population.
|
||||||
|
pub trait Evaluator<G: Genome, O: Organism<G>> {
|
||||||
|
/// Evaluate fitness of an organism.
|
||||||
|
fn evaluate(&self, organism: &O) -> f64;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
//! Genome abstraction.
|
||||||
|
|
||||||
|
use serde::{Serialize, Deserialize};
|
||||||
|
|
||||||
|
/// Trait representing a genome in MabeLabRS.
|
||||||
|
pub trait Genome: Serialize + for<'de> Deserialize<'de> + Clone {
|
||||||
|
/// Mutate this genome in-place.
|
||||||
|
fn mutate(&mut self);
|
||||||
|
|
||||||
|
/// Return a deep copy of this genome.
|
||||||
|
fn copy(&self) -> Self;
|
||||||
|
|
||||||
|
/// Return a human-readable description.
|
||||||
|
fn describe(&self) -> String;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
//! Core traits and data structures for MabeLabRS.
|
||||||
|
|
||||||
|
pub mod genome;
|
||||||
|
pub mod organism;
|
||||||
|
pub mod evaluator;
|
||||||
|
|
||||||
|
/// A unique identifier for genomes.
|
||||||
|
pub type GenomeId = u64;
|
||||||
|
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
//! Organism abstraction.
|
||||||
|
|
||||||
|
use crate::genome::Genome;
|
||||||
|
use serde::{Serialize, Deserialize};
|
||||||
|
|
||||||
|
/// Trait representing an organism composed of a genome.
|
||||||
|
pub trait Organism<G: Genome>: Serialize + for<'de> Deserialize<'de> {
|
||||||
|
/// Return a reference to the genome.
|
||||||
|
fn genome(&self) -> &G;
|
||||||
|
|
||||||
|
/// Return a mutable reference to the genome.
|
||||||
|
fn genome_mut(&mut self) -> &mut G;
|
||||||
|
|
||||||
|
/// Express the phenotype (to be defined by evaluator).
|
||||||
|
fn express(&self) -> String;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
reservations:
|
||||||
|
devices:
|
||||||
|
- capabilities: ["gpu"]
|
||||||
|
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
version: "3.9"
|
||||||
|
services:
|
||||||
|
dev:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile.dev
|
||||||
|
image: mabelabrs-dev:latest
|
||||||
|
container_name: mabelabrs-dev
|
||||||
|
working_dir: /work
|
||||||
|
volumes:
|
||||||
|
- ./:/work
|
||||||
|
- sccache:/root/.cache/sccache
|
||||||
|
- cargo-registry:/usr/local/cargo/registry
|
||||||
|
- cargo-git:/usr/local/cargo/git
|
||||||
|
- target:/work/target
|
||||||
|
tty: true
|
||||||
|
environment:
|
||||||
|
- RUSTC_WRAPPER=/usr/local/cargo/bin/sccache
|
||||||
|
- CARGO_HOME=/usr/local/cargo
|
||||||
|
- RUST_LOG=info
|
||||||
|
|
||||||
|
release:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile.release
|
||||||
|
image: mabelabrs:latest
|
||||||
|
container_name: mabelabrs
|
||||||
|
# no source mount; uses built artifact
|
||||||
|
entrypoint: ["/usr/local/bin/mabelabrs-utils"]
|
||||||
|
command: ["--help"]
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
sccache:
|
||||||
|
cargo-registry:
|
||||||
|
cargo-git:
|
||||||
|
target:
|
||||||
|
|
||||||
Loading…
Reference in New Issue