# HG changeset patch # User drewp # Date 1563953776 25200 # Node ID 302063bfb8ff99a0c517377eb694b6dd7327ee17 # Parent 21d0cd98ef7a0bc335d15db331464d648e38d635 reasoning web page uses rdf/browse/graphView for inputs and outputs now Ignore-this: 64b7275ee149f631b606320444a3478b darcs-hash:1ec4d67abed3d43997fae5f10d4bc23ee1a6b2d5 diff -r 21d0cd98ef7a -r 302063bfb8ff service/reasoning/actions.py --- a/service/reasoning/actions.py Wed Jul 24 00:34:41 2019 -0700 +++ b/service/reasoning/actions.py Wed Jul 24 00:36:16 2019 -0700 @@ -19,13 +19,29 @@ self.payload = None self.foafAgent = None self.nextCall = None + self.lastErr = None self.numRequests = 0 + def report(self): + return { + 'url': self.url, + 'urlAbbrev': self.url + .replace('http%3A%2F%2Fprojects.bigasterisk.com%2Froom%2F', ':') + .replace('http://projects.bigasterisk.com/room/', ':') + .replace('.vpn-home.bigasterisk.com', '.vpn-home'), + 'payload': self.payload, + 'numRequests': self.numRequests, + 'lastChangeTime': round(self.lastChangeTime, 2), + 'lastErr': str(self.lastErr) if self.lastErr is not None else None, + } + def setPayload(self, payload, foafAgent): - if self.numRequests > 0 and (self.payload == payload or self.foafAgent == foafAgent): + if self.numRequests > 0 and (self.payload == payload and + self.foafAgent == foafAgent): return self.payload = payload self.foafAgent = foafAgent + self.lastChangeTime = time.time() self.makeRequest() def makeRequest(self): @@ -52,13 +68,13 @@ log.debug(" PUT %s ok", self.url) self.lastErr = None self.currentRequest = None - self.nextCall = reactor.callLater(3, self.makeRequest) + self.nextCall = reactor.callLater(30, self.makeRequest) def onError(self, err): self.lastErr = err log.debug(' PUT %s failed: %s', self.url, err) self.currentRequest = None - self.nextCall = reactor.callLater(5, self.makeRequest) + self.nextCall = reactor.callLater(50, self.makeRequest) class HttpPutOutputs(object): """these grow forever""" @@ -155,6 +171,7 @@ obj = deviceGraph.value(defaultDesc, ROOM['defaultObject']) defaultStmts.add((s, p, obj)) + log.debug('defaultStmts %s %s %s', s, p, obj) self._putDevices(deviceGraph, defaultStmts) def _oneShotPostActions(self, deviceGraph, inferred): @@ -242,3 +259,27 @@ def _put(self, url, payload, agent=None): assert isinstance(payload, bytes) self.putOutputs.put(url, payload, agent) + +import cyclone.sse + +class PutOutputsTable(cyclone.sse.SSEHandler): + def __init__(self, application, request): + cyclone.sse.SSEHandler.__init__(self, application, request) + self.actions = self.settings.reasoning.actions + + def bind(self, *args, **kwargs): + self.bound = True + self.loop() + + def unbind(self): + self.bound = False + + def loop(self): + if not self.bound: + return + + self.sendEvent(message=json.dumps({ + 'puts': [row.report() for _, row in + sorted(self.actions.putOutputs.state.items())], + }), event='update') + reactor.callLater(1, self.loop) diff -r 21d0cd98ef7a -r 302063bfb8ff service/reasoning/index.html --- a/service/reasoning/index.html Wed Jul 24 00:34:41 2019 -0700 +++ b/service/reasoning/index.html Wed Jul 24 00:36:16 2019 -0700 @@ -2,143 +2,218 @@ reasoning - + + + + + + + + + + + - + + + + +

reasoning service

-
+

Service

- -
-

Input

-
-
-

-      
-
+

Input

+ + +
+ + +
+ +

Rules

-
+

       
+ + + +

