private static Tuple<int, double>[][] IOLinks_PostAdjust_BrainBrainLinks(Set2D[] brainSets)
            {
                // Get the AABB of the brain sets, and use the diagonal as the size
                var aabb = Math2D.GetAABB(brainSets.Select(o => o.Center));
                double maxDistance = (aabb.Item2 - aabb.Item1).Length;

                // Get links between the brains and distances of each link
                var links = Math2D.GetDelaunayTriangulation(brainSets.Select(o => o.Center).ToArray(), true).
                    Select(o => new { Brain1 = o.Item1, Brain2 = o.Item2, Distance = (brainSets[o.Item1].Center - brainSets[o.Item2].Center).Length }).

                    // break here, get stats on lengths, omit links that are excessively long

                    Select(o => new { Brain1 = o.Brain1, Brain2 = o.Brain2, Resistane = (o.Distance / maxDistance) * IOPOSTMERGE_LINKRESISTANCEMULT }).      // calculate the wire's resistance (in terms of burden)
                    ToArray();


                //string dots = string.Join("\r\n", brainSets.Select(o => string.Format("_linksIO2D.Add(AddDot(new Point({0}, {1}), Brushes.Black, Brushes.Gray));", o.Center.X, o.Center.Y)));
                //string lines = string.Join("\r\n", links.Select(o => string.Format("_linksIO2D.Add(AddLine(new Point({0}, {1}), new Point({2}, {3}), Brushes.White));", brainSets[o.Brain1].Center.X, brainSets[o.Brain1].Center.Y, brainSets[o.Brain2].Center.X, brainSets[o.Brain2].Center.Y)));
                //string combined = dots + "\r\n\r\n" + lines;

                Tuple<int, double>[][] retVal = new Tuple<int, double>[brainSets.Length][];

                for (int cntr = 0; cntr < brainSets.Length; cntr++)
                {
                    // Store all links for this brain
                    retVal[cntr] = links.
                        Where(o => o.Brain1 == cntr || o.Brain2 == cntr).       // find links between this brain and another
                        Select(o => Tuple.Create(o.Brain1 == cntr ? o.Brain2 : o.Brain1, o.Resistane)).     // store the link to the other brain and the resistance
                        ToArray();
                }

                return retVal;
            }
            private static Tuple<int, double>[][] BrainBrainDistances(Set2D[] brainSets, double brainLinkResistanceMult)
            {
                // Get the AABB of the brain sets, and use the diagonal as the size
                var aabb = Math2D.GetAABB(brainSets.Select(o => o.Center));
                double maxDistance = (aabb.Item2 - aabb.Item1).Length;

                // Get links between the brains and distances of each link
                List<Tuple<int, int, double>> links2 = new List<Tuple<int, int, double>>();
                for (int outer = 0; outer < brainSets.Length - 1; outer++)
                {
                    for (int inner = outer + 1; inner < brainSets.Length; inner++)
                    {
                        double distance = (brainSets[outer].Center - brainSets[inner].Center).Length;
                        double resistance = (distance / maxDistance) * brainLinkResistanceMult;

                        links2.Add(Tuple.Create(outer, inner, resistance));
                    }
                }

                Tuple<int, double>[][] retVal = new Tuple<int, double>[brainSets.Length][];

                for (int cntr = 0; cntr < brainSets.Length; cntr++)
                {
                    // Store all links for this brain
                    retVal[cntr] = links2.
                        Where(o => o.Item1 == cntr || o.Item2 == cntr).       // find links between this brain and another
                        Select(o => Tuple.Create(o.Item1 == cntr ? o.Item2 : o.Item1, o.Item3)).     // store the link to the other brain and the resistance
                        OrderBy(o => o.Item2).
                        ToArray();
                }

                return retVal;
            }