Mercurial > code > home > repos > homeauto
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 |