def testInconsistency(self):
        self.repo.addConstraint(fd.make_expression(('a', 'b'), 'a < b'))
        self.repo.addConstraint(fd.make_expression(('a', 'b'), 'a > b'))

        try:
            self.repo.consistency()
            self.fail('No ConsistencyFailure raised')
        except ConsistencyFailure:
            pass
    def testInconsistency(self):
        self.repo.addConstraint(fd.make_expression(('a', 'b'),
                                                   'a < b'))
        self.repo.addConstraint(fd.make_expression(('a', 'b'),
                                                   'a > b'))

        try:
            self.repo.consistency()
            self.fail('No ConsistencyFailure raised')
        except ConsistencyFailure:
            pass
示例#3
0
    def testNolutionSolve(self):
        self.repo.addConstraint(fd.make_expression(('a', 'b'),
                                                   'b < a'))

        solutions = self.solver.solve(self.repo)
        self.assertEqual(solutions,
                         [])
 def setUp(self):
     self.relevant_variables = ['x']
     self.irrelevant_variable = 'tagada'
     self.constraint = fd.make_expression(self.relevant_variables,
                                          'x==2')
     self.domains = {'x':fd.FiniteDomain(range(4))}
     self.entailed_domains = {'x':fd.FiniteDomain([2])}
 def setUp(self):
     self.relevant_variables = ['x']
     self.irrelevant_variable = 'tagada'
     self.constraint = fd.make_expression(self.relevant_variables,
                                          'x==2')
     self.domains = {'x':fd.FiniteDomain(range(4))}
     self.entailed_domains = {'x':fd.FiniteDomain([2])}
示例#6
0
    def testConsistency(self):
        for v1 in self.variables:
            for v2 in self.variables:
                if v1 < v2:
                    self.repo.addConstraint(fd.make_expression((v1, v2),
                                                           '%s < %s'%(v1, v2)))

        self.repo.consistency()
        for v, dom in self.repo.getDomains().items():
            self.assertEqual(dom.size(),1)
 def setUp(self):
     self.relevant_variables = ['x','y','z']
     self.irrelevant_variable = 'tagada'
     self.constraint = fd.make_expression(self.relevant_variables,
                                          'x+y==2 and z>1')
     self.domains = {'x':fd.FiniteDomain(range(4)),
                     'y':fd.FiniteDomain(range(3)),
                     'z':fd.FiniteDomain(range(4))}
     self.entailed_domains = {'x':fd.FiniteDomain([2]),
                              'y':fd.FiniteDomain([0]),
                              'z':fd.FiniteDomain([2,3]),}
 def setUp(self):
     self.relevant_variables = ['x','y','z']
     self.irrelevant_variable = 'tagada'
     self.constraint = fd.make_expression(self.relevant_variables,
                                          'x+y==2 and z>1')
     self.domains = {'x':fd.FiniteDomain(range(4)),
                     'y':fd.FiniteDomain(range(3)),
                     'z':fd.FiniteDomain(range(4))}
     self.entailed_domains = {'x':fd.FiniteDomain([2]),
                              'y':fd.FiniteDomain([0]),
                              'z':fd.FiniteDomain([2,3]),}
示例#9
0
    def setUp(self):
        self.solver = Solver()
        self.domains = {}
        self.variables = list('abcdef')
        for v in self.variables:
            self.domains[v] = fd.FiniteDomain(range(6))

        self.repo = Repository(self.variables, self.domains)
        for v1 in self.variables:
            for v2 in self.variables:
                if v1 < v2:
                    self.repo.addConstraint(fd.make_expression((v1, v2),
                                                               '%s < %s'%(v1, v2)))
示例#10
0
 def testVCGDraw(self):
     for v1 in self.variables:
         for v2 in self.variables:
             if v1 < v2:
                 self.repo.addConstraint(fd.make_expression((v1, v2),
                                                        '%s < %s'%(v1, v2)))
     try:
         try:
             self.repo.vcg_draw('toto.vcg')
         except IOError, exc:
             self.fail('This test cannot run in the testing environment'
                       'because I cannot write the file.\n'
                       'The error message was: \n%s' % exc)
     finally:
         os.unlink('toto.vcg')
示例#11
0
def queens(size=8, verbose=0):
    possible_positions = [(i, j) for i in range(size) for j in range(size)]
    variables = []
    domains = {}
    constraints = []
    for i in range(size):
        name = 'Q%d' % i
        variables.append(name)
        domains[name] = fd.FiniteDomain(possible_positions)
    for q1 in variables:
        for q2 in variables:
            if q1 < q2:
                constraints.append(fd.make_expression((q1,q2),
                                                      '%(q1)s[0] < %(q2)s[0] and '
                                                      '%(q1)s[1] != %(q2)s[1] and '
                                                      'abs(%(q1)s[0]-%(q2)s[0]) != '
                                                      'abs(%(q1)s[1]-%(q2)s[1])'%\
                                                      {'q1':q1,'q2':q2}))
    r = Repository(variables, domains, constraints)
    s = Solver().solve(r, verbose)
    print 'Number of solutions:', len(s)
def queens(size=8,verbose=0):
    possible_positions = [(i,j) for i in range(size) for j in range(size)]
    variables = []
    domains = {}
    constraints = []
    for i in range(size):
        name = 'Q%d'%i
        variables.append(name)
        domains[name] = fd.FiniteDomain(possible_positions)
    for q1 in variables:
        for q2 in variables:
            if q1 < q2:
                constraints.append(fd.make_expression((q1,q2),
                                                      '%(q1)s[0] < %(q2)s[0] and '
                                                      '%(q1)s[1] != %(q2)s[1] and '
                                                      'abs(%(q1)s[0]-%(q2)s[0]) != '
                                                      'abs(%(q1)s[1]-%(q2)s[1])'%\
                                                      {'q1':q1,'q2':q2}))
    r = Repository(variables,domains,constraints)
    s = Solver().solve(r,verbose)
    print 'Number of solutions:',len(s)
示例#13
0
 def parseHead(self,kepthead,removedhead,rule):
     try:
         kepthead = self.splitHead(kepthead)
         rule.kepthead = [self.rulesystem.bcfactory.getFreeConstraint(func,args) for (func,args) in kepthead]
         removedhead = self.splitHead(removedhead)
         rule.removedhead = [self.rulesystem.bcfactory.getFreeConstraint(func,args) for (func,args) in removedhead]
     except KeyError:
         logging.getLogger("rulesystem.parse").error("Constraint not found when parsing rules, did you list all constraints in the [Constraints] section?")
         raise
     head = kepthead + removedhead
     for (i,(functor,args)) in enumerate(head):
         types = self.rulesystem.bcfactory.getFreeConstraint(functor,args).types
         for (j,arg) in enumerate(args):
             if arg[0].isupper():
                 if not arg in rule.extravars:
                     rule.extravars.append(arg)
                 rule.guard.append(fd.make_expression(("_var_%i_%i"%(i,j),arg),"_var_%i_%i == %s"%(i,j,arg)))
             elif arg[0] == "_":
                 continue
             else:
                 rule.guard.append(fd.Equals("_var_%i_%i"%(i,j),totype(arg,types[j])))
示例#14
0
 def add_expr(self, vars, expr):
     self.constraints.append(fd.make_expression(vars, expr))
     self.scons.append(expr)
示例#15
0
    def matchAtPosition(self,con,pos):
        allConstraints = self.kepthead + self.removedhead
        var1 = ["_var_%i" % i for i in range(len(allConstraints))]
        var2 = ["_var_%i_%i" % (i,j) for i in range(len(allConstraints)) for j in range(allConstraints[i].arity)]

        domains = {}
        allvals = []
        for i in range(len(allConstraints)):
            c = "_var_%i" % i
            vals = self.rulesystem.findConstraint(allConstraints[i])
            if vals == []:
                return False
            domains[c] = fd.FiniteDomain(vals)
            for j in range(allConstraints[i].arity):
                c2 = "%s_%i" % (c,j)
                vals2 = [x.args[j] for x in vals]
                domains[c2] = fd.FiniteDomain(vals2)
                allvals.extend(vals2)
        for i in self.extravars:
            domains[i] = fd.FiniteDomain(allvals)

        variables = var1 + var2 + self.extravars

        constraints = []
        if(len(var1) > 1):
            constraints.append(fd.AllDistinct(var1))
        constraints.append(fd.Equals("_var_%i" % pos,con))
        for i in range(len(allConstraints)):
            for j in range(allConstraints[i].arity):
                c = "_var_%i" % i
                a = "_var_%i_%i" % (i,j)
                constraints.append(fd.make_expression((c,a),"%s.args[%i] == %s"%(c,j,a)))
        constraints.extend(self.guard)

        try:
            #logging.getLogger("rulesystem.matchAtPosition").debug("vars " + str(variables))
            #logging.getLogger("rulesystem.matchAtPosition").debug("domains " + str(domains))
            #logging.getLogger("rulesystem.matchAtPosition").debug("cons " + str(constraints))
            r = Repository(variables, domains, constraints)
            solutions = Solver().solve(r, self.rulesystem.verbosity > 2 and self.rulesystem.verbosity - 2)
        except ConsistencyFailure:
            return False
        if solutions is None:
            return False
        for solution in solutions:
            p = [solution["_var_%i"%i] for i in range(len(allConstraints))]
            assert len(p) == len(self.kepthead) + len(self.removedhead)
            if tuple(p) in self.history: continue
            if self.rulesystem.hasConstraints(p):
                context = self.rulesystem.createContext()

                #bind vars
                for i in range(len(p)):
                    tempcon = p[i]
                    for j in range(tempcon.arity):
                        var = "_var_%i_%i" % (i,j)
                        context[var] = tempcon.args[j]
                for v in self.extravars:
                    context[v] = solution[v]
                if eval(self.userguard,context):
                    #logging.getLogger("rulesystem.matchAtPosition").info("Fired:%s" % self.name)
                    if self.removedhead == []:
                        removedConstraints = []
                    else:
                        removedConstraints = p[-len(self.removedhead):]
                    for c in removedConstraints:
                        self.rulesystem.removeConstraint(c)
                    self.history.add(tuple(p))
                    try:
                        exec(self.body,context)
                    except NameError:
                        #logging.getLogger("rulesystem.matchAtPosition").error("Variable, function or constraint not found, please check rule '%s'"%self.name)
                        raise