comparison service/reasoning/reasoning.py @ 1086:6ab5238fc049

refactor Ignore-this: 61a7c93a71fba5feea956ef99c84a30e darcs-hash:e82a05debdd45d9127b50ae7cf8efe26e9537989
author drewp <drewp@bigasterisk.com>
date Fri, 06 May 2016 17:34:26 -0700
parents dda3f1524a52
children 0498634eba17
comparison
equal deleted inserted replaced
1085:dda3f1524a52 1086:6ab5238fc049
39 import evtiming 39 import evtiming
40 40
41 ROOM = Namespace("http://projects.bigasterisk.com/room/") 41 ROOM = Namespace("http://projects.bigasterisk.com/room/")
42 DEV = Namespace("http://projects.bigasterisk.com/device/") 42 DEV = Namespace("http://projects.bigasterisk.com/device/")
43 43
44 NS = {'': ROOM, 'dev': DEV}
44 45
45 class Reasoning(object): 46 class Reasoning(object):
46 def __init__(self): 47 def __init__(self):
47 self.prevGraph = None 48 self.prevGraph = None
48 self.lastPollTime = 0 49 self.lastPollTime = 0
85 self.inferred = Graph() 86 self.inferred = Graph()
86 self.inferred.add((ROOM['reasoner'], ROOM['ruleParseError'], 87 self.inferred.add((ROOM['reasoner'], ROOM['ruleParseError'],
87 Literal(traceback.format_exc()))) 88 Literal(traceback.format_exc())))
88 raise 89 raise
89 return [(ROOM['reasoner'], ROOM['ruleParseTime'], 90 return [(ROOM['reasoner'], ROOM['ruleParseTime'],
90 Literal(ruleParseTime))] 91 Literal(ruleParseTime))], ruleParseTime
91 92
92 evtiming.serviceLevel.timed('graphChanged') 93 evtiming.serviceLevel.timed('graphChanged')
93 def graphChanged(self, inputGraph, oneShot=False, oneShotGraph=None): 94 def graphChanged(self, inputGraph, oneShot=False, oneShotGraph=None):
94 log.info("----------------------") 95 log.info("----------------------")
95 log.info("graphChanged oneShot=%s", oneShot) 96 log.info("graphChanged oneShot=%s", oneShot)
97 for s in oneShotGraph: 98 for s in oneShotGraph:
98 log.debug("oneshot stmt %r", s) 99 log.debug("oneshot stmt %r", s)
99 t1 = time.time() 100 t1 = time.time()
100 oldInferred = self.inferred 101 oldInferred = self.inferred
101 try: 102 try:
102 ruleStmts = self.updateRules() 103 ruleStatStmts, ruleParseSec = self.updateRules()
103 104
104 g = inputGraph.getGraph() 105 g = inputGraph.getGraph()
105 self.inferred = self._makeInferred(g) 106 self.inferred = self._makeInferred(g)
106 [self.inferred.add(s) for s in ruleStmts] 107 [self.inferred.add(s) for s in ruleStatStmts]
107 108
108 if oneShot: 109 if oneShot:
109 # unclear where this should go, but the oneshot'd 110 # unclear where this should go, but the oneshot'd
110 # statements should be just as usable as inferred 111 # statements should be just as usable as inferred
111 # ones. 112 # ones.
116 self.actions.putResults(self.inputGraph.getGraph(), self.inferred) 117 self.actions.putResults(self.inputGraph.getGraph(), self.inferred)
117 putResultsTime = time.time() - t2 118 putResultsTime = time.time() - t2
118 finally: 119 finally:
119 if oneShot: 120 if oneShot:
120 self.inferred = oldInferred 121 self.inferred = oldInferred
121 log.info("graphChanged %.1f ms (putResults %.1f ms)" % 122 log.info("graphChanged took %.1f ms (rule parse %.1f ms, putResults %.1f ms)" %
122 ((time.time() - t1) * 1000, 123 ((time.time() - t1) * 1000,
124 ruleParseSec * 1000,
123 putResultsTime * 1000)) 125 putResultsTime * 1000))
124 126
125 def _makeInferred(self, inputGraph): 127 def _makeInferred(self, inputGraph):
126 t1 = time.time() 128 t1 = time.time()
127 out = infer(inputGraph, self.ruleStore) 129 out = infer(inputGraph, self.ruleStore)
130 for p, n in NS.iteritems():
131 out.bind(p, n, override=True)
128 inferenceTime = time.time() - t1 132 inferenceTime = time.time() - t1
129 133
130 out.add((ROOM['reasoner'], ROOM['inferenceTime'], 134 out.add((ROOM['reasoner'], ROOM['inferenceTime'],
131 Literal(inferenceTime))) 135 Literal(inferenceTime)))
132 return out 136 return out
164 self.request.headers.get('User-Agent', '?'), 168 self.request.headers.get('User-Agent', '?'),
165 self.request.headers['Host']) 169 self.request.headers['Host'])
166 yield r.poll() 170 yield r.poll()
167 self.set_status(202) 171 self.set_status(202)
168 172
169 def parseRdf(text, contentType):
170 g = Graph()
171 g.parse(StringInputSource(text), format={
172 'text/n3': 'n3',
173 }[contentType])
174 return g
175
176 class OneShot(cyclone.web.RequestHandler): 173 class OneShot(cyclone.web.RequestHandler):
177 def post(self): 174 def post(self):
178 """ 175 """
179 payload is an rdf graph. The statements are momentarily added 176 payload is an rdf graph. The statements are momentarily added
180 to the input graph for exactly one update. 177 to the input graph for exactly one update.
184 we make those oneshot events here? for every object change? 181 we make those oneshot events here? for every object change?
185 there are probably special cases regarding startup time when 182 there are probably special cases regarding startup time when
186 everything appears to be a 'change'. 183 everything appears to be a 'change'.
187 """ 184 """
188 try: 185 try:
189 g = parseRdf(self.request.body, self.request.headers['content-type']) 186 dt = self.settings.reasoning.inputGraph.addOneShotFromString(
190 for s in g: 187 self.request.body, self.request.headers['content-type'])
191 log.debug("oneshot stmt %r", s) 188 self.set_header('x-graph-ms', str(1000 * dt))
192 if not len(g):
193 log.warn("incoming oneshot graph had no statements: %r", self.request.body)
194 return
195 t1 = time.time()
196 self.settings.reasoning.inputGraph.addOneShot(g)
197 self.set_header('x-graph-ms', str(1000 * (time.time() - t1)))
198 except Exception as e: 189 except Exception as e:
199 log.error(e) 190 log.error(e)
200 raise 191 raise
201 192
202 # for reuse 193 # for reuse