Files
evolution/src/lib/neatArena/curriculum_e2e.test.ts
2026-01-14 11:13:33 +11:00

67 lines
2.6 KiB
TypeScript

import { describe, test, expect } from 'bun:test';
import { createPopulation, evolveGeneration, getPopulationStats, DEFAULT_EVOLUTION_CONFIG } from './evolution';
import { evaluatePopulation, DEFAULT_MATCH_CONFIG } from './selfPlay';
// Extended configuration for Long-term Test
const LONG_RUN_CONFIG = {
...DEFAULT_EVOLUTION_CONFIG,
populationSize: 50, // Smaller pop for faster test speed
};
const MATCH_CONFIG = {
...DEFAULT_MATCH_CONFIG,
matchesPerGenome: 6, // 2 Static + 2 Spinner + 2 Peer
maxTicks: 300,
};
describe('Curriculum Evolution Long-term', () => {
test('Should reliably evolve High Fitness over 50 generations', () => {
let population = createPopulation(LONG_RUN_CONFIG);
const history: number[] = [];
console.log('\n--- Starting Long-term Curriculum Test (50 Gens) ---');
for (let gen = 0; gen < 50; gen++) {
try {
// 1. Evaluate
const evaluatedPop = evaluatePopulation(population, MATCH_CONFIG);
const stats = getPopulationStats(evaluatedPop);
history.push(stats.avgFitness);
console.log(`Gen ${gen}: Avg ${stats.avgFitness.toFixed(2)} | Max ${stats.maxFitness.toFixed(2)} | Species ${stats.speciesCount}`);
// Checks
if (gen === 0) {
if (stats.avgFitness <= 1.0) {
console.error(`FAILURE at Gen 0: Avg Fitness ${stats.avgFitness} <= 1.0`);
}
expect(stats.avgFitness).toBeGreaterThan(1.0);
}
if (gen === 20) {
if (stats.avgFitness <= 12.0) {
console.error(`FAILURE at Gen 20: Avg Fitness ${stats.avgFitness} <= 12.0`);
}
expect(stats.avgFitness).toBeGreaterThan(12.0);
}
// 2. Evolve
population = evolveGeneration(evaluatedPop, LONG_RUN_CONFIG);
} catch (e) {
console.error(`CRASH at Gen ${gen}:`, e);
throw e;
}
}
console.log('--- Test Complete ---');
// Final Success Criteria
const finalStats = getPopulationStats(evaluatePopulation(population, MATCH_CONFIG));
console.log(`Final Gen: Avg ${finalStats.avgFitness.toFixed(2)}`);
expect(finalStats.avgFitness).toBeGreaterThan(15.0); // Better than just Static + Spinner?
}, 600000); // 10 minute timeout
});