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

ale at codespeak.net ale at codespeak.net
Wed Jan 4 14:10:41 CET 2006


Author: ale
Date: Wed Jan  4 14:10:40 2006
New Revision: 21692

Modified:
   pypy/dist/pypy/lib/pyontology/pyontology.py
   pypy/dist/pypy/lib/pyontology/test/test_ontology.py
Log:
Addedsupport for FunctionalProperties, rearranged the constraint classes, added tests


Modified: pypy/dist/pypy/lib/pyontology/pyontology.py
==============================================================================
--- pypy/dist/pypy/lib/pyontology/pyontology.py	(original)
+++ pypy/dist/pypy/lib/pyontology/pyontology.py	Wed Jan  4 14:10:40 2006
@@ -79,7 +79,6 @@
 
     def setValues(self, values):
         for k,v in values:
-            print "####",k,v
             self._dict.setdefault(k,[])
             if type(v) == list:
                 self._dict[k] = v
@@ -118,10 +117,16 @@
     pass
 
 
-class FunctionalProperty:
+class FunctionalProperty(Property):
     
-    def __init__(self):
-        pass
+    def __init__(self, name='', values=[], bases = []):
+        Property.__init__(self, name, values, bases)
+        self.constraint = FunctionalCardinality(name, 1)
+        
+class InverseFunctionalProperty(Property):
+    
+    def __init__(self, name='', values=[], bases = []):
+        Property.__init__(self, name, values, bases)
 
 class DataRange:
     
@@ -141,7 +146,7 @@
 ##               'DatatypeProperty' : DatatypeProperty,
 ##               'DeprecatedClass' : DeprecatedClass,
 ##               'DeprecatedProperty' : DeprecatedProperty,
-##               'FunctionalProperty' : FunctionalProperty,
+               'FunctionalProperty' : FunctionalProperty,
 ##               'InverseFunctionalProperty' : InverseFunctionalProperty,
 ##               'Nothing' : Nothing,
 ##               'ObjectProperty' : ObjectProperty,
@@ -185,7 +190,12 @@
                 avar = self.make_var(fd, s) 
             else:
                 res = [o]
-                avar = self.make_var(fd, s, p) 
+                avar = self.make_var(Property, p)
+                # Set the values of the property p to o
+                sub = self.make_var(fd, s) 
+                obj = self.make_var(fd, o) 
+                res = self.variables[avar].getValues() 
+                self.variables[avar].setValues(res + [(sub, obj)])
             if self.variables.get(avar) and type(self.variables[avar]) == fd:
                 self.variables[avar] = fd(list(self.variables[avar].getValues()) + res)
             else:
@@ -250,7 +260,7 @@
                 res.append(a)
         var = '.'.join([str(a.replace('-','_')) for a in res])
         if not var in self.variables.keys():
-            self.variables[var] = cls(name=var)
+            self.variables[var] = cls(var)
         return var 
 
     def find_prop(self, s):
@@ -300,6 +310,8 @@
         else:
             # var is a builtin class
             cls =builtin_voc[var.split('#')[-1]](name=svar)
+            if hasattr(cls, 'constraint'):
+                self.constraints.append(cls.constraint)
             vals = self.variables[svar].getValues()
             cls.setValues(vals)
             self.variables[svar] =  cls
@@ -387,7 +399,6 @@
             if not k in vals:
                 vals.append((k,v))
         self.variables[svar].setValues(vals)
-        print "->",vals, self.variables[svar]
         cons = DomainConstraint(svar, avar)
         self.constraints.append(cons)
 
@@ -467,21 +478,28 @@
 
 # ----------------- Helper classes ----------------
 
-class MaxCardinality(AbstractConstraint):
-    """Contraint: all values must be distinct"""
+class OwlConstraint(AbstractConstraint):
 
-    def __init__(self, variable, cardinality):
+    def __init__(self, variable):
         AbstractConstraint.__init__(self, [variable])
-        # worst case complexity
-        self.__cost = 1 #len(variables) * (len(variables) - 1) / 2
-        self.cardinality = cardinality
+        self.__cost = 1 
 
     def __repr__(self):
-        return '<MaxCardinality %s,%i>' % (str(self._variables[0]),self.cardinality)
+        return '<%s  %s,%i>' % (self.__class__.__name__, str(self._variables[0]),self.cardinality)
 
     def estimateCost(self, domains):
         return self.__cost
 
+
+class MaxCardinality(OwlConstraint):
+    """Contraint: all values must be distinct"""
+
+    def __init__(self, variable, cardinality):
+        OwlConstraint.__init__(self, [variable])
+        # worst case complexity
+        self.__cost = 1 #len(variables) * (len(variables) - 1) / 2
+        self.cardinality = cardinality
+
     def narrow(self, domains):
         """narrowing algorithm for the constraint"""
         if len(domains[self._variables[0]]) > self.cardinality:
@@ -491,9 +509,6 @@
 
 class MinCardinality(MaxCardinality):
 
-    def __repr__(self):
-        return '<MinCardinality %s,%i>' % (str(self._variables[0]),self.cardinality)
-
     def narrow(self, domains):
         """narrowing algorithm for the constraint"""
           
@@ -504,9 +519,6 @@
         
 class Cardinality(MaxCardinality):
     
-    def __repr__(self):
-        return '<Cardinality %s,%i>' % (str(self._variables[0]),self.cardinality)
-
     def narrow(self, domains):
         """narrowing algorithm for the constraint"""
           
@@ -527,12 +539,10 @@
     #res[dom] = 1
     return res
 
-class SubClassConstraint(AbstractConstraint):
+class SubClassConstraint(OwlConstraint):
 
     def __init__(self, variable, cls_or_restriction):
-        AbstractConstraint.__init__(self, [variable])
-        # worst case complexity
-        self.__cost = 1 #len(variables) * (len(variables) - 1) / 2
+        OwlConstraint.__init__(self, variable)
         self.super = cls_or_restriction
         self.variable = variable
 
@@ -544,12 +554,10 @@
         vals = get_values(subdom, domains, 'getValues')
         superdom.values += [val for val in vals if val not in superdom.values]
 
-class DisjointClassConstraint(AbstractConstraint):
+class DisjointClassConstraint(OwlConstraint):
 
     def __init__(self, variable, cls_or_restriction):
-        AbstractConstraint.__init__(self, [variable])
-        # worst case complexity
-        self.__cost = 1 #len(variables) * (len(variables) - 1) / 2
+        OwlConstraint.__init__(self, [variable])
         self.super = cls_or_restriction
         self.variable = variable
 
@@ -562,14 +570,12 @@
         vals2 = get_values(variable, domains, 'getValues')  
         for i in vals1:
             if i in vals2:
-                raise ConsistencyError
+                raise ConsistencyFailure()
 
-class ComplementClassConstraint(AbstractConstraint):
+class ComplementClassConstraint(OwlConstraint):
 
     def __init__(self, variable, cls_or_restriction):
-        AbstractConstraint.__init__(self, [variable])
-        # worst case complexity
-        self.__cost = 1 #len(variables) * (len(variables) - 1) / 2
+        OwlConstraint.__init__(self, variable)
         self.super = cls_or_restriction
         self.variable = variable
 
@@ -577,12 +583,10 @@
         subdom = domains[self.variable]
         superdom = domains[self.super]
 
-class RangeConstraint(AbstractConstraint):
+class RangeConstraint(OwlConstraint):
 
     def __init__(self, variable, cls_or_restriction):
-        AbstractConstraint.__init__(self, [variable])
-        # worst case complexity
-        self.__cost = 1 #len(variables) * (len(variables) - 1) / 2
+        OwlConstraint.__init__(self, variable)
         self.super = cls_or_restriction
         self.variable = variable
 
@@ -598,12 +602,10 @@
                     res.append((k,v)) 
         subdom.removeValues(res)
 
-class DomainConstraint(AbstractConstraint):
+class DomainConstraint(OwlConstraint):
 
     def __init__(self, variable, cls_or_restriction):
