[pypy-svn] r22486 - in pypy/dist/pypy/lib/pyontology: . test
ale at codespeak.net
ale at codespeak.net
Sun Jan 22 13:44:04 CET 2006
Author: ale
Date: Sun Jan 22 13:44:03 2006
New Revision: 22486
Modified:
pypy/dist/pypy/lib/pyontology/pyontology.py
pypy/dist/pypy/lib/pyontology/test/test_ontology.py
Log:
Added a test for sameas -> changes of the sameasconstraint
got rid of get_values
Modified: pypy/dist/pypy/lib/pyontology/pyontology.py
==============================================================================
--- pypy/dist/pypy/lib/pyontology/pyontology.py (original)
+++ pypy/dist/pypy/lib/pyontology/pyontology.py Sun Jan 22 13:44:03 2006
@@ -1,6 +1,5 @@
from rdflib import Graph, URIRef, BNode, Literal
from logilab.constraint import Repository, Solver
-from logilab.constraint.fd import BinaryExpression
from logilab.constraint.fd import FiniteDomain as fd
from logilab.constraint.propagation import AbstractDomain, AbstractConstraint, ConsistencyFailure
import sys
@@ -279,7 +278,7 @@
self.constraints.append(cls.constraint)
def first(self, s, var):
- avar = self.make_var(None, var)
+ avar = self.make_var(ClassDomain, var)
svar = self.make_var(List, s)
vals = []
vals += self.variables[svar].getValues()
@@ -410,16 +409,16 @@
self.constraints.append(constrain)
#XXX need to change this
-## def distinctMembers(self, s, var):
-## res = self.get_list(var)
-## self.constraints.append(AllDistinct([self.make_var(ClassDomain, y) for y in res]))
-## return res
+ def distinctMembers(self, s, var):
+ s_var = self.make_var(AllDifferent, s)
+ var_var = self.make_var(List, var)
+ constrain = AllDifferentConstraint(s_var, var_var)
+ self.constraints.append(constrain)
def sameAs(self, s, var):
s_var = self.make_var(None, s)
var_var = self.make_var(None, var)
- constrain = BinaryExpression([s_var, var_var],
- "%s == %s" %(s_var, var_var))
+ constrain = SameasConstraint(s_var, var_var)
self.constraints.append(constrain)
def hasValue(self, s, var):
@@ -510,18 +509,6 @@
else:
return 1
-def get_values(dom, domains, attr = 'getValues'):
- res = []
- if type(dom) == Literal:
- return [dom]
- for val in getattr(dom, attr)():
- res.append(val)
- if type(val) == tuple:
- val = val[0]
- if val in domains.keys():
- res.extend(get_values(domains[val], domains, attr))
- return res
-
class SubClassConstraint(AbstractConstraint):
cost=1
@@ -551,10 +538,10 @@
def narrow(self, domains):
subdom = domains[self.variable]
superdom = domains[self.object]
- bases = get_values(superdom, domains, 'getBases')
- subdom.bases += [bas for bas in bases if bas not in subdom.bases]
- vals1 = get_values(superdom, domains, 'getValues')
- vals2 = get_values(subdom, domains, 'getValues')
+## bases = get_values(superdom, domains, 'getBases')
+## subdom.bases += [bas for bas in bases if bas not in subdom.bases]
+ vals1 = superdom.getValues()
+ vals2 = subdom.getValues()
for i in vals1:
if i in vals2:
raise ConsistencyFailure()
@@ -592,7 +579,7 @@
def narrow(self, domains):
propdom = domains[self.variable]
domaindom = domains[self.object]
- newdomain = get_values(domaindom, domains, 'getValues') +[self.object]
+ newdomain = domaindom.getValues() +[self.object]
domain = []
olddomain = propdom.domain
if olddomain:
@@ -612,7 +599,7 @@
def narrow(self, domains):
subdom = domains[self.variable]
superdom = domains[self.object]
- vals = get_values(superdom, domains, 'getValues')
+ vals = superdom.getValues()
for val in subdom.getValues():
if not val in vals:
vals.append(val)
@@ -623,7 +610,7 @@
def narrow(self, domains):
subdom = domains[self.variable]
superdom = domains[self.object]
- vals = get_values(superdom, domains, 'getValues')
+ vals = superdom.getValues()
for val in subdom.getValues():
if not val in vals:
raise ConsistencyFailure("Value not in prescribed range")
@@ -725,6 +712,35 @@
else:
return 0
+class SameasConstraint(SubClassConstraint):
+
+ def narrow(self, domains):
+ if self.variable == self.object:
+ return 1
+ else:
+ for dom in domains.values():
+ vals = dom.getValues()
+ if isinstance(dom, Property):
+ val = Linkeddict(vals)
+ if self.variable in val.keys() and not self.object in val.keys():
+ vals +=[(self.object,v) for v in val[self.variable]]
+ dom.setValues(vals)
+ elif not self.variable in val.keys() and self.object in val.keys():
+ vals +=[(self.variable,v) for v in val[self.object]]
+ dom.setValues(vals)
+ elif self.variable in val.keys() and self.object in val.keys():
+ if not val[self.object] == val[self.variable]:
+ raise ConsistencyFailure("Sameas failure: The two individuals (%s, %s) \
+ has different values for property %r"%(self.variable, self.object, dom))
+ else:
+ if self.variable in vals and not self.object in vals:
+ vals.append(self.object)
+ elif not self.variable in vals and self.object in vals:
+ vals.append(self.variable)
+ else:
+ continue
+ dom.setValues(vals)
+ return 0
class ListConstraint(OwlConstraint):
"""Contraint: all values must be distinct"""
@@ -747,7 +763,7 @@
class RestrictionConstraint(OwlConstraint):
- cost = 90
+ cost = 70
def narrow(self, domains):
prop = domains[self.variable].property
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 Sun Jan 22 13:44:03 2006
@@ -116,7 +116,6 @@
def test_ObjectProperty():
sub = URIRef('a')
- pred = URIRef('type')
obj = URIRef(namespaces['owl']+'#ObjectProperty')
O = Ontology()
O.type(sub, obj)
@@ -478,3 +477,39 @@
O.differentFrom(cls, cls)
O.type(cls, namespaces['owl']+'#Thing')
py.test.raises(ConsistencyFailure, O.consistency, 3)
+
+def test_sameas():
+ O = Ontology()
+ cls = BNode('anon')
+ own1 = BNode('liist1')
+ own2 = BNode('liist2')
+ O.sameAs(cls, own1)
+ O.sameAs(own1, own2)
+ O.sameAs(cls, own2)
+ O.type(cls, namespaces['owl']+'#Thing')
+ O.type(own1, namespaces['owl']+'#Thing')
+ O.type(own2, namespaces['owl']+'#Thing')
+ sub = URIRef('a')
+ obj = URIRef(namespaces['owl']+'#ObjectProperty')
+ O.type(sub, obj)
+ O.variables[O.make_var(None,sub)].setValues([(cls,'1')])
+ O.consistency(3)
+# assert len(O.rep._constraints) == 4
+ assert ('_liist1','1') in O.rep._domains[O.make_var(None,sub)].getValues()
+
+def test_sameasconsistency():
+ O = Ontology()
+ cls = BNode('anon')
+ own1 = BNode('liist1')
+ O.sameAs(cls, own1)
+ O.type(cls, namespaces['owl']+'#Thing')
+ O.type(own1, namespaces['owl']+'#Thing')
+ sub = URIRef('a')
+ obj = URIRef(namespaces['owl']+'#ObjectProperty')
+ O.type(sub, obj)
+ O.variables[O.make_var(None,sub)].setValues([(cls,'1'), (own1,'2')])
+ print O.variables
+ for dom in O.variables.values() :print type(dom)
+ py.test.raises(ConsistencyFailure, O.consistency, 3)
+
+
More information about the Pypy-commit
mailing list