[pypy-svn] r31778 - in pypy/dist/pypy/lib/pyontology: . test

ale at codespeak.net ale at codespeak.net
Tue Aug 29 14:04:22 CEST 2006


Author: ale
Date: Tue Aug 29 14:04:20 2006
New Revision: 31778

Modified:
   pypy/dist/pypy/lib/pyontology/constraint_classes.py
   pypy/dist/pypy/lib/pyontology/pyontology.py
   pypy/dist/pypy/lib/pyontology/test/test_ontology.py
Log:
bugfixes and small performance improvements

Modified: pypy/dist/pypy/lib/pyontology/constraint_classes.py
==============================================================================
--- pypy/dist/pypy/lib/pyontology/constraint_classes.py	(original)
+++ pypy/dist/pypy/lib/pyontology/constraint_classes.py	Tue Aug 29 14:04:20 2006
@@ -5,7 +5,7 @@
 import py
 from pypy.tool.ansi_print import ansi_log
 log = py.log.Producer("Constraint")
-py.log.setconsumer("Constraint", ansi_log)
+py.log.setconsumer("Constraint", None)
 
 class OwlConstraint(AbstractConstraint):
 
@@ -110,9 +110,16 @@
         self.variable = variable
 
     def narrow(self, domains):
-        x_vals = domains[self.object].getValues()
-        if self.variable not in x_vals:
-            raise ConsistencyFailure("%s not in %s"% (self.variable, self.object))
+        dom = domains[self.variable]
+        if domains[self.object].fixed:
+            x_vals = set(domains[self.object].getValues())
+            for indi in dom.getValues():
+                if not indi in x_vals:
+                    dom.removeValue(indi) 
+        else:
+            x_vals = set(domains[self.object].getValues())
+            if dom not in x_vals:
+                raise ConsistencyFailure("%s not in %s"% (self.variable, self.object))
 
 class ComplementOfConstraint(SubClassConstraint):
 
@@ -134,17 +141,18 @@
     def narrow(self, domains):
         propdom = domains[self.variable]
         rangedom = domains[self.object]
-        newrange = rangedom.getValues()
+        newrange = set(rangedom.getValues())
         res = []
-        oldrange = propdom.range
+        oldrange = set(propdom.range)
         if oldrange:
-            for v in oldrange:
-                if v in newrange:
-                    res.append(v)
+            res = oldrange & newrange 
         else:
             res = newrange
-        propdom.range = res
-        propdom.setValues([(None,i) for i in res])
+        propdom.range = list(res)
+        prop = Linkeddict(propdom.getValues())
+        for pval in prop:
+            if pval not in res:
+                raise ConsistencyFailure("Value %r not in range %r"%(pval, res))
 
 class DomainConstraint(SubClassConstraint):
 
@@ -153,20 +161,18 @@
     def narrow(self, domains):
         propdom = domains[self.variable]
         domaindom = domains[self.object]
-        newdomain = domaindom.getValues() +[self.object]
+        newdomain = set(domaindom.getValues() +[self.object])
         domain = []
-        olddomain = propdom.domain
+        olddomain = set(propdom.domain)
         if olddomain:
-            for v in olddomain:
-                if v in newdomain:
-                    domain.append(v)
+            domain= olddomain & newdomain
         else:
             domain = newdomain
-        propdom.domain = domain
+        propdom.domain = list(domain)
         prop = Linkeddict(propdom.getValues())
-        for pval in prop.keys():
+        for pval in prop:
             if pval not in domain:
-                raise ConsistencyFailure("Value %r not in range %r"%(pval, domain))
+                raise ConsistencyFailure("Value %r not in domain %r"%(pval, domain))
 
 class SubPropertyConstraint(SubClassConstraint):
 
@@ -187,10 +193,9 @@
         subdom = domains[self.variable]
         superdom = domains[self.object]
         vals = superdom.getValues()  
-        for val in subdom.getValues():
-            if not val in vals:
-                raise ConsistencyFailure("The Property %s is not equivalent to Property %s" %
-                                         (self.variable, self.object))
+        for value in subdom.getValues():
+            if not value in vals:
+                superdom.addValue(value[0], value[1])
 
 class TypeConstraint(SubClassConstraint):
     cost = 1
@@ -215,7 +220,7 @@
                 for item in val:
                     for otheritem in val:
                         if (otheritem == item) == False: 
-                            raise ConsistencyFailure("FunctionalCardinality error")
+                            raise ConsistencyFailure("FunctionalCardinality error: %s for property %s" % (cls, self.variable))
         else:
             return 0
 
