Skip to content
Snippets Groups Projects
Commit 6bba62f9 authored by BBQ's avatar BBQ
Browse files

Merge branch 'dev' of git-st.inf.tu-dresden.de:OpenLicht/eraser into dev

parents 30d19e5c adac26be
No related branches found
No related tags found
1 merge request!19dev to master
Showing
with 170 additions and 189 deletions
...@@ -3,21 +3,21 @@ aspect DecisionTree { ...@@ -3,21 +3,21 @@ aspect DecisionTree {
// let DecisionTreeLeaf implement Leaf // let DecisionTreeLeaf implement Leaf
public class DecisionTreeLeaf implements Leaf { } public class DecisionTreeLeaf implements Leaf { }
//--- classify --- //--- internalClassify ---
syn DecisionTreeLeaf DecisionTreeRoot.classify() { syn DecisionTreeLeaf DecisionTreeRoot.internalClassify() {
return getRootRule().classify(); return getRootRule().internalClassify();
} }
syn DecisionTreeLeaf DecisionTreeElement.classify(); syn DecisionTreeLeaf DecisionTreeElement.internalClassify();
syn DecisionTreeLeaf DecisionTreeRule.classify(); syn DecisionTreeLeaf DecisionTreeRule.internalClassify();
syn DecisionTreeLeaf ItemStateCheckRule.classify() { syn DecisionTreeLeaf ItemStateCheckRule.internalClassify() {
boolean chooseLeft = getItemStateCheck().holds(); boolean chooseLeft = getItemStateCheck().holds();
return (chooseLeft ? getLeft() : getRight()).classify(); return (chooseLeft ? getLeft() : getRight()).internalClassify();
} }
syn DecisionTreeLeaf DecisionTreeLeaf.classify() = this; syn DecisionTreeLeaf DecisionTreeLeaf.internalClassify() = this;
//--- holds --- //--- holds ---
syn boolean ItemStateCheck.holds() = holdsFor(getItem()); syn boolean ItemStateCheck.holds() = holdsFor(getItem());
...@@ -47,19 +47,19 @@ aspect DecisionTree { ...@@ -47,19 +47,19 @@ aspect DecisionTree {
} }
//--- computePreferences --- //--- computePreferences ---
syn List<ItemPreference> DecisionTreeLeaf.computePreferences() { syn MachineLearningResult DecisionTreeLeaf.computePreferences() {
// iterate over preference of this leaf, and all its parents and ancestors // iterate over preference of this leaf, and all its parents and ancestors
List<ItemPreference> result = new ArrayList<>(); MachineLearningResult result = new MachineLearningResult();
Set<Item> seenItems = new HashSet<>(); Set<Item> seenItems = new HashSet<>();
List<DecisionTreeElement> ancestors = ancestors(); List<DecisionTreeElement> ancestors = ancestors();
for (ItemPreference pref : getPreferenceList()) { for (ItemPreference pref : getPreferenceList()) {
result.add(pref); result.addItemPreference(pref);
seenItems.add(pref.getItem()); seenItems.add(pref.getItem());
} }
for (DecisionTreeElement ancestor : ancestors) { for (DecisionTreeElement ancestor : ancestors) {
for (ItemPreference pref : ancestor.getPreferenceList()) { for (ItemPreference pref : ancestor.getPreferenceList()) {
if (!seenItems.contains(pref.getItem())) { if (!seenItems.contains(pref.getItem())) {
result.add(pref); result.addItemPreference(pref);
seenItems.add(pref.getItem()); seenItems.add(pref.getItem());
} }
} }
......
...@@ -401,7 +401,6 @@ aspect ItemHandling { ...@@ -401,7 +401,6 @@ aspect ItemHandling {
//--- ItemPreference.apply --- //--- ItemPreference.apply ---
public abstract void ItemPreference.apply(); public abstract void ItemPreference.apply();
public void ItemPreferenceColor.apply() { public void ItemPreferenceColor.apply() {
logger.debug("Apply color preference {} -> {}", getItem().getID(), getPreferredHSB());
getItem().setStateFromColor(getPreferredHSB()); getItem().setStateFromColor(getPreferredHSB());
getItem().freeze(); getItem().freeze();
for (Item controller : getItem().getControlledByList()) { for (Item controller : getItem().getControlledByList()) {
...@@ -409,8 +408,8 @@ aspect ItemHandling { ...@@ -409,8 +408,8 @@ aspect ItemHandling {
} }
getItem().unfreeze(); getItem().unfreeze();
} }
//--- ItemPreference.apply ---
public void ItemPreferenceDouble.apply() { public void ItemPreferenceDouble.apply() {
logger.debug("Apply double preference {} -> {}", getItem().getID(), getPreferredValue());
getItem().setStateFromDouble(getPreferredValue()); getItem().setStateFromDouble(getPreferredValue());
getItem().freeze(); getItem().freeze();
for (Item controller : getItem().getControlledByList()) { for (Item controller : getItem().getControlledByList()) {
...@@ -419,6 +418,14 @@ aspect ItemHandling { ...@@ -419,6 +418,14 @@ aspect ItemHandling {
getItem().unfreeze(); getItem().unfreeze();
} }
//--- ItemPreference.describe ---
syn String ItemPreference.describe() = getItem().getID() + " -> " + getNewStateAsString();
//--- ItemPreference.getNewStateAsString ---
syn String ItemPreference.getNewStateAsString();
eq ItemPreferenceColor.getNewStateAsString() = getPreferredHSB().toString();
eq ItemPreferenceDouble.getNewStateAsString() = Double.toString(getPreferredValue());
// // override Item.init$Children from JastAdd's own ASTNode aspect // // override Item.init$Children from JastAdd's own ASTNode aspect
// refine ASTNode public void Item.init$Children() { // refine ASTNode public void Item.init$Children() {
// refined(); // refined();
......
...@@ -8,10 +8,10 @@ aspect MachineLearning { ...@@ -8,10 +8,10 @@ aspect MachineLearning {
public interface Leaf { public interface Leaf {
String getLabel(); String getLabel();
int getActivityIdentifier(); int getActivityIdentifier();
List<ItemPreference> computePreferences(); MachineLearningResult computePreferences();
} }
syn Leaf InternalMachineLearningModel.classify(); syn Leaf InternalMachineLearningModel.internalClassify();
//--- currentActivityName --- //--- currentActivityName ---
syn String Root.currentActivityName() = JavaUtils.ifPresentOrElseReturn( syn String Root.currentActivityName() = JavaUtils.ifPresentOrElseReturn(
...@@ -31,8 +31,8 @@ aspect MachineLearning { ...@@ -31,8 +31,8 @@ aspect MachineLearning {
return (int) ((ItemPreferenceDouble) preferences.get(0)).getPreferredValue(); return (int) ((ItemPreferenceDouble) preferences.get(0)).getPreferredValue();
} }
//--- currentPreferences --- // //--- currentPreferences ---
syn List<ItemPreference> Root.currentPreferences() = getMachineLearningRoot().getPreferenceLearning().getDecoder().classify().getPreferences(); // syn List<ItemPreference> Root.currentPreferences() = getMachineLearningRoot().getPreferenceLearning().getDecoder().classify().getItemPreferences();
//--- canSetActivity --- //--- canSetActivity ---
syn boolean MachineLearningModel.canSetActivity() = false; syn boolean MachineLearningModel.canSetActivity() = false;
...@@ -45,7 +45,7 @@ aspect MachineLearning { ...@@ -45,7 +45,7 @@ aspect MachineLearning {
} }
//--- DummyMachineLearningModel.classify --- //--- DummyMachineLearningModel.classify ---
eq DummyMachineLearningModel.classify() { eq DummyMachineLearningModel.internalClassify() {
if (logger.isInfoEnabled() && getItemList().size() > 0) { if (logger.isInfoEnabled() && getItemList().size() > 0) {
logger.info("Dummy classification of {}, values of connected items: {}", logger.info("Dummy classification of {}, values of connected items: {}",
mlKind(), mlKind(),
...@@ -125,6 +125,12 @@ aspect MachineLearning { ...@@ -125,6 +125,12 @@ aspect MachineLearning {
private MachineLearningEncoder ExternalMachineLearningModel.encoder; private MachineLearningEncoder ExternalMachineLearningModel.encoder;
public void ExternalMachineLearningModel.setEncoder(MachineLearningEncoder encoder) { public void ExternalMachineLearningModel.setEncoder(MachineLearningEncoder encoder) {
this.encoder = encoder; this.encoder = encoder;
for (Item relevantItem : encoder.getRelevantItems()) {
addRelevantItem(relevantItem);
}
for (Item targetItem : encoder.getTargets()) {
addTargetItem(targetItem);
}
} }
private MachineLearningDecoder ExternalMachineLearningModel.decoder; private MachineLearningDecoder ExternalMachineLearningModel.decoder;
public void ExternalMachineLearningModel.setDecoder(MachineLearningDecoder decoder) { public void ExternalMachineLearningModel.setDecoder(MachineLearningDecoder decoder) {
...@@ -161,6 +167,43 @@ aspect MachineLearning { ...@@ -161,6 +167,43 @@ aspect MachineLearning {
return this.decoder; return this.decoder;
} }
//--- classify ---
public MachineLearningResult MachineLearningModel.classify() {
MachineLearningResult result = getDecoder().classify();
setLastPreference(result);
return result;
}
//--- equals ---
public boolean MachineLearningResult.equals(Object other) {
if (!(other instanceof MachineLearningResult)) {
return false;
}
MachineLearningResult otherResult = (MachineLearningResult) other;
if (getNumItemPreference() != otherResult.getNumItemPreference()) {
return false;
}
for (int i = 0; i < getNumItemPreference(); i++) {
if (!getItemPreference(i).equals(otherResult.getItemPreference(i))) {
return false;
}
}
return true;
}
public abstract boolean ItemPreference.equals(Object other);
public boolean ItemPreferenceDouble.equals(Object other) {
if (!(other instanceof ItemPreferenceDouble)) {
return false;
}
return getItem() == ((ItemPreferenceDouble) other).getItem() && getPreferredValue() == ((ItemPreferenceDouble) other).getPreferredValue();
}
public boolean ItemPreferenceColor.equals(Object other) {
if (!(other instanceof ItemPreferenceColor)) {
return false;
}
return getItem() == ((ItemPreferenceColor) other).getItem() && getPreferredHSB() == ((ItemPreferenceColor) other).getPreferredHSB();
}
} }
aspect ChangeEvents { aspect ChangeEvents {
...@@ -171,19 +214,30 @@ aspect ChangeEvents { ...@@ -171,19 +214,30 @@ aspect ChangeEvents {
RecognitionEvent result = new RecognitionEvent(); RecognitionEvent result = new RecognitionEvent();
result.initChangeEvent(); result.initChangeEvent();
for (Item relevantItem : modelOfRecognition.getRelevantItems()) { for (Item relevantItem : modelOfRecognition.getRelevantItems()) {
result.addChangedItem(ChangedItem.newFromItem(relevantItem)); result.addRelevantItem(ChangedItem.newFrom(relevantItem));
}
for (ItemPreference preference : modelOfRecognition.getLastPreference().getItemPreferences()) {
result.addChangedItem(ChangedItem.newFrom(preference));
} }
return result; return result;
} }
//--- newFrom Item --- //--- newFrom Item ---
public static ChangedItem ChangedItem.newFromItem(Item source) { public static ChangedItem ChangedItem.newFrom(Item source) {
ChangedItem result = new ChangedItem(); ChangedItem result = new ChangedItem();
result.setItem(source); result.setItem(source);
result.setNewStateAsString(source.getStateAsString()); result.setNewStateAsString(source.getStateAsString());
return result; return result;
} }
//--- newFrom ItemPreference ---
public static ChangedItem ChangedItem.newFrom(ItemPreference update) {
ChangedItem result = new ChangedItem();
result.setItem(update.getItem());
result.setNewStateAsString(update.getNewStateAsString());
return result;
}
//--- initChangeEvent --- //--- initChangeEvent ---
protected void ChangeEvent.initChangeEvent() { protected void ChangeEvent.initChangeEvent() {
this.setCreated(Instant.now()); this.setCreated(Instant.now());
......
...@@ -10,10 +10,11 @@ rel ChangedItem.Item -> Item ; ...@@ -10,10 +10,11 @@ rel ChangedItem.Item -> Item ;
RecognitionEvent : ChangeEvent ; RecognitionEvent : ChangeEvent ;
rel RecognitionEvent.Activity -> Activity ; rel RecognitionEvent.Activity -> Activity ;
rel RecognitionEvent.RelevantItem* -> ChangedItem ;
ManualChangeEvent : ChangeEvent ; ManualChangeEvent : ChangeEvent ;
abstract MachineLearningModel ::= ; abstract MachineLearningModel ::= LastPreference:MachineLearningResult ;
rel MachineLearningModel.RelevantItem* <-> Item.RelevantInMachineLearningModel* ; rel MachineLearningModel.RelevantItem* <-> Item.RelevantInMachineLearningModel* ;
rel MachineLearningModel.TargetItem* <-> Item.TargetInMachineLearningModel* ; rel MachineLearningModel.TargetItem* <-> Item.TargetInMachineLearningModel* ;
...@@ -21,6 +22,8 @@ ExternalMachineLearningModel : MachineLearningModel ; ...@@ -21,6 +22,8 @@ ExternalMachineLearningModel : MachineLearningModel ;
abstract InternalMachineLearningModel : MachineLearningModel ::= <OutputApplication:DoubleDoubleFunction> ; abstract InternalMachineLearningModel : MachineLearningModel ::= <OutputApplication:DoubleDoubleFunction> ;
MachineLearningResult ::= ItemPreference* ;
abstract ItemPreference ::= ; abstract ItemPreference ::= ;
rel ItemPreference.Item -> Item ; rel ItemPreference.Item -> Item ;
......
...@@ -18,17 +18,19 @@ aspect NeuralNetwork { ...@@ -18,17 +18,19 @@ aspect NeuralNetwork {
public int getActivityIdentifier() { public int getActivityIdentifier() {
return (int) number; return (int) number;
} }
public List<ItemPreference> computePreferences() { public MachineLearningResult computePreferences() {
return Collections.singletonList(new ItemPreferenceDouble(affectedItem, number)); MachineLearningResult result = new MachineLearningResult();
result.addItemPreference(new ItemPreferenceDouble(affectedItem, number));
return result;
} }
} }
//--- classify --- //--- internalClassify ---
syn DoubleNumber NeuralNetworkRoot.classify() { syn DoubleNumber NeuralNetworkRoot.internalClassify() {
return getOutputLayer().classify(); return getOutputLayer().internalClassify();
} }
syn DoubleNumber OutputLayer.classify() { syn DoubleNumber OutputLayer.internalClassify() {
double[] inputs = new double[getNumOutputNeuron()]; double[] inputs = new double[getNumOutputNeuron()];
for (int i = 0; i < getNumOutputNeuron(); ++i) { for (int i = 0; i < getNumOutputNeuron(); ++i) {
OutputNeuron n = getOutputNeuron(i); OutputNeuron n = getOutputNeuron(i);
......
...@@ -48,8 +48,7 @@ public class InternalMachineLearningHandler implements MachineLearningEncoder, M ...@@ -48,8 +48,7 @@ public class InternalMachineLearningHandler implements MachineLearningEncoder, M
@Override @Override
public MachineLearningResult classify() { public MachineLearningResult classify() {
List<ItemPreference> preferences = model.classify().computePreferences(); return model.internalClassify().computePreferences();
return new InternalMachineLearningResult(preferences);
} }
@Override @Override
......
package de.tudresden.inf.st.eraser.jastadd.model;
import java.util.List;
/**
* Result of a classification returned by an internally held machine learning model.
*
* @author rschoene - Initial contribution
*/
public class InternalMachineLearningResult implements MachineLearningResult {
private final List<ItemPreference> preferences;
InternalMachineLearningResult(List<ItemPreference> preferences) {
this.preferences = preferences;
}
@Override
public List<ItemPreference> getPreferences() {
return this.preferences;
}
}
package de.tudresden.inf.st.eraser.jastadd.model;
import de.tudresden.inf.st.eraser.jastadd.model.ItemPreference;
import java.util.List;
/**
* Representation of a classification result using a MachineLearningModel.
*
* @author rschoene - Initial contribution
*/
@SuppressWarnings("unused")
public interface MachineLearningResult {
// Object rawClass();
// double rawConfidence();
// can be used for both activity and preferences
/**
* Get the result as a list of item preferences, i.e., new states to be set for those items.
* @return the classification result as item preferences
*/
List<ItemPreference> getPreferences();
}
...@@ -103,8 +103,7 @@ public class MqttReceiver implements AutoCloseable { ...@@ -103,8 +103,7 @@ public class MqttReceiver implements AutoCloseable {
mqtt.setHost(this.host); mqtt.setHost(this.host);
connection = mqtt.callbackConnection(); connection = mqtt.callbackConnection();
AtomicReference<Throwable> error = new AtomicReference<>(); AtomicReference<Throwable> error = new AtomicReference<>();
connection.listener(new Listener() { connection.listener(new ExtendedListener() {
@Override
public void onConnected() { public void onConnected() {
logger.debug("Connected"); logger.debug("Connected");
} }
...@@ -115,12 +114,17 @@ public class MqttReceiver implements AutoCloseable { ...@@ -115,12 +114,17 @@ public class MqttReceiver implements AutoCloseable {
} }
@Override @Override
public void onPublish(UTF8Buffer topicBuffer, Buffer body, Runnable ack) { public void onPublish(UTF8Buffer topic, Buffer body, Callback<Callback<Void>> ack) {
String topicString = topicBuffer.toString(); String topicString = topic.toString();
String message = body.ascii().toString(); String message = body.ascii().toString();
// logger.debug("{}: {}", topicString, message); // logger.debug("{}: {}", topicString, message);
onMessageCallback.accept(topicString, message); onMessageCallback.accept(topicString, message);
ack.run(); // always acknowledge message ack.onSuccess(null); // always acknowledge message
}
@Override
public void onPublish(UTF8Buffer topicBuffer, Buffer body, Runnable ack) {
logger.warn("onPublish should not be called");
} }
@Override @Override
......
...@@ -25,17 +25,17 @@ public class DecisionTreeTest { ...@@ -25,17 +25,17 @@ public class DecisionTreeTest {
dtroot.setRootRule(newRule(isLessThanFour, isFourOrGreater, "check item1", check)); dtroot.setRootRule(newRule(isLessThanFour, isFourOrGreater, "check item1", check));
// current value is four, so return value should be "four or greater" // current value is four, so return value should be "four or greater"
Leaf leaf = dtroot.classify(); Leaf leaf = dtroot.internalClassify();
Assert.assertEquals(isFourOrGreater, leaf); Assert.assertEquals(isFourOrGreater, leaf);
// change value to 5, so return value should still be "four or greater" // change value to 5, so return value should still be "four or greater"
mai.item.setState(5); mai.item.setState(5);
leaf = dtroot.classify(); leaf = dtroot.internalClassify();
Assert.assertEquals(isFourOrGreater, leaf); Assert.assertEquals(isFourOrGreater, leaf);
// change value to 2, so return value should now be "less than four" // change value to 2, so return value should now be "less than four"
mai.item.setState(2); mai.item.setState(2);
leaf = dtroot.classify(); leaf = dtroot.internalClassify();
Assert.assertEquals(isLessThanFour, leaf); Assert.assertEquals(isLessThanFour, leaf);
} }
...@@ -64,17 +64,17 @@ public class DecisionTreeTest { ...@@ -64,17 +64,17 @@ public class DecisionTreeTest {
dtroot.setRootRule(newRule(rule25, rule75, "50-item1", check50)); dtroot.setRootRule(newRule(rule25, rule75, "50-item1", check50));
// current value is 20, so return value should be "less than 25" // current value is 20, so return value should be "less than 25"
Leaf leaf = dtroot.classify(); Leaf leaf = dtroot.internalClassify();
Assert.assertEquals(isLessThan25, leaf); Assert.assertEquals(isLessThan25, leaf);
// change value to 25, so return value should still be "25 or greater" // change value to 25, so return value should still be "25 or greater"
mai.item.setState(25); mai.item.setState(25);
leaf = dtroot.classify(); leaf = dtroot.internalClassify();
Assert.assertEquals(is25OrGreater, leaf); Assert.assertEquals(is25OrGreater, leaf);
// change value to 100, so return value should now be "greater than 75" // change value to 100, so return value should now be "greater than 75"
mai.item.setState(100); mai.item.setState(100);
leaf = dtroot.classify(); leaf = dtroot.internalClassify();
Assert.assertEquals(is75OrGreater, leaf); Assert.assertEquals(is75OrGreater, leaf);
} }
...@@ -139,7 +139,7 @@ public class DecisionTreeTest { ...@@ -139,7 +139,7 @@ public class DecisionTreeTest {
for (TestResult result : testResults) { for (TestResult result : testResults) {
mai.item.setState(Math.round(result.value)); mai.item.setState(Math.round(result.value));
Leaf leaf = dtroot.classify(); Leaf leaf = dtroot.internalClassify();
Assert.assertEquals(result.chooseLeft ? leaf : right, leaf); Assert.assertEquals(result.chooseLeft ? leaf : right, leaf);
} }
} }
......
...@@ -50,17 +50,17 @@ public class NeuralNetworkTest { ...@@ -50,17 +50,17 @@ public class NeuralNetworkTest {
neuralNetworkRoot.setOutputLayer(outputLayer); neuralNetworkRoot.setOutputLayer(outputLayer);
// Current value is 1, so return value is 1 * 4 * 0.6 = 2.4, 1 * 4 * 0.4 = 1.6, both are less than 4. so 0. // Current value is 1, so return value is 1 * 4 * 0.6 = 2.4, 1 * 4 * 0.4 = 1.6, both are less than 4. so 0.
Leaf leaf = neuralNetworkRoot.classify(); Leaf leaf = neuralNetworkRoot.internalClassify();
assertLeafEqual(0, leaf); assertLeafEqual(0, leaf);
// Current value is 2, so return value is 2 * 4 * 0.6 = 4.8, 2 * 4 * 0.4 = 3.2, first is less than 4. so 1. // Current value is 2, so return value is 2 * 4 * 0.6 = 4.8, 2 * 4 * 0.4 = 3.2, first is less than 4. so 1.
mai.item.setState(2); mai.item.setState(2);
leaf = neuralNetworkRoot.classify(); leaf = neuralNetworkRoot.internalClassify();
assertLeafEqual(1, leaf); assertLeafEqual(1, leaf);
// Current value is 5, so return value is 5 * 4 * 0.6 = 12, 5 * 4 * 0.4 = 8, both are greater than 4. so 3. // Current value is 5, so return value is 5 * 4 * 0.6 = 12, 5 * 4 * 0.4 = 8, both are greater than 4. so 3.
mai.item.setState(5); mai.item.setState(5);
leaf = neuralNetworkRoot.classify(); leaf = neuralNetworkRoot.internalClassify();
assertLeafEqual(3, leaf); assertLeafEqual(3, leaf);
} }
......
package de.tudresden.inf.st.eraser.starter; package de.tudresden.inf.st.eraser.starter;
import beaver.Parser; import beaver.Parser;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import de.tudresden.inf.st.eraser.feedbackloop.analyze.AnalyzeImpl; import de.tudresden.inf.st.eraser.feedbackloop.analyze.AnalyzeImpl;
...@@ -68,6 +69,7 @@ public class EraserStarter { ...@@ -68,6 +69,7 @@ public class EraserStarter {
System.exit(1); System.exit(1);
} }
ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
File settingsFile = new File(commandLineOptions.configFile); File settingsFile = new File(commandLineOptions.configFile);
Setting settings; Setting settings;
try { try {
...@@ -127,52 +129,6 @@ public class EraserStarter { ...@@ -127,52 +129,6 @@ public class EraserStarter {
machineLearningModel.setEncoder(handler); machineLearningModel.setEncoder(handler);
machineLearningModel.setDecoder(handler); machineLearningModel.setDecoder(handler);
root.getMachineLearningRoot().setActivityRecognition(machineLearningModel); root.getMachineLearningRoot().setActivityRecognition(machineLearningModel);
/**
//Begin the Integration
Item item1=model.resolveItem("m_accel_x").get();
Item item2=model.resolveItem("m_accel_y").get();
Item item3=model.resolveItem("m_accel_z").get();
Item item4=model.resolveItem("m_rotation_x").get();
Item item5=model.resolveItem("m_rotation_y").get();
Item item6=model.resolveItem("m_rotation_z").get();
Item item7=model.resolveItem("w_accel_x").get();
Item item8=model.resolveItem("w_accel_y").get();
Item item9=model.resolveItem("w_accel_z").get();
Item item10=model.resolveItem("w_rotation_x").get();
Item item11=model.resolveItem("w_rotation_y").get();
Item item12=model.resolveItem("w_rotation_z").get();
//0.2717419,8.698134,4.471172,0.043741,0.515962,0.854318,1.8818425,4.9320555,8.145074,0.2374878,-0.032836914,0.3381958,working
item1.setStateFromString("0.2717419");
item2.setStateFromString("8.698134");
item3.setStateFromString("4.471172");
item4.setStateFromString("0.043741");
item5.setStateFromString("0.515962");
item6.setStateFromString("0.854318");
item7.setStateFromString("1.8818425");
item8.setStateFromString("4.9320555");
item9.setStateFromString("8.145074");
item10.setStateFromString("0.2374878");
item11.setStateFromString("-0.032836914");
item12.setStateFromString("0.3381958");
ArrayList<Item> newData=new ArrayList<>();
newData.add(item1);
newData.add(item2);
newData.add(item3);
newData.add(item4);
newData.add(item5);
newData.add(item6);
newData.add(item7);
newData.add(item8);
newData.add(item9);
newData.add(item10);
newData.add(item11);
newData.add(item12);
handler.newData(newData);*/
List<ItemPreference> preference=handler.classify().getPreferences();
for(ItemPreference preference1 : preference){
preference1.apply();
}
} }
// initialize preference learning // initialize preference learning
...@@ -188,23 +144,9 @@ public class EraserStarter { ...@@ -188,23 +144,9 @@ public class EraserStarter {
machineLearningModel.setEncoder(handler); machineLearningModel.setEncoder(handler);
machineLearningModel.setDecoder(handler); machineLearningModel.setDecoder(handler);
root.getMachineLearningRoot().setPreferenceLearning(machineLearningModel); root.getMachineLearningRoot().setPreferenceLearning(machineLearningModel);
//working,medium,240,70
/**Item activity_item = model.resolveItem("activity").get();
String activity=activity_item.getStateAsString();
activity_item.setStateFromString(activity);
Item brightness_item = model.resolveItem("w_brightness").get();
brightness_item.setStateFromString("medium");
ArrayList<Item> newData1 = new ArrayList<>();
newData1.add(activity_item);
newData1.add(brightness_item);
handler.newData(newData1);*/
List<ItemPreference> preference=handler.classify().getPreferences();
for(ItemPreference preference1 : preference){
preference1.apply();
}
} }
machineLearningRoot.getPreferenceLearning().connectItems(settings.preference.items); // machineLearningRoot.getPreferenceLearning().connectItems(settings.preference.items);
if (!machineLearningRoot.getActivityRecognition().check()) { if (!machineLearningRoot.getActivityRecognition().check()) {
logger.fatal("Invalid activity recognition!"); logger.fatal("Invalid activity recognition!");
System.exit(1); System.exit(1);
......
...@@ -6,7 +6,6 @@ import org.apache.logging.log4j.Logger; ...@@ -6,7 +6,6 @@ import org.apache.logging.log4j.Logger;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.List;
/** /**
* Setting bean. * Setting bean.
...@@ -47,10 +46,10 @@ class Setting { ...@@ -47,10 +46,10 @@ class Setting {
public boolean dummy = false; public boolean dummy = false;
/** Model id. Default: 1.*/ /** Model id. Default: 1.*/
public int id = 1; public int id = 1;
/** Items to connect to inputs */ // /** Items to connect to inputs */
public List<String> items; // public List<String> items;
/** Item to change with classification result */ // /** Item to change with classification result */
public String affectedItem; // public String affectedItem;
} }
public class OpenHabContainer { public class OpenHabContainer {
/** The URL from which to import and at which openHAB is running */ /** The URL from which to import and at which openHAB is running */
......
...@@ -31,8 +31,8 @@ activity: ...@@ -31,8 +31,8 @@ activity:
dummy: false dummy: false
# Model id. Default: 1. # Model id. Default: 1.
id: 1 id: 1
# Item to change with classification result # # Item to change with classification result
affectedItem: activity # affectedItem: activity
# Model for preference learning. If dummy is true, then the file parameter is ignored. # Model for preference learning. If dummy is true, then the file parameter is ignored.
preference: preference:
...@@ -43,12 +43,12 @@ preference: ...@@ -43,12 +43,12 @@ preference:
dummy: false dummy: false
# Model id. Default: 1. # Model id. Default: 1.
id: 1 id: 1
# Items to connect to inputs # # Items to connect to inputs
items: # items:
- activity # - activity
- w_brightness # - w_brightness
# Item to change with classification result # # Item to change with classification result
affectedItem: iris1_item # affectedItem: iris1_item
# Initialize the knowledge base by importing data from openHAB. # Initialize the knowledge base by importing data from openHAB.
openhab: openhab:
......
...@@ -3,6 +3,8 @@ package de.tudresden.inf.st.eraser.feedbackloop.analyze; ...@@ -3,6 +3,8 @@ package de.tudresden.inf.st.eraser.feedbackloop.analyze;
import de.tudresden.inf.st.eraser.feedbackloop.api.Analyze; import de.tudresden.inf.st.eraser.feedbackloop.api.Analyze;
import de.tudresden.inf.st.eraser.feedbackloop.api.Plan; import de.tudresden.inf.st.eraser.feedbackloop.api.Plan;
import de.tudresden.inf.st.eraser.jastadd.model.Activity; import de.tudresden.inf.st.eraser.jastadd.model.Activity;
import de.tudresden.inf.st.eraser.jastadd.model.ItemPreference;
import de.tudresden.inf.st.eraser.jastadd.model.MachineLearningResult;
import de.tudresden.inf.st.eraser.jastadd.model.Root; import de.tudresden.inf.st.eraser.jastadd.model.Root;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
...@@ -17,10 +19,12 @@ public class AnalyzeImpl implements Analyze { ...@@ -17,10 +19,12 @@ public class AnalyzeImpl implements Analyze {
private Root knowledgeBase; private Root knowledgeBase;
private Plan plan; private Plan plan;
private Activity mostRecentActivity; private Activity mostRecentActivity;
private MachineLearningResult mostRecentPreferences;
private Logger logger = LogManager.getLogger(AnalyzeImpl.class); private Logger logger = LogManager.getLogger(AnalyzeImpl.class);
public AnalyzeImpl() { public AnalyzeImpl() {
this.mostRecentActivity = null; this.mostRecentActivity = null;
this.mostRecentPreferences = null;
} }
@Override @Override
...@@ -40,17 +44,32 @@ public class AnalyzeImpl implements Analyze { ...@@ -40,17 +44,32 @@ public class AnalyzeImpl implements Analyze {
@Override @Override
public void analyzeLatestChanges() { public void analyzeLatestChanges() {
MachineLearningResult recognitionResult = knowledgeBase.getMachineLearningRoot().getActivityRecognition().getDecoder().classify();
recognitionResult.getItemPreferences().forEach(ItemPreference::apply);
knowledgeBase.currentActivity().ifPresent(activity -> { knowledgeBase.currentActivity().ifPresent(activity -> {
MachineLearningResult newMLResult = knowledgeBase.getMachineLearningRoot().getPreferenceLearning().classify();
// check if activity has changed
if (!activity.equals(mostRecentActivity)) { if (!activity.equals(mostRecentActivity)) {
// new! inform plan! // new! inform plan!
logger.info("Found new activity '{}'", activity.getLabel()); logger.info("Found new activity '{}'", activity.getLabel());
mostRecentActivity = activity; try {
informPlan(activity);
} catch (Exception e) {
logger.catching(e);
}
} else {
// if no change, also check, if preferences have changed
if (!newMLResult.equals(mostRecentPreferences)) {
logger.info("Preferences have changed for same activity '{}'", activity.getLabel());
try { try {
informPlan(activity); informPlan(activity);
} catch (Exception e) { } catch (Exception e) {
logger.catching(e); logger.catching(e);
} }
} }
}
mostRecentActivity = activity;
mostRecentPreferences = newMLResult;
}); });
} }
} }
...@@ -22,7 +22,7 @@ public interface Execute { ...@@ -22,7 +22,7 @@ public interface Execute {
void setKnowledgeBase(Root knowledgeBase); void setKnowledgeBase(Root knowledgeBase);
/** /**
* <b>Deprecated</b>: Use {@link #updateItems(List)} instead. * <b>Deprecated</b>: Use {@link #updateItems(Iterable)} instead.
* @param brightnessAndRgbForItems Map, keys are item names, values are RGB and brightness values * @param brightnessAndRgbForItems Map, keys are item names, values are RGB and brightness values
*/ */
@Deprecated @Deprecated
...@@ -32,5 +32,5 @@ public interface Execute { ...@@ -32,5 +32,5 @@ public interface Execute {
* Updates items according to given preferences * Updates items according to given preferences
* @param preferences tuples containing item and its new HSB value * @param preferences tuples containing item and its new HSB value
*/ */
void updateItems(List<ItemPreference> preferences); void updateItems(Iterable<ItemPreference> preferences);
} }
...@@ -21,7 +21,7 @@ public interface Plan { ...@@ -21,7 +21,7 @@ public interface Plan {
void planToMatchPreferences(Activity activity); void planToMatchPreferences(Activity activity);
default void informExecute(List<ItemPreference> preferences) { default void informExecute(Iterable<ItemPreference> preferences) {
getExecute().updateItems(preferences); getExecute().updateItems(preferences);
} }
} }
...@@ -54,7 +54,7 @@ public class ExecuteImpl implements Execute { ...@@ -54,7 +54,7 @@ public class ExecuteImpl implements Execute {
} }
@Override @Override
public void updateItems(List<ItemPreference> preferences) { public void updateItems(Iterable<ItemPreference> preferences) {
for (ItemPreference preference : preferences) { for (ItemPreference preference : preferences) {
preference.apply(); preference.apply();
} }
......
...@@ -226,7 +226,7 @@ public class Main { ...@@ -226,7 +226,7 @@ public class Main {
List<String> output = new ArrayList<>(); List<String> output = new ArrayList<>();
Function<DoubleNumber, String> leafToString = classification -> Double.toString(classification.number); Function<DoubleNumber, String> leafToString = classification -> Double.toString(classification.number);
Function<NeuralNetworkRoot, DoubleNumber> classify = NeuralNetworkRoot::classify; Function<NeuralNetworkRoot, DoubleNumber> classify = NeuralNetworkRoot::internalClassify;
DoubleNumber classification = classify.apply(nn); DoubleNumber classification = classify.apply(nn);
output.add(leafToString.apply(classification)); output.add(leafToString.apply(classification));
System.out.println(output); System.out.println(output);
......
...@@ -160,21 +160,27 @@ public class MachineLearningImpl implements MachineLearningDecoder, MachineLearn ...@@ -160,21 +160,27 @@ public class MachineLearningImpl implements MachineLearningDecoder, MachineLearn
@Override @Override
public MachineLearningResult classify() { public MachineLearningResult classify() {
MachineLearningResult result = new MachineLearningResult();
switch (this.goal) { switch (this.goal) {
case GOAL_ACTIVITY_PHONE_AND_WATCH: case GOAL_ACTIVITY_PHONE_AND_WATCH:
String activityStringValue = activity_result; String activityStringValue = activity_result;
if (activityStringValue == null) {
return result;
}
Item activityItem = resolve(this.root.getSmartHomeEntityModel(), "activity"); Item activityItem = resolve(this.root.getSmartHomeEntityModel(), "activity");
//activityItem.setStateFromString(activityStringValue); //activityItem.setStateFromString(activityStringValue);
// FIXME how to translate activityStringValue to a number? or should activity item state better be a String? // FIXME how to translate activityStringValue to a number? or should activity item state better be a String?
for (int i=0; i< activites.length;i++){ ItemPreference classifiedActivity = null;
if(activites[i].equals(activityStringValue)){ for (Activity activity : this.root.getMachineLearningRoot().getActivityList()) {
activityItem.setStateFromString(String.valueOf(i)); if (activity.getLabel().equals(activityStringValue)) {
ItemPreference classifiedActivity = new ItemPreferenceDouble(activityItem,i); classifiedActivity = new ItemPreferenceDouble(activityItem, activity.getIdentifier());
return new MachineLearningResultImpl(classifiedActivity);
} }
logger.debug("Classify would return activity: {}", activityStringValue); logger.debug("Classify would return activity: {}", activityStringValue);
} }
if (classifiedActivity != null) {
result.addItemPreference(classifiedActivity);
}
return result;
case GOAL_PREFERENCE_BRIGHTNESS_IRIS: case GOAL_PREFERENCE_BRIGHTNESS_IRIS:
// String[] preference = {result[1], result[2]}; // String[] preference = {result[1], result[2]};
// FIXME what is the meaning of result[1] and result[2] // FIXME what is the meaning of result[1] and result[2]
...@@ -185,11 +191,11 @@ public class MachineLearningImpl implements MachineLearningDecoder, MachineLearn ...@@ -185,11 +191,11 @@ public class MachineLearningImpl implements MachineLearningDecoder, MachineLearn
color = Math.round(Float.valueOf(preference_result[0])); color = Math.round(Float.valueOf(preference_result[0]));
brightness = Math.round(Float.valueOf(preference_result[1])); brightness = Math.round(Float.valueOf(preference_result[1]));
} }
ItemPreference classifiedPreference = new ItemPreferenceColor(iris1, TupleHSB.of(color, 100, brightness)); result.addItemPreference(new ItemPreferenceColor(iris1, TupleHSB.of(color, 100, brightness)));
return new MachineLearningResultImpl(classifiedPreference); return result;
default: default:
logger.error("Unknown goal value ({}) set in classify", this.goal); logger.error("Unknown goal value ({}) set in classify", this.goal);
return new EmptyMachineLearningResult(); return result;
} }
} }
...@@ -202,12 +208,4 @@ public class MachineLearningImpl implements MachineLearningDecoder, MachineLearn ...@@ -202,12 +208,4 @@ public class MachineLearningImpl implements MachineLearningDecoder, MachineLearn
learner.preference_train(filenameOfCsv); learner.preference_train(filenameOfCsv);
} }
class EmptyMachineLearningResult implements MachineLearningResult {
@Override
public List<ItemPreference> getPreferences() {
return Collections.emptyList();
}
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment