// diversify.jsvar LOG2 = Math.log(2); //handy constantvar genes, gtotal = 3, qtotal = 3, tolerance = 0.01;if (jsarguments.length>1) {	gtotal = jsarguments[1];}if (jsarguments.length>2) {	qtotal = jsarguments[2];}if (jsarguments.length>3) {	tolerance = jsarguments[3];}// define a gene objectfunction gene() {	this.qualia = new Array(qtotal);	for (var i=0;i<qtotal;i++) {		this.qualia[i] = 0.5;	}	this.getEntropy = gene_getEntropy;	this.toString = gene_toString;}function gene_toString() {	var total = this.qualia.length + " qualia: ";	for (var i=0;i<qtotal;i++) {		total = total + " " + this.qualia[i];	}	return total;}function gene_getEntropy() {	return complexity(this.qualia);}function qualia_getEntropy(q) {	var terms = new Array(genes.length);	for (var i=0;i<genes.length;i++) {		terms [i] = genes[i].qualia[q];	}	return complexity(terms);}function complexity(terms) {	// this function returns my own definition of complexity from the terms array	var complexity = 0.0;	var sum = 0.0;	// calculate sum to scale probabilities by	for (var i=0;i<terms.length;i++) {		sum += terms[i];	}	// do the entropy for each, weighted for sum	for (var i=0;i<terms.length;i++) {		complexity -= (terms[i]/sum)*Math.log(terms[i]/sum)/LOG2;	}	complexity /= terms.length	// return the remainder	return complexity*2; // double to make it scale from 0..1}function debug() {	post(genes.length + " genes\n");	for (var i=0;i<genes.length;i++) {		post("gene " + i + ": " + genes[i].toString() + "\n");	}	}function tolerance(t) {	tolerance = t;}function diversify() {	var g = Math.round(Math.random() * (gtotal-1));	var q = Math.round(Math.random() * (qtotal-1));	var d = (Math.random()-0.5) * tolerance;	var gH = genes[g].getEntropy();	var qH = qualia_getEntropy(q);	if (genes[g].qualia[q] + d > 0 && genes[g].qualia[q] + d < 1) 	{		genes[g].qualia[q] += d;		var newgH = genes[g].getEntropy();		var newqH = qualia_getEntropy(q);				if (newgH > gH && newqH > qH) {			genes[g].qualia[q] -= d;		} 	} else {		// if hit maxima, reset to centre		genes[g].qualia[q] = 0.5;	}	outputlist();}function outputlist() {	var list = "list";	var gene = "gene";	for (var i=0;i<genes.length;i++) {		gene = "";		for (var j=0;j<genes[i].qualia.length;j++) {			gene += " " + genes[i].qualia[j];		}		outlet(0,"poly target " + (i+1));		outlet(0,"poly " + gene);		list += gene;	}	outlet(0,list);	var geneH = "geneH";	for (var i=0;i<genes.length;i++) {		geneH += " " + genes[i].getEntropy();	}	outlet(0, geneH);	var qualiaH = "qualiaH";	for (var i=0;i<genes[0].qualia.length;i++) {		qualiaH += " " + qualia_getEntropy(i);	}	outlet(0, qualiaH);}function reset() {	genes = new Array(gtotal);	for (var i=0;i<genes.length;i++) {		genes[i] = new gene(qtotal);	}	outputlist();}reset();