@@ -275,17 +280,19 @@
     
     def narrow(self, domains):
         """narrowing algorithm for the constraint"""
-        obj_domain = domains[self.object].getValues()
-        sub_domain = domains[self.variable].getValues()
+        obj_domain = domains[self.object].getValuesPrKey()
+        sub_domain = set(domains[self.variable].getValues())
         res = []
         for cls, val in obj_domain:
             for v in val:
                 if not (v,cls) in sub_domain:
                     domains[self.variable].addValue(v, cls)
+        obj_domain = set(domains[self.object].getValues())
+        sub_domain = domains[self.variable].getValuesPrKey()
         for cls, val in sub_domain:
             for v in val:
-                if not (val,cls) in obj_domain:
-                    domains[self.object].addValue(val, cls)
+                if not (v,cls) in obj_domain:
+                    domains[self.object].addValue(v, cls)
 
 class DifferentfromConstraint(SubClassConstraint):
 
@@ -446,7 +453,7 @@
     cost = 100
         
     def narrow(self, domains):
-        val = domains[self.List].getValues()
+        val = set(domains[self.List].getValues())
         dom = domains[self.variable]
         property = dom.property
         indi = dom.getValues()
@@ -473,13 +480,16 @@
     cost = 100
         
     def narrow(self, domains):
-        val = domains[self.List].getValues()
+        val = set(domains[self.List].getValues())
         dom = domains[self.variable]
         property = dom.property
         indi = dom.getValues()
-        prop = Linkeddict(domains[property].getValues())
+        prop = domains[property]._dict
+        remove = []
         for v in indi:
-            if not v in prop.keys():
+            if not val:
+                dom.removeValue(v)
+            elif not v in prop:
                 dom.removeValue(v)
             else:
                 prop_val = prop[v]
@@ -498,7 +508,7 @@
         indi = dom.getValues()
         prop = Linkeddict(domains[property].getValues())
         for v in indi:
-            if not v in prop.keys():
+            if not v in prop:
                 dom.removeValue(v)
             else:
                 prop_val = prop[v] 

Modified: pypy/dist/pypy/lib/pyontology/pyontology.py
==============================================================================
--- pypy/dist/pypy/lib/pyontology/pyontology.py	(original)
+++ pypy/dist/pypy/lib/pyontology/pyontology.py	Tue Aug 29 14:04:20 2006
@@ -6,15 +6,17 @@
 from constraint_classes import *
 import sys, py
 import time
+from urllib2 import URLError
 log = py.log.Producer("Pyontology")
 from pypy.tool.ansi_print import ansi_log
 py.log.setconsumer("Pyontology", None)
-
+#py.log.setconsumer("Pyontology.exception", ansi_log)
 
 namespaces = {
     'rdf' : 'http://www.w3.org/1999/02/22-rdf-syntax-ns',
     'rdfs' : 'http://www.w3.org/2000/01/rdf-schema',
     'xmlns' : 'http://www.w3.org/1999/xhtml',
+    'xmlschema' : 'http://www.w3.org/2001/XMLSchema', 
     'owl' : 'http://www.w3.org/2002/07/owl',
 }
 
@@ -56,7 +58,9 @@
     # The instances of a class can be represented as a FiniteDomain in values (not always see Disjointwith)
     # Properties of a class is in the dictionary "properties"
     # The bases of a class is in the list "bases"
-    
+
+    fixed = False
+ 
     def __init__(self, name='', uri=None, values = [], bases = []):
         AbstractDomain.__init__(self)
         self.name = name
@@ -100,7 +104,6 @@
                 cls = variables[cls]
                 dom,constraint = cls.finish(variables, glob_constraints)
 
-                log.finish("DOM %r "%dom)
                 # if the base class is a Restriction we shouldnt add the constraints to the store
                 if not isinstance(cls, Restriction):
                     self.domains.update(dom)
@@ -109,14 +112,12 @@
                 for constraint in cls.un_constraint:
                     dom, constraints = constraint(self.name, variables[cls.property], cls.value)
                     self.domains.update(dom)
-                    log("Updating constraints %r" % constraints)
                     self.in_constraint.extend(constraints)
-            log("RESULT of finish %r, %r" %(self.domains,self.in_constraint))
             # update the store
             if ('owl_Thing' in variables.keys() and isinstance(self, ClassDomain)
                  and  self.getValues() == []):
                 variables[self.name].setValues(variables['owl_Thing'].getValues())
-                log.finish("setting the domain %s to all individuals %r"%(self.name,variables[self.name]))
+#                log.finish("setting the domain %s to all individuals %r"%(self.name,variables[self.name]))
             variables.update(self.domains)
             glob_constraints.extend(self.in_constraint)
             assert len([x for x in glob_constraints if type(x)==list])==0
