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
Branches
Tags
No related merge requests found
......@@ -21,7 +21,7 @@ public class ExecuteImplTest {
@Test
public void testColorControlledByOneNumber() {
ModelAndItem mai = TestUtils.createModelAndItem(0);
Root model = mai.model;
OpenHAB2Model model = mai.model;
NumberItem numberItem = mai.item;
ColorItem lamp = new ColorItem();
......@@ -33,7 +33,7 @@ public class ExecuteImplTest {
numberItem.addControlling(lamp);
Execute execute = new ExecuteImpl();
execute.setKnowledgeBase(model);
execute.setKnowledgeBase(model.getRoot());
Assert.assertEquals(0, numberItem.getState(), DELTA);
Assert.assertEquals(TupleHSB.of(0, 0, 0), lamp.getState());
......@@ -47,7 +47,7 @@ public class ExecuteImplTest {
@Test
public void testColorControlledByOneBoolean() {
Root model = TestUtils.createModelAndItem(0).model;
OpenHAB2Model model = TestUtils.createModelAndItem(0).model;
ItemWithBooleanState button = new SwitchItem();
button.setID("button");
......@@ -64,7 +64,7 @@ public class ExecuteImplTest {
button.addControlling(lamp);
Execute execute = new ExecuteImpl();
execute.setKnowledgeBase(model);
execute.setKnowledgeBase(model.getRoot());
Assert.assertFalse(button.getState());
Assert.assertEquals(TupleHSB.of(0, 0, 0), lamp.getState());
......@@ -79,7 +79,7 @@ public class ExecuteImplTest {
@Test
public void testColorControlledByMany() {
ModelAndItem mai = TestUtils.createModelAndItem(0);
Root model = mai.model;
OpenHAB2Model model = mai.model;
NumberItem numberItem = mai.item;
Group g = TestUtils.getDefaultGroup(model);
......@@ -108,7 +108,7 @@ public class ExecuteImplTest {
lamp.addControlledBy(colorItem);
Execute execute = new ExecuteImpl();
execute.setKnowledgeBase(model);
execute.setKnowledgeBase(model.getRoot());
Assert.assertEquals(0, numberItem.getState(), DELTA);
Assert.assertEquals("0", stringItem.getState());
......
......@@ -79,7 +79,7 @@ public class IntegrationMain {
logger.info("Start!");
Root model = Main.importFromFile();
// Root model = importFromLocalFile();
logger.debug("Got model: {}", model.description());
logger.debug("Got model: {}", model.getOpenHAB2Model().description());
MqttRoot mqttRoot = new MqttRoot();
mqttRoot.setHostByName("localhost");
mqttRoot.setIncomingPrefix("oh2/out/");
......@@ -89,7 +89,7 @@ public class IntegrationMain {
irisStateTopic.setPart("state");
irisTopic.addSubTopic(irisStateTopic);
Item iris = null;
for (Item item : model.items()) {
for (Item item : model.getOpenHAB2Model().items()) {
if (item.getID().equals("iris1_item")) {
iris = item;
break;
......
......@@ -23,15 +23,15 @@ public class Main {
}
private static Root createModel() {
Root model = Root.createEmptyRoot();
Root root = Root.createEmptyRoot();
Group group = new Group();
group.setID("Group1");
model.addGroup(group);
root.getOpenHAB2Model().addGroup(group);
Item activityItem = newItem("activity", "Recognized activity", false, 8);
Item brightnessItem = newItem("brightness", "Measured brightness", false, 5);
group.addItem(activityItem);
group.addItem(brightnessItem);
return model;
return root;
}
private static NumberItem newItem(String id, String label, boolean defaultSendState, int initialState) {
......@@ -70,7 +70,7 @@ public class Main {
}
}
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",
Arrays.stream(times.toArray(new Long[0])).mapToLong(l -> l).average().orElse(-1));
logger.info("Took on median: {}ms",
......@@ -78,30 +78,36 @@ public class Main {
.skip((REPETITIONS-1)/2).limit(2-REPETITIONS%2).average().orElse(Double.NaN));
}
/**
* 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
*/
Root model = createModel();
Item activityItem = model.resolveItem("activity").orElseThrow(
private static class PreparationResult {
OutputLayer outputLayer;
DoubleArrayDoubleFunction sigmoid;
InputNeuron activity;
InputNeuron brightness;
NeuralNetworkRoot nn;
HiddenNeuron[] hiddenNeurons;
PreparationResult(OutputLayer outputLayer, DoubleArrayDoubleFunction sigmoid, InputNeuron activity,
InputNeuron brightness, NeuralNetworkRoot nn, HiddenNeuron[] hiddenNeurons) {
this.outputLayer = outputLayer;
this.sigmoid = sigmoid;
this.activity = activity;
this.brightness = brightness;
this.nn = nn;
this.hiddenNeurons = hiddenNeurons;
}
}
private static PreparationResult prepareNetwork() {
Root root = createModel();
Item activityItem = root.getOpenHAB2Model().resolveItem("activity").orElseThrow(
() -> new RuntimeException("Activity not found"));
Item brightnessItem = model.resolveItem("brightness").orElseThrow(
Item brightnessItem = root.getOpenHAB2Model().resolveItem("brightness").orElseThrow(
() -> new RuntimeException("Brightness not found"));
NeuralNetworkRoot nn = new NeuralNetworkRoot();
DoubleArrayDoubleFunction sigmoid = inputs -> Math.signum(Arrays.stream(inputs).sum());
// input layer
// input layer (2 neurons)
InputNeuron activity = new InputNeuron();
activity.setItem(activityItem);
InputNeuron brightness = new InputNeuron();
......@@ -109,31 +115,50 @@ public class Main {
nn.addInputNeuron(activity);
nn.addInputNeuron(brightness);
// output layer
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);
// hidden layer
// hidden layer (10 neurons)
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.setActivationFormula(sigmoid);
hiddenNeurons[i] = hiddenNeuron;
nn.addHiddenNeuron(hiddenNeuron);
activity.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));
}
......@@ -142,52 +167,23 @@ public class Main {
* Sigmoid function for all layers, combinator creates RGB value in hex form
*/
private static void createAndTestColorNetwork() {
Root model = createModel();
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();
PreparationResult pr = prepareNetwork();
for (int i = 0; i < 3; i++) {
OutputNeuron output = new OutputNeuron();
output.setLabel("Brightness_Output_" + i);
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)
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);
pr.outputLayer.setCombinator(inputs -> 65536 * Math.ceil(255.0 * inputs[0]) + 256 * Math.ceil(255.0 * inputs[1]) + Math.ceil(255.0 * inputs[0]));
// hidden layer (10 neurons)
HiddenNeuron[] hiddenNeurons = new HiddenNeuron[10];
for (int hiddenIndex = 0; hiddenIndex < hiddenNeurons.length; hiddenIndex++) {
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);
for (HiddenNeuron hiddenNeuron : pr.hiddenNeurons) {
for (int outputIndex = 0; outputIndex < pr.outputLayer.getNumOutputNeuron(); outputIndex++) {
hiddenNeuron.connectTo(pr.outputLayer.getOutputNeuron(outputIndex), random.nextDouble() * 1.0/pr.hiddenNeurons.length);
}
}
model.getMachineLearningRoot().setPreferenceLearning(nn);
classifyTimed(nn, NeuralNetworkRoot::classify,
classifyTimed(pr.nn, NeuralNetworkRoot::classify,
classification -> Double.toHexString(classification.number));
// long before = System.nanoTime();
......
......@@ -3,10 +3,7 @@ package de.tudresden.inf.st.eraser.skywriter_hue_integration;
import beaver.Parser;
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.jastadd.model.Item;
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.jastadd.model.*;
import de.tudresden.inf.st.eraser.openhab2.mqtt.MQTTUpdater;
import de.tudresden.inf.st.eraser.util.ParserUtils;
import org.apache.logging.log4j.LogManager;
......@@ -39,7 +36,8 @@ public class Main {
@SuppressWarnings("ResultOfMethodCallIgnored")
public static void main(String[] args) throws IOException, Parser.Exception {
// 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(() ->
new NoSuchElementException("Iris1_item not found"));
Item skywriter1_x = model.resolveItem("skywriter1_x").orElseThrow(() ->
......@@ -48,10 +46,10 @@ public class Main {
new NoSuchElementException("Skywriter1 y not found"));
Item skywriter1_xyz = model.resolveItem("skywriter1_xyz").orElseThrow(() ->
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
Rule mapXYtoIrisState = new Rule();
model.addRule(mapXYtoIrisState);
root.addRule(mapXYtoIrisState);
mapXYtoIrisState.activateFor(skywriter1_xyz);
// mapXYtoIrisState.addEventFor(skywriter1_y, "y changed");
SetStateFromItemsAction action = new SetStateFromItemsAction();
......@@ -64,7 +62,7 @@ public class Main {
Lock abortLock = new ReentrantLock();
Condition abortCondition = abortLock.newCondition();
Thread readFromOpenHABThread = new Thread(() -> {
try (MQTTUpdater updater = new MQTTUpdater(model)) {
try (MQTTUpdater updater = new MQTTUpdater(root)) {
updater.start();
if (!updater.waitUntilReady(3, TimeUnit.SECONDS)) {
logger.error("openHAB reader not ready. Aborting.");
......@@ -84,7 +82,7 @@ public class Main {
}
});
if (USE_READ_FROM_OPENHAB || SEND_TO_OPENHAB) {
model.getMqttRoot().setHostByName(MQTT_HOST);
root.getMqttRoot().setHostByName(MQTT_HOST);
}
if (USE_READ_FROM_OPENHAB) {
readFromOpenHABThread.start();
......@@ -124,7 +122,7 @@ public class Main {
}
// 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();
// 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