HyperCube(Sample a, Sample b, Sample midPoint, HyperCube parent) {
            this.a = a;
            this.b = b;
            this.midPoint = midPoint;
            this.parent = parent;
            this.InCubeSamples = new ArrayList<Sample>();
            InCubeSamples.add(a);
            InCubeSamples.add(b);
            InCubeSamples.add(midPoint);
            this.L = ApproxL(a, b, this);
            if (parent != null) {
                highestLowBound = Math.max(Math.max(-1000000000000.0,
                        Math.max(a.fx, b.fx) - VectorNorm2(VectorMul(VectorSub(b.x, a.x), L))),
                        midPoint.fx - VectorNorm2(VectorMul(VectorSub(b.x, a.x), L)) / 2.0);
            }

            double minimum = Math.min(Math.min(a.fx, b.fx), midPoint.fx);
            if (highestLowBound > minimum) {
                highestLowBound = minimum;
            }

            goodOneFactor = ((midPoint.fx - a.fx) + (midPoint.fx - b.fx));
        }