From: jjenista Date: Mon, 4 Apr 2011 18:29:21 +0000 (+0000) Subject: dfj version of delaunay refinement executes the original algorithm with workers=1... X-Git-Url: http://plrg.eecs.uci.edu/git/?p=IRC.git;a=commitdiff_plain;h=7a9cc8ea2da63e959ca72f2035d0ec7dac0e38c6 dfj version of delaunay refinement executes the original algorithm with workers=1, but set to 2 another malformed triangle appears... --- diff --git a/Robust/src/Benchmarks/oooJava/DelaunayRefinement-orig-algo/GraphNode.java b/Robust/src/Benchmarks/oooJava/DelaunayRefinement-orig-algo/GraphNode.java index 755d4534..2e00aa28 100644 --- a/Robust/src/Benchmarks/oooJava/DelaunayRefinement-orig-algo/GraphNode.java +++ b/Robust/src/Benchmarks/oooJava/DelaunayRefinement-orig-algo/GraphNode.java @@ -16,14 +16,14 @@ public class GraphNode extends Node { outNeighbors = new Vector(); } -// public Object getData() { -// return getNodeData(this); -// } -// -// public Object setData(Object n) { -// return setNodeData(this, n); -// } - + //public Object getData() { + // return getNodeData(this); + //} + // + //public Object setData(Object n) { + // return setNodeData(this, n); + //} + public final boolean addInNeighbor(GraphNode n) { if (inNeighbors.contains(n)) { return false; diff --git a/Robust/src/Benchmarks/oooJava/DelaunayRefinement-orig-algo/Node.java b/Robust/src/Benchmarks/oooJava/DelaunayRefinement-orig-algo/Node.java index 5f71f4f8..d2ac5391 100644 --- a/Robust/src/Benchmarks/oooJava/DelaunayRefinement-orig-algo/Node.java +++ b/Robust/src/Benchmarks/oooJava/DelaunayRefinement-orig-algo/Node.java @@ -1,7 +1,7 @@ -public class Node { +abstract public class Node { //None of the program actually uses getData/setData so I use leave Node as a //wrapper interface. -// public abstract Object getData(); -// public abstract Object setData(Object obj); + //public abstract Object getData(); + //public abstract Object setData(Object obj); } diff --git a/Robust/src/Benchmarks/oooJava/DelaunayRefinement-orig-algo/SerialDelaunayRefinement.java b/Robust/src/Benchmarks/oooJava/DelaunayRefinement-orig-algo/SerialDelaunayRefinement.java index d67103c8..a88d7e37 100644 --- a/Robust/src/Benchmarks/oooJava/DelaunayRefinement-orig-algo/SerialDelaunayRefinement.java +++ b/Robust/src/Benchmarks/oooJava/DelaunayRefinement-orig-algo/SerialDelaunayRefinement.java @@ -44,6 +44,7 @@ public class SerialDelaunayRefinement { if (runtime < mintime) { mintime = runtime; } + //System.exit( 0 ); // GC STALLS FOREVER???? System.gc(); } @@ -93,8 +94,13 @@ public class SerialDelaunayRefinement { System.gc(); + + int zzz = 0; + + // long id = Time.getNewTimeId(); long startTime = System.currentTimeMillis(); + while (!worklist.isEmpty()) { Node bad_element = (Node) worklist.pop(); // System.out.println("Bad Node"+ ((Element)mesh.getNodeData(bad_element)).toString()); @@ -102,23 +108,45 @@ public class SerialDelaunayRefinement { cavity.initialize(bad_element); cavity.build(); cavity.update(); + + + //boolean printChange = true; //(zzz % 10 == 0); //remove old data + //if( printChange ) { + // System.out.println( "\n\n\nbad tri: "+mesh.getNodeData( bad_element ) ); + // System.out.println( "\npre nodes: " ); + //} Node node; for (Iterator iterator = cavity.getPre().getNodes().iterator(); iterator.hasNext();) { node = (Node) iterator.next(); + //if( printChange ) { + // System.out.println( " "+mesh.getNodeData( node ) ); + //} mesh.removeNode(node); } //add new data + //if( printChange ) { + // System.out.println( "post nodes: " ); + //} for (Iterator iterator1 = cavity.getPost().getNodes().iterator(); iterator1.hasNext();) { node = (Node) iterator1.next(); + //if( printChange ) { + // System.out.println( " "+mesh.getNodeData( node ) ); + //} mesh.addNode(node); } + //if( printChange ) { + // System.out.println( "post edges: " ); + //} Edge_d edge; for (Iterator iterator2 = cavity.getPost().getEdges().iterator(); iterator2.hasNext();) { edge = (Edge_d) iterator2.next(); + //if( printChange ) { + // System.out.println( " "+mesh.getEdgeData( edge ) ); + //} mesh.addEdge(edge); } @@ -131,7 +159,14 @@ public class SerialDelaunayRefinement { if (mesh.containsNode(bad_element)) { worklist.push((Node) bad_element); } + } else { + //System.out.println( "\n\n\nthis tri no longer a concern: "+mesh.getNodeData( bad_element ) ); } + + //++zzz; + //System.out.println( "\n\ntris="+mesh.getNumNodes()+ + // " [wl="+worklist.size()+"]"); + //if( zzz == 10 ) { System.exit( 0 ); } } long time = System.currentTimeMillis() - startTime; System.out.println("runtime: " + time + " ms"); diff --git a/Robust/src/Benchmarks/oooJava/DelaunayRefinement-orig-algo/Tuple.java b/Robust/src/Benchmarks/oooJava/DelaunayRefinement-orig-algo/Tuple.java index 29391115..24406031 100644 --- a/Robust/src/Benchmarks/oooJava/DelaunayRefinement-orig-algo/Tuple.java +++ b/Robust/src/Benchmarks/oooJava/DelaunayRefinement-orig-algo/Tuple.java @@ -121,7 +121,15 @@ public class Tuple { } public String toString() { - return new String("(" + coords[0] + ", " + coords[1] + ", " + coords[2] + ")"); + //return new String("(" + coords[0] + ", " + coords[1] + ", " + coords[2] + ")"); + + String x = ""+coords[0]; + x = x.substring( 0, 4 ); + + String y = ""+coords[1]; + y = y.substring( 0, 4 ); + + return new String("("+x+", "+y+")"); } public static int cmp(Tuple a, Tuple b) { diff --git a/Robust/src/Benchmarks/oooJava/DelaunayRefinement-orig-algo/input/tiny.ele b/Robust/src/Benchmarks/oooJava/DelaunayRefinement-orig-algo/input/tiny.ele new file mode 100644 index 00000000..d9c5aea4 --- /dev/null +++ b/Robust/src/Benchmarks/oooJava/DelaunayRefinement-orig-algo/input/tiny.ele @@ -0,0 +1,6 @@ +5 +0 0 1 3 +1 1 2 3 +2 2 3 5 +3 3 4 5 +4 0 3 4 diff --git a/Robust/src/Benchmarks/oooJava/DelaunayRefinement-orig-algo/input/tiny.node b/Robust/src/Benchmarks/oooJava/DelaunayRefinement-orig-algo/input/tiny.node new file mode 100644 index 00000000..3b017004 --- /dev/null +++ b/Robust/src/Benchmarks/oooJava/DelaunayRefinement-orig-algo/input/tiny.node @@ -0,0 +1,7 @@ +6 +0 1 1 0 +1 4 1 0 +2 7 2 0 +3 5 3 0 +4 0 9 0 //if you use this for point 4 it works fine: 2 6 0 +5 6 6 0 diff --git a/Robust/src/Benchmarks/oooJava/DelaunayRefinement-orig-algo/input/tiny.poly b/Robust/src/Benchmarks/oooJava/DelaunayRefinement-orig-algo/input/tiny.poly new file mode 100644 index 00000000..bc45b3b8 --- /dev/null +++ b/Robust/src/Benchmarks/oooJava/DelaunayRefinement-orig-algo/input/tiny.poly @@ -0,0 +1,7 @@ +ignored line +5 +0 0 1 +1 1 2 +2 2 5 +3 5 4 +4 4 0 diff --git a/Robust/src/Benchmarks/oooJava/DelaunayRefinement/Cavity.java b/Robust/src/Benchmarks/oooJava/DelaunayRefinement/Cavity.java index b1b2b873..da6268b5 100644 --- a/Robust/src/Benchmarks/oooJava/DelaunayRefinement/Cavity.java +++ b/Robust/src/Benchmarks/oooJava/DelaunayRefinement/Cavity.java @@ -55,39 +55,30 @@ public class Cavity { } private Edge_d getOpposite(Node node) { - Element element = (Element) getNodeData(node); + Element element = (Element) graph.getNodeData(node); - System.out.println( "\n element="+element+" with obtuse="+element.getObtuse() ); + // Don't think we'd run into it but.. + // TODO check this. + // if(neighbors.size() != 3) + // throw new Error(String.format("neighbors %d", new Object[] { + // Integer.valueOf(neighbors.size()) + // })); - int outNeiCnt = 0; + int cntOutNeighbors = 0; - for (Iterator iterator = getOutNeighbors(node); iterator.hasNext();) { - ++outNeiCnt; + for (Iterator iterator = graph.getOutNeighbors(node); iterator.hasNext();) { + ++cntOutNeighbors; Node neighbor = (Node) iterator.next(); - Edge_d edge = getEdge(node, neighbor); - ElementEdge edge_data = (ElementEdge) getEdgeData(edge); - - System.out.println( " is "+edge_data.getPoint(0)+" and "+edge_data.getPoint(1)+ - " opposite the obtuse?"); - - if (element.getObtuse().notEquals(edge_data.getPoint(0)) && - element.getObtuse().notEquals(edge_data.getPoint(1)) - ) + Edge_d edge = graph.getEdge(node, neighbor); + ElementEdge edge_data = (ElementEdge) graph.getEdgeData(edge); + if (element.getObtuse().notEquals(edge_data.getPoint(0)) + && element.getObtuse().notEquals(edge_data.getPoint(1))) return edge; } - int inNeiCnt = 0; - - for (Iterator iterator = ((EdgeGraphNode)node).getInNeighbors(); iterator.hasNext();) { - ++inNeiCnt; - Node neighbor = (Node) iterator.next(); - } - - if( outNeiCnt != 3 ) { - System.out.println( "Get opposite when "+outNeiCnt+" out-neighbors? in-nei="+inNeiCnt ); - } - System.out.println("Error: \"Edge\" in Cavity.java getOpposite(Node)"); + System.out.println(" tri="+element+" has "+cntOutNeighbors+" out-neighbors"); + System.out.println(" obtuse="+element.getObtuse()); System.exit(-1); return null; // it's here so the compiler doesn't complain. } diff --git a/Robust/src/Benchmarks/oooJava/DelaunayRefinement/DirectedEdgeGraph.java b/Robust/src/Benchmarks/oooJava/DelaunayRefinement/DirectedEdgeGraph.java index 8c4f59a9..9252a22c 100644 --- a/Robust/src/Benchmarks/oooJava/DelaunayRefinement/DirectedEdgeGraph.java +++ b/Robust/src/Benchmarks/oooJava/DelaunayRefinement/DirectedEdgeGraph.java @@ -59,26 +59,7 @@ public class DirectedEdgeGraph implements EdgeGraph { } } } - - System.out.println( "Graph has "+nodes.size()+" nodes currently." ); - } - -// // keep the nodes set up-to-date, but use AFTER... -// public void addNodeToAllNodesSet( Node n ) { -// if( !n.inGraph ) { -// System.out.println( "Error: adding a node NOT IN the graph to the all-nodes set!" ); -// System.exit( -1 ); -// } -// nodes.add( n ); -// } -// -// public void removeNodeFromAllNodesSet( Node n ) { -// if( n.inGraph ) { -// System.out.println( "Error: removing a node IN the graph from the all-nodes set!" ); -// System.exit( -1 ); -// } -// nodes.add( n ); -// } + } // these are the normal methods for truly adding and removing nodes // from the graph, nodes know locally if they are in and out but they @@ -91,6 +72,7 @@ public class DirectedEdgeGraph implements EdgeGraph { public boolean removeNode(Node n) { boolean wasIn = n.inGraph; + n.inGraph = false; removeConnectingEdges((EdgeGraphNode) n); return wasIn; } diff --git a/Robust/src/Benchmarks/oooJava/DelaunayRefinement/SerialDelaunayRefinement.java b/Robust/src/Benchmarks/oooJava/DelaunayRefinement/SerialDelaunayRefinement.java index f22ac8e3..c8f8fea1 100644 --- a/Robust/src/Benchmarks/oooJava/DelaunayRefinement/SerialDelaunayRefinement.java +++ b/Robust/src/Benchmarks/oooJava/DelaunayRefinement/SerialDelaunayRefinement.java @@ -104,6 +104,9 @@ public class SerialDelaunayRefinement { Cavity lastAppliedCavity = null; + int zzz = 0; + + long startTime = System.currentTimeMillis(); while (!worklist.isEmpty()) { @@ -126,7 +129,8 @@ public class SerialDelaunayRefinement { nodeForBadTri.inGraph ) { - System.out.println( "computing a cavity..." ); + //System.out.println( "computing a cavity for tri "+ + // mesh.getNodeData( nodeForBadTri )+"..." ); sese computeCavity { //takes < 1 sec @@ -144,7 +148,7 @@ public class SerialDelaunayRefinement { //Takes up a whooping 50% of computation time and changes NOTHING but cavity :D cavity.update(); } - + sese storeCavity { cavities[i] = cavity; } @@ -175,32 +179,54 @@ public class SerialDelaunayRefinement { appliedCavity = true; lastAppliedCavity = cavity; + + //boolean printChange = true; //(zzz % 10 == 0); + + //remove old data Node node; - + //if( printChange ) { + // System.out.println( "\n\n\nbad tri: "+mesh.getNodeData( nodeForBadTri ) ); + // System.out.println( "\npre nodes: " ); + //} //Takes up 8.9% of runtime for (Iterator iterator = cavity.getPre().getNodes().iterator(); iterator.hasNext();) { node = (Node) iterator.next(); + //if( printChange ) { + // System.out.println( " "+mesh.getNodeData( node ) ); + //} mesh.removeNode(node); } //add new data + //if( printChange ) { + // System.out.println( "post nodes: " ); + //} //Takes up 1.7% of runtime for (Iterator iterator1 = cavity.getPost().getNodes().iterator(); iterator1.hasNext();) { node = (Node) iterator1.next(); + //if( printChange ) { + // System.out.println( " "+mesh.getNodeData( node ) ); + //} mesh.addNode(node); } + //if( printChange ) { + // System.out.println( "post edges: " ); + //} //Takes up 7.8% of runtime Edge_d edge; for (Iterator iterator2 = cavity.getPost().getEdges().iterator(); iterator2.hasNext();) { edge = (Edge_d) iterator2.next(); + //if( printChange ) { + // System.out.println( " "+mesh.getEdgeData( edge ) ); + //} mesh.addEdge(edge); } } @@ -208,37 +234,54 @@ public class SerialDelaunayRefinement { sese scheduleMoreBad { + + if( appliedCavity ) { + // we did apply the cavity, and we may + // have introduced new bad triangles + HashMapIterator it2 = cavity.getPost().newBad(mesh).iterator(); + while (it2.hasNext()) { + worklist.push((Node)it2.next()); + } + } + + // the logic of having this out here seems wacky, and overconservative, + // but it matches the original algorithm and it works... + if( nodeForBadTri != null && mesh.containsNode( nodeForBadTri ) ) { + worklist.push( nodeForBadTri ); + } + /* if( !appliedCavity ) { // if we couldn't even apply this cavity, just // throw it back on the worklist if( nodeForBadTri != null && nodeForBadTri.inGraph ) { worklist.push( nodeForBadTri ); + } else { + System.out.println( "\n\n\nthis tri no longer a concern: "+ + mesh.getNodeData( nodeForBadTri ) ); } } else { - // otherwise we did apply the cavity, so repair the all-nodes set of the mesh - //Iterator itrPreNodes = cavity.getPre().getNodes().iterator(); - //while( itrPreNodes.hasNext() ) { - // System.out.println( "yere" ); - // mesh.removeNodeFromAllNodesSet( (Node)itrPreNodes.next() ); - // System.out.println( "yeres" ); - //} - //Iterator itrPostNodes = cavity.getPost().getNodes().iterator(); - //while( itrPostNodes.hasNext() ) { - // mesh.addNodeToAllNodesSet( (Node)itrPostNodes.next() ); - //} - + // otherwise we did apply the cavity, // and we may have introduced new bad triangles HashMapIterator it2 = cavity.getPost().newBad(mesh).iterator(); while (it2.hasNext()) { worklist.push((Node)it2.next()); } } + */ + } // end scheduleMoreBad } // end phase 3 + //++zzz; + //Node aNode = (Node)lastAppliedCavity.getPost().getNodes().iterator().next(); + //mesh.discoverAllNodes( aNode ); + //System.out.println( "\n\ntris="+mesh.getNumNodes()+ + // " [wl="+worklist.size()+"]"); + //if( zzz == 10 ) { System.exit( 0 ); } + } // end while( !worklist.isEmpty() ) long time = System.currentTimeMillis() - startTime; diff --git a/Robust/src/Benchmarks/oooJava/DelaunayRefinement/Tuple.java b/Robust/src/Benchmarks/oooJava/DelaunayRefinement/Tuple.java index 29391115..0e4ab8d1 100644 --- a/Robust/src/Benchmarks/oooJava/DelaunayRefinement/Tuple.java +++ b/Robust/src/Benchmarks/oooJava/DelaunayRefinement/Tuple.java @@ -120,8 +120,16 @@ public class Tuple { return 57.295779513082323D * Math.acos(d); } - public String toString() { - return new String("(" + coords[0] + ", " + coords[1] + ", " + coords[2] + ")"); + public String toString() { + //return new String("(" + coords[0] + ", " + coords[1] + ", " + coords[2] + ")"); + + String x = ""+coords[0]; + x = x.substring( 0, 4 ); + + String y = ""+coords[1]; + y = y.substring( 0, 4 ); + + return new String("("+x+", "+y+")"); } public static int cmp(Tuple a, Tuple b) { diff --git a/Robust/src/Benchmarks/oooJava/DelaunayRefinement/input/tiny.ele b/Robust/src/Benchmarks/oooJava/DelaunayRefinement/input/tiny.ele new file mode 100644 index 00000000..d9c5aea4 --- /dev/null +++ b/Robust/src/Benchmarks/oooJava/DelaunayRefinement/input/tiny.ele @@ -0,0 +1,6 @@ +5 +0 0 1 3 +1 1 2 3 +2 2 3 5 +3 3 4 5 +4 0 3 4 diff --git a/Robust/src/Benchmarks/oooJava/DelaunayRefinement/input/tiny.node b/Robust/src/Benchmarks/oooJava/DelaunayRefinement/input/tiny.node new file mode 100644 index 00000000..3b017004 --- /dev/null +++ b/Robust/src/Benchmarks/oooJava/DelaunayRefinement/input/tiny.node @@ -0,0 +1,7 @@ +6 +0 1 1 0 +1 4 1 0 +2 7 2 0 +3 5 3 0 +4 0 9 0 //if you use this for point 4 it works fine: 2 6 0 +5 6 6 0 diff --git a/Robust/src/Benchmarks/oooJava/DelaunayRefinement/input/tiny.poly b/Robust/src/Benchmarks/oooJava/DelaunayRefinement/input/tiny.poly new file mode 100644 index 00000000..bc45b3b8 --- /dev/null +++ b/Robust/src/Benchmarks/oooJava/DelaunayRefinement/input/tiny.poly @@ -0,0 +1,7 @@ +ignored line +5 +0 0 1 +1 1 2 +2 2 5 +3 5 4 +4 4 0