Skip to content

Commit a3000ae

Browse files
committed
Workflow test with DummyKernel
1 parent 02f7caf commit a3000ae

File tree

8 files changed

+664
-185
lines changed

8 files changed

+664
-185
lines changed

.idea/workspace.xml

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

src/main/java/de/dmi3y/behaiv/Behaiv.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import de.dmi3y.behaiv.provider.Provider;
1010
import de.dmi3y.behaiv.provider.ProviderCallback;
1111
import de.dmi3y.behaiv.session.CaptureSession;
12+
import io.reactivex.rxjava3.core.Observable;
13+
import io.reactivex.rxjava3.subjects.ReplaySubject;
1214
import org.apache.commons.math3.util.Pair;
1315

1416
import javax.annotation.Nonnull;
@@ -19,9 +21,11 @@
1921

2022
public class Behaiv implements ProviderCallback {
2123

24+
private static ReplaySubject<String> subject;
2225
private Kernel kernel;
2326
private List<Provider> providers;
2427
private CaptureSession currentSession;
28+
private boolean predict = true;
2529

2630
private Behaiv() {
2731
providers = new ArrayList<>();
@@ -31,6 +35,7 @@ private Behaiv() {
3135
public synchronized static Behaiv with(@Nonnull Kernel kernel) {
3236
Behaiv behaiv = new Behaiv();
3337
behaiv.kernel = kernel;
38+
subject = ReplaySubject.create();
3439
return behaiv;
3540

3641
}
@@ -56,19 +61,21 @@ public Behaiv register(@Nonnull BehaivNode node, @Nullable String name) {
5661
return this;
5762
}
5863

59-
public Behaiv register(@Nonnull BehaivNode node) {
60-
return this.register(node, null);
64+
public Observable<String> register(@Nonnull BehaivNode node) {
65+
this.register(node, null);
66+
return subject;
6167
}
6268

63-
public void startCapturing() {
69+
public void startCapturing(boolean predict) {
70+
this.predict = predict;
6471
currentSession = new CaptureSession(providers);
6572
currentSession.start(this);
6673
}
6774

6875
@Override
6976
public void onFeaturesCaptured(List<Pair<Double, String>> features) {
70-
if (kernel.readyToPredict()) {
71-
String label = kernel.predictOne(features.stream().map(Pair::getFirst).collect(Collectors.toCollection(ArrayList::new)));
77+
if (kernel.readyToPredict() && predict) {
78+
subject.onNext(kernel.predictOne(features.stream().map(Pair::getFirst).collect(Collectors.toCollection(ArrayList::new))));
7279
}
7380
}
7481

src/main/java/de/dmi3y/behaiv/kernel/DummyKernel.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ public void fit(ArrayList<Pair<ArrayList<Double>, String>> data) {
1414

1515
@Override
1616
public String predictOne(ArrayList<Double> features) {
17-
1817
return this.data.stream().map(featuresIter -> {
1918
Double result = 0.0;
2019
for (int i = 0; i < featuresIter.getFirst().size(); i++) {
@@ -24,7 +23,7 @@ public String predictOne(ArrayList<Double> features) {
2423
}
2524
featuresIter.getFirst().add(result);
2625
return featuresIter;
27-
}).max(Comparator.comparingDouble(one -> one.getFirst().get(one.getFirst().size() - 1))).map(it -> it.getSecond()).orElse(null);
26+
}).max(Comparator.comparingDouble(one -> one.getFirst().get(one.getFirst().size() - 1))).map(Pair::getSecond).orElse(null);
2827
}
2928

3029
}

src/main/java/de/dmi3y/behaiv/kernel/Kernel.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public abstract class Kernel {
99
private Long treshold = 10L;
1010

1111
//list<features>, label
12-
protected ArrayList<Pair<ArrayList<Double>, String>> data;
12+
protected ArrayList<Pair<ArrayList<Double>, String>> data = new ArrayList<>();
1313

1414
public abstract void fit(ArrayList<Pair<ArrayList<Double>, String>> data);
1515

src/main/java/de/dmi3y/behaiv/node/ActionableNode.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
import de.dmi3y.behaiv.Behaiv;
44

5-
public interface ActionableNode {
5+
public interface ActionableNode extends BehaivNode {
66
void register(Behaiv behaiv);
7+
78
void captureResult(Behaiv behaiv);
89
}

src/test/java/de/dmi3y/behaiv/LibraryTest.java

Lines changed: 144 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,152 @@
33
*/
44
package de.dmi3y.behaiv;
55

6+
import de.dmi3y.behaiv.kernel.DummyKernel;
7+
import de.dmi3y.behaiv.node.BehaivNode;
8+
import de.dmi3y.behaiv.node.MockActionableNode;
9+
import de.dmi3y.behaiv.provider.TestProvider;
10+
import io.reactivex.rxjava3.core.Observable;
11+
import org.apache.commons.math3.util.Pair;
12+
import org.junit.Before;
613
import org.junit.Test;
7-
import static org.junit.Assert.*;
14+
15+
import java.util.ArrayList;
16+
17+
import static de.dmi3y.behaiv.kernel.DummyKernelTest.GYM;
18+
import static de.dmi3y.behaiv.kernel.DummyKernelTest.HOME;
19+
import static de.dmi3y.behaiv.kernel.DummyKernelTest.JOG;
20+
import static de.dmi3y.behaiv.kernel.DummyKernelTest.WORK;
21+
import static org.junit.Assert.assertEquals;
822

923
public class LibraryTest {
10-
@Test public void testSomeLibraryMethod() {
11-
// Behaiv classUnderTest = new Behaiv();
12-
// assertTrue("someLibraryMethod should return 'true'", classUnderTest.someLibraryMethod());
24+
Behaiv behaiv;
25+
private TestProvider positionProvider;
26+
private TestProvider timeProvider;
27+
private ArrayList<Pair<ArrayList<Double>, String>> data;
28+
29+
public static final String WORK_SCREEN = "WORK_SCREEN";
30+
31+
@Before
32+
public void setUp() throws Exception {
33+
behaiv = Behaiv.with(new DummyKernel());
34+
positionProvider = new TestProvider(new String[]{"latitude", "longitude"}, new Double[]{10.10, 10.10});
35+
timeProvider = new TestProvider(new String[]{"time"}, new Double[]{9.0 * 60 + 30.0});
36+
behaiv.setProvider(positionProvider);
37+
behaiv.setProvider(timeProvider);
38+
ArrayList<Double> list = new ArrayList<>();
39+
data = new ArrayList<>();
40+
41+
42+
list.add(5 * 60 + 00.0);
43+
list.add(HOME[0]);
44+
list.add(HOME[1]);
45+
list.add(0.0);
46+
data.add(new Pair<>(list, "SELFIMPROVEMENT_SCREEN"));
47+
list = new ArrayList<>();
48+
list.add(5 * 60 + 10.0);
49+
list.add(HOME[0]);
50+
list.add(HOME[1]);
51+
list.add(0.0);
52+
data.add(new Pair<>(list, "SELFIMPROVEMENT_SCREEN"));
53+
list = new ArrayList<>();
54+
list.add(6 * 60 + 10.0);
55+
list.add(GYM[0]);
56+
list.add(GYM[1]);
57+
list.add(1.0);
58+
data.add(new Pair<>(list, "SPORT_SCREEN"));
59+
list = new ArrayList<>();
60+
list.add(7 * 60 + 30.0);
61+
list.add(HOME[0]);
62+
list.add(HOME[1]);
63+
list.add(1.0);
64+
data.add(new Pair<>(list, "SELFIMPROVEMENT_SCREEN"));
65+
list = new ArrayList<>();
66+
list.add(8 * 60 + 30.0);
67+
list.add(WORK[0]);
68+
list.add(WORK[1]);
69+
list.add(0.0);
70+
71+
data.add(new Pair<>(list, WORK_SCREEN));
72+
list = new ArrayList<>();
73+
list.add(10 * 60 + 30.0);
74+
list.add(WORK[0]);
75+
list.add(WORK[1]);
76+
list.add(1.0);
77+
data.add(new Pair<>(list, WORK_SCREEN));
78+
list = new ArrayList<>();
79+
list.add(11 * 60 + 30.0);
80+
list.add(WORK[0]);
81+
list.add(WORK[1]);
82+
list.add(1.0);
83+
data.add(new Pair<>(list, WORK_SCREEN));
84+
list = new ArrayList<>();
85+
list.add(16 * 60 + 30.0);
86+
list.add(WORK[0]);
87+
list.add(WORK[1]);
88+
list.add(0.0);
89+
data.add(new Pair<>(list, WORK_SCREEN));
90+
list = new ArrayList<>();
91+
list.add(17 * 60 + 10.0);
92+
list.add(WORK[0]);
93+
list.add(WORK[1]);
94+
list.add(0.0);
95+
data.add(new Pair<>(list, WORK_SCREEN));
96+
list = new ArrayList<>();
97+
list.add(18 * 60 + 50.0);
98+
list.add(WORK[0]);
99+
list.add(WORK[1]);
100+
list.add(0.0);
101+
data.add(new Pair<>(list, WORK_SCREEN));
102+
list = new ArrayList<>();
103+
list.add(19 * 60 + 5.0);
104+
list.add(JOG[0]);
105+
list.add(JOG[1]);
106+
list.add(1.0);
107+
data.add(new Pair<>(list, "SPORT_SCREEN"));
108+
list = new ArrayList<>();
109+
list.add(19 * 60 + 10.0);
110+
list.add(JOG[0]);
111+
list.add(JOG[1]);
112+
list.add(1.0);
113+
data.add(new Pair<>(list, "SPORT_SCREEN"));
114+
list = new ArrayList<>();
115+
list.add(19 * 60 + 25.0);
116+
list.add(JOG[0]);
117+
list.add(JOG[1]);
118+
list.add(1.0);
119+
data.add(new Pair<>(list, "SPORT_SCREEN"));
120+
list = new ArrayList<>();
121+
list.add(21 * 60 + 00.0);
122+
list.add(HOME[0]);
123+
list.add(HOME[1]);
124+
list.add(0.0);
125+
data.add(new Pair<>(list, "ADD_SCREEN"));
13126
}
127+
128+
@Test
129+
public void behaivTest_basicTestFlow_predictsJob() throws Exception {
130+
for (Pair<ArrayList<Double>, String> fToL : data) {
131+
ArrayList<Double> features = fToL.getFirst();
132+
timeProvider.next(new Double[]{features.get(0)});
133+
positionProvider.next(new Double[]{features.get(1), features.get(2)});
134+
capture(fToL.getSecond());
135+
}
136+
137+
Observable<String> register = behaiv.register(new BehaivNode() {
138+
});
139+
timeProvider.next(new Double[]{11 * 60 + 30.0});
140+
positionProvider.next(new Double[]{WORK[0], WORK[1]});
141+
behaiv.startCapturing(true);
142+
String predictionResult = register.blockingFirst();
143+
assertEquals(WORK_SCREEN, predictionResult);
144+
145+
}
146+
147+
public void capture(String screenName) throws InterruptedException {
148+
behaiv.startCapturing(false);
149+
Thread.sleep(100);
150+
behaiv.register(new MockActionableNode(), screenName);
151+
behaiv.stopCapturing(false);
152+
}
153+
14154
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package de.dmi3y.behaiv.node;
2+
3+
import de.dmi3y.behaiv.Behaiv;
4+
5+
public class MockActionableNode implements ActionableNode {
6+
@Override
7+
public void register(Behaiv behaiv) {
8+
9+
}
10+
11+
@Override
12+
public void captureResult(Behaiv behaiv) {
13+
14+
}
15+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package de.dmi3y.behaiv.provider;
2+
3+
import io.reactivex.rxjava3.core.Observable;
4+
import io.reactivex.rxjava3.core.Single;
5+
6+
import java.util.Arrays;
7+
import java.util.List;
8+
9+
public class TestProvider implements Provider {
10+
11+
private List<String> names;
12+
private List<Double> features;
13+
14+
public TestProvider(String[] names, Double[] features) {
15+
this.names = Arrays.asList(names);
16+
this.features = Arrays.asList(features);
17+
}
18+
19+
@Override
20+
public List<String> availableFeatures() {
21+
return names;
22+
}
23+
24+
@Override
25+
public Observable<List<Double>> subscribeFeatures() {
26+
throw new UnsupportedOperationException();
27+
}
28+
29+
@Override
30+
public Single<List<Double>> getFeature() {
31+
return Single.just(features);
32+
}
33+
34+
public void next(Double[] features) {
35+
this.features = Arrays.asList(features);
36+
}
37+
}

0 commit comments

Comments
 (0)