Skip to content

Commit 61b98e3

Browse files
committed
shit code doesn't work
1 parent 115d024 commit 61b98e3

16 files changed

+570
-367
lines changed

.idea/workspace.xml

Lines changed: 259 additions & 268 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main/java/dcel/DCEL.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ else if (b.getPrev() != null) {
143143
e.setFace(c_face);
144144
}
145145

146-
// if c and c.twin share the same face, then don't update anything -- happens _only_ when it's the inf face
146+
// if c and c.twin share the same face, then don't process anything -- happens _only_ when it's the inf face
147147
if (c_twin.getFace() != c.getFace()) {
148148
Face c_twin_face = createFace(c_twin);
149149
c_twin.setFace(c_twin_face);
@@ -183,7 +183,7 @@ public void deleteEdge(HalfEdge e) {
183183
updateFace(e);
184184
updateFace(e.getTwin());
185185

186-
// update incident edge for the origin of e and e.twin
186+
// process incident edge for the origin of e and e.twin
187187
if (e == e.getOrigin().getIncidentEdge()) {
188188
HalfEdge cand = oNext(e) != null ? oNext(e) : oPrev(e);
189189
e.getOrigin().setIncidentEdge(cand);
@@ -193,7 +193,7 @@ public void deleteEdge(HalfEdge e) {
193193
e.getTwin().getOrigin().setIncidentEdge(cand);
194194
}
195195

196-
// update incident edges for e and e.twin
196+
// process incident edges for e and e.twin
197197
updateIncidentEdges(e);
198198
updateIncidentEdges(e.getTwin());
199199

src/main/java/kds/DummyKDS.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public void initialize(double starttime, ArrayList<BoundedKDSPoint> ps) {
5252
}
5353

5454
@Override
55-
public void update(Event event, double t) {
55+
public void process(Event event, double t) {
5656

5757
}
5858

src/main/java/kds/Event.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package kds;
22

33

4+
import kds.solvers.EigenSolver;
45
import utils.Primitive;
56

67
public abstract class Event<P extends Primitive> implements Comparable<Event> {
@@ -75,7 +76,7 @@ public Event(double failureTime, P a, P b) {
7576

7677
public Event() {}
7778

78-
public abstract void computeFailureTime(double t);
79+
public abstract void computeFailureTime(EigenSolver solver, double t);
7980

8081
//public abstract Event createEvent();
8182

src/main/java/kds/EventQueue.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ public EventQueue() {
1414

1515
public void add(EventType e) {
1616
double failureTime = e.getFailureTime();
17+
System.out.println(failureTime);
18+
if (failureTime == -1) return;
1719
ArrayList<EventType> es = queue.get(failureTime);
1820
if (es != null) {
1921
es.add(e);
@@ -31,7 +33,7 @@ public void remove(EventType e) {
3133
if (es != null) {
3234
es.remove(e);
3335
}
34-
queue.put(failureTime, es);
36+
//queue.put(failureTime, es);
3537
}
3638

3739
public ArrayList<EventType> peek(double t) throws NoSuchElementException {
@@ -68,6 +70,10 @@ public ArrayList<EventType> poll() {
6870
}
6971

7072
public double firstKey() {
71-
return queue.firstKey();
73+
try {
74+
return queue.firstKey();
75+
} catch (NoSuchElementException ex) {
76+
return Double.MAX_VALUE;
77+
}
7278
}
7379
}

src/main/java/kds/KDS.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public interface KDS<PointType extends Primitive, EventType extends Event<PointT
1111
boolean audit(double t);
1212
void initialize(double starttime);
1313
void initialize(double starttime, ArrayList<PointType> ps);
14-
void update(EventType event, double t);
14+
void process(EventType event, double t);
1515
EventQueue<EventType> getEventQueue();
1616
ArrayList<PointType> getPrimitives();
1717
}

src/main/java/kds/Simulator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,10 +102,11 @@ public int run(boolean visualize, boolean auditEveryTimestep) throws IOException
102102
try {
103103
while (kds.getEventQueue().firstKey() <= t) {
104104
es = kds.getEventQueue().poll();
105+
if (es.size() > 0) LOGGER.log(Level.FINER, "{0} events", es.size());
105106
for (EventType e : es) {
106107
if (e.isValid()) {
107108
event = true;
108-
e.process(e.getFailureTime());
109+
kds.process(e, e.getFailureTime());
109110
LOGGER.log(Level.FINER, "EVENT at time t={0}", e.getFailureTime());
110111
}
111112
}

src/main/java/sortedlist/SortedEvent.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package sortedlist;
22

3-
import kds.Event;
4-
import kds.KDSPoint;
3+
import kds.solvers.EigenSolver;
54
import utils.Primitive;
65

76
/**
@@ -23,13 +22,13 @@ public SortedEvent(SortedList<P> sl, P a, P b) {
2322
public SortedEvent() {}
2423

2524
@Override
26-
public void computeFailureTime(double t) {
25+
public void computeFailureTime(EigenSolver solver, double t) {
2726

2827
}
2928

3029

3130
@Override
3231
public void process(double t) {
33-
sl.update(this, t);
32+
sl.process(this, t);
3433
}
3534
}

src/main/java/sortedlist/SortedList.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ Complex64F[] findRoots(double t, double[] ac, double[] bc) {
130130
}
131131

132132
@Override
133-
public void update(SortedEvent<P> event, double t) {
133+
public void process(SortedEvent<P> event, double t) {
134134
P a = event.getA();
135135
P b = event.getB();
136136

src/main/java/tournament_tree/DistanceFunction.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,25 @@
66
* Created by clausvium on 28/12/16.
77
*/
88
public class DistanceFunction<P extends Primitive> implements TournamentTreeWinner<P> {
9-
private Primitive p;
9+
private P p;
1010

11-
public DistanceFunction(Primitive p) {
11+
public DistanceFunction(P p) {
12+
this.p = p;
13+
}
14+
15+
public P getP() {
16+
return p;
17+
}
18+
19+
public void setP(P p) {
1220
this.p = p;
1321
}
1422

1523
@Override
1624
public P findWinner(P first, P second) {
1725
double firstDistance = p.getDistance(first);
1826
double secondDistance = p.getDistance(second);
27+
if (Math.abs(firstDistance - secondDistance) < 1e-10) System.out.println("FUCK");
1928
return firstDistance < secondDistance ? first : second;
2029
}
2130

Lines changed: 90 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,111 @@
11
package tournament_tree;
22

3+
import kds.solvers.EigenSolver;
4+
import org.ejml.data.Complex64F;
35
import utils.Primitive;
6+
import utils.RootFinder;
7+
8+
import java.util.ArrayList;
9+
import java.util.Collections;
10+
import java.util.NoSuchElementException;
411

512
/**
613
* Created by clausvium on 22/12/16.
714
*/
815
public class TournamentEvent<P extends Primitive> extends kds.Event<P>{
916

10-
private double failureTime;
11-
private TournamentNode<P> first;
12-
private TournamentNode<P> second;
17+
private TournamentNode<P> node;
18+
private TournamentTreeWinner<P> winnerFunction;
19+
private boolean inFailedEvent;
20+
21+
public TournamentEvent(TournamentNode<P> node, TournamentTreeWinner<P> winnerFunction, boolean inFailedEvent) {
22+
this.node = node;
23+
this.winnerFunction = winnerFunction;
24+
this.inFailedEvent = inFailedEvent;
25+
}
26+
27+
public TournamentNode<P> getNode() {
28+
return node;
29+
}
1330

14-
public TournamentEvent(TournamentNode<P> first, TournamentNode<P> second) {
15-
this.first = first;
16-
this.second = second;
31+
public void setNode(TournamentNode<P> node) {
32+
this.node = node;
1733
}
1834

1935
@Override
2036
public void process(double t) {
21-
System.out.println("PROCESS");
37+
System.out.println("PROCESSING");
2238
}
2339

2440
@Override
25-
public void computeFailureTime(double t) {
41+
public void computeFailureTime(EigenSolver solver, double t) {
42+
43+
TournamentNode<P> leftChild = node.getLeftChild();
44+
TournamentNode<P> rightChild = node.getRightChild();
45+
46+
if (leftChild == null || rightChild == null || leftChild.isNull() || rightChild.isNull()) {
47+
super.setFailureTime(-1);
48+
return;
49+
}
50+
51+
double[] aCoeffsX = leftChild.getWinner().getCoeffsX();
52+
double[] aCoeffsY = leftChild.getWinner().getCoeffsY();
53+
double[] bCoeffsX = rightChild.getWinner().getCoeffsX();
54+
double[] bCoeffsY = rightChild.getWinner().getCoeffsY();
55+
56+
57+
double[] p1_coeffs = getDistCoeffs(winnerFunction.getP().getCoeffsX(), winnerFunction.getP().getCoeffsY(),
58+
aCoeffsX, aCoeffsY);
59+
60+
double[] p2_coeffs = getDistCoeffs(winnerFunction.getP().getCoeffsX(), winnerFunction.getP().getCoeffsY(),
61+
bCoeffsX, bCoeffsY);
62+
63+
double[] coeffs = new double[p1_coeffs.length];
64+
65+
for (int i = 0; i < p1_coeffs.length; ++i) {
66+
coeffs[i] = p1_coeffs[i] - p2_coeffs[i];
67+
}
68+
69+
try {
70+
double failureTime = RootFinder.findFirstRoot(coeffs, t, this.inFailedEvent);
71+
super.setFailureTime(failureTime);
72+
} catch (RootFinder.NoRootException ex) {
73+
// event is invalid
74+
this.setValid(false);
75+
super.setFailureTime(-1);
76+
}
77+
}
78+
79+
double[] getDistCoeffs(double[] p1_coeffsX, double[] p1_coeffsY, double[] p2_coeffsX, double[] p2_coeffsY) {
80+
double[] x = expand(p1_coeffsX, p2_coeffsX);
81+
double[] y = expand(p1_coeffsY, p2_coeffsY);
82+
83+
double[] res = new double[x.length];
84+
85+
for (int i = 0; i < x.length; ++i) {
86+
res[i] = x[i] + y[i];
87+
}
88+
89+
return res;
90+
}
91+
92+
double[] expand(double[] p1_coeffs, double[] p2_coeffs) {
93+
double first = Math.pow(p1_coeffs[0], 2) - 2 * p1_coeffs[0] * p2_coeffs[0] + Math.pow(p2_coeffs[0], 2);
94+
double second = 2 * p1_coeffs[0] * p1_coeffs[1] - 2 * p1_coeffs[0] * p2_coeffs[1] - 2 * p1_coeffs[1] *
95+
p2_coeffs[0] + 2 * p2_coeffs[0] * p2_coeffs[1];
96+
second = 2 * (p1_coeffs[0] * (p1_coeffs[1] - p2_coeffs[1]) - p2_coeffs[0] * (p1_coeffs[1] - p2_coeffs[0]));
97+
double third = Math.pow(p1_coeffs[1], 2) - 2 * p1_coeffs[1] * p2_coeffs[1] + Math.pow(p2_coeffs[1], 2);
98+
99+
return new double[]{first, second, third};
100+
}
101+
102+
Complex64F[] findRoots(EigenSolver solver, double t, double[] ac, double[] bc) {
103+
double[] coeffs = new double[ac.length];
26104

105+
for (int i = 0; i < ac.length; ++i) {
106+
coeffs[i] = ac[i] - bc[i];
107+
}
108+
return solver.findRoots(coeffs, t);
27109
}
28110

29111
}

src/main/java/tournament_tree/TournamentNode.java

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package tournament_tree;
22

3+
import kds.solvers.EigenSolver;
34
import utils.Primitive;
45

56
/**
@@ -12,7 +13,7 @@ public class TournamentNode<P extends Primitive> {
1213
private TournamentNode<P> rightChild;
1314
private TournamentEvent<P> event;
1415
private int key;
15-
private P object; // the winner object of the subtree rooted at this node
16+
private P winner; // the winner winner of the subtree rooted at this node
1617
private int weight;
1718
private boolean isNull = false; // special flag indicating that it's a null node
1819

@@ -30,23 +31,24 @@ public TournamentNode(int key) {
3031
this.weight = 1;
3132
}
3233

33-
public TournamentNode(int key, P object) {
34+
public TournamentNode(int key, P winner) {
3435
this.key = key;
3536
this.weight = 1;
36-
this.object = object;
37+
this.winner = winner;
3738
}
3839

39-
public TournamentNode(int key, int weight, P object, TournamentNode<P> leftChild, TournamentNode<P> rightChild) {
40+
public TournamentNode(int key, int weight, P winner, TournamentNode<P> leftChild, TournamentNode<P> rightChild) {
4041
this.key = key;
41-
this.object = object;
42+
this.winner = winner;
4243
this.weight = weight;
4344
this.leftChild = leftChild;
4445
this.rightChild = rightChild;
4546
}
4647

47-
public TournamentEvent<P> createEvent(double t) {
48-
event = new TournamentEvent<>(leftChild, rightChild);
49-
event.computeFailureTime(t);
48+
public TournamentEvent<P> createEvent(EigenSolver solver, double t, TournamentTreeWinner<P> winnerFunction,
49+
boolean inFailedEvent) {
50+
event = new TournamentEvent<>(this, winnerFunction, inFailedEvent);
51+
event.computeFailureTime(solver, t);
5052

5153
return event;
5254
}
@@ -69,7 +71,7 @@ public void setWeight(int weight) {
6971
}
7072

7173
public TournamentNode<P> getLeftChild() {
72-
if (leftChild == null) return new TournamentNode<>(true);
74+
if (leftChild == null) return getNullNode(false);
7375
return leftChild;
7476
}
7577

@@ -80,7 +82,7 @@ public void setLeftChild(TournamentNode<P> leftChild) {
8082
}
8183

8284
public TournamentNode<P> getRightChild() {
83-
if (rightChild == null) return new TournamentNode<>(true);
85+
if (rightChild == null) return getNullNode(false);
8486
return rightChild;
8587
}
8688

@@ -99,7 +101,7 @@ public void setKey(int key) {
99101
}
100102

101103
public TournamentNode<P> getParent() {
102-
if (parent == null) return new TournamentNode<>(true);
104+
if (parent == null) return getNullNode(true);
103105
return parent;
104106
}
105107

@@ -119,12 +121,12 @@ public void setEvent(TournamentEvent<P> event) {
119121
this.event = event;
120122
}
121123

122-
public P getObject() {
123-
return object;
124+
public P getWinner() {
125+
return winner;
124126
}
125127

126-
public void setObject(P object) {
127-
this.object = object;
128+
public void setWinner(P winner) {
129+
this.winner = winner;
128130
}
129131

130132
/**
@@ -152,4 +154,11 @@ public void updateWeights() {
152154
public void updateWinner() {
153155
// TODO
154156
}
157+
158+
private TournamentNode<P> getNullNode(boolean isParent) {
159+
TournamentNode<P> nullNode = new TournamentNode<>();
160+
if (!isParent) nullNode.setParent(this);
161+
nullNode.setNull(true);
162+
return nullNode;
163+
}
155164
}

0 commit comments

Comments
 (0)