gzz-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gzz-commits] fenfire ./Makefile docs/SwampTutorial.rst org/f...


From: Tuomas J. Lukka
Subject: [Gzz-commits] fenfire ./Makefile docs/SwampTutorial.rst org/f...
Date: Thu, 24 Apr 2003 08:05:31 -0400

CVSROOT:        /cvsroot/fenfire
Module name:    fenfire
Changes by:     Tuomas J. Lukka <address@hidden>        03/04/24 08:05:30

Modified files:
        .              : Makefile 
        docs           : SwampTutorial.rst 
        org/fenfire/swamp: CachedNodeFunction.java 
                           observablegraphtest.py 
Added files:
        org/fenfire/swamp/bench: __init__.py graph.py 

Log message:
        Functions, benching

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/Makefile.diff?tr1=1.10&tr2=1.11&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/docs/SwampTutorial.rst.diff?tr1=1.3&tr2=1.4&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/swamp/CachedNodeFunction.java.diff?tr1=1.1&tr2=1.2&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/swamp/observablegraphtest.py.diff?tr1=1.2&tr2=1.3&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/swamp/bench/__init__.py?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/fenfire/fenfire/org/fenfire/swamp/bench/graph.py?rev=1.1

Patches:
Index: fenfire/Makefile
diff -u fenfire/Makefile:1.10 fenfire/Makefile:1.11
--- fenfire/Makefile:1.10       Wed Apr 23 09:04:54 2003
+++ fenfire/Makefile    Thu Apr 24 08:05:30 2003
@@ -2,7 +2,7 @@
 # For a real makefile use build.xml instead of this.
 
 all:
-       ant 2>&1 | sed 's/ *\[javac\] *//g'
+       ant compile 2>&1 | sed 's/ *\[javac\] *//g'
 
 TEST=org/
 
@@ -20,6 +20,10 @@
 rundemo:
        $(LDLIB) java $(CLASSPATH) $(PYTHONPATH) org.python.util.jython 
../libvob/rundemo.py $(DBG) $(DEMO)
 
+BENCH=org.fenfire.swamp.bench.graph
+
+bench:
+       $(LDLIB) java $(CLASSPATH) $(PYTHONPATH) org.python.util.jython 
../libvob/bench/mark.py $(BENCH)
 
 .PHONY: docs
 
Index: fenfire/docs/SwampTutorial.rst
diff -u fenfire/docs/SwampTutorial.rst:1.3 fenfire/docs/SwampTutorial.rst:1.4
--- fenfire/docs/SwampTutorial.rst:1.3  Tue Apr 22 08:14:32 2003
+++ fenfire/docs/SwampTutorial.rst      Thu Apr 24 08:05:30 2003
@@ -1,7 +1,6 @@
-//(c): Matti J. Katila
-
-2003-04-15T15:53:31Z
+//(c): Matti J. Katila and Tuomas J. Lukka
 
+$Id: SwampTutorial.rst,v 1.4 2003/04/24 12:05:30 tjl Exp $
 
 How to set up Fen with swamps?
 ------------------------------
@@ -16,8 +15,8 @@
  
     fen.txt = new CachingNodeContent(new SimpleNodeContent(fen));
 
-Adding triplet in the Swamp?
-----------------------------
+How do I add a triplet in the Swamp?
+------------------------------------
 
 Adding triplet is easy, just: ::
 
@@ -29,8 +28,8 @@
     fen.graph.set1_11X(sub, pred, obj)
 
 
-Literals
---------
+How are Literals used?
+----------------------
 
 ::
 
@@ -41,16 +40,19 @@
     <@tuomasl2> x = graph.find1_11X(foo,bar)
     <@tuomasl2> ((Literal)x).getTextString()
 
+(note that this will change at some point for efficiency: we shall
+accept Integer, Float &c objects as literals, I think -- tjl)
 
-New node
---------
+How do I make a new node?
+-------------------------
 
-Use shortcut method Nodes.N()  ::
+If you want a new identity, 
+use shortcut method Nodes.N()  ::
 
     Nodes.N()  if URN-5 Namespace
     also N(Namespace..)
 
-or ::
+If you know the uri you want, use ::
 
     Nodes.get(uri)
 
@@ -58,6 +60,8 @@
 How to make a triplet?
 ----------------------
 
+There is no special "triplet" object in the API at the moment.
+
 ::
 
     < mudyc> tuomasl2: how do i do a new triplet?
@@ -67,6 +71,7 @@
 
     fen.graph.add(sub, pred, onj);
 
+See "How do I add a triplet" above.
 
 Find nodes
 ----------
