def test_isRedundat_onlyOneHyperplane_3d(self):
        d = 3
        h = Hyperplane([1.0, 1.0, 0.0], 5)
        r = Region([h], d)

        resul = h.isRedundant(r)
        self.assertFalse(resul,
                         "no puede ser redundante si no hay otro hiperplanos")
        pass
    def test_classify_twoSquarePoliedrom(self):
        d = 2
        k = 2
        t0 = "blue"
        t1 = "red"
        sample_blue1 = Sample((8.0, 8.0))
        sample_blue2 = Sample((2.0, 2.0))
        sample_red = Sample((5.0, 5.0))

        h1 = Hyperplane({0: 1, 1: 0}, 4)
        h2 = Hyperplane({0: -1, 1: 0}, 0)
        h3 = Hyperplane({0: 0, 1: 1}, 4)
        h4 = Hyperplane({0: 1, 1: -1}, 0)

        h5 = Hyperplane({0: 1, 1: 0}, 10)
        h6 = Hyperplane({0: -1, 1: 0}, -6)
        h7 = Hyperplane({0: 0, 1: 1}, 10)
        h8 = Hyperplane({0: 0, 1: -1}, -6)

        classifier = Classifier([], [], t0, t1, d, k)
        classifier.regions = [
            Region([h1, h2, h3, h4], d),
            Region([h5, h6, h7, h8], d)
        ]

        self.assertEquals(t1, classifier.classify(sample_blue1),
                          "la muestra debe ser azul")
        self.assertEquals(t1, classifier.classify(sample_blue2),
                          "la muestra debe ser azul")

        self.assertEquals(t0, classifier.classify(sample_red),
                          "la muestra debe ser roja")
def defineHyperplane(group,cluster):
    
    def getVals(model,dic):
        ret = {}
        for key,value in dic.items():
            ret[key] = model.getVal(value)
        return ret
    
    dimension = cluster.getDimension()  
    
        
    ################## model #########################################
    
    model = Model()
    model.hideOutput()
    piVars = {}
    for f in range(dimension):
        piVars[f] = model.addVar(vtype="CONTINUOUS", name="pi[%s]" % (f),lb=None)
    
    alfaVar = model.addVar(vtype="CONTINUOUS", name="alfa",lb=None)
    objective = model.addVar(vtype="CONTINUOUS", name="objective",lb=None)
    
    model.addCons(quicksum(piVars[f]*piVars[f] for f in range(dimension)) <= objective , "objective_function" )
    
    for sample in cluster.getSamples():
        model.addCons(quicksum(piVars[f]*sample.getFeature(f) for f in range(dimension))>= alfaVar + 1, "r1%s" % (sample))
    
    for sample in group.getSamples():
        model.addCons(quicksum(piVars[f]*sample.getFeature(f) for f in range(dimension)) <= alfaVar - 1,"f2%s" % (sample))
    model.setObjective(objective,sense="minimize")
    model.optimize()

    return Hyperplane(getVals(model,piVars), model.getVal(alfaVar))    
    def test_isRedundant_thereIsNotRedundant_3d(self):
        d = 3
        h1 = Hyperplane([1.0, 1.0, 0.0], 5.5)
        h2 = Hyperplane([2.0, 1.0, 0.0], 6.0)
        h3 = Hyperplane([3.0, 1.0, 0.0], 7.0)

        r = Region([h1, h2, h3], d)

        self.assertFalse(h1.isRedundant(r),
                         "el hiperplano x + y = 5.5 no es redundante")
        self.assertFalse(h2.isRedundant(r),
                         "el hiperplano 2x + y = 6 no es redundante")
        self.assertFalse(h3.isRedundant(r),
                         "el hiperplano 3x + y = 7 no es redundante")
    def test_classify_Polytope(self):
        d = 2
        k = 2
        t0 = "blue"
        t1 = "red"
        sample_blue = Sample((-5.0, -5.0))
        sample_red = Sample((5.0, 5.0))

        h1 = Hyperplane({0: 1, 1: 2}, 5)
        h2 = Hyperplane({0: 1, 1: 0.5}, 5)

        classifier = Classifier([], [], t0, t1, d, k)
        classifier.regions = [Region([h1, h2], d)]

        self.assertEquals(t1, classifier.classify(sample_blue),
                          "la muestra debe ser azul")

        self.assertEquals(t0, classifier.classify(sample_red),
                          "la muestra debe ser roja")
    def test_Classify_squarePolyedrom(self):
        d = 2
        k = 1
        t0 = "blue"
        t1 = "red"
        sample_blue = Sample((2.0, 2.0))
        sample_red = Sample((6.0, 0.0))

        h1 = Hyperplane({0: 1, 1: 0}, 4)
        h2 = Hyperplane({0: -1, 1: 0}, 0)
        h3 = Hyperplane({0: 0, 1: 1}, 4)
        h4 = Hyperplane({0: 1, 1: -1}, 0)

        classifier = Classifier([], [], t0, t1, d, k)
        classifier.regions = [Region([h1, h2, h3, h4], d)]

        self.assertEquals(t1, classifier.classify(sample_blue),
                          "la muestra debe ser azul")
        self.assertEquals(t0, classifier.classify(sample_red),
                          "la muestra debe ser roja")
    def test_Classify_irregularPolyhedron(self):
        d = 2
        k = 1
        t0 = "blue"
        t1 = "red"
        sample_blue = Sample((0.0, 0.0))
        sample_red = Sample((20.0, 20.0))

        h1 = Hyperplane({0: 1, 1: 1}, 10)
        h2 = Hyperplane({0: -10, 1: -1}, 10)
        h3 = Hyperplane({0: 4, 1: -1}, 50)
        h4 = Hyperplane({0: 1, 1: -1}, 10)

        classifier = Classifier([], [], t0, t1, d, k)
        classifier.regions = [Region([h1, h2, h3, h4], d)]

        self.assertEquals(t1, classifier.classify(sample_blue),
                          "la muestra debe ser azul")
        self.assertEquals(t0, classifier.classify(sample_red),
                          "la muestra debe ser roja")
    def test_isRedundat_thereIsRedundant_3d(self):
        d = 3
        h1 = Hyperplane([1.0, 1.0, 0.0], 5.5)
        h2 = Hyperplane([1.0, 1.0, 0.0], 6.0)
        h3 = Hyperplane([1.0, 1.0, 0.0], 7.0)

        r = Region([h1, h2, h3], d)

        self.assertFalse(h1.isRedundant(r),
                         "el hiperplano x + y = 5.5 no es redundante")
        self.assertTrue(
            h2.isRedundant(r),
            "el hiperplano x + y = 6 es redundante por el hiperplano x 'y = 5.5"
        )
        self.assertTrue(
            h3.isRedundant(r),
            "el hiperplano x + y = 7 es redundante por el hiperplano x 'y = 5.5"
        )

        pass
    def test_classify_twoPolytope(self):
        d = 2
        k = 2
        t0 = "blue"
        t1 = "red"
        sample_blue1 = Sample((-10.0, -5.0))
        sample_blue2 = Sample((40.0, 20.0))

        sample_red = Sample((5.0, 5.0))

        h1 = Hyperplane({0: 1, 1: 2}, 5)
        h2 = Hyperplane({0: 1, 1: 0.5}, 5)
        h3 = Hyperplane({0: -1, 1: -2}, -30)
        h4 = Hyperplane({0: -1, 1: -0.5}, -30)

        classifier = Classifier([], [], t0, t1, d, k)
        classifier.regions = [Region([h1, h2], d), Region([h3, h4], d)]

        self.assertEquals(t1, classifier.classify(sample_blue1),
                          "la muestra debe ser azul")
        self.assertEquals(t1, classifier.classify(sample_blue2),
                          "la muestra debe ser azul")
        self.assertEquals(t0, classifier.classify(sample_red),
                          "la muestra debe ser roja")
    def test_Classify_trivial(self):
        d = 2
        k = 1
        t0 = "blue"
        t1 = "red"
        sample_blue = Sample((2.0, 0.0))
        sample_red = Sample((6.0, 0.0))

        hyperplane = Hyperplane({0: 4, 1: 0}, 16)

        classifier = Classifier([], [], t0, t1, d, k)
        classifier.regions = [Region([hyperplane], d)]

        self.assertEquals(t1, classifier.classify(sample_blue),
                          "la muestra debe ser azul")
        self.assertEquals(t0, classifier.classify(sample_red),
                          "la muestra debe ser roja")