Skip to content
Snippets Groups Projects
Commit d05b3682 authored by René Schöne's avatar René Schöne
Browse files

Last fixes after model separation.

parent f1b65336
No related branches found
No related tags found
No related merge requests found
...@@ -21,7 +21,7 @@ public class ExecuteImplTest { ...@@ -21,7 +21,7 @@ public class ExecuteImplTest {
@Test @Test
public void testColorControlledByOneNumber() { public void testColorControlledByOneNumber() {
ModelAndItem mai = TestUtils.createModelAndItem(0); ModelAndItem mai = TestUtils.createModelAndItem(0);
Root model = mai.model; OpenHAB2Model model = mai.model;
NumberItem numberItem = mai.item; NumberItem numberItem = mai.item;
ColorItem lamp = new ColorItem(); ColorItem lamp = new ColorItem();
...@@ -33,7 +33,7 @@ public class ExecuteImplTest { ...@@ -33,7 +33,7 @@ public class ExecuteImplTest {
numberItem.addControlling(lamp); numberItem.addControlling(lamp);
Execute execute = new ExecuteImpl(); Execute execute = new ExecuteImpl();
execute.setKnowledgeBase(model); execute.setKnowledgeBase(model.getRoot());
Assert.assertEquals(0, numberItem.getState(), DELTA); Assert.assertEquals(0, numberItem.getState(), DELTA);
Assert.assertEquals(TupleHSB.of(0, 0, 0), lamp.getState()); Assert.assertEquals(TupleHSB.of(0, 0, 0), lamp.getState());
...@@ -47,7 +47,7 @@ public class ExecuteImplTest { ...@@ -47,7 +47,7 @@ public class ExecuteImplTest {
@Test @Test
public void testColorControlledByOneBoolean() { public void testColorControlledByOneBoolean() {
Root model = TestUtils.createModelAndItem(0).model; OpenHAB2Model model = TestUtils.createModelAndItem(0).model;
ItemWithBooleanState button = new SwitchItem(); ItemWithBooleanState button = new SwitchItem();
button.setID("button"); button.setID("button");
...@@ -64,7 +64,7 @@ public class ExecuteImplTest { ...@@ -64,7 +64,7 @@ public class ExecuteImplTest {
button.addControlling(lamp); button.addControlling(lamp);
Execute execute = new ExecuteImpl(); Execute execute = new ExecuteImpl();
execute.setKnowledgeBase(model); execute.setKnowledgeBase(model.getRoot());
Assert.assertFalse(button.getState()); Assert.assertFalse(button.getState());
Assert.assertEquals(TupleHSB.of(0, 0, 0), lamp.getState()); Assert.assertEquals(TupleHSB.of(0, 0, 0), lamp.getState());
...@@ -79,7 +79,7 @@ public class ExecuteImplTest { ...@@ -79,7 +79,7 @@ public class ExecuteImplTest {
@Test @Test
public void testColorControlledByMany() { public void testColorControlledByMany() {
ModelAndItem mai = TestUtils.createModelAndItem(0); ModelAndItem mai = TestUtils.createModelAndItem(0);
Root model = mai.model; OpenHAB2Model model = mai.model;
NumberItem numberItem = mai.item; NumberItem numberItem = mai.item;
Group g = TestUtils.getDefaultGroup(model); Group g = TestUtils.getDefaultGroup(model);
...@@ -108,7 +108,7 @@ public class ExecuteImplTest { ...@@ -108,7 +108,7 @@ public class ExecuteImplTest {
lamp.addControlledBy(colorItem); lamp.addControlledBy(colorItem);
Execute execute = new ExecuteImpl(); Execute execute = new ExecuteImpl();
execute.setKnowledgeBase(model); execute.setKnowledgeBase(model.getRoot());
Assert.assertEquals(0, numberItem.getState(), DELTA); Assert.assertEquals(0, numberItem.getState(), DELTA);
Assert.assertEquals("0", stringItem.getState()); Assert.assertEquals("0", stringItem.getState());
......
...@@ -79,7 +79,7 @@ public class IntegrationMain { ...@@ -79,7 +79,7 @@ public class IntegrationMain {
logger.info("Start!"); logger.info("Start!");
Root model = Main.importFromFile(); Root model = Main.importFromFile();
// Root model = importFromLocalFile(); // Root model = importFromLocalFile();
logger.debug("Got model: {}", model.description()); logger.debug("Got model: {}", model.getOpenHAB2Model().description());
MqttRoot mqttRoot = new MqttRoot(); MqttRoot mqttRoot = new MqttRoot();
mqttRoot.setHostByName("localhost"); mqttRoot.setHostByName("localhost");
mqttRoot.setIncomingPrefix("oh2/out/"); mqttRoot.setIncomingPrefix("oh2/out/");
...@@ -89,7 +89,7 @@ public class IntegrationMain { ...@@ -89,7 +89,7 @@ public class IntegrationMain {
irisStateTopic.setPart("state"); irisStateTopic.setPart("state");
irisTopic.addSubTopic(irisStateTopic); irisTopic.addSubTopic(irisStateTopic);
Item iris = null; Item iris = null;
for (Item item : model.items()) { for (Item item : model.getOpenHAB2Model().items()) {
if (item.getID().equals("iris1_item")) { if (item.getID().equals("iris1_item")) {
iris = item; iris = item;
break; break;
......
...@@ -23,15 +23,15 @@ public class Main { ...@@ -23,15 +23,15 @@ public class Main {
} }
private static Root createModel() { private static Root createModel() {
Root model = Root.createEmptyRoot(); Root root = Root.createEmptyRoot();
Group group = new Group(); Group group = new Group();
group.setID("Group1"); group.setID("Group1");
model.addGroup(group); root.getOpenHAB2Model().addGroup(group);
Item activityItem = newItem("activity", "Recognized activity", false, 8); Item activityItem = newItem("activity", "Recognized activity", false, 8);
Item brightnessItem = newItem("brightness", "Measured brightness", false, 5); Item brightnessItem = newItem("brightness", "Measured brightness", false, 5);
group.addItem(activityItem); group.addItem(activityItem);
group.addItem(brightnessItem); group.addItem(brightnessItem);
return model; return root;
} }
private static NumberItem newItem(String id, String label, boolean defaultSendState, int initialState) { private static NumberItem newItem(String id, String label, boolean defaultSendState, int initialState) {
...@@ -70,7 +70,7 @@ public class Main { ...@@ -70,7 +70,7 @@ public class Main {
} }
} }
logger.info("Classification results: {}", results); logger.info("Classification results: {}", results);
logger.info("Took {}ms", String.join("ms, ", times.stream().map(l -> Long.toString(l)).collect(Collectors.toList()))); logger.info("Took {}ms", times.stream().map(l -> Long.toString(l)).collect(Collectors.joining("ms, ")));
logger.info("Took on average: {}ms", logger.info("Took on average: {}ms",
Arrays.stream(times.toArray(new Long[0])).mapToLong(l -> l).average().orElse(-1)); Arrays.stream(times.toArray(new Long[0])).mapToLong(l -> l).average().orElse(-1));
logger.info("Took on median: {}ms", logger.info("Took on median: {}ms",
...@@ -78,30 +78,36 @@ public class Main { ...@@ -78,30 +78,36 @@ public class Main {
.skip((REPETITIONS-1)/2).limit(2-REPETITIONS%2).average().orElse(Double.NaN)); .skip((REPETITIONS-1)/2).limit(2-REPETITIONS%2).average().orElse(Double.NaN));
} }
/** private static class PreparationResult {
* Purpose: Create a neural network with 3 layers (2 + 10 + 1 neurons) OutputLayer outputLayer;
* Sigmoid function for all layers, combinator of output is identity function DoubleArrayDoubleFunction sigmoid;
*/ InputNeuron activity;
private static void createAndTestBrightnessNetwork() { InputNeuron brightness;
/* NeuralNetworkRoot nn;
- Helligkeit NN: HiddenNeuron[] hiddenNeurons;
- arbeitet momentan mit Zonen und nicht mit einzelnen Lampen
- 3 Layers PreparationResult(OutputLayer outputLayer, DoubleArrayDoubleFunction sigmoid, InputNeuron activity,
- Input Layer hat Neuronen (Aktivitätsnummer, Wert vom Helligkeitssensor) InputNeuron brightness, NeuralNetworkRoot nn, HiddenNeuron[] hiddenNeurons) {
- Hidden Layer hat 10 Neuronen this.outputLayer = outputLayer;
- Output Layer hat 1 Neuron ( Helligkeitswert) this.sigmoid = sigmoid;
- Aktivierungsfunktion: Sigmoidfunktion <- selbe für alle Layers this.activity = activity;
*/ this.brightness = brightness;
Root model = createModel(); this.nn = nn;
Item activityItem = model.resolveItem("activity").orElseThrow( this.hiddenNeurons = hiddenNeurons;
}
}
private static PreparationResult prepareNetwork() {
Root root = createModel();
Item activityItem = root.getOpenHAB2Model().resolveItem("activity").orElseThrow(
() -> new RuntimeException("Activity not found")); () -> new RuntimeException("Activity not found"));
Item brightnessItem = model.resolveItem("brightness").orElseThrow( Item brightnessItem = root.getOpenHAB2Model().resolveItem("brightness").orElseThrow(
() -> new RuntimeException("Brightness not found")); () -> new RuntimeException("Brightness not found"));
NeuralNetworkRoot nn = new NeuralNetworkRoot(); NeuralNetworkRoot nn = new NeuralNetworkRoot();
DoubleArrayDoubleFunction sigmoid = inputs -> Math.signum(Arrays.stream(inputs).sum()); DoubleArrayDoubleFunction sigmoid = inputs -> Math.signum(Arrays.stream(inputs).sum());
// input layer // input layer (2 neurons)
InputNeuron activity = new InputNeuron(); InputNeuron activity = new InputNeuron();
activity.setItem(activityItem); activity.setItem(activityItem);
InputNeuron brightness = new InputNeuron(); InputNeuron brightness = new InputNeuron();
...@@ -109,31 +115,50 @@ public class Main { ...@@ -109,31 +115,50 @@ public class Main {
nn.addInputNeuron(activity); nn.addInputNeuron(activity);
nn.addInputNeuron(brightness); nn.addInputNeuron(brightness);
// output layer
OutputLayer outputLayer = new OutputLayer(); OutputLayer outputLayer = new OutputLayer();
OutputNeuron output = new OutputNeuron();
output.setLabel("Brightness_Output");
output.setActivationFormula(sigmoid);
outputLayer.addOutputNeuron(output);
// we just have one output neuron, thus use IdentityFunction
outputLayer.setCombinator(inputs -> inputs[0]);
nn.setOutputLayer(outputLayer); nn.setOutputLayer(outputLayer);
// hidden layer // hidden layer (10 neurons)
HiddenNeuron[] hiddenNeurons = new HiddenNeuron[10]; HiddenNeuron[] hiddenNeurons = new HiddenNeuron[10];
for (int i = 0; i < hiddenNeurons.length; i++) { for (int hiddenIndex = 0; hiddenIndex < hiddenNeurons.length; hiddenIndex++) {
HiddenNeuron hiddenNeuron = new HiddenNeuron(); HiddenNeuron hiddenNeuron = new HiddenNeuron();
hiddenNeuron.setActivationFormula(sigmoid); hiddenNeuron.setActivationFormula(sigmoid);
hiddenNeurons[i] = hiddenNeuron;
nn.addHiddenNeuron(hiddenNeuron); nn.addHiddenNeuron(hiddenNeuron);
activity.connectTo(hiddenNeuron, 1.0/2.0); activity.connectTo(hiddenNeuron, 1.0/2.0);
brightness.connectTo(hiddenNeuron, 1.0/2.0); brightness.connectTo(hiddenNeuron, 1.0/2.0);
hiddenNeuron.connectTo(output, 1.0/hiddenNeurons.length);
} }
root.getMachineLearningRoot().setPreferenceLearning(nn);
model.getMachineLearningRoot().setPreferenceLearning(nn); return new PreparationResult(outputLayer, sigmoid, activity, brightness, nn, hiddenNeurons);
}
classifyTimed(nn, NeuralNetworkRoot::classify, /**
* Purpose: Create a neural network with 3 layers (2 + 10 + 1 neurons)
* Sigmoid function for all layers, combinator of output is identity function
*/
private static void createAndTestBrightnessNetwork() {
/*
- Helligkeit NN:
- arbeitet momentan mit Zonen und nicht mit einzelnen Lampen
- 3 Layers
- Input Layer hat Neuronen (Aktivitätsnummer, Wert vom Helligkeitssensor)
- Hidden Layer hat 10 Neuronen
- Output Layer hat 1 Neuron ( Helligkeitswert)
- Aktivierungsfunktion: Sigmoidfunktion <- selbe für alle Layers
*/
PreparationResult pr = prepareNetwork();
OutputNeuron output = new OutputNeuron();
output.setLabel("Brightness_Output");
output.setActivationFormula(pr.sigmoid);
pr.outputLayer.addOutputNeuron(output);
// we just have one output neuron, thus use IdentityFunction
pr.outputLayer.setCombinator(inputs -> inputs[0]);
for (HiddenNeuron hiddenNeuron : pr.hiddenNeurons) {
hiddenNeuron.connectTo(output, 1.0/pr.hiddenNeurons.length);
}
classifyTimed(pr.nn, NeuralNetworkRoot::classify,
classification -> Double.toString(classification.number)); classification -> Double.toString(classification.number));
} }
...@@ -142,52 +167,23 @@ public class Main { ...@@ -142,52 +167,23 @@ public class Main {
* Sigmoid function for all layers, combinator creates RGB value in hex form * Sigmoid function for all layers, combinator creates RGB value in hex form
*/ */
private static void createAndTestColorNetwork() { private static void createAndTestColorNetwork() {
Root model = createModel(); PreparationResult pr = prepareNetwork();
Item activityItem = model.resolveItem("activity").orElseThrow(
() -> new RuntimeException("Activity not found"));
Item brightnessItem = model.resolveItem("brightness").orElseThrow(
() -> new RuntimeException("Brightness not found"));
NeuralNetworkRoot nn = new NeuralNetworkRoot();
DoubleArrayDoubleFunction sigmoid = inputs -> Math.signum(Arrays.stream(inputs).sum());
// input layer (2 neurons)
InputNeuron activity = new InputNeuron();
activity.setItem(activityItem);
InputNeuron brightness = new InputNeuron();
brightness.setItem(brightnessItem);
nn.addInputNeuron(activity);
nn.addInputNeuron(brightness);
// output layer (3 neurons)
OutputLayer outputLayer = new OutputLayer();
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
OutputNeuron output = new OutputNeuron(); OutputNeuron output = new OutputNeuron();
output.setLabel("Brightness_Output_" + i); output.setLabel("Brightness_Output_" + i);
output.setActivationFormula(inputs -> Arrays.stream(inputs).sum()); output.setActivationFormula(inputs -> Arrays.stream(inputs).sum());
outputLayer.addOutputNeuron(output); pr.outputLayer.addOutputNeuron(output);
} }
// we have three output neurons, combine them to a double value (representing RGB) // we have three output neurons, combine them to a double value (representing RGB)
outputLayer.setCombinator(inputs -> 65536 * Math.ceil(255.0 * inputs[0]) + 256 * Math.ceil(255.0 * inputs[1]) + Math.ceil(255.0 * inputs[0])); pr.outputLayer.setCombinator(inputs -> 65536 * Math.ceil(255.0 * inputs[0]) + 256 * Math.ceil(255.0 * inputs[1]) + Math.ceil(255.0 * inputs[0]));
nn.setOutputLayer(outputLayer);
// hidden layer (10 neurons) for (HiddenNeuron hiddenNeuron : pr.hiddenNeurons) {
HiddenNeuron[] hiddenNeurons = new HiddenNeuron[10]; for (int outputIndex = 0; outputIndex < pr.outputLayer.getNumOutputNeuron(); outputIndex++) {
for (int hiddenIndex = 0; hiddenIndex < hiddenNeurons.length; hiddenIndex++) { hiddenNeuron.connectTo(pr.outputLayer.getOutputNeuron(outputIndex), random.nextDouble() * 1.0/pr.hiddenNeurons.length);
HiddenNeuron hiddenNeuron = new HiddenNeuron();
hiddenNeuron.setActivationFormula(sigmoid);
hiddenNeurons[hiddenIndex] = hiddenNeuron;
nn.addHiddenNeuron(hiddenNeuron);
activity.connectTo(hiddenNeuron, 1.0/2.0);
brightness.connectTo(hiddenNeuron, 1.0/2.0);
for (int outputIndex = 0; outputIndex < outputLayer.getNumOutputNeuron(); outputIndex++) {
hiddenNeuron.connectTo(outputLayer.getOutputNeuron(outputIndex), random.nextDouble() * 1.0/hiddenNeurons.length);
} }
} }
model.getMachineLearningRoot().setPreferenceLearning(nn); classifyTimed(pr.nn, NeuralNetworkRoot::classify,
classifyTimed(nn, NeuralNetworkRoot::classify,
classification -> Double.toHexString(classification.number)); classification -> Double.toHexString(classification.number));
// long before = System.nanoTime(); // long before = System.nanoTime();
......
...@@ -3,10 +3,7 @@ package de.tudresden.inf.st.eraser.skywriter_hue_integration; ...@@ -3,10 +3,7 @@ package de.tudresden.inf.st.eraser.skywriter_hue_integration;
import beaver.Parser; import beaver.Parser;
import de.tudresden.inf.st.eraser.commons.color.ColorUtils; import de.tudresden.inf.st.eraser.commons.color.ColorUtils;
import de.tudresden.inf.st.eraser.commons.color.ColorUtils.RGBvalues; import de.tudresden.inf.st.eraser.commons.color.ColorUtils.RGBvalues;
import de.tudresden.inf.st.eraser.jastadd.model.Item; import de.tudresden.inf.st.eraser.jastadd.model.*;
import de.tudresden.inf.st.eraser.jastadd.model.Root;
import de.tudresden.inf.st.eraser.jastadd.model.Rule;
import de.tudresden.inf.st.eraser.jastadd.model.SetStateFromItemsAction;
import de.tudresden.inf.st.eraser.openhab2.mqtt.MQTTUpdater; import de.tudresden.inf.st.eraser.openhab2.mqtt.MQTTUpdater;
import de.tudresden.inf.st.eraser.util.ParserUtils; import de.tudresden.inf.st.eraser.util.ParserUtils;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
...@@ -39,7 +36,8 @@ public class Main { ...@@ -39,7 +36,8 @@ public class Main {
@SuppressWarnings("ResultOfMethodCallIgnored") @SuppressWarnings("ResultOfMethodCallIgnored")
public static void main(String[] args) throws IOException, Parser.Exception { public static void main(String[] args) throws IOException, Parser.Exception {
// use openHAB-eraser-connection to update hue (automatically done) // use openHAB-eraser-connection to update hue (automatically done)
Root model = ParserUtils.load("skywriter-hue.eraser", Main.class); Root root = ParserUtils.load("skywriter-hue.eraser", Main.class);
OpenHAB2Model model = root.getOpenHAB2Model();
Item irisItem = model.resolveItem("iris1_item").orElseThrow(() -> Item irisItem = model.resolveItem("iris1_item").orElseThrow(() ->
new NoSuchElementException("Iris1_item not found")); new NoSuchElementException("Iris1_item not found"));
Item skywriter1_x = model.resolveItem("skywriter1_x").orElseThrow(() -> Item skywriter1_x = model.resolveItem("skywriter1_x").orElseThrow(() ->
...@@ -48,10 +46,10 @@ public class Main { ...@@ -48,10 +46,10 @@ public class Main {
new NoSuchElementException("Skywriter1 y not found")); new NoSuchElementException("Skywriter1 y not found"));
Item skywriter1_xyz = model.resolveItem("skywriter1_xyz").orElseThrow(() -> Item skywriter1_xyz = model.resolveItem("skywriter1_xyz").orElseThrow(() ->
new NoSuchElementException("Skywriter1 xyz not found")); new NoSuchElementException("Skywriter1 xyz not found"));
System.out.println(model.prettyPrint()); System.out.println(root.prettyPrint());
// define rule to switch color, based on xyz-to-rgb-to-hsb mapping // define rule to switch color, based on xyz-to-rgb-to-hsb mapping
Rule mapXYtoIrisState = new Rule(); Rule mapXYtoIrisState = new Rule();
model.addRule(mapXYtoIrisState); root.addRule(mapXYtoIrisState);
mapXYtoIrisState.activateFor(skywriter1_xyz); mapXYtoIrisState.activateFor(skywriter1_xyz);
// mapXYtoIrisState.addEventFor(skywriter1_y, "y changed"); // mapXYtoIrisState.addEventFor(skywriter1_y, "y changed");
SetStateFromItemsAction action = new SetStateFromItemsAction(); SetStateFromItemsAction action = new SetStateFromItemsAction();
...@@ -64,7 +62,7 @@ public class Main { ...@@ -64,7 +62,7 @@ public class Main {
Lock abortLock = new ReentrantLock(); Lock abortLock = new ReentrantLock();
Condition abortCondition = abortLock.newCondition(); Condition abortCondition = abortLock.newCondition();
Thread readFromOpenHABThread = new Thread(() -> { Thread readFromOpenHABThread = new Thread(() -> {
try (MQTTUpdater updater = new MQTTUpdater(model)) { try (MQTTUpdater updater = new MQTTUpdater(root)) {
updater.start(); updater.start();
if (!updater.waitUntilReady(3, TimeUnit.SECONDS)) { if (!updater.waitUntilReady(3, TimeUnit.SECONDS)) {
logger.error("openHAB reader not ready. Aborting."); logger.error("openHAB reader not ready. Aborting.");
...@@ -84,7 +82,7 @@ public class Main { ...@@ -84,7 +82,7 @@ public class Main {
} }
}); });
if (USE_READ_FROM_OPENHAB || SEND_TO_OPENHAB) { if (USE_READ_FROM_OPENHAB || SEND_TO_OPENHAB) {
model.getMqttRoot().setHostByName(MQTT_HOST); root.getMqttRoot().setHostByName(MQTT_HOST);
} }
if (USE_READ_FROM_OPENHAB) { if (USE_READ_FROM_OPENHAB) {
readFromOpenHABThread.start(); readFromOpenHABThread.start();
...@@ -124,7 +122,7 @@ public class Main { ...@@ -124,7 +122,7 @@ public class Main {
} }
// wait for user to press enter // wait for user to press enter
System.out.println("Press [Enter] to quit updating the model."); System.out.println("Press [Enter] to quit updating the root.");
System.in.read(); System.in.read();
// and then cancel the threads // and then cancel the threads
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment