void ensureSingleConnectedStructure(ConnectionGeneList connections, List <PointF> hiddenNeurons, Dictionary <long, PointF> conSourcePoints, Dictionary <long, PointF> conTargetPoints) { List <List <long> > allChains = new List <List <long> >(); int maxChain = 0; foreach (var con in connections) { bool isInChain = false; List <long> nChain = null; foreach (List <long> chain in allChains) { maxChain = Math.Max(chain.Count, maxChain); if (chain.Contains(con.SourceNeuronId) || chain.Contains(con.TargetNeuronId)) { nChain = chain; isInChain = true; break; } } if (!isInChain) { nChain = new List <long>(); allChains.Add(nChain); } if (!nChain.Contains(con.SourceNeuronId)) { nChain.Add(con.SourceNeuronId); } if (!nChain.Contains(con.TargetNeuronId)) { nChain.Add(con.TargetNeuronId); } } List <long> finalChain = allChains.Find(chain => chain.Count == maxChain); if (finalChain != null && finalChain.Count != 0) { List <ConnectionGene> markDelete = new List <ConnectionGene>(); foreach (var conn in connections) { bool delete = false; //if we don't have you in our chain, get rid of the object if (!finalChain.Contains(conn.SourceNeuronId)) { hiddenNeurons.Remove(conSourcePoints[conn.InnovationId]); delete = true; } if (!finalChain.Contains(conn.TargetNeuronId)) { hiddenNeurons.Remove(conTargetPoints[conn.InnovationId]); delete = true; } if (delete) { markDelete.Add(conn); } } markDelete.ForEach(x => connections.Remove(x)); //connections.RemoveAll(x => !(finalChain.Contains(x.SourceNeuronId) || finalChain.Contains(x.TargetNeuronId))); //hiddenNeurons.RemoveAll(hn => } connections.ForEach(con => { //readjust connection source/target depending on hiddenNeuron array PointF point = conSourcePoints[con.InnovationId]; con.SourceNeuronId = hiddenNeurons.FindIndex(hp => hp.X == point.X && hp.Y == point.Y); if (con.SourceNeuronId == -1) { Console.WriteLine("Adjusted con src- " + con.SourceNeuronId + " tgt- " + con.TargetNeuronId); } point = conTargetPoints[con.InnovationId]; con.TargetNeuronId = hiddenNeurons.FindIndex(hp => hp.X == point.X && hp.Y == point.Y); if (con.TargetNeuronId == -1) { Console.WriteLine("Adjusted con src- " + con.SourceNeuronId + " tgt- " + con.TargetNeuronId); } }); }
void ensureSingleConnectedStructure(ConnectionGeneList connections, List<PointF> hiddenNeurons, Dictionary<long, PointF> conSourcePoints, Dictionary<long, PointF> conTargetPoints) { List<List<long>> allChains = new List<List<long>>(); int maxChain = 0; foreach (var con in connections) { bool isInChain = false; List<long> nChain = null; foreach (List<long> chain in allChains) { maxChain = Math.Max(chain.Count, maxChain); if (chain.Contains(con.SourceNeuronId) || chain.Contains(con.TargetNeuronId)) { nChain = chain; isInChain = true; break; } } if (!isInChain) { nChain = new List<long>(); allChains.Add(nChain); } if (!nChain.Contains(con.SourceNeuronId)) nChain.Add(con.SourceNeuronId); if (!nChain.Contains(con.TargetNeuronId)) nChain.Add(con.TargetNeuronId); } List<long> finalChain = allChains.Find(chain => chain.Count == maxChain); if (finalChain != null && finalChain.Count != 0) { List<ConnectionGene> markDelete = new List<ConnectionGene>(); foreach (var conn in connections) { bool delete = false; //if we don't have you in our chain, get rid of the object if (!finalChain.Contains(conn.SourceNeuronId)) { hiddenNeurons.Remove(conSourcePoints[conn.InnovationId]); delete = true; } if (!finalChain.Contains(conn.TargetNeuronId)) { hiddenNeurons.Remove(conTargetPoints[conn.InnovationId]); delete = true; } if (delete) markDelete.Add(conn); } markDelete.ForEach(x => connections.Remove(x)); //connections.RemoveAll(x => !(finalChain.Contains(x.SourceNeuronId) || finalChain.Contains(x.TargetNeuronId))); //hiddenNeurons.RemoveAll(hn => } connections.ForEach(con => { //readjust connection source/target depending on hiddenNeuron array PointF point = conSourcePoints[con.InnovationId]; con.SourceNeuronId = hiddenNeurons.FindIndex(hp => hp.X == point.X && hp.Y == point.Y); if (con.SourceNeuronId == -1) Console.WriteLine("Adjusted con src- " + con.SourceNeuronId + " tgt- " + con.TargetNeuronId); point = conTargetPoints[con.InnovationId]; con.TargetNeuronId = hiddenNeurons.FindIndex(hp => hp.X == point.X && hp.Y == point.Y); if (con.TargetNeuronId == -1) Console.WriteLine("Adjusted con src- " + con.SourceNeuronId + " tgt- " + con.TargetNeuronId); }); }