Closer to compiling. at the moment, it throws a NullPointerException right after...
[IRC.git] / Robust / src / Benchmarks / oooJava / DelaunayRefinement / Mesh.java
1 public class Mesh {
2   protected static final HashMap edge_map = new HashMap();
3
4   public Mesh() {
5   }
6
7   public static HashSet getBad(EdgeGraph mesh) {
8     HashSet ret = new HashSet();
9     for (Iterator iterator = mesh.iterator(); iterator.hasNext();) {
10       Node node = (Node) iterator.next();
11       Element element = (Element) mesh.getNodeData(node);
12       if (element.isBad())
13         ret.add(node);
14     }
15
16     return ret;
17   }
18
19   private static FileInputStream getScanner(String filename) {
20     return new FileInputStream(filename);
21   }
22
23   private Tuple[] readNodes(String filename) {
24     FileInputStream scanner = getScanner(filename + ".node");
25     StringTokenizer st = new StringTokenizer(scanner.readLine());
26
27     int ntups = Integer.parseInt(st.nextToken());
28     Tuple tuples[] = new Tuple[ntups];
29     for (int i = 0; i < ntups; i++) {
30       st = new StringTokenizer(scanner.readLine());
31       int index = Integer.parseInt(st.nextToken());
32       double x = Double.parseDouble(st.nextToken());
33       double y = Double.parseDouble(st.nextToken());
34       // we don't parse the z axis
35       tuples[index] = new Tuple(x, y, 0.0D);
36     }
37     return tuples;
38   }
39
40   private void readElements(EdgeGraph mesh, String filename, Tuple tuples[]) {
41     FileInputStream scanner =getScanner(filename + ".ele");
42     StringTokenizer st = new StringTokenizer(scanner.readLine());
43     int nels = Integer.parseInt(st.nextToken());
44     Element elements[] = new Element[nels];
45     for (int i = 0; i < nels; i++) {
46       st = new StringTokenizer(scanner.readLine());
47       int index = Integer.parseInt(st.nextToken());
48       int n1 = Integer.parseInt(st.nextToken());
49       int n2 = Integer.parseInt(st.nextToken());
50       int n3 = Integer.parseInt(st.nextToken());
51       elements[index] = new Element(tuples[n1], tuples[n2], tuples[n3]);
52       addElement(mesh, elements[index]);
53     }
54   }
55
56   private void readPoly(EdgeGraph mesh, String filename, Tuple tuples[]) {
57     FileInputStream scanner = getScanner(filename + ".poly");
58     StringTokenizer st = new StringTokenizer(scanner.readLine());
59     // discard line 1
60     st = new StringTokenizer(scanner.readLine());
61     int nsegs = Integer.parseInt(st.nextToken());
62
63     Element segments[] = new Element[nsegs];
64     for (int i = 0; i < nsegs; i++) {
65       st = new StringTokenizer(scanner.readLine());
66       int index = Integer.parseInt(st.nextToken());
67       int n1 = Integer.parseInt(st.nextToken());
68       int n2 = Integer.parseInt(st.nextToken());
69       // don't parse z value
70       segments[index] = new Element(tuples[n1], tuples[n2]);
71       addElement(mesh, segments[index]);
72     }
73
74   }
75
76   public void read(EdgeGraph mesh, String basename) {
77     Tuple tuples[] = readNodes(basename);
78     readElements(mesh, basename, tuples);
79     readPoly(mesh, basename, tuples);
80   }
81
82   protected Node addElement(EdgeGraph mesh, Element element) {
83     Node node = mesh.createNode(element);
84     mesh.addNode(node);
85     for (int i = 0; i < element.numEdges(); i++) {
86       ElementEdge edge = element.getEdge(i);
87       if (!edge_map.containsKey(edge)) {
88         edge_map.put(edge, node);
89       } else {
90         Edge_d new_edge = mesh.createEdge(node, (Node) edge_map.get(edge), edge);
91         mesh.addEdge(new_edge);
92         edge_map.remove(edge);
93       }
94     }
95
96     return node;
97   }
98
99   public static boolean verify(EdgeGraph mesh) {
100     for (Iterator iterator = mesh.iterator(); iterator.hasNext();) {
101       Node node = (Node) iterator.next();
102       Element element = (Element) mesh.getNodeData(node);
103       if (element.getDim() == 2) {
104         if (mesh.getOutNeighborsSize(node) != 1) {
105           System.out.println("-> Segment " + element + " has " + mesh.getOutNeighborsSize(node) + " relation(s)");
106           return false;
107         }
108       } else if (element.getDim() == 3) {
109         if (mesh.getOutNeighborsSize(node) != 3) {
110           System.out.println("-> Triangle " + element + " has " + mesh.getOutNeighborsSize(node) + " relation(s)");
111           return false;
112         }
113       } else {
114         System.out.println("-> Figures with " + element.getDim() + " edges");
115         return false;
116       }
117     }
118
119     Node start = mesh.getRandom();
120     Stack remaining = new Stack();
121     HashSet found = new HashSet();
122     remaining.push(start);
123     while (!remaining.empty()) {
124       Node node = (Node) remaining.pop();
125       if (!found.contains(node)) {
126         found.add(node);
127         Node neighbor;
128         for (Iterator iterator1 = mesh.getOutNeighbors(node); iterator1.hasNext(); remaining
129             .push(neighbor))
130           neighbor = (Node) iterator1.next();
131
132       }
133     }
134     if (found.size() != mesh.getNumNodes()) {
135       System.out.println("Not all elements are reachable");
136       return false;
137     } else {
138       return true;
139     }
140   }
141 }