public static NodeServer <NodeType> Create(
            Vector[] initVectors,
            int numOfNodes,
            int vectorLength,
            GlobalVectorType globalVectorType,
            ApproximationType approximation,
            MonitoredFunction monitoredFunction,
            ResolveNodesFunction <NodeType> resolveNodes,
            Func <Vector, ConvexBound, int, int, NodeType> createNode)
        {
            initVectors = initVectors.Map(v => v.Clone());
            var globalVector = globalVectorType.GetValue(initVectors);

            var(lowerBound, upperBound) = approximation.Calc(monitoredFunction.Function(globalVector));
            var upperConvexBound = monitoredFunction.UpperBound(globalVector, upperBound);
            var lowerConvexBound = monitoredFunction.LowerBound(globalVector, lowerBound);
            var upperNodes       = ArrayUtils.Init(numOfNodes, i => createNode(globalVector.Clone(), upperConvexBound, i, vectorLength));
            var lowerNodes       = ArrayUtils.Init(numOfNodes, i => createNode(globalVector.Clone(), lowerConvexBound, i, vectorLength));

            NodeServer <NodeType> ReCreate(Vector[] newInitVectors)
            => Create(newInitVectors, numOfNodes, vectorLength, globalVectorType, approximation, monitoredFunction, resolveNodes, createNode);

            return(new NodeServer <NodeType>(initVectors, numOfNodes, vectorLength, globalVectorType, upperBound, lowerBound, monitoredFunction.Function,
                                             approximation, upperNodes, lowerNodes, resolveNodes, ReCreate));
        }
 public NodeServer(Vector[]                             nodesVectors,
                   int numOfNodes, int vectorLength,
                   GlobalVectorType globalVectorType,
                   double upperBound, double lowerBound,
                   Func <Vector, double> function,
                   ApproximationType approximation, NodeType[] upperNodes,
                   NodeType[]                           lowerNodes,
                   ResolveNodesFunction <NodeType> resolveNodes,
                   Func <Vector[], NodeServer <NodeType> > reCreate)
     : base(nodesVectors, numOfNodes, vectorLength, globalVectorType, upperBound, lowerBound, function,
            approximation)
 {
     UpperNodes   = upperNodes;
     LowerNodes   = lowerNodes;
     ResolveNodes = resolveNodes;
     ReCreate     = reCreate;
 }