@@ -136,8 +137,11 @@
             self.removeValue(val)
 
     def removeValue(self, value):
-        self.values.pop(value)
+        log.removeValue("Removing %r of %r" % (value ,self.values))
+        if value in self.values:
+            self.values.pop(value)
         if not self.values:
+            log.removeValue("Removed the lastvalue of the Domain")
             raise ConsistencyFailure
  
     def getBases(self):
@@ -160,12 +164,13 @@
         
     def setValues(self, values):
         for val in values:
-            self.addValue(val) #self.values = dict.fromkeys(values)
+            self.addValue(val) 
 
 class FixedClassDomain(ClassDomain):
 
-    finished = False
-    
+    finished = True 
+    fixed = True
+ 
     def removeValues(self, values):
         pass #raise ConsistencyFailure
 
@@ -178,8 +183,9 @@
 class Thing(ClassDomain):
     pass
 
-class Individual:
+class Individual(Thing):
     def __init__(self, name, uri=None, values=[], bases=[]):
+        Thing.__init__(self, name, uri, values, bases) 
         self.name = name
         self.uri = uri
         self.sameas = set() 
@@ -209,7 +215,7 @@
     def __init__(self, name='', values=[], bases = []):
         ClassDomain.__init__(self, name, values, bases)
 
-class Property(fd):
+class Property(ClassDomain):
     # Property contains the relationship between a class instance and a value
     # - a pair. To accomodate global assertions like 'range' and 'domain' attributes
     # for range and domain must be filled in by rdfs:range and rdfs:domain
@@ -226,6 +232,7 @@
         self.in_constraint = []
         self.bases = []
         self.finished = True
+
     def finish(self, var, constraints):
         return var, constraints
     
@@ -246,6 +253,8 @@
         return self._dict.items()
     
     def addValue(self, key, val):
+        if key == None:
+            raise RuntimeError
         self._dict.setdefault(key, [])
         self._dict[key].append(val)
     
@@ -296,11 +305,6 @@
         Property.__init__(self, name, values, bases)
         self.constraint = [FunctionalCardinality(name)]
 
-    def addValue(self, key, val):
-        Property.addValue(self, key, val)
-#        if len(self._dict[key]) > 1:
-#            raise ConsistencyFailure("FunctionalProperties can only have one value")
-        
 class InverseFunctionalProperty(Property):
     
     def __init__(self, name='', values=[], bases = []):
@@ -317,7 +321,7 @@
             res = res | vals
 
 class TransitiveProperty(Property):
-    
+   
     def __init__(self, name='', values=[], bases = []):
         Property.__init__(self, name, values, bases)
         #self.constraint = TransitiveConstraint(name)
@@ -376,7 +380,8 @@
                getUriref('owl', 'Restriction') : Restriction,
                getUriref('owl', 'SymmetricProperty') : SymmetricProperty,
                getUriref('owl', 'TransitiveProperty') : TransitiveProperty,
-               getUriref('rdf', 'List') : List
+               getUriref('rdf', 'List') : List,
+#               getUriref('xmlschema', 'string') : str
               }
 
 class Ontology:
@@ -391,6 +396,8 @@
         self.constraints = []
         self.seen = {}
         self.var2ns ={}
+        self.nr_of_triples = 0
+        self.time = time.time()
     
     def add(self, triple):
         self.graph.add(triple)
@@ -409,18 +416,23 @@
         self.graph.load(f, format=format)
     
     def attach_fd(self):
-        #while len(list(self.graph.triples((None,)*3))) != len(self.seen.keys()):
-        self.time = time.time()
-        self.nr_of_triples = 0
         for (s, p, o) in (self.graph.triples((None,)*3)):
             self.consider_triple((s, p, o))
         log("=============================")
-#        assert len(list(self.graph.triples((None,)*3))) == len(self.seen.keys())
 
     def finish(self):
-        for key in list(self.variables.keys()):
-            log("FINISHING %s,%r" % (key,self.variables[key].bases))
-            self.variables[key].finish(self.variables, self.constraints)
+        t0 = time.time()
+        for constraint in self.constraints:
+            log.exception("Trying %r" %constraint)
+            for key in constraint.affectedVariables():
+                log.exception("FINISHING %s" % key)
+                if isinstance( self.variables[key], fd):
+                    continue
+                self.variables[key].finish(self.variables, self.constraints)
+                t1 = time.time()
+            constraint.narrow(self.variables)
+            t2 = time.time()
+            t0 = time.time()
     
     def consider_triple(self,(s, p, o)):
         if (s, p, o) in self.seen:
