Mercurial > code > home > repos > homeauto
annotate service/reasoning/inference.py @ 1089:cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
Ignore-this: e8788fe6e9c8738671bc1f8910a906c
refactor all rule/inference code to one module; all escaping/unescaping to another.
darcs-hash:dd0d4538341f23cf7a524cfdc51d03fe1db5ebab
author | drewp <drewp@bigasterisk.com> |
---|---|
date | Sun, 08 May 2016 02:58:25 -0700 |
parents | 6ab5238fc049 |
children | 3b61c0dfaaef |
rev | line source |
---|---|
825
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
1 """ |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
2 see ./reasoning for usage |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
3 """ |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
4 |
1089
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
5 import sys, os |
919
6ee2a90fc816
bugs in async http client. move trig helpers to rdflibtrig, which can work with rdflib 4
drewp <drewp@bigasterisk.com>
parents:
850
diff
changeset
|
6 try: |
6ee2a90fc816
bugs in async http client. move trig helpers to rdflibtrig, which can work with rdflib 4
drewp <drewp@bigasterisk.com>
parents:
850
diff
changeset
|
7 from rdflib.Graph import Graph |
6ee2a90fc816
bugs in async http client. move trig helpers to rdflibtrig, which can work with rdflib 4
drewp <drewp@bigasterisk.com>
parents:
850
diff
changeset
|
8 except ImportError: |
6ee2a90fc816
bugs in async http client. move trig helpers to rdflibtrig, which can work with rdflib 4
drewp <drewp@bigasterisk.com>
parents:
850
diff
changeset
|
9 from rdflib import Graph |
1089
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
10 |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
11 from rdflib.parser import StringInputSource |
825
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
12 |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
13 sys.path.append("/my/proj/room/fuxi/build/lib.linux-x86_64-2.6") |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
14 from FuXi.Rete.Util import generateTokenSet |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
15 from FuXi.Rete import ReteNetwork |
1089
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
16 from FuXi.Rete.RuleStore import N3RuleStore |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
17 |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
18 from rdflib import plugin, Namespace |
825
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
19 from rdflib.store import Store |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
20 |
1089
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
21 sys.path.append('../../../ffg/ffg') |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
22 import evtiming |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
23 |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
24 from escapeoutputstatements import escapeOutputStatements |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
25 ROOM = Namespace("http://projects.bigasterisk.com/room/") |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
26 |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
27 _rulesCache = (None, None, None, None) |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
28 @evtiming.serviceLevel.timed('readRules') |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
29 def readRules(rulesPath, outputPatterns): |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
30 """ |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
31 returns (rulesN3, ruleGraph) |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
32 |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
33 This includes escaping certain statements in the output |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
34 (implied) subgraaphs so they're not confused with input |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
35 statements. |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
36 """ |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
37 global _rulesCache |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
38 mtime = os.path.getmtime(rulesPath) |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
39 key = (rulesPath, mtime) |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
40 if _rulesCache[:2] == key: |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
41 _, _, rulesN3, expandedN3 = _rulesCache |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
42 else: |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
43 rulesN3 = open(rulesPath).read() # for web display |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
44 |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
45 plainGraph = Graph() |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
46 plainGraph.parse(StringInputSource(rulesN3), |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
47 format='n3') # for inference |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
48 escapeOutputStatements(plainGraph, outputPatterns=outputPatterns) |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
49 expandedN3 = plainGraph.serialize(format='n3') |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
50 _rulesCache = key + (rulesN3, expandedN3) |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
51 |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
52 # the rest needs to happen each time since inference is |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
53 # consuming the ruleGraph somehow |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
54 ruleStore = N3RuleStore() |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
55 ruleGraph = Graph(ruleStore) |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
56 |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
57 ruleGraph.parse(StringInputSource(expandedN3), format='n3') |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
58 log.debug('%s rules' % len(ruleStore.rules)) |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
59 return rulesN3, ruleGraph |
cb7fa2f30df9
rules become simple-looking again; fix the ambiguity in memory after loading them.
drewp <drewp@bigasterisk.com>
parents:
1086
diff
changeset
|
60 |
825
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
61 def infer(graph, rules): |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
62 """ |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
63 returns new graph of inferred statements |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
64 """ |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
65 # based on fuxi/tools/rdfpipe.py |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
66 store = plugin.get('IOMemory',Store)() |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
67 store.open('') |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
68 |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
69 target = Graph() |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
70 tokenSet = generateTokenSet(graph) |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
71 network = ReteNetwork(rules, inferredTarget=target) |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
72 network.feedFactsToAdd(tokenSet) |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
73 |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
74 store.rollback() |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
75 return target |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
76 |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
77 import time, logging |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
78 log = logging.getLogger() |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
79 def logTime(func): |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
80 def inner(*args, **kw): |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
81 t1 = time.time() |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
82 try: |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
83 ret = func(*args, **kw) |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
84 finally: |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
85 log.info("Call to %s took %.1f ms" % ( |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
86 func.__name__, 1000 * (time.time() - t1))) |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
87 return ret |
fc753b24f69a
move reasoning from /my/proj/room, new integration with magma
drewp <drewp@bigasterisk.com>
parents:
diff
changeset
|
88 return inner |