-        AbstractConstraint.__init__(self, [variable])
-        # worst case complexity
-        self.__cost = 1 #len(variables) * (len(variables) - 1) / 2
+        OwlConstraint.__init__(self, variable)
         self.super = cls_or_restriction
         self.variable = variable
 
@@ -615,16 +617,12 @@
         for k,val in get_values(subdom, domains, 'getValues'):
             if not k in vals and k != superdom:
                 res.append((k,val))
-        print "res",res,vals,superdom
         subdom.removeValues(res)
-        print "---",subdom
-        
-class SubPropertyConstraint(AbstractConstraint):
+
+class SubPropertyConstraint(OwlConstraint):
 
     def __init__(self, variable, cls_or_restriction):
-        AbstractConstraint.__init__(self, [variable])
-        # worst case complexity
-        self.__cost = 1 #len(variables) * (len(variables) - 1) / 2
+        OwlConstraint.__init__(self, variable)
         self.super = cls_or_restriction
         self.variable = variable
 
@@ -634,14 +632,30 @@
         vals = get_values(superdom, domains, 'getValues')  
         for val in subdom.getValues():
             if not val in vals:
-                raise ConsistencyError("Value not in prescribed range")
+                vals.append(val)
+        superdom.setValues(vals)
 
-class EquivalentPropertyConstraint(AbstractConstraint):
+class FunctionalCardinality(OwlConstraint):
+    """Contraint: all values must be distinct"""
+
+    def __init__(self, variable, cardinality):
+        OwlConstraint.__init__(self, variable)
+        self.cardinality = cardinality
+        self.variable = variable
+
+    def narrow(self, domains):
+        """narrowing algorithm for the constraint"""
+        domain = domains[self.variable].getValues()
+        for cls, val in domain:
+            if len(val) != self.cardinality:
+                raise ConsistencyFailure("Maxcardinality exceeded")
+        else:
+            return 0
+
+class EquivalentPropertyConstraint(OwlConstraint):
 
     def __init__(self, variable, cls_or_restriction):
-        AbstractConstraint.__init__(self, [variable])
-        # worst case complexity
-        self.__cost = 1 #len(variables) * (len(variables) - 1) / 2
+        OwlConstraint.__init__(self, variable)
         self.super = cls_or_restriction
         self.variable = variable
 
@@ -651,5 +665,4 @@
         vals = get_values(superdom, domains, 'getValues')  
         for val in subdom.getValues():
             if not val in vals:
-                raise ConsistencyError("Value not in prescribed range")
-            
\ No newline at end of file
+                raise ConsistencyFailure("Value not in prescribed range")

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	Wed Jan  4 14:10:40 2006
@@ -1,4 +1,5 @@
 # tests for the Ontology class
+import py
 
 try:
     import logilab.constraint
@@ -182,4 +183,31 @@
     O.type(b, None, obj)
     O.subPropertyOf(sub, None, b)
     assert len(O.constraints) ==1
-    assert O.variables['a_'].getValues() in O.variables['b_'].getValues()
\ No newline at end of file
+    O.variables['a_'].setValues([('individ_',42)])
+    O.consistency()
+    for val in O.variables['a_'].getValues():
+        assert  val in O.variables['b_'].getValues()
+
+def test_functionalproperty():
+    
+    O = Ontology()
+    #Make functional property
+    sub = URIRef('p')
+    obj = URIRef(namespaces['owl']+'#FunctionalProperty')
+    O.type(sub, None, obj)
+    #Make class
+    sub = URIRef('c')
+    obj = URIRef(namespaces['owl']+'#Class')
+    O.type(sub, None, obj)
+    #Make individual with a value of the property
+    sub = URIRef('individ')
+    obj = URIRef('c')
+    O.type(sub, None, obj)
+    O.variables['p_'].setValues([('individ_',42)])
+    assert len(O.constraints) == 2
+    #add another valueof the property
+    O.variables['p_'].setValues([('individ_',42),('individ_',43)])
+    #check that consistency raises
+    print O.constraints
+    print O.variables
+    py.test.raises(ConsistencyFailure, O.consistency)
\ No newline at end of file



More information about the Pypy-commit mailing list