Skip to content

Checkpointing

Radiate provides built-in support for checkpointing, allowing you to save the state of your genetic algorithm at regular intervals. This is particularly useful for long-running experiments, as it enables you to resume from the last checkpoint in case of interruptions.

import radiate as rd

target = "Hello, Radiate!"

def fitness_func(x: list[str]) -> int:
    return sum(1 for i in range(len(target)) if x[i] == target[i])

engine = rd.GeneticEngine(
    codec=rd.CharCodec.vector(len(target)),
    fitness_func=fitness_func,
    offspring_selector=rd.BoltzmannSelector(4),
)

result = engine.run(rd.ScoreLimit(len(target)), checkpoint=(10, "checkpoint.json"))

# load from checkpoint from generation 10
engine = rd.GeneticEngine(
    codec=rd.CharCodec.vector(len(target)),
    fitness_func=fitness_func,
    offspring_selector=rd.BoltzmannSelector(4),
    checkpoint_path="checkpoint_10.json",
)

result = engine.run(rd.ScoreLimit(len(target)))
use radiate::*;

fn main() {
    let target = "Hello, Radiate!";
    let target_len = target.len();

    fn fitness_fn(geno: Vec<char>) -> Score {
        geno.into_iter().zip(target.chars()).fold(
            0,
            |acc, (allele, targ)| {
                if allele == targ { acc + 1 } else { acc }
            },
        ).into()
    }

    let engine = GeneticEngine::builder()
        .codec(CharCodec::vector(target.len()))
        .offspring_selector(BoltzmannSelector::new(4_f32))
        .fitness_fn(fitness_fn)
        .build();

    let result = engine.iter()
        .checkpoint(10, "checkpoint.json")
        .until_score(target_len)
        .last()
        .expect("No result from engine run");

    // load from checkpoint from generation 10
    let resumed_engine = GeneticEngine::builder()
        .codec(CharCodec::vector(target.len()))
        .offspring_selector(BoltzmannSelector::new(4_f32))
        .fitness_fn(fitness_fn)
        .load_checkpoint("checkpoint_10.json")
        .build();

    let resumed_result = resumed_engine.iter()
        .until_score(target_len)
        .last()
        .expect("No result from resumed engine run");
}