@@ -480,9 +492,9 @@
                 ns,name = a,''
             if ns not in uris.keys():
                 uris[ns] = ns.split('/')[-1]
-            a = uris[ns] + '_' + name
-            var = str(a.replace('.','_'))
-            var = str(a.replace('-','_'))
+            var = uris[ns] + '_' + name
+            var = str(var.replace('.','_'))
+            var = str(var.replace('-','_'))
         elif type(a) == BNode:
             var = str(a)
         else:
@@ -490,14 +502,14 @@
         if not cls:
             return var
         if not var in self.variables:
-            cls = self.variables[var] = cls(var)
+            cls = self.variables[var] = cls(var, a)
             if cls.constraint:
                 log("make_var constraint 1 %r,%r" %(cls,a))
                 self.constraints.extend(cls.constraint)
         # XXX needed because of old style classes
         elif not cls == self.variables[var].__class__ and issubclass(cls, self.variables[var].__class__):
             vals = self.variables[var].getValues()
-            tmp = cls(var)
+            tmp = cls(var, a)
             tmp.setValues(vals)
             tmp.property = self.variables[var].property
             if tmp.constraint:
@@ -513,7 +525,6 @@
     def consistency(self, verbose=0):
         log("BEFORE FINISH %r" % self.variables)
         self.finish()
-        log("DOMAINS %r"% self.variables)
         self.rep = Repository(self.variables.keys(), self.variables, self.constraints)
         self.rep.consistency(verbose)
     
@@ -554,9 +565,9 @@
         if not var in builtin_voc :
             # var is not one of the builtin classes -> it is a Thing
             self.type(s, Thing_uri)
-            svar = self.make_var(None,s)
+            svar = self.make_var(Individual, s)
             self.variables[svar].type.append(avar) 
-            #self.constraints.append(MemberConstraint(Individual(svar,s), avar))
+            self.constraints.append(MemberConstraint(svar, avar))
         else:
             # var is a builtin class
             cls = builtin_voc[var]
@@ -773,9 +784,12 @@
         url = var
         # add the triples to the graph
         tmp = Graph()
-        tmp.load(url)
-        for trip in tmp.triples((None,)*3):
-            self.add(trip)
+        try:
+           tmp.load(url)
+           for trip in tmp.triples((None,)*3):
+               self.add(trip)
+        except URLError:
+           pass
 
     def sameAs(self, s, var):
         s_var = self.make_var(Thing, s)

Modified: pypy/dist/pypy/lib/pyontology/test/test_ontology.py
==============================================================================
--- pypy/dist/pypy/lib/pyontology/test/test_ontology.py	(original)
+++ pypy/dist/pypy/lib/pyontology/test/test_ontology.py	Tue Aug 29 14:04:20 2006
@@ -121,7 +121,7 @@
     O.make_var(ClassDomain, obj)
     O.type(sub, obj)
     
-    assert O.variables[O.make_var(None, sub)].__class__  == Thing
+    assert O.variables[O.make_var(None, sub)].__class__  == Individual 
 
 def test_ObjectProperty():
     sub = URIRef('a')
@@ -339,7 +339,7 @@
     obj = URIRef(namespaces['owl']+'#Thing')
     O.type(cls2, obj)
     O.subClassOf(cls2,restrict)
-    
+    O.variables[O.make_var(None, cls2)].finish(O.variables, O.constraints) 
     O.consistency()
     assert cls in O.variables[O.make_var(None, cls2)].getValues()
 #    py.test.raises(ConsistencyFailure, O.consistency)
@@ -548,6 +548,8 @@
     O.add((cls, UR(namespaces['rdfs']+'#subClassOf'),restr2 ))
     O.add((restr2, UR(namespaces['rdfs']+'#minCardinality'), 3 ))
     O.attach_fd()
+    for var in O.variables.values():
+        var.finish(O.variables, O.constraints)
     py.test.raises(ConsistencyFailure, O.consistency)
 
 def test_terminology_subclassof_cardinality():
@@ -573,6 +575,8 @@
     O.add((restr2, UR(namespaces['rdfs']+'#minCardinality'), 3 ))
     O.add((cls2, UR(namespaces['rdfs']+'#subClassOf'), cls ))
     O.attach_fd()
+    for var in O.variables.values():
+        var.finish(O.variables, O.constraints)
     py.test.raises(ConsistencyFailure, O.consistency)
     
 def test_add_file():



More information about the Pypy-commit mailing list