[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