/// <summary>
        ///     Transforms the input array based upon the values provided.
        /// </summary>
        /// <param name="input">The input array</param>
        /// <returns>A scaled array</returns>
        public Node[] Transform(Node[] input)
        {
            Node[] output = new Node[input.Length];
            for (int i = 0; i < output.Length; i++)
            {
                int    index = input[i].Index;
                double value = input[i].Value;
                output[i] = new Node(index, Transform(value, index));
            }

            return(output);
        }
        private static double ComputeSquaredDistance(Node[] xNodes, Node[] yNodes)
        {
            Node   x       = xNodes[0];
            Node   y       = yNodes[0];
            int    xLength = xNodes.Length;
            int    yLength = yNodes.Length;
            int    xIndex  = 0;
            int    yIndex  = 0;
            double sum     = 0;

            while (true)
            {
                if (x.Index == y.Index)
                {
                    double d = x.Value - y.Value;
                    sum += d * d;
                    xIndex++;
                    yIndex++;
                    if (xIndex < xLength && yIndex < yLength)
                    {
                        x = xNodes[xIndex];
                        y = yNodes[yIndex];
                    }
                    else if (xIndex < xLength)
                    {
                        x = xNodes[xIndex];
                        break;
                    }
                    else if (yIndex < yLength)
                    {
                        y = yNodes[yIndex];
                        break;
                    }
                    else
                    {
                        break;
                    }
                }
                else if (x.Index > y.Index)
                {
                    sum += y.Value * y.Value;
                    if (++yIndex < yLength)
                    {
                        y = yNodes[yIndex];
                    }
                    else
                    {
                        break;
                    }
                }
                else
                {
                    sum += x.Value * x.Value;
                    if (++xIndex < xLength)
                    {
                        x = xNodes[xIndex];
                    }
                    else
                    {
                        break;
                    }
                }
            }

            for (; xIndex < xLength; xIndex++)
            {
                double d = xNodes[xIndex].Value;
                sum += d * d;
            }

            for (; yIndex < yLength; yIndex++)
            {
                double d = yNodes[yIndex].Value;
                sum += d * d;
            }

            return(sum);
        }
        private static double Dot(Node[] xNodes, Node[] yNodes)
        {
            double sum  = 0;
            int    xlen = xNodes.Length;
            int    ylen = yNodes.Length;

            if (xlen == 0)
            {
                throw new ArgumentOutOfRangeException("xNodes");
            }

            if (ylen == 0)
            {
                throw new ArgumentOutOfRangeException("yNodes");
            }

            int  i = 0;
            int  j = 0;
            Node x = xNodes[0];
            Node y = yNodes[0];

            while (true)
            {
                if (x.Index == y.Index)
                {
                    sum += (x.Value * y.Value);
                    i++;
                    j++;
                    if (i < xlen && j < ylen)
                    {
                        x = xNodes[i];
                        y = yNodes[j];
                    }
                    else
                    {
                        break;
                    }
                }
                else
                {
                    if (x.Index > y.Index)
                    {
                        ++j;
                        if (j < ylen)
                        {
                            y = yNodes[j];
                        }
                        else
                        {
                            break;
                        }
                    }
                    else
                    {
                        ++i;
                        if (i < xlen)
                        {
                            x = xNodes[i];
                        }
                        else
                        {
                            break;
                        }
                    }
                }
            }

            return(sum);
        }