Index: fenfire/org/fenfire/swamp/CachedNodeFunction.java
diff -u fenfire/org/fenfire/swamp/CachedNodeFunction.java:1.1 
fenfire/org/fenfire/swamp/CachedNodeFunction.java:1.2
--- fenfire/org/fenfire/swamp/CachedNodeFunction.java:1.1       Thu Apr 24 
00:51:28 2003
+++ fenfire/org/fenfire/swamp/CachedNodeFunction.java   Thu Apr 24 08:05:30 2003
@@ -13,10 +13,58 @@
  */
 public class CachedNodeFunction implements NodeFunction {
 
-    static List cache =  null;
+    static final private Object DIRTY = new Object();
+
+    NodeFunction f;
+
+    ConstGraph ourGraph;
+
+    CachingMap cache;
+
+    private class CacheEntry implements Obs {
+       Object node;
+       Object value = DIRTY;
+       /*
+       Set obses;
+       public void addObs(Obs o) {
+           if(obses == null) obses = new HashSet();
+           obses.add(o);
+       }
+       */
+       public void chg() {
+           /*
+           if(obses != null) {
+               for(Iterator i = obses.iterator(); i.hasNext();) {
+                   ((Obs)i.next()).chg();
+               }
+           }
+           */
+           value = DIRTY;
+       }
+    }
+
+    public CachedNodeFunction(int n, ConstGraph g, NodeFunction f) {
+       cache = new CachingMap(n);
+       this.ourGraph = g;
+       this.f = f;
+    }
 
     public Object f(ConstGraph g, Object node) {
-       return null;
+       if(g != ourGraph)
+           throw new IllegalArgumentException("Called with wrong graph");
+
+       CacheEntry cac = (CacheEntry)cache.get(node);
+       if(cac == null) {
+           cac = new CacheEntry();
+           cac.node = node;
+           cache.put(node, cac);
+       }
+       if(cac.value == DIRTY) {
+           ConstGraph og = ourGraph.getObservedConstGraph(cac);
+           cac.value = f.f(og, node);
+           og.close();
+       }
+       return cac.value;
     }
 
 }
Index: fenfire/org/fenfire/swamp/observablegraphtest.py
diff -u fenfire/org/fenfire/swamp/observablegraphtest.py:1.2 
fenfire/org/fenfire/swamp/observablegraphtest.py:1.3
--- fenfire/org/fenfire/swamp/observablegraphtest.py:1.2        Mon Apr 14 
08:21:20 2003
+++ fenfire/org/fenfire/swamp/observablegraphtest.py    Thu Apr 24 08:05:30 2003
@@ -1,7 +1,9 @@
 # Tests which all ObservableGraph implementations must pass
 
+from __future__ import nested_scopes
+
 import org
-from org.fenfire.swamp import Nodes
+from org.fenfire.swamp import Nodes, NodeFunction, CachedNodeFunction
 
 _uriMaker = org.fenfire.util.URN5Namespace()
 _node = [Nodes.get(_uriMaker.generateId()) for i in range(0,20)]
@@ -52,4 +54,60 @@
 
     assert o1.t == 2
     assert o2.t == 2
+
+def test_ObservableGraph_Func():
+    node = _node
+    class Func(NodeFunction):
+       def f(self, g, x):
+           self.calls += 1
+           literal = g.find1_11X(x, node[0])
+           print "F: Got literal",literal
+           if literal == None: return None
+           return literal.getTextString()
+       
+    of = Func()
+    of.calls = 0
+    cf = CachedNodeFunction(3, graph, of)
+
+    def doit(f):
+       print "F now:",f
+       assert f.f(graph, node[1]) == None
+       assert f.f(graph, node[2]) == None
+       assert f.f(graph, node[3]) == None
+       assert f.f(graph, node[4]) == None
+
+       graph.set1_11X(node[4], node[0], Nodes.getStringLiteral("X"))
+
+       assert f.f(graph, node[4]) == "X"
+       assert f.f(graph, node[1]) == None
+
+       graph.set1_11X(node[4], node[0], Nodes.getStringLiteral("Y"))
+       graph.set1_11X(node[1], node[0], Nodes.getStringLiteral("Z"))
+       graph.set1_11X(node[3], node[0], Nodes.getStringLiteral("Q"))
+
+       assert f.f(graph, node[4]) == "Y"
+       assert f.f(graph, node[1]) == "Z"
+       assert f.f(graph, node[2]) == None
+       assert f.f(graph, node[3]) == "Q"
+
+       graph.rm_11A(node[3], node[0])
+
+       assert f.f(graph, node[4]) == "Y"
+       assert f.f(graph, node[1]) == "Z"
+       assert f.f(graph, node[2]) == None
+       assert f.f(graph, node[3]) == None
+
+       graph.rm_11A(node[4], node[0])
+       graph.rm_11A(node[1], node[0])
+
+       assert f.f(graph, node[1]) == None
+       assert f.f(graph, node[2]) == None
+       assert f.f(graph, node[3]) == None
+       assert f.f(graph, node[4]) == None
+
+    doit(of)
+    assert of.calls == 18
+    of.calls = 0
+    doit(cf)
+    assert of.calls < 16
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]