Output

-
-
-

-      
-
+ + +
+ + + + +
- - - - +
- function updateIn() { - $.get("lastInputGraph", makeAddStmts($("#input"), $("#inputQ").val())); - } - function updateOut() { - $.get("lastOutputGraph", makeAddStmts($("#output"), $("#outputQ").val())); - } - - function update() { - updateIn(); - updateOut(); - $.get("rules", function (txt) { - $("#rules").empty().text(txt); - }); - } - $("#inputQ").on('keyup', updateIn); - function loop() { - update(); - if ($("input#auto").is(":checked")) { - setTimeout(loop, 2000); - } - } - loop(); - $("input#auto").click(loop); - }); - // ]]> - diff -r 21d0cd98ef7a -r 302063bfb8ff service/reasoning/reasoning.py --- a/service/reasoning/reasoning.py Wed Jul 24 00:34:41 2019 -0700 +++ b/service/reasoning/reasoning.py Wed Jul 24 00:36:16 2019 -0700 @@ -31,11 +31,12 @@ from greplin.scales.cyclonehandler import StatsHandler from inference import infer, readRules -from actions import Actions +from actions import Actions, PutOutputsTable from inputgraph import InputGraph from escapeoutputstatements import unquoteOutputStatements - + from standardservice.logsetup import log, verboseLogging +from patchablegraph import PatchableGraph, CycloneGraphHandler, CycloneGraphEventsHandler ROOM = Namespace("http://projects.bigasterisk.com/room/") @@ -56,8 +57,9 @@ self.rulesN3 = "(not read yet)" self.inferred = Graph() # gets replaced in each graphChanged call + self.outputGraph = PatchableGraph() # copy of inferred, for now - self.inputGraph = InputGraph([], self.graphChanged) + self.inputGraph = InputGraph([], self.graphChanged) self.inputGraph.updateFileData() @STATS.updateRules.time() @@ -81,6 +83,7 @@ self.inferred = Graph() self.inferred.add((ROOM['reasoner'], ROOM['ruleParseError'], Literal(traceback.format_exc()))) + self.copyOutput() raise return [(ROOM['reasoner'], ROOM['ruleParseTime'], Literal(ruleParseTime))], ruleParseTime @@ -127,6 +130,11 @@ ruleParseSec * 1000, inferSec * 1000, putResultsTime * 1000)) + if not oneShot: + self.copyOutput() + + def copyOutput(self): + self.outputGraph.setToGraph((s,p,o,ROOM['inferred']) for s,p,o in self.inferred) def _makeInferred(self, inputGraph): t1 = time.time() @@ -141,7 +149,7 @@ return out, inferenceTime - + class Index(cyclone.web.RequestHandler): def get(self): self.set_header("Content-Type", "text/html") @@ -185,7 +193,7 @@ traceback.print_exc() log.error(e) raise - + # for reuse class GraphResource(cyclone.web.RequestHandler): def get(self, which): @@ -257,8 +265,13 @@ (r"/", Index), (r"/immediateUpdate", ImmediateUpdate), (r"/oneShot", OneShot), + (r'/putOutputs', PutOutputsTable), (r'/(jquery.min.js)', Static), (r'/(lastInput|lastOutput)Graph', GraphResource), + + (r"/graph/output", CycloneGraphHandler, {'masterGraph': reasoning.outputGraph}), + (r"/graph/output/events", CycloneGraphEventsHandler, {'masterGraph': reasoning.outputGraph}), + (r'/ntGraphs', NtGraphs), (r'/rules', Rules), (r'/status', Status), @@ -269,7 +282,7 @@ def configLogging(arg): log.setLevel(WARN) - + if arg['-i'] or arg['-r'] or arg['-o'] or arg['-v']: log.handlers[0].setFormatter(ColoredFormatter("%(log_color)s%(levelname)-8s %(name)-6s %(filename)-12s:%(lineno)-3s %(funcName)-20s%(reset)s %(white)s%(message)s", datefmt=None,