dfj version of delaunay refinement executes the original algorithm with workers=1...
[IRC.git] / Robust / src / Benchmarks / oooJava / DelaunayRefinement / Cavity.java
1 public class Cavity {
2   protected Tuple center;
3   protected Node centerNode;
4   protected Element centerElement;
5   protected int dim;
6   protected LinkedList frontier;
7   protected Subgraph pre = new Subgraph();
8   protected Subgraph post = new Subgraph();
9   private final EdgeGraph graph;
10   protected HashSet connections;
11
12   public Cavity(EdgeGraph mesh) {
13     center = null;
14     graph = mesh;
15     connections = new HashSet();
16     frontier = new LinkedList();
17   }
18
19   public Subgraph getPre() {
20     return pre;
21   }
22
23   public Subgraph getPost() {
24     return post;
25   }
26
27   public void triggerAbort() {
28   }
29
30   public void triggerBorderConflict() {
31   }
32
33   public void initialize(Node node) {
34     pre.reset();
35     post.reset();
36     connections.clear();
37     frontier = new LinkedList();
38     centerNode = node;
39     for (centerElement = (Element) getNodeData(centerNode); graph.containsNode(centerNode)
40         && centerElement.isObtuse();) {
41       Edge_d oppositeEdge = getOpposite(centerNode);
42       if (getSource(oppositeEdge) == centerNode)
43         centerNode = getDest(oppositeEdge);
44       else
45         centerNode = getSource(oppositeEdge);
46       centerElement = (Element) getNodeData(centerNode);
47       if (centerNode == null)
48         System.exit(-1);
49     }
50
51     center = centerElement.center();
52     dim = centerElement.getDim();
53     pre.addNode(centerNode);
54     frontier.addLast(centerNode);
55   }
56
57   private Edge_d getOpposite(Node node) {
58     Element element = (Element) graph.getNodeData(node);
59
60     // Don't think we'd run into it but..
61     // TODO check this.
62     // if(neighbors.size() != 3)
63     // throw new Error(String.format("neighbors %d", new Object[] {
64     // Integer.valueOf(neighbors.size())
65     // }));
66
67     int cntOutNeighbors = 0;
68
69     for (Iterator iterator = graph.getOutNeighbors(node); iterator.hasNext();) {
70       ++cntOutNeighbors;
71       Node neighbor = (Node) iterator.next();
72       Edge_d edge = graph.getEdge(node, neighbor);
73       ElementEdge edge_data = (ElementEdge) graph.getEdgeData(edge);
74       if (element.getObtuse().notEquals(edge_data.getPoint(0))
75           && element.getObtuse().notEquals(edge_data.getPoint(1)))
76         return edge;
77     }
78
79     System.out.println("Error: \"Edge\" in Cavity.java getOpposite(Node)");
80     System.out.println("  tri="+element+" has "+cntOutNeighbors+" out-neighbors");
81     System.out.println("  obtuse="+element.getObtuse());
82     System.exit(-1);
83     return null; // it's here so the compiler doesn't complain.
84   }
85
86   public boolean isMember(Node node) {
87     Element element = (Element) getNodeData(node);
88     return element.inCircle(center);
89   }
90
91   public void build() {
92     while (frontier.size() != 0) {
93       Node curr = (Node) frontier.removeFirst();
94       for (Iterator iterator = getOutNeighbors(curr); iterator.hasNext();) {
95         Node next = (Node) iterator.next();
96         Element nextElement = (Element) getNodeData(next);
97         Edge_d edge = getEdge(curr, next);
98         if ((dim != 2 || nextElement.getDim() != 2 || next == centerNode) && isMember(next)) {
99           if (nextElement.getDim() == 2 && dim != 2) {
100             initialize(next);
101             build();
102             return;
103           }
104           if (!pre.existsNode(next)) {
105             pre.addNode(next);
106             pre.addEdge(edge);
107             frontier.addLast(next);
108           }
109         } else if (!connections.contains(edge)) {
110           connections.add(edge);
111           pre.addBorder(next);
112         }
113       }
114
115     }
116   }
117
118   public void update() {
119     if (centerElement.getDim() == 2) {
120       Element ele1 = new Element(center, centerElement.getPoint(0));
121       Node node1 = graph.createNode(ele1);
122       post.addNode(node1);
123       Element ele2 = new Element(center, centerElement.getPoint(1));
124       Node node2 = graph.createNode(ele2);
125       post.addNode(node2);
126     }
127     Node ne_node;
128     for (HashMapIterator iterator = connections.iterator(); iterator.hasNext(); post.addNode(ne_node)) {
129       Edge_d conn = (Edge_d) iterator.next();
130       ElementEdge edge = (ElementEdge) getEdgeData(conn);
131       Element new_element = new Element(center, edge.getPoint(0), edge.getPoint(1));
132       ne_node = graph.createNode(new_element);
133       Node ne_connection;
134       if (pre.existsNode(getDest(conn)))
135         ne_connection = getSource(conn);
136       else
137         ne_connection = getDest(conn);
138       ElementEdge new_edge =
139           new_element.getRelatedEdge((Element) getNodeData(ne_connection));
140       post.addEdge(createEdge(ne_node, ne_connection, new_edge));
141
142       // Collection postnodes = (Collection)post.getNodes().clone();
143       LinkedList postnodes = new LinkedList();
144       for (Iterator it = post.getNodes().iterator(); it.hasNext();) {
145         postnodes.addLast(it.next());
146       }
147
148       for (Iterator iterator1 = postnodes.iterator(); iterator1.hasNext();) {
149         Node node = (Node) iterator1.next();
150         Element element = (Element) getNodeData(node);
151         if (element.isRelated(new_element)) {
152           ElementEdge ele_edge = new_element.getRelatedEdge(element);
153           post.addEdge(createEdge(ne_node, node, ele_edge));
154         }
155       }
156     }
157   }
158   
159   private Object getNodeData(Node n) {
160     return ((EdgeGraphNode) n).data;
161   }
162   
163   public Node getSource(Edge_d e) {
164     return ((GraphEdge) e).getSrc();
165   }
166   
167   public Node getDest(Edge_d e) {
168     return ((GraphEdge) e).getDest();
169   }
170   
171   public Edge_d getEdge(Node src, Node dest) {
172     return ((EdgeGraphNode) src).getOutEdge((EdgeGraphNode) dest);
173   }
174   
175   
176   public Edge_d createEdge(Node src, Node dest, Object e) {
177     return new GraphEdge((EdgeGraphNode) src, (EdgeGraphNode) dest, e);
178   }
179   
180   public Iterator getOutNeighbors(Node src) {
181     return ((EdgeGraphNode) src).getOutNeighbors();
182   }
183   
184   public Object getEdgeData(Edge_d e) {
185     return ((GraphEdge) e).d;
186   }
187 }