JSFiddle - React, Tailwind, and code Playground
HTML
<script src="https://wagenaartje.github.io/neataptic/cdn/1.2.32/neataptic.js"></script>
<script src="https://cdn.rawgit.com/cazala/mnist/ffdcc447/dist/mnist.js"></script>
JavaScript
/** Rename vars */
var Neat = neataptic.Neat;
var Methods = neataptic.Methods;
var Config = neataptic.Config;
/** Turn off warnings */
Config.warnings = false;
function createWorker(network, cost){
// source is equivalent of test(), but without time recording
var source = `
${network.standalone()}
var cost = ${cost.toString()}
onmessage = function(e) {
console.log('Message received at', performance.now());
var set = new Float64Array(e.data);
var ins = set[0];
var out = set[1];
var error = 0;
// Calculate how much samples are in the set
for(var i = 0; i < (set.length - 2) / (ins + out); i++){
let input = [];
let target = [];
for(var j = 2 + i * (ins + out); j < 2 + i * (ins + out) + ins; j++){
input.push(set[j]);
}
for(var j = 2 + i * (ins + out) + ins; j < 2 + i * (ins + out) + ins + out; j++){
target.push(set[j]);
}
let output = activate(input);
error += cost(target, output);
}
var answer = new Float64Array([error / ((set.length - 2) / (ins + out))]);
postMessage(answer.buffer, [answer.buffer]);
}
`;
var blob = new Blob([source]);
var blobURL = window.URL.createObjectURL(blob);
var worker = new Worker(blobURL);
return worker;
}
async function multiEvaluate(population, dataSet, cost){
// Prepare the dataset to create a buffer
var converted = [dataSet[0].input.length, dataSet[0].output.length];
for(var i = 0; i < dataSet.length; i++){
for(var j = 0; j < converted[0]; j++){
converted.push(dataSet[i].input[j]);
}
for(var j = 0; j < converted[1]; j++){
converted.push(dataSet[i].output[j]);
}
}
return new Promise((resolve, reject) => {
// Keep track of how many workers are finished
var counter = 0;
// Create a worker for every network, post a message
for(var i = 0; i < population.length; i++){
let genome = population[i];
let worker = createWorker(genome, cost);
...