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

Fix Learner bugs.

- Let ExternalMachineLearningModel.check() return true instead of throwing an exception
- In Learner, use temporary files to store encog model
- In MachineLearningImpl, do not use result for now (as newData won't work at the moment)
- Minor fixes for base (add logger, add correct input to jastadd gradle task)
parent d3fefce4
Branches
No related tags found
No related merge requests found
...@@ -118,6 +118,7 @@ task copyRagdoc(type: Copy, dependsOn: cleanRagdoc) { ...@@ -118,6 +118,7 @@ task copyRagdoc(type: Copy, dependsOn: cleanRagdoc) {
} }
generateAst.dependsOn preprocess generateAst.dependsOn preprocess
generateAst.inputs.files file("./src/main/jastadd/mainGen.ast"), file("./src/main/jastadd/mainGen.jadd")
//compileJava.dependsOn jastadd //compileJava.dependsOn jastadd
// //
//// always run jastadd //// always run jastadd
......
aspect Logging { aspect Logging {
// Base
protected org.apache.logging.log4j.Logger Item.logger = org.apache.logging.log4j.LogManager.getLogger(Item.class); protected org.apache.logging.log4j.Logger Item.logger = org.apache.logging.log4j.LogManager.getLogger(Item.class);
protected org.apache.logging.log4j.Logger ItemPreference.logger = org.apache.logging.log4j.LogManager.getLogger(ItemPreference.class); protected org.apache.logging.log4j.Logger ItemPreference.logger = org.apache.logging.log4j.LogManager.getLogger(ItemPreference.class);
protected org.apache.logging.log4j.Logger Neuron.logger = org.apache.logging.log4j.LogManager.getLogger(Neuron.class);
// MachineLearning
private org.apache.logging.log4j.Logger DummyMachineLearningModel.logger = org.apache.logging.log4j.LogManager.getLogger(DummyMachineLearningModel.class); private org.apache.logging.log4j.Logger DummyMachineLearningModel.logger = org.apache.logging.log4j.LogManager.getLogger(DummyMachineLearningModel.class);
private org.apache.logging.log4j.Logger Rule.logger = org.apache.logging.log4j.LogManager.getLogger(Rule.class); private org.apache.logging.log4j.Logger InternalMachineLearningModel.logger = org.apache.logging.log4j.LogManager.getLogger(InternalMachineLearningModel.class);
private org.apache.logging.log4j.Logger MqttRoot.logger = org.apache.logging.log4j.LogManager.getLogger(MqttRoot.class); private org.apache.logging.log4j.Logger ExternalMachineLearningModel.logger = org.apache.logging.log4j.LogManager.getLogger(ExternalMachineLearningModel.class);
private org.apache.logging.log4j.Logger InternalMachineLearningModel.logger = org.apache.logging.log4j.LogManager.getLogger(MachineLearningModel.class);
// NeuralNetwork
private org.apache.logging.log4j.Logger NeuralNetworkRoot.logger = org.apache.logging.log4j.LogManager.getLogger(NeuralNetworkRoot.class); private org.apache.logging.log4j.Logger NeuralNetworkRoot.logger = org.apache.logging.log4j.LogManager.getLogger(NeuralNetworkRoot.class);
private org.apache.logging.log4j.Logger OutputLayer.logger = org.apache.logging.log4j.LogManager.getLogger(OutputLayer.class); private org.apache.logging.log4j.Logger OutputLayer.logger = org.apache.logging.log4j.LogManager.getLogger(OutputLayer.class);
protected org.apache.logging.log4j.Logger Neuron.logger = org.apache.logging.log4j.LogManager.getLogger(Neuron.class);
// Rules
private org.apache.logging.log4j.Logger Rule.logger = org.apache.logging.log4j.LogManager.getLogger(Rule.class);
// MQTT
private org.apache.logging.log4j.Logger MqttRoot.logger = org.apache.logging.log4j.LogManager.getLogger(MqttRoot.class);
} }
...@@ -112,7 +112,8 @@ aspect MachineLearning { ...@@ -112,7 +112,8 @@ aspect MachineLearning {
@Override @Override
public boolean ExternalMachineLearningModel.check() { public boolean ExternalMachineLearningModel.check() {
throw new UnsupportedOperationException("check not available for external ML models (yet)!"); logger.warn("check not available for external ML models (yet)!");
return true;
} }
//--- mlKind --- //--- mlKind ---
......
...@@ -7,7 +7,6 @@ import de.tudresden.inf.st.eraser.feedbackloop.analyze.AnalyzeImpl; ...@@ -7,7 +7,6 @@ import de.tudresden.inf.st.eraser.feedbackloop.analyze.AnalyzeImpl;
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.Execute; import de.tudresden.inf.st.eraser.feedbackloop.api.Execute;
import de.tudresden.inf.st.eraser.feedbackloop.api.Plan; import de.tudresden.inf.st.eraser.feedbackloop.api.Plan;
import de.tudresden.inf.st.eraser.feedbackloop.api.EncogModel;
import de.tudresden.inf.st.eraser.feedbackloop.execute.ExecuteImpl; import de.tudresden.inf.st.eraser.feedbackloop.execute.ExecuteImpl;
import de.tudresden.inf.st.eraser.feedbackloop.learner_backup.Learner; import de.tudresden.inf.st.eraser.feedbackloop.learner_backup.Learner;
import de.tudresden.inf.st.eraser.feedbackloop.learner_backup.MachineLearningImpl; import de.tudresden.inf.st.eraser.feedbackloop.learner_backup.MachineLearningImpl;
...@@ -16,7 +15,6 @@ import de.tudresden.inf.st.eraser.jastadd.model.*; ...@@ -16,7 +15,6 @@ import de.tudresden.inf.st.eraser.jastadd.model.*;
import de.tudresden.inf.st.eraser.openhab2.OpenHab2Importer; import de.tudresden.inf.st.eraser.openhab2.OpenHab2Importer;
import de.tudresden.inf.st.eraser.openhab2.mqtt.MQTTUpdater; import de.tudresden.inf.st.eraser.openhab2.mqtt.MQTTUpdater;
import de.tudresden.inf.st.eraser.spark.Application; import de.tudresden.inf.st.eraser.spark.Application;
import de.tudresden.inf.st.eraser.util.JavaUtils;
import de.tudresden.inf.st.eraser.util.ParserUtils; import de.tudresden.inf.st.eraser.util.ParserUtils;
import net.sourceforge.argparse4j.ArgumentParsers; import net.sourceforge.argparse4j.ArgumentParsers;
import net.sourceforge.argparse4j.annotation.Arg; import net.sourceforge.argparse4j.annotation.Arg;
...@@ -27,10 +25,8 @@ import org.apache.logging.log4j.Logger; ...@@ -27,10 +25,8 @@ import org.apache.logging.log4j.Logger;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.util.Collections;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
...@@ -124,7 +120,7 @@ public class EraserStarter { ...@@ -124,7 +120,7 @@ public class EraserStarter {
MachineLearningImpl handler = new MachineLearningImpl(learner, MachineLearningImpl.GOAL_ACTIVITY_PHONE_AND_WATCH); MachineLearningImpl handler = new MachineLearningImpl(learner, MachineLearningImpl.GOAL_ACTIVITY_PHONE_AND_WATCH);
handler.setKnowledgeBaseRoot(root); handler.setKnowledgeBaseRoot(root);
logger.info("Reading activity recognition from csv file {}", settings.activity.file); logger.info("Reading activity recognition from csv file {}", settings.activity.file);
handler.initActivities(settings.activity.realURL().toString()); handler.initActivities(settings.activity.realURL().getFile());
ExternalMachineLearningModel machineLearningModel = new ExternalMachineLearningModel(); ExternalMachineLearningModel machineLearningModel = new ExternalMachineLearningModel();
machineLearningModel.setEncoder(handler); machineLearningModel.setEncoder(handler);
machineLearningModel.setDecoder(handler); machineLearningModel.setDecoder(handler);
...@@ -139,7 +135,7 @@ public class EraserStarter { ...@@ -139,7 +135,7 @@ public class EraserStarter {
logger.info("Reading preference learning from csv file {}", settings.preference.file); logger.info("Reading preference learning from csv file {}", settings.preference.file);
MachineLearningImpl handler = new MachineLearningImpl(learner, MachineLearningImpl.GOAL_PREFERENCE_BRIGHTNESS_IRIS); MachineLearningImpl handler = new MachineLearningImpl(learner, MachineLearningImpl.GOAL_PREFERENCE_BRIGHTNESS_IRIS);
handler.setKnowledgeBaseRoot(root); handler.setKnowledgeBaseRoot(root);
handler.initPreferences(settings.preference.realURL().toString()); handler.initPreferences(settings.preference.realURL().getFile());
ExternalMachineLearningModel machineLearningModel = new ExternalMachineLearningModel(); ExternalMachineLearningModel machineLearningModel = new ExternalMachineLearningModel();
machineLearningModel.setEncoder(handler); machineLearningModel.setEncoder(handler);
machineLearningModel.setDecoder(handler); machineLearningModel.setDecoder(handler);
......
...@@ -32,7 +32,7 @@ class Setting { ...@@ -32,7 +32,7 @@ class Setting {
URL realURL() { URL realURL() {
if (external) { if (external) {
try { try {
return Paths.get(file).toUri().toURL(); return Paths.get(file).toUri().normalize().toURL();
} catch (MalformedURLException e) { } catch (MalformedURLException e) {
logger.catching(e); logger.catching(e);
return null; return null;
......
...@@ -26,6 +26,7 @@ load: ...@@ -26,6 +26,7 @@ load:
activity: activity:
# File to read in. Expected format = csv # File to read in. Expected format = csv
file: datasets/backup/activity_data.csv file: datasets/backup/activity_data.csv
external: true
# Use dummy model in which the current activity is directly editable. Default: false. # Use dummy model in which the current activity is directly editable. Default: false.
dummy: true dummy: true
# Model id. Default: 1. # Model id. Default: 1.
...@@ -34,7 +35,8 @@ activity: ...@@ -34,7 +35,8 @@ 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:
# File to read in. Expected format = csv # File to read in. Expected format = csv
file: datasets/backup/preference_data.csv file: ../datasets/backup/preference_data.csv
external: true
# Use dummy model in which the current activity is directly editable. Default: false. # Use dummy model in which the current activity is directly editable. Default: false.
dummy: false dummy: false
# Model id. Default: 1. # Model id. Default: 1.
......
package de.tudresden.inf.st.eraser.feedbackloop.learner_backup; package de.tudresden.inf.st.eraser.feedbackloop.learner_backup;
import java.io.File; import java.io.File;
import java.io.IOException;
//import com.sun.javafx.tools.packager.Log; //import com.sun.javafx.tools.packager.Log;
import org.encog.ConsoleStatusReportable; import org.encog.ConsoleStatusReportable;
import org.encog.Encog; import org.encog.Encog;
...@@ -26,8 +27,8 @@ public class Learner { ...@@ -26,8 +27,8 @@ public class Learner {
* */ * */
private String csv_url_activity; private String csv_url_activity;
private String csv_url_preference; private String csv_url_preference;
private String save_activity_model_file = "datasets/backup/activity_model.eg"; private File save_activity_model_file;
private String save_preference_model_file = "datasets/backup/preference_model.eg"; private File save_preference_model_file;
private File csv_file; private File csv_file;
private VersatileDataSource a_souce; private VersatileDataSource a_souce;
private VersatileMLDataSet a_data; private VersatileMLDataSet a_data;
...@@ -43,6 +44,22 @@ public class Learner { ...@@ -43,6 +44,22 @@ public class Learner {
private String[] preference_result; private String[] preference_result;
private String activity_result; private String activity_result;
public Learner() {
try {
save_activity_model_file = File.createTempFile("activity_model", "eg");
} catch (IOException e) {
// use local alternative
save_activity_model_file = new File("activity_model.eq");
}
try {
save_preference_model_file = File.createTempFile("preference_model", "eg");
} catch (IOException e) {
// use local alternative
save_preference_model_file = new File("preference_model.eg");
}
save_activity_model_file.deleteOnExit();
save_preference_model_file.deleteOnExit();
}
private void activityDataAnalyser(String activity_csv_url){ private void activityDataAnalyser(String activity_csv_url){
this.csv_url_activity = activity_csv_url; this.csv_url_activity = activity_csv_url;
...@@ -149,7 +166,7 @@ public class Learner { ...@@ -149,7 +166,7 @@ public class Learner {
public String activity_predictor(String[] new_data){ public String activity_predictor(String[] new_data){
activityDataAnalyser("datasets/backup/activity_data.csv"); activityDataAnalyser("datasets/backup/activity_data.csv");
BasicNetwork activity_method = (BasicNetwork) loadObject(new File(save_activity_model_file)); BasicNetwork activity_method = (BasicNetwork) loadObject(save_activity_model_file);
MLData input = activity_helper.allocateInputVector(); MLData input = activity_helper.allocateInputVector();
System.out.println("input"+activity_helper); System.out.println("input"+activity_helper);
String[] activity_new_data = new String[12]; String[] activity_new_data = new String[12];
...@@ -191,7 +208,7 @@ public class Learner { ...@@ -191,7 +208,7 @@ public class Learner {
public String[] preference_predictor(String[] new_data){ public String[] preference_predictor(String[] new_data){
preference_result = new String[2]; preference_result = new String[2];
preferenceDataAnalyser("datasets/backup/preference_data.csv"); preferenceDataAnalyser("datasets/backup/preference_data.csv");
BasicNetwork preference_method = (BasicNetwork)loadObject(new File(save_preference_model_file)); BasicNetwork preference_method = (BasicNetwork)loadObject(save_preference_model_file);
MLData input = preference_helper.allocateInputVector(); MLData input = preference_helper.allocateInputVector();
// //
// System.out.print("input: "+input); // System.out.print("input: "+input);
...@@ -206,10 +223,11 @@ public class Learner { ...@@ -206,10 +223,11 @@ public class Learner {
preference_result[1] = preference_helper.denormalizeOutputVectorToString(output)[1]; preference_result[1] = preference_helper.denormalizeOutputVectorToString(output)[1];
return preference_result; return preference_result;
} }
private void saveEncogModel(String model_file_url){ private void saveEncogModel(File modelFile){
if (model_file_url.equals(save_activity_model_file)){saveObject(new File(model_file_url), this.a_best_method);} if (modelFile.equals(save_activity_model_file)) {
else { saveObject(modelFile, this.a_best_method);
saveObject(new File(model_file_url), this.p_best_method); } else {
saveObject(modelFile, this.p_best_method);
} }
} }
......
...@@ -135,14 +135,14 @@ public class MachineLearningImpl implements MachineLearningDecoder, MachineLearn ...@@ -135,14 +135,14 @@ public class MachineLearningImpl implements MachineLearningDecoder, MachineLearn
public MachineLearningResult classify() { public MachineLearningResult classify() {
switch (this.goal) { switch (this.goal) {
case GOAL_ACTIVITY_PHONE_AND_WATCH: case GOAL_ACTIVITY_PHONE_AND_WATCH:
String activityStringValue = result[0]; // String activityStringValue = result[0];
Item activityItem = resolve(this.root.getOpenHAB2Model(), "activity"); Item activityItem = resolve(this.root.getOpenHAB2Model(), "activity");
// 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?
logger.debug("Classify would return activity: {}", activityStringValue); // logger.debug("Classify would return activity: {}", activityStringValue);
ItemPreference classifiedActivity = new ItemPreferenceDouble(activityItem, 0); ItemPreference classifiedActivity = new ItemPreferenceDouble(activityItem, 0);
return new MachineLearningResultImpl(classifiedActivity); return new MachineLearningResultImpl(classifiedActivity);
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]
Item iris1 = resolve(this.root.getOpenHAB2Model(), "iris1_item"); Item iris1 = resolve(this.root.getOpenHAB2Model(), "iris1_item");
ItemPreference classifiedPreference = new ItemPreferenceColor(iris1, TupleHSB.of(0, 0, 0)); ItemPreference classifiedPreference = new ItemPreferenceColor(iris1, TupleHSB.of(0, 0, 0));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment