diff --git a/.gitignore b/.gitignore index ae5f085df619e4faf11263c8af42121396ec16d9..cddf03602a35709c94e0d191f9fe37af69e5757e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ .gradle/ .idea/ build/dependencyUpdates/ +venv/ +*/out/ +logs/ diff --git a/benchmark/.gitignore b/benchmark/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..54c5c0b024dab04da2a43d4135ed67ed2a670b46 --- /dev/null +++ b/benchmark/.gitignore @@ -0,0 +1,2 @@ +/build/ +logs/ diff --git a/benchmark/build.gradle b/benchmark/build.gradle new file mode 100644 index 0000000000000000000000000000000000000000..dfcc1d42edbaf81885917bd8b31573056ba29dbb --- /dev/null +++ b/benchmark/build.gradle @@ -0,0 +1,36 @@ +apply plugin: 'application' + +dependencies { + compile project(':eraser-base') + compile project(':feedbackloop.learner_backup') + compile project(':datasets') + testImplementation 'junit:junit:4.12' + // https://mvnrepository.com/artifact/org.hamcrest/java-hamcrest + // https://mvnrepository.com/artifact/org.hamcrest/hamcrest-core + testCompile group: 'org.hamcrest', name: 'hamcrest-core', version: '1.3' + implementation group: 'com.opencsv', name: 'opencsv', version: '4.1' + // https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient + compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.0-alpha4' + testCompile group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.11.2' + // https://mvnrepository.com/artifact/org.apache.httpcomponents/fluent-hc + compile group: 'org.apache.httpcomponents', name: 'fluent-hc', version: '4.2.1' + // https://mvnrepository.com/artifact/junit/junit + testCompile group: 'junit', name: 'junit', version: '4.4' + +} + +run { + mainClassName = 'de.tudresden.inf.st.eraser.benchmark.Main' + standardInput = System.in + if (project.hasProperty("appArgs")) { + args Eval.me(appArgs) + } +} + +sourceSets { + main { + java { + srcDir 'src/main/java' + } + } +} diff --git a/benchmark/src/main/java/de/tudresden/inf/st/eraser/benchmark/Benchmark.java b/benchmark/src/main/java/de/tudresden/inf/st/eraser/benchmark/Benchmark.java new file mode 100644 index 0000000000000000000000000000000000000000..2c1d64d5be93238589167e0c474218d3b22a952f --- /dev/null +++ b/benchmark/src/main/java/de/tudresden/inf/st/eraser/benchmark/Benchmark.java @@ -0,0 +1,146 @@ +package de.tudresden.inf.st.eraser.benchmark; + +import com.opencsv.CSVReader; +import org.apache.http.HttpResponse; +import org.apache.http.client.fluent.Request; +import org.apache.http.entity.ContentType; +import org.apache.http.util.EntityUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import java.io.File; +import java.io.FileReader; +import java.util.Arrays; + +public class Benchmark { + + //read every 5 s from csv + //activity CSV + /** + * Col 1: smartphone acceleration x + * Col 2: smartphone acceleration y + * Col 3: smartphone acceleration z + * Col 4: smartphone rotation x + * Col 5: smartphone rotation y + * Col 6: smartphone rotation z + * Col 7: watch acceleration x + * Col 8: watch acceleration y + * Col 9: watch acceleration z + * Col 10: watch rotation x + * Col 11: watch rotation y + * Col 12: watch rotation z/*/ + //preference CSV + /** + * Col 1: Activity + * Col 2: watch brightness range "bright, medium, dimmer, dark"*/ + + private String a_csv_file_path; + private String p_csv_file_path; + private static final Logger logger = LogManager.getLogger(Benchmark.class); + private static final String ERASER_ITEM_URI = "http://localhost:4567/model/items/"; + //TODO ITEM_NAME HAS TO BE DISCUSSED + private static final String[] ACTIVITY_ITEM_NAME = { + "m_accel_x", "m_accel_y", "m_accel_z", "m_rotation_x", + "m_rotation_y", "m_rotation_z", "w_accel_x", "w_accel_y", + "w_accel_z", "w_rotation_x", "w_rotation_y", "w_rotation_z"}; + private static final String[] PREFERENCE_ITEM_NAME = { + "w_brightness" + }; + private static boolean flag2 = true; + //csv_type is activity or preference + Benchmark(String a_csv_file_path, String p_csv_file_path) { + this.a_csv_file_path = a_csv_file_path; + this.p_csv_file_path = p_csv_file_path; + } + + void start(){ + String PREFERENCE_URL = "http://localhost:4567/model/items/iris1_item/state"; + String ACTIVITY_URL = "http://localhost:4567/activity/current"; + int TIME_PERIOD = 5000; + File a_file; + File p_file; + FileReader a_file_reader; + FileReader p_file_reader; + CSVReader a_csv_reader; + CSVReader p_csv_reader; + String[] a_next_record; + String[] p_next_record; + boolean flag1; + a_file=new File(a_csv_file_path); + p_file= new File(p_csv_file_path); + try { + a_file_reader =new FileReader(a_file); + p_file_reader=new FileReader(p_file); + a_csv_reader = new CSVReader(a_file_reader); + p_csv_reader = new CSVReader(p_file_reader); + while ((((a_next_record = a_csv_reader.readNext())!= null) && flag2)){ + try{Thread.sleep(TIME_PERIOD);}catch (InterruptedException e){e.printStackTrace();} + String[] values = Arrays.copyOf(a_next_record,12); + setNewValue(values, ACTIVITY_ITEM_NAME,"activity"); + HttpResponse response= Request.Get(ACTIVITY_URL).execute().returnResponse(); + String status = response.getStatusLine().toString(); + if(status.contains("200")){ + flag1 = true; + logger.info("activity should be (read direct from CSV): " + a_next_record[12]); + logger.info(EntityUtils.toString(response.getEntity())); + logger.info("get activity from web server: response 200 ok"); + }else{ + flag1 = false; + flag2 = false; + logger.info("can not get the activity from the web server"); + } + while((((p_next_record = p_csv_reader.readNext()) != null) && flag1)) { + try{Thread.sleep(TIME_PERIOD);}catch (InterruptedException e){e.printStackTrace();} + String[] values1 = Arrays.copyOf(p_next_record,2); + setNewValue(values1, PREFERENCE_ITEM_NAME,"preference"); + HttpResponse response1= Request.Get(PREFERENCE_URL).execute().returnResponse(); + String status1=response1.getStatusLine().toString(); + if(status1.contains("200")){ + flag2 = true; + logger.info("get the iris1_item preference from web server: response 200 ok, value is: "+EntityUtils.toString(response1.getEntity())); + }else {flag2 = false; + logger.info("can not get the iris1_item from the web server");} + break; + } + } + } + catch (Exception e){ + e.printStackTrace(); + } + } + private void setNewValue(String[] values, String[] name, String file_typ){ + if(file_typ.equals("activity")) + { + int i = 0; + for(String value : values){ + String uri = ERASER_ITEM_URI + name[i] + "/state"; + try { + HttpResponse httpResponse = Request.Put(uri) + .bodyString(value, ContentType.TEXT_PLAIN) + .execute().returnResponse(); + String status=httpResponse.getStatusLine().toString(); + if(status.contains("200")){ + logger.info("put activity input name: "+name[i]+", value: "+value+"to web server: response 200 ok"); + }else{ + logger.info("can not put activity inputs to rest server"); + } + }catch (Exception e){ + e.printStackTrace(); + } + i+=1; + } + }else{ + String uri= ERASER_ITEM_URI + "w_brightness" +"/state"; + try { + HttpResponse httpResponse = Request.Put(uri) + .bodyString(values[1], ContentType.TEXT_PLAIN) + .execute().returnResponse(); + String put_response=httpResponse.getStatusLine().toString(); + if (put_response.contains("200")){logger.info("put w_brightness to web server: response 200 ok");}else{ + logger.info("can not put w_brightness to rest server"); + } + }catch (Exception e){ + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/benchmark/src/main/java/de/tudresden/inf/st/eraser/benchmark/Main.java b/benchmark/src/main/java/de/tudresden/inf/st/eraser/benchmark/Main.java new file mode 100644 index 0000000000000000000000000000000000000000..ac7536cae53749132be31ebe028e5ec0e55c30f4 --- /dev/null +++ b/benchmark/src/main/java/de/tudresden/inf/st/eraser/benchmark/Main.java @@ -0,0 +1,12 @@ +package de.tudresden.inf.st.eraser.benchmark; + +public class Main { + + public static void main(String[] args) { + String A_CSV_FILE_PATH = "../datasets/backup/activity_data.csv"; + String P_CSV_FILE_PATH = "../datasets/backup/preference_data.csv"; + Benchmark benchmark=new Benchmark(A_CSV_FILE_PATH,P_CSV_FILE_PATH); + benchmark.start(); + } +} + diff --git a/feedbackloop.learner_backup/out/production/resources/log4j2.xml b/benchmark/src/main/resources/log4j2.xml similarity index 100% rename from feedbackloop.learner_backup/out/production/resources/log4j2.xml rename to benchmark/src/main/resources/log4j2.xml diff --git a/datasets/.gitignore b/datasets/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..567609b1234a9b8806c5a05da6c866e480aa148d --- /dev/null +++ b/datasets/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/datasets/backup/activity_data.csv b/datasets/backup/activity_data.csv index 12c125ce2bbdc9ec6bb9762f05f6a83c3b863bb0..c32f9706f812e54cc6dc58a1876c806503530d9e 100644 --- a/datasets/backup/activity_data.csv +++ b/datasets/backup/activity_data.csv @@ -1,418 +1,369 @@ -7,20,12,13,2 -7,20,14,40,1 -7,20,14,40,2 -7,21,13,2,2 -7,21,13,2,2 -7,21,14,23,2 -7,21,14,23,2 -7,21,15,41,2 -7,21,16,54,2 -7,21,16,54,2 -7,21,17,45,3 -7,22,12,28,3 -7,22,15,35,2 -7,22,15,35,2 -7,22,18,59,3 -7,22,18,59,3 -7,23,12,32,2 -7,23,12,32,2 -7,23,16,7,2 -7,23,16,7,2 -7,23,16,7,2 -7,23,16,7,2 -7,23,16,7,2 -7,24,12,4,0 -7,24,12,4,0 -7,24,12,4,1 -7,24,14,38,2 -7,24,14,38,2 -7,24,18,54,3 -7,25,12,31,0 -7,25,12,32,1 -7,25,12,32,1 -7,25,15,6,3 -7,25,18,56,3 -7,26,13,41,2 -7,26,19,14,3 -7,27,11,39,2 -7,27,11,39,3 -7,27,11,46,3 -7,27,11,46,2 -7,27,13,8,2 -7,27,13,8,2 -7,27,13,9,2 -7,27,13,45,2 -7,27,13,45,2 -7,27,15,38,3 -7,28,12,12,2 -7,28,12,13,2 -7,28,12,41,2 -7,28,12,41,2 -7,28,12,41,2 -7,28,14,0,1 -7,28,14,0,2 -7,28,15,21,3 -7,28,18,56,3 -7,29,10,9,1 -7,29,10,9,1 -7,29,10,9,1 -7,29,11,54,0 -7,29,11,54,0 -7,29,11,54,0 -7,29,11,54,1 -7,29,14,10,2 -7,29,16,44,2 -7,29,16,44,2 -7,30,16,7,3 -7,30,18,45,3 -7,31,13,2,0 -7,31,13,2,1 -7,31,13,3,1 -7,31,13,3,1 -7,31,13,3,1 -7,31,18,39,3 -8,1,12,22,0 -8,1,12,22,1 -8,1,14,20,2 -8,1,14,20,2 -8,1,14,20,2 -8,1,15,55,3 -8,1,18,31,3 -8,1,18,37,3 -8,1,18,37,3 -8,1,19,2,3 -8,1,19,2,3 -8,1,20,5,3 -8,2,10,9,2 -8,2,10,9,1 -8,2,10,9,2 -8,2,10,9,2 -8,2,13,58,2 -8,2,13,58,2 -8,2,15,44,3 -8,2,15,44,3 -8,2,15,44,3 -8,2,17,21,3 -8,2,17,21,3 -8,2,17,21,3 -8,3,13,31,1 -8,3,13,31,2 -8,3,13,32,2 -8,3,16,43,3 -8,4,13,20,1 -8,4,13,20,2 -8,4,18,27,3 -8,5,13,37,2 -8,5,13,37,2 -8,5,18,33,3 -8,6,11,24,3 -8,6,11,24,3 -8,6,11,24,3 -8,6,13,50,3 -8,7,13,4,2 -8,7,13,4,2 -8,7,14,56,3 -8,8,12,13,2 -8,8,12,13,2 -8,8,15,51,2 -8,8,15,51,2 -8,8,15,51,3 -8,9,13,32,2 -8,9,13,32,2 -8,9,13,32,2 -8,9,15,8,2 -8,9,15,8,2 -8,9,15,8,2 -8,9,16,19,2 -8,10,11,32,0 -8,10,11,32,1 -8,10,11,32,1 -8,10,13,13,1 -8,10,13,13,1 -8,10,13,13,2 -8,10,16,42,3 -8,10,16,42,3 -8,11,14,6,2 -8,11,14,7,2 -8,11,18,54,3 -8,11,18,54,3 -8,11,18,54,3 -8,12,12,27,1 -8,12,12,27,1 -8,12,12,28,1 -8,12,13,53,2 -8,12,13,53,2 -8,12,13,53,2 -8,12,15,21,3 -8,13,13,16,1 -8,13,13,16,1 -8,13,13,16,1 -8,13,14,14,2 -8,13,14,14,2 -8,13,16,11,3 -8,13,17,18,3 -8,14,13,7,1 -8,14,13,7,1 -8,14,13,7,1 -8,14,13,7,1 -8,14,13,7,2 -8,14,13,7,2 -8,14,15,6,3 -8,15,14,5,2 -8,15,14,5,2 -8,15,14,6,2 -8,15,14,6,2 -8,15,16,41,3 -8,15,16,41,3 -8,15,17,30,3 -8,16,13,40,2 -8,16,13,40,2 -8,16,17,52,3 -8,16,17,53,3 -8,17,13,34,1 -8,17,13,35,2 -8,17,14,7,2 -8,17,19,2,3 -8,18,10,21,3 -8,18,11,14,2 -8,18,11,14,2 -8,18,11,14,2 -8,18,11,14,2 -8,18,14,25,2 -8,18,14,25,3 -8,18,14,25,2 -8,18,18,18,3 -8,18,18,19,3 -8,19,18,33,3 -8,19,18,33,3 -8,19,18,33,3 -8,19,18,33,3 -8,20,14,28,2 -8,20,14,28,2 -8,20,14,28,2 -8,20,14,28,2 -8,20,17,8,3 -8,20,18,22,3 -8,21,11,24,1 -8,21,11,24,1 -8,21,11,24,1 -8,21,15,34,3 -8,21,18,55,3 -8,22,12,3,1 -8,22,12,4,2 -8,22,12,4,2 -8,22,13,51,2 -8,22,13,51,2 -8,22,13,51,2 -8,22,18,12,3 -8,22,18,12,3 -8,22,18,12,3 -8,22,18,12,3 -8,22,18,40,3 -8,22,18,40,3 -8,23,13,42,1 -8,23,13,42,1 -8,23,17,32,3 -8,23,19,28,3 -8,23,20,27,3 -8,23,20,27,3 -8,23,21,49,3 -8,24,14,0,2 -8,24,14,0,2 -8,24,14,0,2 -8,24,14,0,2 -8,24,15,4,3 -8,24,15,4,3 -8,24,16,2,3 -8,24,16,3,3 -8,24,16,37,3 -8,24,17,9,3 -8,24,17,14,3 -8,25,13,34,1 -8,25,13,34,1 -8,25,13,34,1 -8,25,13,34,1 -8,25,13,34,1 -8,25,15,1,3 -8,25,17,58,3 -8,26,10,29,0 -8,26,10,29,0 -8,26,10,29,0 -8,26,10,29,0 -8,26,10,29,0 -8,26,16,42,3 -8,26,16,42,3 -8,26,18,41,3 -8,26,18,41,3 -8,27,13,41,2 -8,27,13,41,2 -8,27,13,41,2 -8,27,13,41,2 -8,27,17,42,3 -8,28,11,9,1 -8,28,11,9,1 -8,28,12,14,0 -8,28,12,14,1 -8,28,12,14,0 -8,28,15,3,2 -8,28,15,3,2 -8,28,16,31,3 -8,28,17,40,3 -8,29,14,44,3 -8,29,17,25,3 -8,30,12,5,0 -8,30,12,5,0 -8,30,12,5,0 -8,30,13,32,1 -8,30,13,32,1 -8,30,13,56,2 -8,30,14,23,2 -8,30,14,23,2 -8,30,14,23,2 -8,30,14,23,2 -8,30,14,41,2 -8,30,14,41,2 -8,30,14,41,2 -8,30,15,50,3 -8,30,17,0,3 -8,30,18,59,3 -8,30,18,59,3 -8,31,14,31,2 -8,31,14,31,2 -8,31,14,31,2 -8,31,17,59,3 -8,31,18,0,3 -9,1,16,13,3 -9,1,16,13,3 -9,1,16,13,3 -9,1,17,41,3 -9,2,13,44,1 -9,2,13,44,1 -9,2,13,44,1 -9,2,14,49,2 -9,2,14,49,2 -9,2,14,49,2 -9,2,16,6,3 -9,2,16,6,3 -9,2,17,2,3 -9,3,16,9,3 -9,3,17,35,3 -9,3,17,36,3 -9,4,12,57,1 -9,4,12,57,1 -9,4,15,8,3 -9,4,15,34,3 -9,4,16,26,3 -9,4,16,26,3 -9,4,18,37,3 -9,4,18,37,3 -9,4,18,37,3 -9,6,11,18,0 -9,6,11,18,0 -9,6,12,54,1 -9,6,12,54,1 -9,6,14,21,2 -9,6,14,21,2 -9,6,19,20,3 -9,7,11,50,0 -9,7,14,17,2 -9,7,14,57,3 -9,7,14,57,3 -9,7,16,56,3 -9,7,16,56,3 -9,7,16,56,3 -9,7,16,56,3 -9,7,18,38,3 -9,7,18,38,3 -9,8,11,4,2 -9,8,11,4,2 -9,8,11,13,0 -9,8,11,13,0 -9,8,11,13,0 -9,8,11,13,0 -9,8,11,13,0 -9,8,11,14,0 -9,8,11,14,1 -9,8,11,14,1 -9,8,12,1,0 -9,8,12,1,0 -9,8,12,1,0 -9,8,12,1,0 -9,8,12,1,0 -9,8,12,1,1 -9,8,12,36,0 -9,8,12,36,0 -9,8,12,36,0 -9,8,12,36,0 -9,8,12,36,0 -9,8,13,37,1 -9,8,13,37,1 -9,8,13,37,1 -9,8,14,20,2 -9,8,14,20,2 -9,8,18,20,3 -9,9,12,47,1 -9,9,12,47,2 -9,9,12,47,2 -9,9,19,5,3 -9,10,13,15,1 -9,10,13,15,1 -9,10,13,15,0 -9,10,16,49,3 -9,10,19,6,3 -9,10,21,5,3 -9,11,14,16,2 -9,11,14,16,2 -9,11,14,16,2 -9,11,18,41,3 -9,12,14,43,2 -9,12,14,43,2 -9,12,14,43,2 -9,12,16,14,3 -9,12,17,12,3 -9,12,17,12,2 -9,12,17,12,3 -9,12,17,12,2 -9,12,20,44,3 -9,13,19,52,3 -9,14,14,39,2 -9,14,14,39,2 -9,14,15,14,3 -9,14,17,29,3 -9,14,17,29,3 -9,14,17,29,3 -9,15,11,41,1 -9,15,11,41,1 -9,15,13,4,1 -9,15,14,3,1 -9,15,14,3,2 -9,16,12,36,1 -9,16,12,36,1 -9,16,12,36,1 -9,16,12,36,1 -9,16,12,48,1 -9,16,12,48,1 -9,16,13,51,1 -9,16,13,51,2 -9,16,13,51,1 -9,16,15,13,3 -9,16,15,14,3 -9,16,15,14,3 -9,17,10,27,0 -9,17,10,27,0 -9,17,11,10,0 -9,17,11,10,0 -9,17,11,10,0 -9,17,12,43,1 -9,17,12,43,1 -9,17,12,43,1 -9,17,13,32,1 -9,17,13,32,1 -9,17,14,5,1 -9,17,14,5,2 -9,17,14,6,2 -9,17,15,7,3 -9,17,15,49,3 -9,17,15,49,3 -9,17,18,12,3 -9,17,18,13,3 +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 +0.2813187,8.604761,4.55856,0.041658,0.510887,0.857407,1.8818425,4.9320555,8.145074,0.2374878,-0.032836914,0.3381958,working +0.23822308,8.622718,4.406528,0.03991,0.512086,0.856781,1.8818425,4.9320555,8.145074,0.2374878,-0.032836914,0.3381958,working +0.11731588,8.619126,4.4783545,0.038642,0.513641,0.855887,2.0590134,5.7125654,6.4547677,0.2374878,-0.032836914,0.3381958,working +0.24181437,8.669404,4.486734,0.04219,0.515633,0.854455,2.0829554,4.6112323,7.302315,0.30133057,0.005004883,0.3652954,working +0.19632454,8.66701,4.4556093,0.041381,0.51905,0.852327,0.21547815,-1.0773908,9.294291,0.0087890625,-0.002319336,0.5358887,working +0.23343466,8.623915,4.4328647,0.042787,0.516075,0.853984,0.7757214,3.490746,9.370906,0.10900879,0.048583984,0.53826904,working +0.18555063,8.669404,4.437653,0.043233,0.516444,0.853727,1.1109096,2.1978772,9.299079,0.056274414,0.01751709,0.55133057,working +0.21547815,8.698134,4.4125137,0.043405,0.515751,0.854099,0.36391866,-0.8283938,9.763555,-0.009521484,-0.016784668,0.5675049,working +0.3890578,8.66701,4.4520183,0.039945,0.519914,0.851807,1.1875241,-1.8243817,7.465121,0.04333496,-0.003479004,0.5588989,working +0.12808979,8.670602,4.3634324,0.039883,0.521765,0.850612,1.1875241,-1.8243817,7.465121,0.04333496,-0.003479004,0.5588989,working +0.10654198,8.6574335,4.414908,0.040269,0.516884,0.853285,1.2066777,-1.1444284,9.648633,1.2207031E-4,-0.055358887,0.5834961,working +0.08140286,8.76637,4.1539397,0.039312,0.527554,0.84693,0.44532153,-2.1452048,9.543288,-0.05847168,-0.039367676,0.52716064,working +0.17956513,8.698134,4.1814733,0.041489,0.52054,0.850801,0.6368576,-0.6512229,9.998186,0.034851074,-0.028747559,0.53570557,working +0.02633622,8.651448,4.3873744,0.040486,0.520068,0.850974,1.508347,0.19632454,9.749189,0.08312988,-0.020568848,0.57818604,working +0.010773907,8.610746,4.4963107,0.047136,0.515427,0.852877,0.9720459,-1.3694834,9.696517,-0.0056152344,-0.049438477,0.5576782,working +0.21906945,8.929175,3.6032736,0.047929,0.528586,0.845337,1.043872,-0.59855044,10.160992,0.0053100586,-0.024353027,0.52856445,working +-0.15801731,8.755595,4.423288,0.048114,0.519962,0.849552,1.1923125,-0.08140286,9.849746,0.052856445,-0.003540039,0.5180054,working +0.05865794,8.665813,4.332308,0.045692,0.518734,0.850569,2.5905263,0.90021986,9.873688,0.12976074,-0.029785156,0.532959,working +0.06584055,8.605958,4.477157,0.048499,0.515082,0.852584,2.327164,2.0398598,8.001422,0.20056152,0.003479004,0.48242188,working +0.05865794,8.631097,4.3861775,0.046089,0.516823,0.851908,2.0111294,1.2354081,9.006987,0.16241455,-0.02746582,0.46368408,working +-0.017956512,8.627506,4.4675803,0.047409,0.513421,0.853688,1.1779473,-0.51235914,9.773131,0.057434082,-0.011291504,0.5081787,working +-0.18794483,8.659827,4.4783545,0.041528,0.515836,0.852265,0.9959879,0.7469909,9.672575,0.07373047,-0.002319336,0.5019531,working +-0.027533319,8.591593,4.620809,0.046683,0.510911,0.854784,3.0550013,3.6487634,8.48984,0.25952148,-0.010253906,0.43432617,working +-0.08140286,8.716091,4.332308,0.042494,0.517638,0.85112,1.3455414,-0.49320555,9.89763,0.034423828,-0.038757324,0.4852295,working +-0.22146365,8.836999,4.1036615,0.038773,0.531266,0.842643,2.2266076,3.2369606,8.465898,0.26757812,0.02154541,0.43115234,working +1.0761937,11.745954,2.4648306,0.526819,0.526535,0.468877,-9.270349,-2.4372973,1.0390835,-0.7081909,-0.08135986,0.6744995,walking +-1.8710686,8.711303,-1.5227122,0.54441,0.510167,0.46156,-9.270349,-2.4372973,1.0390835,-0.7081909,-0.08135986,0.6744995,walking +-0.63087213,9.64983,-2.3463178,0.218222,0.734833,0.617411,-11.353305,-1.388637,0.16759412,-0.6591797,-0.101745605,0.7449341,walking +-0.10055647,9.488221,0.008379706,0.520795,-0.531387,-0.481526,-8.963891,-0.51235914,-0.3878607,-0.51483154,-0.0703125,0.83361816,walking +2.2026656,10.09156,-3.4476504,0.512742,-0.552492,-0.477334,-15.552734,-0.7517793,0.48362875,-0.6300659,-0.072631836,0.772522,walking +0.09816227,9.627085,-1.8674773,0.54604,-0.514798,-0.454878,-13.747506,-2.2984335,-2.5139117,-0.34100342,-0.17474365,0.42633057,walking +-0.7781156,8.385692,-3.1112652,0.50674,-0.550405,-0.502163,-10.745177,-2.27928,1.2785037,-0.03930664,-0.30413818,0.26208496,walking +-0.18674773,9.277532,-1.1683705,0.548857,-0.509167,-0.470289,-9.150639,1.6232687,0.16280572,0.030029297,-0.38269043,0.19390869,walking +-0.6823475,10.573992,-2.553416,0.679861,-0.341986,-0.292999,-7.52737,-2.1452048,0.9672575,0.3192749,-0.3623047,0.18859863,walking +-0.2765303,11.451467,-0.30645782,0.563436,0.508963,0.451556,-8.384495,-0.80924016,-0.7134721,0.16137695,-0.67700195,0.019042969,walking +1.2916719,9.548077,-1.3000516,0.51573,0.538749,0.509015,-7.28795,-1.0630256,0.23463176,0.26348877,-0.6868286,-0.1529541,walking +0.8379706,10.741586,0.45489833,0.54087,0.51788,0.4762,-9.370906,-0.48362875,1.7286136,0.18725586,-0.7562256,-0.11633301,walking +0.59495914,9.346964,-1.6639702,0.502446,0.561492,0.502803,-9.605537,-2.5905263,0.05746084,0.13793945,-0.74884033,-0.1798706,walking +0.93014735,10.562021,-0.16519992,0.523761,0.542328,0.462923,-9.481039,-2.4277205,-0.7230489,0.42114258,-0.3991089,-0.73480225,walking +0.08738836,9.709685,-1.5191209,0.562041,0.534199,0.433607,-12.689269,-1.6472107,0.34476504,0.7036743,0.074035645,-0.63220215,walking +0.18076223,9.118318,-1.3084313,0.254447,-0.716063,-0.601747,-8.485051,-2.4133554,-1.3599066,0.15490723,0.4364624,-0.1907959,walking +-0.18435353,9.961076,-1.3263878,0.261971,-0.708253,-0.606287,-10.0508585,-1.0199299,0.8331822,0.113220215,0.6170654,-0.04260254,walking +-0.688333,8.623915,-0.7649474,0.467896,-0.599728,-0.506172,-6.7803793,-0.521936,0.2681506,-0.20965576,0.58239746,-0.020568848,walking +-0.22744916,9.506178,-1.1575965,0.49718,-0.585651,-0.491387,-9.394848,-2.0494366,-0.33997664,-0.18896484,0.69592285,0.20074463,walking +-1.1348516,10.6877165,-0.9516952,0.519502,-0.571514,-0.466647,-8.714894,-0.7278373,-0.8810662,-0.18896484,0.69592285,0.20074463,walking +0.8882488,10.172963,-0.6715736,0.52846,-0.55123,-0.467232,-9.56723,-0.80445176,-0.4357447,-0.22363281,0.6533203,0.2144165,walking +-0.8511387,8.486248,-1.1384429,0.491758,-0.577708,-0.488183,-11.305421,-4.060566,-1.0055647,-0.18109131,0.64508057,0.1262207,walking +0.023942016,11.11987,1.3946224,0.51358,-0.536144,-0.482607,3.8546648,5.104438,6.799533,0.1015625,-0.27069092,-0.4434204,walking +-0.5470751,9.082404,-1.6232687,0.42116,-0.616129,-0.547717,-8.441956,-1.6424223,0.320823,-0.20501709,0.6883545,0.33581543,walking +-1.4808137,9.829395,-4.5178585,0.00118,0.776792,0.629414,-9.768343,-3.2609026,0.272939,-0.20495605,0.69610596,0.3265381,walking +-1.4257472,9.561244,-0.8643068,0.450442,0.612177,0.47736,-9.768343,-3.2609026,0.272939,-0.20495605,0.69610596,0.3265381,walking +-1.5466543,11.438298,-2.468422,0.496624,0.573871,0.452744,-9.768343,-3.2609026,0.272939,-0.20495605,0.69610596,0.3265381,walking +-2.6252422,8.619126,-2.7030537,0.552147,0.5078,0.450302,-8.1881695,-1.2641385,0.038307227,-0.34222412,0.49102783,-0.016540527,walking +-0.21308395,9.40203,-2.1691468,0.599439,0.476026,0.396271,-6.339846,-1.3503298,-0.033518825,-0.35205078,0.44171143,-0.16430664,walking +-0.08140286,8.789114,-2.3690627,0.593409,0.464892,0.410283,-8.432379,-4.2999864,1.4700398,-0.24761963,0.57470703,0.45324707,walking +-0.8559271,9.961076,-0.90021986,0.555447,0.518125,0.43304,-9.509769,-2.006341,-2.1499932,0.13470459,0.65411377,0.0036010742,walking +-0.2801216,8.352173,-0.33638534,0.558818,0.514925,0.445665,-7.8290396,-3.596091,-0.79008657,0.16339111,0.60461426,-0.7661743,walking +-0.08738836,9.898827,-1.9524715,0.508351,0.559775,0.486663,-10.352529,-2.0590134,0.22505496,0.59747314,0.28381348,-0.71154785,walking +2.1930888,7.1550717,-3.1411927,0.192016,0.739159,0.626426,-8.556877,-1.412579,0.78529817,0.6008911,0.26306152,-0.72491455,walking +-0.92895025,11.055226,-0.23822308,0.493986,-0.554274,-0.504623,-13.939042,-2.0590134,1.3934253,0.64434814,0.144104,-0.7451172,walking +0.21188685,8.973468,-1.0235212,0.550447,-0.505433,-0.448153,-13.024457,-2.873042,1.1875241,0.5584717,0.3137207,-0.7282715,walking +-0.24779987,12.925097,-3.788824,0.53726,-0.52702,-0.453356,-11.741165,-2.5570073,1.3982137,0.6694946,0.21734619,-0.6765747,walking +-2.1547816,13.4183035,-6.009446,0.323083,-0.661886,-0.619246,-8.001422,-2.4995465,1.6376339,0.4973755,0.46984863,-0.6560669,walking +-1.2593501,8.961497,-1.7465701,0.196693,-0.740158,-0.62706,-12.808979,-2.5761611,0.10055647,0.5979004,0.381958,-0.6482544,walking +-0.1328782,9.147048,-2.9053638,0.022181,0.777414,0.627034,-7.6710224,-1.5753847,-0.320823,0.4567871,0.2935791,-0.8391113,walking +0.7338228,9.568427,-6.634333,0.393491,0.730379,0.484185,-11.674128,0.17238252,1.7142484,0.7868042,0.18414307,-0.5524292,walking +-1.9716251,8.117541,-4.0761285,0.469076,0.718339,0.409424,-11.674128,0.17238252,1.7142484,0.7868042,0.18414307,-0.5524292,walking +0.32561144,9.016563,3.6092591,-0.018518,-0.561261,-0.827409,-12.650962,-2.0111294,0.5746084,0.78063965,0.17840576,-0.39233398,walking +0.090979666,9.075222,3.503914,0.010144,0.564181,0.825586,-8.2169,-0.18195933,0.24899697,0.74591064,0.1239624,-0.62054443,walking +0.19991584,9.054871,3.7086184,-0.012561,-0.560571,-0.82801,-9.385271,-4.0462008,-1.5562311,0.256958,0.36480713,-0.27624512,walking +0.21667525,9.060856,3.6415808,0.012755,0.558465,0.829429,-9.710882,-0.7757214,3.6870706,0.14190674,0.45703125,-0.21124268,walking +0.22744916,9.060856,3.645172,0.012841,0.558664,0.829293,-10.529699,-3.1316159,-0.272939,-0.29626465,0.49450684,0.17242432,walking +0.19512744,9.060856,3.6140475,0.01255,0.557529,0.830062,-9.509769,-0.8283938,0.9959879,-0.1918335,0.40795898,-0.080078125,walking +0.1328782,9.076419,3.5685577,-0.010446,-0.561843,-0.827177,-9.572019,-2.4947581,-1.6136919,0.13330078,0.41436768,-0.2218628,walking +-1.5095441,11.198878,-1.8387469,0.261779,-0.680799,-0.637011,-1.958457,-0.10055647,4.4675803,-0.04296875,-0.19110107,-0.9154053,dancing +-0.05267244,-5.6156,2.4037786,0.352709,-0.731645,-0.528224,18.703505,12.378023,14.5088625,-0.5602417,-0.23596191,-0.7937622,dancing +0.07062895,-1.5753847,-0.81761986,0.339088,-0.677723,-0.589453,18.703505,12.378023,14.5088625,-0.5602417,-0.23596191,-0.7937622,dancing +2.2732944,3.4225113,-2.6755204,0.118016,0.877354,0.45141,-12.794614,11.975797,11.530476,-0.47833252,-0.43554688,-0.7303467,dancing +-4.5561657,13.062764,-2.8646624,0.381358,-0.792455,-0.433683,-12.794614,11.975797,11.530476,-0.371521,-0.3826294,-0.53393555,dancing +4.5980644,-4.882974,2.19668,0.276273,-0.733631,-0.604661,-12.794614,11.975797,11.530476,-0.371521,-0.3826294,-0.53393555,dancing +-1.8016368,11.6442,-5.7664347,0.219061,-0.663912,-0.707763,-1.8626889,-9.198523,-16.357185,-0.7172241,-0.3291626,-0.37512207,dancing +-1.7992426,27.91759,-1.6220716,-0.082716,0.809359,0.578657,-3.1411927,-0.93373865,-0.31124622,-0.35992432,0.33746338,-0.79608154,dancing +0.5793968,1.2126632,-4.6244006,-0.030779,0.801127,0.590978,-3.1411927,-0.93373865,-0.31124622,-0.35992432,0.33746338,-0.79608154,dancing +0.48123455,35.582626,-8.6299,0.514118,0.515082,0.556824,1.2880806,3.8355112,2.3894134,-0.4446411,-0.15338135,-0.85528564,dancing +3.2692823,-1.8004397,-0.7769185,0.514916,0.374323,0.534814,-2.9400797,-4.3047748,-3.7732618,-0.40649414,-0.029296875,-0.8713379,dancing +2.4863784,-4.0258503,0.1352724,0.543841,-0.486144,-0.546646,-12.861651,-5.33907,-3.265691,-0.34906006,0.54486084,-0.69177246,dancing +0.39145198,8.514978,-7.3430166,0.520221,-0.546999,-0.566261,-10.213664,-8.327033,1.3072342,-0.07220459,0.12145996,-0.6904297,dancing +-4.309563,26.964697,-0.6811504,0.555781,-0.51674,-0.545712,-7.431602,3.940856,14.346057,-0.18426514,0.19262695,-0.8668823,dancing +-5.368997,26.76957,-7.6746135,0.573843,-0.547145,-0.523433,-12.871228,-8.714894,10.793061,-0.087768555,0.31750488,-0.8586426,dancing +-3.2513258,10.072407,-9.166202,0.561235,-0.526834,-0.535287,-7.393295,-1.9249382,-6.129156,-0.55218506,0.30267334,-0.60998535,dancing +-1.0989386,8.825027,-1.2078748,0.494579,-0.582964,-0.569548,-7.393295,-1.9249382,-6.129156,-0.55218506,0.30267334,-0.60998535,dancing +-1.4999673,9.7803135,-5.5521536,0.461249,-0.606122,-0.597372,-7.393295,-1.9249382,-6.129156,-0.55218506,0.30267334,-0.60998535,dancing +-4.3993454,13.245921,-4.8722005,0.505116,-0.582591,-0.566936,-8.111555,-4.3718123,-3.0789435,-0.10809326,0.3184204,-0.6734009,dancing +-2.7748797,12.2080345,-7.835025,0.412957,-0.585669,-0.636403,-8.111555,-4.3718123,-3.0789435,-0.10809326,0.3184204,-0.6734009,dancing +-0.9995792,16.71871,-6.7013707,0.363318,-0.656258,-0.61907,-8.111555,-4.3718123,-3.0789435,-0.10809326,0.3184204,-0.6734009,dancing +-6.169858,26.574442,-2.6120741,0.446443,0.638707,0.565161,-25.617958,-7.728483,6.229713,-0.18395996,0.6801758,0.0079956055,dancing +3.4823663,-2.4756045,-2.802413,0.631561,0.453375,0.3784,5.9807158,-0.56982,6.612785,-0.5132446,0.11016846,-0.84606934,dancing +0.19632454,-0.35913026,1.483208,0.637244,0.476061,0.351114,-2.7341783,1.8435353,-4.3526587,-0.50219727,0.082214355,-0.8566284,dancing +3.6008794,5.6778493,-4.009091,0.637278,0.483459,0.382699,-13.038822,-9.873688,3.86903,-0.30413818,0.54803467,-0.48510742,dancing +2.6862943,2.0003555,-2.4121583,0.420848,-0.549301,-0.628842,5.559336,-8.508993,7.0581064,0.47381592,0.25909424,-0.46484375,dancing +-0.12449849,25.859772,-6.409278,0.444236,0.699106,0.454563,-8.408437,-7.28795,-3.0933087,0.8930054,0.19561768,-0.31585693,dancing +1.4915876,3.345897,3.9971197,0.471195,0.545347,0.476621,-8.408437,-7.28795,-3.0933087,0.8930054,0.19561768,-0.31585693,dancing +-6.293159,17.597382,-3.558981,0.51224,0.55481,0.428982,-5.2241483,-10.91756,-4.7884035,0.8930054,0.19561768,-0.31585693,dancing +-0.9816227,8.230068,-5.3127337,0.362911,-0.699678,-0.583309,-17.152061,-12.521675,1.9201498,0.5169678,-0.24389648,-0.71276855,dancing +1.5526398,8.35337,-1.8387469,0.421293,-0.607088,-0.605932,-6.4978633,8.327033,3.86903,0.9624634,-0.013122559,-0.2140503,dancing +2.8167782,9.326612,-3.752911,0.216582,0.808251,0.528818,-11.228806,-10.730812,-6.2967505,0.8629761,-0.12542725,-0.012512207,dancing +-3.5003228,9.1255,0.077811554,0.340029,0.607215,0.516562,-1.661576,5.559336,9.792285,0.6323242,0.07775879,-0.52948,dancing +-6.82946,7.5082164,3.2094274,0.311356,0.579539,0.380038,-12.976573,-3.0597897,-3.596091,0.7932739,-0.4605713,0.19799805,dancing +-6.5565214,5.717354,5.6658783,0.185591,0.464146,0.413321,-20.580557,3.8498764,-0.4261679,0.7647095,-0.4713745,0.23999023,dancing +-0.093373865,5.5102553,6.8689647,0.253226,0.141213,0.429836,-22.682667,-7.1059904,-6.631939,0.83862305,-0.53723145,-0.048095703,dancing +-0.02873042,5.6898203,7.9870567,0.261946,0.140491,0.440384,-14.781801,4.036624,3.1603463,0.82159424,-0.46600342,-0.3283081,dancing +0.9911995,5.329493,7.752425,0.259802,0.132426,0.445474,-9.816227,8.015787,-11.880029,0.41210938,0.028564453,-0.8978882,dancing +0.9911995,5.329493,7.752425,0.259802,0.132426,0.445474,35.975273,-13.852851,-0.81881696,0.15344238,0.34429932,-0.8980713,dancing +1.8866309,5.0721164,7.60997,0.258374,0.13855,0.457876,-4.343082,6.9623384,-5.425261,0.5442505,-0.30700684,-0.7702637,dancing +1.8866309,5.0721164,7.60997,0.258374,0.13855,0.457876,-4.43885,-6.0285997,-7.4842744,0.62213135,-0.49639893,-0.57073975,dancing +1.8866309,5.0721164,7.60997,0.258374,0.13855,0.457876,-2.858677,-5.7987566,-6.8091097,-0.5181885,-0.24584961,-0.33776855,dancing +1.2940661,5.0960584,7.704541,0.252565,0.146955,0.465843,-10.146626,-0.56982,1.8195933,-0.29083252,-0.015625,-0.39385986,dancing +1.2940661,5.0960584,7.704541,0.252565,0.146955,0.465843,-14.130578,-14.020445,5.544971,0.028686523,0.005493164,-0.94610596,dancing +1.2940661,5.0960584,7.704541,0.252565,0.146955,0.465843,-0.62728083,-1.0390835,-0.6464345,0.01763916,-0.029052734,-0.96429443,dancing +-0.62129533,5.445612,8.038532,0.246227,0.138322,0.452051,0.5554548,1.5275006,-4.2185836,-0.27026367,-0.5075073,-0.7207031,dancing +-0.62129533,5.445612,8.038532,0.246227,0.138322,0.452051,-10.429143,-2.0685902,-4.7788267,-0.1798706,-0.34783936,-0.91845703,dancing +-0.62129533,5.445612,8.038532,0.246227,0.138322,0.452051,-34.993652,-0.6607997,-3.3566709,0.14996338,0.07019043,-0.5793457,dancing +-1.2545617,2.8526914,9.387665,0.200543,0.135893,0.410051,-9.988609,-5.473145,0.2633622,-0.07659912,0.23321533,-0.5091553,dancing +-1.2545617,2.8526914,9.387665,0.200543,0.135893,0.410051,-37.52193,11.377247,0.0,-0.5796509,0.2685547,-0.3302002,dancing +-5.3486466,4.1635165,10.986992,0.177058,0.151285,0.376394,-26.522966,11.042058,6.775591,0.3161621,-0.24066162,-0.6817627,dancing +-1.3850456,4.0773253,9.271546,0.181064,0.078282,0.317588,-7.153875,-4.6782703,-3.3279405,-0.6854248,-0.4020996,-0.6055298,dancing +0.19871874,2.9364884,9.163807,0.182012,0.063067,0.334532,-7.153875,-4.6782703,-3.3279405,-0.6854248,-0.4020996,-0.6055298,dancing +-0.45609543,3.3566709,8.334216,0.185752,0.072793,0.364497,7.4268136,-4.3957543,-0.2825158,-0.49023438,-0.60131836,-0.59381104,dancing +-0.82480246,4.06296,9.226056,0.163756,0.171797,0.438793,-23.266851,-6.7947445,-24.181437,-0.19897461,-0.46099854,-0.64434814,dancing +-0.7733272,3.810372,8.857349,0.150553,0.173511,0.465805,-23.266851,-6.7947445,-24.181437,0.10510254,-0.565979,-0.81585693,dancing +-1.3467385,4.226963,8.487445,0.144853,0.167943,0.469881,-12.722788,-11.554418,-6.4499793,-0.34527588,-0.11248779,-0.9309082,dancing +-1.2916719,3.9552212,8.185776,0.129444,0.189504,0.47238,-12.722788,-11.554418,-6.4499793,-0.34527588,-0.11248779,-0.9309082,dancing +-2.1428106,1.1192893,8.376115,0.081862,0.190805,0.454552,-7.517793,-6.2249246,-12.588713,-0.43927002,-0.20568848,-0.8723755,dancing +-0.545878,2.268506,8.230068,0.064164,0.196495,0.435339,-16.213533,-18.239029,29.783869,0.4555664,-0.20837402,-0.8644409,dancing +-0.545878,1.7525556,6.8557963,0.108653,0.169757,0.457975,-16.213533,-18.239029,29.783869,0.4555664,-0.20837402,-0.8644409,dancing +-1.0031705,1.6496049,9.600749,0.164427,0.091194,0.481398,-4.783615,-2.2649148,-5.7843914,-0.09460449,-0.28289795,-0.9168701,dancing +0.58298814,2.610877,9.801862,0.177686,0.056519,0.443821,-16.146496,-38.264133,21.619642,0.28320312,-0.12322998,-0.92407227,dancing +0.7769185,2.5558102,9.7084875,0.177548,0.021465,0.421464,-12.976573,-2.2361844,-12.0093155,0.24395752,-0.09832764,-0.9067383,dancing +0.61411273,2.8203697,8.512584,0.175761,-0.006402,0.396688,-10.658986,-23.669079,12.938266,0.8140869,-0.20648193,-0.49694824,dancing +0.7015011,3.028665,8.292317,0.193947,-0.012867,0.351924,-19.780895,-32.307358,25.005043,0.87231445,-0.18859863,-0.38006592,dancing +1.6591818,3.040636,9.016563,0.183839,-0.017427,0.343706,-5.2145715,1.3455414,1.7286136,0.74017334,0.33502197,-0.05407715,dancing +1.7705121,3.335123,9.296685,0.17411,-0.021688,0.338191,-19.9437,-57.436897,13.22557,0.94873047,0.014221191,-0.25457764,dancing +0.9959879,3.321955,9.203311,0.169907,-0.021603,0.328727,-23.841461,-51.566315,18.727446,0.9489746,0.04437256,-0.17047119,dancing +1.7908629,3.2860417,9.175778,0.162457,-0.019116,0.328205,-3.1364043,1.7669208,1.1444284,0.7150879,0.40179443,-0.17193604,dancing +2.0590134,2.219425,8.789114,0.154137,-0.02028,0.338588,-3.7972038,-0.9911995,-0.37349546,0.65319824,0.4500122,-0.2597046,dancing +0.8834604,3.1136594,9.155427,0.136216,-0.019107,0.313152,-2.2984335,-5.6551046,-9.524135,0.5107422,0.5120239,-0.46636963,dancing +1.0163386,1.8854338,9.555259,0.120914,-0.030812,0.298579,-9.691729,-5.554548,1.1013328,0.91864014,-0.030639648,-0.012817383,dancing +1.0079589,1.8100165,9.533711,0.108573,-0.041892,0.286177,-8.992621,-5.602432,2.6862943,0.92559814,-0.26239014,0.014038086,dancing +1.0079589,1.8100165,9.533711,0.108573,-0.041892,0.286177,-1.0295067,-0.34955344,1.1971009,0.6725464,0.17822266,-0.704895,dancing +2.078167,1.0642227,9.43914,0.085724,-0.074001,0.251005,9.251195,8.858546,-6.493075,0.43548584,0.62939453,-0.42596436,dancing +1.7956513,1.4999673,9.661801,0.085047,-0.07941,0.249626,5.9807158,34.648888,20.09214,0.48736572,0.45159912,-0.29840088,dancing +1.8686744,1.7956513,9.903615,0.095007,-0.076599,0.250747,-0.866701,13.9438305,13.512875,0.51031494,0.40283203,-0.38781738,dancing +1.8686744,1.7956513,9.903615,0.095007,-0.076599,0.250747,7.029376,38.16836,8.255207,0.237854,0.40441895,-0.4666748,dancing +1.4401124,1.9476831,8.74123,0.11099,-0.061563,0.259082,7.029376,38.16836,8.255207,0.237854,0.40441895,-0.4666748,dancing +1.4401124,1.9476831,8.74123,0.11099,-0.061563,0.259082,-8.350976,25.033773,8.178593,0.13439941,-0.10437012,-0.6239624,dancing +1.4401124,1.9476831,8.74123,0.11099,-0.061563,0.259082,-26.072857,-32.71437,26.508602,0.095703125,-0.4041748,-0.8901367,dancing +1.9632454,2.018312,8.313866,0.127513,-0.038076,0.259911,-23.611618,-39.442078,9.32781,-0.39178467,-0.1159668,-0.7161865,dancing +1.9632454,2.018312,8.313866,0.127513,-0.038076,0.259911,5.085284,-2.5713725,-2.0254946,-0.26672363,-0.5751343,-0.7036743,dancing +0.60932434,3.0681696,9.052477,0.131991,-0.040674,0.246552,5.085284,-2.5713725,-2.0254946,-0.26672363,-0.5751343,-0.7036743,dancing +0.60932434,3.0681696,9.052477,0.131991,-0.040674,0.246552,20.03468,24.880545,20.781672,-0.01727295,-0.61883545,-0.5725708,dancing +0.60932434,3.0681696,9.052477,0.131991,-0.040674,0.246552,-30.391996,-23.621195,-8.815451,-0.819397,-0.37023926,-0.4265747,dancing +1.2485762,2.5833437,10.242394,0.133648,-0.039705,0.240514,9.193734,17.228676,13.867216,-0.18328857,-0.8397827,-0.44335938,dancing +0.5279215,3.6966474,8.180987,0.131563,-0.038393,0.260185,-18.928558,0.9816227,5.1235914,-0.37872314,-0.8082886,-0.45074463,dancing +-0.18435353,2.6312277,10.752359,0.129343,-0.058427,0.246766,45.80108,30.669724,5.133168,0.066223145,0.19677734,-0.58691406,dancing +0.36750996,4.045004,7.961918,0.157725,-0.01845,0.269816,45.844173,29.257145,1.8291701,0.068725586,0.21868896,-0.59124756,dancing +0.89303726,4.1742907,7.603985,0.205324,0.023198,0.278158,45.844173,29.257145,1.8291701,0.068725586,0.21868896,-0.59124756,dancing +0.019153614,5.0374002,8.525752,0.219525,-0.022294,0.221374,32.407913,17.774553,0.2873042,0.125,0.24633789,-0.6143799,dancing +-0.4321534,5.793968,7.854179,0.229523,-0.022137,0.194461,-23.54458,-8.623915,-1.9488802,0.27172852,-0.0010375977,-0.82891846,dancing +-1.6292542,6.754043,9.066842,0.263673,0.048986,0.172589,-15.016433,-1.8914193,3.739743,0.65216064,0.24005127,-0.44763184,dancing +-0.49081135,6.030994,9.817424,0.268913,0.07796,0.179818,24.837448,30.837318,16.112978,0.5783081,0.38201904,-0.30615234,dancing +-0.08619126,6.1100025,6.56131,0.310198,0.037761,0.16616,-15.275007,-3.122039,10.601525,0.023925781,-0.6676636,-0.72424316,dancing +-0.6847417,6.6079965,6.578069,0.332459,0.024177,0.126753,-32.752678,-1.6807296,-7.240066,-0.11669922,-0.29608154,-0.92437744,dancing +-0.89543146,7.0724716,7.289147,0.337729,0.014951,0.078682,22.060175,6.6606693,-5.391742,-0.2277832,-0.43133545,-0.788147,dancing +-0.5506664,6.6427126,6.7947445,0.340486,0.011528,0.070576,0.5315128,3.3087866,12.061988,0.1798706,-0.7470093,-0.63500977,dancing +-0.037110128,6.4739213,6.2644286,0.353686,0.004541,0.061581,1.0151415,1.2737153,8.805874,0.074279785,-0.78570557,-0.5996704,dancing +-0.6871359,6.7348895,6.752846,0.355992,0.006114,0.028282,0.9864111,-0.4357447,7.675811,-0.029907227,0.05633545,-0.97631836,dancing +0.7781156,0.62608373,13.4422455,0.109537,-0.017382,0.502022,7.422025,5.7508726,-0.4357447,0.4711914,0.31848145,-0.57958984,lying +1.067814,1.0450691,9.329007,0.069728,-0.027419,0.479298,3.1794999,-4.5298295,2.336741,0.93481445,0.28710938,-0.050476074,lying +1.0295067,0.93732995,9.343372,0.069772,-0.027098,0.478409,-0.63206923,-10.333375,0.6607997,0.8916626,0.05255127,0.02935791,lying +1.0905589,0.89423436,9.528923,0.068825,-0.027936,0.478198,-0.8714894,-10.299856,1.0965444,0.6711426,0.023498535,-0.107910156,lying +-0.034715924,0.8750807,9.471462,0.050216,-0.022737,0.47624,2.303222,-10.812215,0.8283938,0.6668091,0.022766113,-0.10839844,lying +0.92775315,0.82360536,9.508572,0.100342,-0.034871,0.493959,7.551312,-8.355764,7.1059904,0.5140381,0.25543213,0.29107666,lying +1.2150574,1.0666169,9.757569,0.079846,-0.02702,0.486489,7.1873937,-2.1691468,2.6479871,0.5656128,0.23803711,0.42132568,lying +1.270124,1.2413936,9.423578,0.085681,-0.033578,0.482435,7.3549876,-10.132261,-3.572149,0.71087646,0.12390137,0.34332275,lying +1.2354081,1.1647792,9.36492,0.085307,-0.034933,0.482168,5.3007627,-7.0245876,4.0174704,0.5527344,0.15118408,0.33569336,lying +1.7525556,2.005144,6.588843,0.082507,-0.001699,0.511765,4.232949,-7.5225816,-2.9161377,0.67077637,0.40789795,0.21044922,lying +1.922544,1.2425907,8.761581,0.066092,-0.016159,0.517305,4.232949,-7.5225816,-2.9161377,0.67077637,0.40789795,0.21044922,lying +0.3172317,-0.41060558,10.044873,0.033376,-0.008348,0.513688,9.457097,-10.299856,-5.3725886,0.67077637,0.40789795,0.21044922,lying +-13.785813,-1.9165585,7.9930425,-0.248631,0.355075,0.407095,9.457097,-10.299856,-5.3725886,0.6039429,0.4309082,0.3334961,lying +-5.4061074,-0.47046062,8.224083,-0.137367,0.24702,0.442219,6.114791,-10.481815,-3.371036,0.6013794,0.335083,0.20037842,lying +-5.3881507,0.25378537,7.69257,-0.122974,0.247411,0.439031,4.9224787,-10.601525,-4.927267,0.7946167,0.35272217,0.16192627,lying +-2.2158337,-1.5490485,8.249222,-0.039781,-0.0025,0.49737,2.777274,-2.4756045,-0.7422025,0.48950195,0.41723633,0.2475586,lying +0.89303726,1.6603789,11.309011,0.043675,0.021625,0.501122,12.181698,-3.7588966,2.3319526,0.41363525,0.42785645,0.15966797,lying +4.092888,0.6548142,11.572374,0.148896,-0.06608,0.423493,3.6535518,-9.174581,0.5410896,0.56378174,0.13085938,0.08392334,lying +4.9524064,2.9053638,6.775591,0.157319,-0.08853,0.485426,-2.72939,0.1436521,9.14585,0.115478516,-0.1104126,0.04650879,lying +1.3611037,0.36511576,10.160992,0.109675,-0.119889,0.537302,-0.08619126,-4.8602295,7.5082164,0.2835083,-0.10949707,0.026611328,lying +2.542642,0.48123455,8.775947,0.090738,-0.064833,0.538508,-0.08619126,-4.8602295,7.5082164,0.2835083,-0.10949707,0.026611328,lying +1.2354081,0.8331822,9.369708,0.062437,-0.030422,0.540841,-1.0390835,-6.1387334,7.335834,0.31292725,-0.050720215,0.061523438,lying +1.0007763,0.8702923,9.41041,0.061722,-0.018469,0.540189,0.8619126,-6.4068837,7.651869,0.3065796,-0.026733398,0.085876465,lying +0.9828198,0.91578215,9.32781,0.062559,-0.016057,0.539085,0.20111294,-5.78918,8.279149,0.272583,-0.02557373,0.08099365,lying +0.90381116,0.6631939,9.522937,0.055965,-0.027886,0.536139,4.7979803,-7.6135616,-7.8912888,0.7335205,0.4847412,0.1340332,lying +0.8319851,0.81881696,9.482236,0.052538,-0.025674,0.535042,4.7979803,-7.6135616,-7.8912888,0.7335205,0.4847412,0.1340332,lying +1.1707647,0.78769237,9.234436,0.057437,-0.030304,0.535808,5.386954,-8.183381,7.2592196,0.39520264,0.2668457,-0.05029297,lying +0.6332663,0.7541735,9.598354,0.056614,-0.028472,0.536826,5.386954,-8.183381,7.2592196,0.39520264,0.2668457,-0.05029297,lying +0.8583213,0.58777654,9.500193,0.049152,-0.024994,0.538068,2.5187001,-0.8475474,8.42759,0.24157715,0.23150635,0.036376953,lying +0.8858546,0.60573304,9.479841,0.049036,-0.024114,0.53807,5.707777,-8.652645,7.651869,0.3416748,0.26013184,0.0068359375,lying +0.8595184,0.6572084,9.441534,0.053508,-0.021819,0.538046,5.080496,-7.192182,5.2959743,0.38079834,0.28118896,0.014709473,lying +0.81163436,0.63087213,9.417592,0.049244,-0.020966,0.538258,5.171476,-7.345411,5.0613422,0.39465332,0.28356934,0.016540527,lying +0.80445176,0.676362,9.507375,0.052132,-0.025991,0.537735,5.171476,-7.345411,5.0613422,0.39465332,0.28356934,0.016540527,lying +3.705027,6.211756,6.081272,0.356814,0.06642,0.569911,-0.92416185,-2.384625,8.930372,0.019104004,-0.083984375,0.032104492,lying +-1.7429788,9.594764,-3.9264908,0.599053,0.489213,0.356771,-1.6376339,-0.521936,9.011775,-0.09851074,-0.09906006,0.01361084,lying +1.804031,6.775591,6.495469,0.358314,0.125564,0.496893,3.98874,4.213795,7.2113357,-0.4078369,0.07171631,-0.27856445,getting up +0.7565677,7.321469,5.853823,0.385424,0.166314,0.485998,3.98874,4.213795,7.2113357,-0.4078369,0.07171631,-0.27856445,getting up +-0.51116204,11.372458,-1.721431,0.551661,0.315508,0.400456,-1.1779473,-12.981361,-1.2737153,-0.008178711,0.651001,-0.75683594,getting up +-0.044292733,10.01734,-2.3319526,0.60771,0.386845,0.366552,-1.1779473,-12.981361,-1.2737153,-0.008178711,0.651001,-0.75683594,getting up +0.047884032,8.288726,-5.097255,0.667071,0.518986,0.325706,-3.53863,-9.212888,-1.733402,0.11566162,0.6757202,-0.7201538,getting up +0.78170687,7.4375877,-7.711724,0.729606,0.524644,0.281481,-3.145981,-9.653421,-1.0965444,0.10369873,0.6723633,-0.72540283,getting up +0.7314286,7.952341,-6.0800753,0.724444,0.514214,0.306981,-3.0550013,-9.308656,-0.047884032,0.10662842,0.6362915,-0.7576904,getting up +1.0642227,7.839813,-6.0585275,0.719183,0.510162,0.315935,-2.5474305,-8.580819,1.4460979,0.10662842,0.6362915,-0.7576904,getting up +1.1563994,9.003395,-4.086902,0.679054,0.488935,0.36551,-5.329493,-8.010999,1.3072342,0.25878906,0.5993042,-0.74658203,getting up +0.8678981,9.075222,-4.358644,0.679095,0.478453,0.368605,-6.373365,-9.217676,-0.641646,0.34362793,0.61724854,-0.6595459,getting up +-2.4013844,9.002198,1.472434,0.471214,0.442282,0.390479,-2.6862943,-0.79487497,9.212888,0.1642456,-0.03149414,-0.97473145,getting up +-1.9596541,7.3849154,5.662287,0.318185,0.351412,0.431604,-2.6862943,-0.79487497,9.212888,0.1642456,-0.03149414,-0.97473145,getting up +-2.5067291,5.7748146,6.3793507,0.250726,0.297848,0.445006,-2.6862943,-0.79487497,9.212888,0.1642456,-0.03149414,-0.97473145,getting up +-2.6048915,4.1706996,7.156269,0.175619,0.239031,0.455325,-2.8921957,-1.3838485,8.954314,0.16912842,-0.022399902,-0.97161865,getting up +0.45250413,1.0618285,9.482236,0.053052,0.00286,0.452231,-2.9017725,-1.1971009,9.222465,0.16912842,-0.022399902,-0.97161865,getting up +-3.9755719,2.445677,9.829395,0.087005,0.11265,0.448801,5.803545,7.3645644,-2.0638018,0.168396,-0.022338867,-0.97283936,getting up +-0.80924016,8.744822,4.5801077,0.408321,0.294136,0.43778,-4.453215,4.960786,12.354081,0.12347412,0.13775635,-0.7609863,getting up +-0.2837129,9.783905,-1.5370775,0.612064,0.41741,0.367859,-7.9152308,-8.145074,4.3861775,0.029846191,0.517395,-0.6730957,getting up +-0.5303157,9.660604,-2.7928362,0.650772,0.436042,0.332186,-4.2281604,-7.627927,5.985504,-0.20056152,0.18762207,-0.91448975,getting up +-0.39743748,9.652225,-2.8491,0.664107,0.438354,0.320754,-4.501099,-3.083732,7.6375036,0.20495605,0.15795898,-0.8401489,getting up +0.7015011,1.0821792,9.532514,0.069863,-0.014044,0.437128,7.9487495,5.315128,1.2210429,-0.3390503,-0.5656738,-0.69989014,getting up +0.7529764,1.0666169,9.522937,0.06915,-0.014728,0.43757,7.9487495,5.315128,1.2210429,-0.3390503,-0.5656738,-0.69989014,getting up +0.7410054,1.009156,9.451111,0.066262,-0.016157,0.437731,7.9487495,5.315128,1.2210429,-0.3390503,-0.5656738,-0.69989014,getting up +0.7098808,0.9576807,9.455899,0.064499,-0.017663,0.438077,7.9487495,5.315128,1.2210429,-0.3390503,-0.5656738,-0.69989014,getting up +0.5303157,1.0199299,9.560047,0.05964,-0.007167,0.445017,7.9487495,5.315128,1.2210429,-0.3390503,-0.5656738,-0.69989014,getting up +0.34835634,1.0175357,9.540894,0.058427,-0.005304,0.452726,7.9487495,5.315128,1.2210429,-0.3390503,-0.5656738,-0.69989014,getting up +0.36990416,1.4556746,9.358934,0.068614,9.66E-4,0.45346,7.9487495,5.315128,1.2210429,-0.3390503,-0.5656738,-0.69989014,getting up +-3.9025488,2.3906105,9.835381,0.101116,0.100239,0.436387,6.133945,7.4603324,-3.016694,-0.36853027,-0.63287354,-0.65545654,getting up +-3.429694,4.3658266,7.8745294,0.185402,0.204235,0.42461,6.133945,7.4603324,-3.016694,-0.36853027,-0.63287354,-0.65545654,getting up +-1.4915876,8.674192,3.9240966,0.436043,0.334635,0.423488,4.6351743,2.801216,8.925584,-0.08874512,-0.20245361,-0.798584,getting up +-0.5590461,9.657013,-3.466804,0.654102,0.438002,0.32678,1.7190368,2.2984335,11.48738,-0.023803711,-0.11303711,-0.7922363,getting up +-0.33159694,9.408015,-3.0083144,0.660632,0.438496,0.323987,2.906561,3.3806129,0.33997664,-0.20080566,0.13085938,-0.74224854,getting up +-0.6536171,9.713276,-2.019509,0.63986,0.431322,0.337232,2.906561,3.3806129,0.33997664,-0.20080566,0.13085938,-0.74224854,getting up +-0.45729253,9.628283,-1.7154455,0.625291,0.423314,0.346692,-1.9440918,-6.301539,4.903325,-0.27905273,0.54156494,-0.5644531,getting up +-0.80325466,9.676167,-2.147599,0.638433,0.440608,0.326434,-3.3135753,-11.650186,2.767697,-0.23632812,0.56103516,-0.60369873,getting up +-3.4584243,5.5629277,-11.432313,0.745335,0.555948,0.158843,-0.0047884034,-0.61291564,8.322245,0.028930664,0.048828125,-0.90875244,getting up +-0.60214174,8.731653,-8.986636,0.759024,0.528473,0.211023,6.4739213,-7.015011,4.381389,-0.38146973,0.55023193,-0.72198486,getting up +-0.049081136,6.603208,-4.7500963,0.72917,0.473651,0.244622,3.739743,-5.8945246,4.2904096,-0.25476074,0.4000244,-0.8187866,getting up +-1.0139444,9.616311,-1.3455414,0.607241,0.431619,0.333201,-7.9583263,-5.032612,4.429273,-0.119628906,0.545105,-0.7716675,getting up +-1.3491327,9.82341,0.17118542,0.58999,0.368623,0.30736,1.685518,-2.1308396,8.585608,-0.038757324,0.05456543,-0.86224365,getting up +-0.08140286,9.385271,-1.4616601,0.587527,0.42082,0.374104,-3.8402996,-7.302315,12.708423,-0.038757324,0.05456543,-0.86224365,getting up +-1.2988545,10.250774,-1.210269,0.163023,0.730719,0.622134,2.2601264,-0.7517793,8.925584,-0.019226074,0.094055176,-0.84399414,getting up +-0.35553896,9.932345,-2.2984335,-0.051033,0.758208,0.649904,2.2601264,-0.7517793,8.925584,-0.06555176,-0.16235352,-0.87646484,getting up +0.05865794,9.607931,-1.271321,0.13732,-0.719487,-0.673311,2.8778305,2.8682537,8.465898,-0.018066406,-0.31695557,-0.8586426,getting up +-1.4891934,9.762358,-1.8303672,0.207792,-0.719784,-0.65417,3.3518825,3.2944214,8.66701,-0.045776367,-0.32348633,-0.86376953,getting up +-1.3144168,9.7563715,-1.3431472,0.206839,-0.717338,-0.655592,3.3518825,3.2944214,8.66701,-0.045776367,-0.32348633,-0.86376953,getting up +-1.2401965,9.7803135,-1.292869,0.21009,-0.716625,-0.654731,-9.409213,-2.4851813,-0.48362875,-0.63067627,0.35913086,0.52178955,getting up +-1.2162545,9.840169,-1.2425907,0.210742,-0.71313,-0.657956,-9.409213,-2.4851813,-0.48362875,-0.63067627,0.35913086,0.52178955,getting up +-1.2378023,9.872491,-1.1935096,0.211178,-0.709722,-0.661237,-9.409213,-2.4851813,-0.48362875,-0.63067627,0.35913086,0.52178955,getting up +-1.198298,9.781511,-1.0151415,0.211256,-0.708644,-0.662221,-9.409213,-2.4851813,-0.48362875,-0.63067627,0.35913086,0.52178955,getting up +-1.1911154,9.720459,-1.0055647,0.211676,-0.706189,-0.66437,-9.409213,-2.4851813,-0.48362875,-0.63067627,0.35913086,0.52178955,getting up +-1.1671734,9.870096,-1.151611,0.211967,-0.708288,-0.662024,-9.409213,-2.4851813,-0.48362875,-0.63067627,0.35913086,0.52178955,getting up +-1.2114661,9.759963,-1.0977415,0.212862,-0.708956,-0.660991,-9.409213,-2.4851813,-0.48362875,-0.63067627,0.35913086,0.52178955,getting up +0.7146692,1.3934253,9.340978,0.089651,-0.00312,0.417283,3.9743748,7.73806,5.6407394,-0.67645264,0.33605957,0.5355835,getting up +0.82599956,1.3455414,9.48463,0.087991,-0.00456,0.416977,2.0973208,1.4173675,8.949526,-0.79937744,0.18200684,0.55792236,getting up +0.6584055,1.5945383,9.496601,0.092038,-0.00257,0.416586,2.0973208,1.4173675,8.949526,-0.79937744,0.18200684,0.55792236,getting up +1.328782,2.9963434,11.656171,0.148971,0.007997,0.423309,2.2170308,2.15957,9.174581,0.1026001,0.14648438,0.9837036,getting up +-1.3611037,8.628703,4.1359835,0.438745,0.229936,0.319773,-15.069105,-25.7664,2.0350714,0.08215332,-0.4119873,0.8272705,getting up +-4.045004,9.002198,1.3275849,0.491764,0.397139,0.263512,-8.968679,-22.567745,0.92895025,0.09820557,-0.48492432,0.78845215,getting up +-3.3542767,9.003395,-1.6184803,0.529851,0.51857,0.276504,-4.903325,-7.61835,-3.098097,0.045166016,-0.80059814,0.5270996,getting up +-2.5366566,8.859743,-3.7912183,0.545344,0.563223,0.349472,-4.903325,-7.61835,-3.098097,0.045166016,-0.80059814,0.5270996,getting up +0.29448682,9.293094,-4.8973393,0.629883,0.535572,0.366506,-5.2049947,-5.9663506,-2.0398598,-0.012268066,-0.8010864,0.5418701,getting up +-1.6484078,8.002619,-5.0182467,0.607939,0.6292,0.303782,-7.469909,-6.4068837,-0.17717093,0.066833496,-0.6807251,0.3007202,getting up +-1.3563153,8.2037325,-2.079364,0.538547,0.561007,0.388253,-9.849746,-6.0046577,0.34955344,-0.057861328,-0.68237305,0.25274658,getting up +-0.04070143,9.927557,-1.5753847,0.626124,0.426154,0.347018,-6.861782,-8.949526,5.659893,-0.11682129,-0.40185547,0.8427124,getting up +-0.5554548,9.822212,-1.6783354,0.614296,0.428075,0.354046,2.873042,2.6288335,8.350976,0.057556152,0.1303711,0.98083496,getting up +-1.246182,9.847352,-0.5434838,0.587803,0.410959,0.341078,4.5537715,2.3463178,8.1642275,0.12390137,0.16320801,0.9719238,getting up +-2.15957,7.85777,-7.620744,0.764364,0.48603,0.164172,2.5713725,2.944868,8.844181,0.112854004,0.21234131,0.96325684,getting up +-0.81761986,8.972271,-1.769315,0.650518,0.397484,0.293039,-2.4516625,-0.92416185,9.734824,0.018554688,-0.036621094,0.70654297,getting up +-0.9876082,9.7240505,-0.521936,0.597225,0.390318,0.332846,-5.544971,-4.975151,7.40766,-6.1035156E-5,-0.12957764,0.6951904,getting up +-2.8311436,9.345766,-1.7788919,0.323092,-0.672183,-0.643092,-11.932701,-2.930503,0.7613561,0.37469482,-0.60479736,-0.35321045,getting up +0.5674258,10.207679,1.5729905,0.26551,-0.69882,-0.653699,-11.932701,-2.930503,0.7613561,0.37469482,-0.60479736,-0.35321045,getting up +-2.825158,9.901221,-6.5708866,0.212012,-0.720192,-0.656629,-11.932701,-2.930503,0.7613561,0.37469482,-0.60479736,-0.35321045,getting up +-5.1116204,7.4148426,-0.60573304,0.216464,-0.724514,-0.648422,-11.932701,-2.930503,0.7613561,0.37469482,-0.60479736,-0.35321045,getting up +0.051475335,9.0476885,3.6942532,0.524853,0.176888,0.27445,3.8833952,-8.441956,4.7165775,0.5126953,-0.41912842,-0.5494385,reading +0.12808979,8.9842415,3.7900212,0.523027,0.174178,0.273199,4.951209,-9.241618,-6.885724,0.6368408,0.5133667,-0.082336426,reading +0.06703765,8.965088,3.6499605,0.523948,0.172769,0.272169,4.951209,-9.241618,-6.885724,0.6368408,0.5133667,-0.082336426,reading +0.045489833,9.010578,3.8175547,0.523228,0.172727,0.271831,4.7500963,-8.7053175,1.0869676,0.46624756,0.45837402,-0.20721436,reading +0.06943185,9.036914,3.776853,0.523728,0.172254,0.271803,5.779603,-8.145074,-3.6966474,0.6072998,0.5275879,-0.047851562,reading +0.034715924,9.011775,3.7122097,0.528377,0.161318,0.252932,5.9902925,-8.240842,-4.7548847,0.65093994,0.5335083,-0.018737793,reading +0.06943185,9.009381,3.7313633,0.503882,0.228535,0.357397,5.2720323,-7.6949644,2.767697,0.4074707,0.42651367,-0.20239258,reading +0.22505496,8.893262,3.8031895,0.482578,0.25763,0.418032,5.497087,-9.639056,-2.5713725,0.5736084,0.5039673,-0.097229004,reading +0.1352724,9.010578,3.8295257,0.483855,0.259558,0.416577,6.6846113,-6.6893997,-2.1643584,0.4557495,0.62420654,-0.16363525,reading +0.08020575,8.9842415,3.7900212,0.483776,0.261572,0.41761,6.0621185,-7.0006456,-4.0701427,0.4835205,0.66693115,-0.14245605,reading +0.016759412,8.956709,3.9025488,0.489382,0.264482,0.413744,6.3685765,-7.1634517,-3.9983168,0.4979248,0.6590576,-0.14666748,reading +0.46447513,9.993398,2.9735985,0.565463,0.263197,0.325919,5.415684,-7.6614456,-5.0182467,0.5946655,0.635437,-0.07513428,reading +0.19153613,8.400057,4.8973393,0.455782,0.198238,0.385135,6.114791,-7.7332716,-2.906561,0.51586914,0.62298584,-0.12536621,reading +0.24181437,8.479065,4.8386817,0.45569,0.196415,0.383573,6.0046577,-7.6710224,-1.043872,0.4593506,0.60339355,-0.15960693,reading +0.2645593,8.3868885,4.911705,0.455563,0.195669,0.378565,6.5457473,-7.752425,-2.0733786,0.53564453,0.6374512,-0.020568848,reading +0.24899697,8.364143,4.909311,0.456406,0.195833,0.377804,6.325481,-8.528147,-1.388637,0.49041748,0.607666,-0.10461426,reading +0.25139117,8.350976,4.9464207,0.454331,0.194655,0.378158,6.483498,-8.00621,-1.2066777,0.46258545,0.5890503,-0.1472168,reading +0.23223756,8.367735,5.0254292,0.453797,0.192742,0.377,6.919243,-6.9000893,-3.5098996,0.51330566,0.6300049,-0.051452637,reading +0.44891283,8.289924,5.040992,0.468045,0.150584,0.303261,7.469909,-6.7803793,-2.7820623,0.5115967,0.6220093,-0.022644043,reading +0.31124622,8.354567,5.00867,0.475315,0.126131,0.260557,7.469909,-6.7803793,-2.7820623,0.5115967,0.6220093,-0.022644043,reading +0.557849,8.383297,5.044583,0.485259,0.081805,0.185081,7.350199,-5.674258,-2.873042,0.57373047,0.5710449,0.06640625,reading +0.45489833,8.331821,4.9404354,0.480499,0.117909,0.244601,5.257667,-9.32781,0.81402856,0.5319214,0.446167,-0.09173584,reading +0.22984336,8.49343,4.8243165,0.467962,0.167377,0.332289,5.2241483,-9.892841,-0.6655881,0.4977417,0.5111084,-0.18249512,reading +0.25857377,8.425196,4.847061,0.456957,0.186617,0.369656,5.434838,-9.241618,-0.18195933,0.4727173,0.5373535,-0.19946289,reading +0.29807812,8.499416,4.691438,0.46124,0.187768,0.361762,7.809886,-8.6334915,-1.1492168,0.44396973,0.5876465,-0.14300537,reading +0.5422867,8.53892,4.5920787,0.470563,0.186151,0.356845,5.185841,-5.363012,2.3463178,0.17828369,0.5204468,-0.12023926,reading +0.108936176,8.610746,4.4687777,0.473924,0.189529,0.353294,5.185841,-5.363012,2.3463178,0.17828369,0.5204468,-0.12023926,reading +0.41299978,8.645462,4.4005427,0.48497,0.183085,0.348634,8.2169,-6.019023,-2.432509,0.3779297,0.67663574,-0.032714844,reading +0.37588966,8.62152,4.5513773,0.483387,0.183852,0.34884,8.025364,-5.8466406,-1.0055647,0.3779297,0.67663574,-0.032714844,reading +0.2837129,8.623915,4.5441947,0.479515,0.189044,0.356414,7.704541,-6.4978633,-1.364695,0.38781738,0.64263916,-0.079833984,reading +0.35434186,8.644265,4.437653,0.475872,0.203589,0.378237,8.020576,-5.746084,-0.49320555,0.32574463,0.6552124,-0.1182251,reading +0.38307226,8.644265,4.426879,0.479259,0.193537,0.361896,8.336611,-6.0142345,-1.1875241,0.34692383,0.66522217,-0.06640625,reading +0.30885202,8.656237,4.4328647,0.480626,0.196025,0.360675,7.771579,-6.95755,-2.7629087,0.4222412,0.6610718,-0.058654785,reading +0.39743748,8.664616,4.459201,0.482108,0.190997,0.359816,7.771579,-6.95755,-2.7629087,0.4222412,0.6610718,-0.058654785,reading +0.32680854,8.652645,4.5358152,0.480967,0.191436,0.359034,8.236053,-5.1810527,-1.3311762,0.35473633,0.6616821,-0.054382324,reading +0.39983168,8.619126,4.4603977,0.480877,0.189432,0.358086,8.236053,-5.1810527,-1.3311762,0.35473633,0.6616821,-0.054382324,reading +0.31124622,8.639477,4.4675803,0.480206,0.193002,0.358359,7.824251,-4.1371803,-4.687847,0.387146,0.7139282,-0.012817383,reading +0.40462008,8.608353,4.485537,0.482988,0.190831,0.356566,7.335834,-3.4237084,-6.0525417,0.47314453,0.72094727,0.05432129,reading +0.36990416,8.639477,4.5202527,0.481752,0.190689,0.356889,7.872135,-5.00867,-4.55856,0.548645,0.7122803,0.122802734,reading +0.46088383,8.717288,4.4807487,0.481568,0.189589,0.35649,7.5465236,-6.3829417,0.18674773,0.34552002,0.6011963,-0.16253662,reading +0.4333505,8.64666,4.5513773,0.480823,0.189283,0.356862,7.5465236,-6.3829417,0.18674773,0.34552002,0.6011963,-0.16253662,reading +0.2717419,8.622718,4.423288,0.478732,0.193337,0.357637,7.038953,-7.3166804,-0.91458505,0.4180298,0.6279297,-0.11242676,reading +0.22146365,8.611943,4.453215,0.47913,0.193361,0.356561,8.24563,-5.3821654,-3.6296098,0.48815918,0.6576538,0.07128906,reading +0.21308395,8.669404,4.5238442,0.479402,0.190629,0.353405,7.7093296,-6.397307,2.030283,0.3267212,0.6272583,-0.1003418,reading +0.20470424,8.603564,4.578911,0.4785,0.190347,0.35378,8.269572,-6.301539,-1.9871874,0.36401367,0.6604614,-0.061462402,reading +0.21068975,8.65025,4.4807487,0.480444,0.185876,0.351681,8.269572,-6.301539,-1.9871874,0.36401367,0.6604614,-0.061462402,reading +0.32561144,8.652645,4.759673,0.4795,0.189287,0.35033,8.010999,-2.4229321,-1.8770541,0.19390869,0.604126,-0.1749878,reading +0.40581718,8.622718,4.4005427,0.484372,0.183214,0.344614,8.010999,-2.4229321,-1.8770541,0.19390869,0.604126,-0.1749878,reading +0.4225766,8.644265,4.453215,0.491422,0.170771,0.329321,8.010999,-2.4229321,-1.8770541,0.19390869,0.604126,-0.1749878,reading +0.30047232,8.616732,4.5082817,0.508734,0.029415,0.088808,8.365341,-6.8330517,-0.7661445,0.4449463,0.5628662,0.008117676,reading +0.38307226,8.470686,4.823119,0.505399,0.003563,0.039837,8.101978,-4.3287168,-3.821146,0.62957764,0.53759766,0.21777344,reading +0.30765492,8.507795,4.6782703,0.505728,-0.006423,0.021294,8.111555,-3.9695864,-5.57849,0.75024414,0.42193604,0.28771973,reading +0.2633622,8.694544,4.408922,0.520918,-0.013196,0.007811,8.135497,-5.094861,-3.3901896,0.6911621,0.43804932,0.26019287,reading +0.23463176,8.668207,4.3742065,0.521188,-0.014667,0.007118,8.135497,-5.094861,-3.3901896,0.6911621,0.43804932,0.26019287,reading +0.1604115,8.700529,4.498705,0.521065,-0.012916,0.009618,8.135497,-5.094861,-3.3901896,0.6911621,0.43804932,0.26019287,reading +0.25498247,8.746018,4.2102036,0.427971,0.295937,0.538508,7.4268136,-3.5194764,-5.315128,0.4312744,0.7504883,0.06402588,reading +0.46926352,8.799889,4.2437224,0.355216,0.371939,0.669981,7.9966335,-4.4196963,-4.6351743,0.19732666,0.829895,-0.12286377,reading +0.22744916,8.631097,3.679888,0.307022,0.415636,0.723846,6.339846,-8.384495,-0.31124622,-0.0017089844,0.7738037,-0.48883057,reading +0.2837129,8.944737,4.1862617,0.328889,0.430042,0.691728,6.3302693,-8.992621,-1.3024458,-0.026672363,0.729126,-0.54486084,reading +-0.90261406,9.451111,0.664391,0.41849,0.560944,0.532071,6.8809357,-8.700529,-0.6368576,-0.041748047,0.70129395,-0.5609131,reading +-2.0949266,5.5461683,-4.320337,0.532796,0.687411,0.338894,7.350199,-7.0724716,0.9816227,-0.05670166,0.6612549,-0.5805054,reading +-0.6775591,10.178948,-1.2785037,0.481581,0.567819,0.459069,6.5840545,-9.121908,0.770933,0.01727295,0.7211304,-0.48657227,reading +-0.47405192,9.61272,2.1583729,0.431698,0.44596,0.54865,8.0924015,-7.7907324,-2.4660277,0.13513184,0.8187866,-0.307312,reading +-0.5793968,9.610326,2.112883,0.424366,0.449894,0.549505,3.6727054,-7.144298,-2.9640217,0.16827393,0.77459717,-0.36462402,reading +-0.40222588,9.55047,2.1320367,0.430287,0.449814,0.549681,6.421249,-7.608773,-2.1068976,0.101745605,0.7675781,-0.4169922,reading +-0.4297592,9.606734,2.12246,0.426088,0.452766,0.552639,6.421249,-7.608773,-2.1068976,0.101745605,0.7675781,-0.4169922,reading +-0.36391866,9.574412,2.2038627,0.424412,0.453767,0.556486,6.397307,-8.312668,-2.3175871,0.09124756,0.7698364,-0.4336548,reading +-0.41180268,9.563639,2.2266076,0.42385,0.452525,0.556342,6.3350577,-7.9104424,-6.1530986,0.10070801,0.7746582,-0.4111328,reading +-0.10175357,9.544485,2.4301147,0.386091,0.48693,0.611933,6.7324953,-6.7133417,-4.247314,0.11340332,0.8291626,-0.30474854,reading +-0.19871874,9.470264,2.0638018,0.333603,0.521783,0.665704,7.091625,-6.1387334,-4.4005427,0.13031006,0.8366089,-0.26818848,reading +-0.21667525,9.563639,2.1428106,0.356477,0.510714,0.640012,6.8426285,-6.612785,-4.6160207,0.17901611,0.8216553,-0.24829102,reading +-0.22266077,8.842984,-4.537012,0.356985,0.765486,0.472036,3.0071173,-8.690952,-2.801216,0.2524414,0.791687,-0.47131348,reading +-1.3934253,9.868899,-1.4269443,0.324254,0.724224,0.54202,3.7014358,-7.824251,-0.038307227,-0.06591797,0.6723633,-0.69799805,reading +-0.40102878,9.528923,-1.316811,0.311577,0.703091,0.560119,6.143522,-5.2768207,3.8977604,-0.13586426,0.536499,-0.78045654,reading +-0.30885202,10.247183,-1.7669208,0.30072,0.703998,0.560515,2.815581,-0.23463176,8.66701,-0.1743164,-0.044921875,-0.9202881,reading +-1.4652514,9.01776,3.4009635,0.26317,0.521783,0.69711,-0.6751649,-5.291186,-8.714894,-0.37243652,0.88983154,-0.23016357,reading +-1.6124948,9.473856,3.21661,0.259809,0.520139,0.694731,-0.6751649,-5.291186,-8.714894,-0.37243652,0.88983154,-0.23016357,reading +-1.553837,9.440337,3.3387144,0.258307,0.524715,0.685753,-0.6751649,-5.291186,-8.714894,-0.37243652,0.88983154,-0.23016357,reading +-0.58298814,9.3421755,2.7593174,0.262307,0.523689,0.684083,-0.6751649,-5.291186,-8.714894,-0.37243652,0.88983154,-0.23016357,reading +-0.9576807,9.220071,3.0992942,0.263974,0.522447,0.683864,-0.6751649,-5.291186,-8.714894,-0.37243652,0.88983154,-0.23016357,reading +-0.8619126,8.913613,3.0322564,0.268156,0.520667,0.683479,-0.6751649,-5.291186,-8.714894,-0.37243652,0.88983154,-0.23016357,reading +-0.88944596,9.701305,2.9616275,0.272036,0.519901,0.681376,-0.6751649,-5.291186,-8.714894,-0.37243652,0.88983154,-0.23016357,reading +-0.5231331,8.980651,3.1483753,0.274279,0.520218,0.680266,-0.6751649,-5.291186,-8.714894,-0.37243652,0.88983154,-0.23016357,reading diff --git a/datasets/backup/activity_data_readme.txt b/datasets/backup/activity_data_readme.txt new file mode 100644 index 0000000000000000000000000000000000000000..47610a70c31db34d8fe1b83cb20e4dd99bb35316 --- /dev/null +++ b/datasets/backup/activity_data_readme.txt @@ -0,0 +1,17 @@ +Columns: + +Col 1: smartphone acceleration x +Col 2: smartphone acceleration y +Col 3: smartphone acceleration z +Col 4: smartphone rotation x +Col 5: smartphone rotation y +Col 6: smartphone rotation z +Col 7: watch acceleration x +Col 8: watch acceleration y +Col 9: watch acceleration z +Col 10: watch rotation x +Col 11: watch rotation y +Col 12: watch rotation z +Col 13: Activity + +Activity: walking, reading, working, dancing, lying, getting up \ No newline at end of file diff --git a/datasets/backup/activity_model.eg b/datasets/backup/activity_model.eg index 9e8e7dd5b6fb787250d60beb9827f673fdd59424..03530cd457c6b950e0d9b5f659763d1ab09132a4 100644 --- a/datasets/backup/activity_model.eg +++ b/datasets/backup/activity_model.eg @@ -1,4 +1,4 @@ -encog,BasicNetwork,java,3.4.0,1,1557488730242 +encog,BasicNetwork,java,3.4.0,1,1557909364798 [BASIC] [BASIC:PARAMS] [BASIC:NETWORK] @@ -8,15 +8,15 @@ contextTargetOffset=0,0,0 contextTargetSize=0,0,0 endTraining=2 hasContext=f -inputCount=4 -layerCounts=1,8,5 -layerFeedCounts=1,7,4 +inputCount=12 +layerCounts=6,20,13 +layerFeedCounts=6,19,12 layerContextCount=0,0,0 -layerIndex=0,1,9 -output=0.5539299775,0.0770594835,-0.302657233,0.9894768853,-0.0460538615,-0.9564997713,0.1328260972,0.84692464,1,-1,0.4666666667,0.0909090909,-0.7627118644,1 -outputCount=1 -weightIndex=0,8,43 -weights=-0.2082891814,-0.6843874613,0.600132684,0.2232178679,0.6316689217,-0.7989016095,0.7585971909,-0.0827567588,-0.0800286678,4.124276145,1.1983455831,1.6385983977,-0.7866403776,-0.8163260492,-0.2264578939,0.5625320698,-0.2546902571,-1.2684824676,-1.0893738235,0.1764525443,0.6958134679,-0.575860844,0.9468363747,-3.3934510615,0.4590571878,1.1354141604,4.7051910634,-0.1682786324,1.3419375086,0.708864249,2.5175195691,1.2754066059,-0.1480365369,-0.8213163364,-0.5841608912,-3.5535412204,0.168548408,0.0365107638,-0.6519168374,-0.6772203052,0.3567520699,-0.1143981536,0.789607884 +layerIndex=0,6,26 +output=-1,-0.999941951,-0.9999999856,-1,-1,0.9999421247,-0.777513258,-0.7259196773,0.9943765659,0.2481214155,-0.9814528965,0.9999864488,0.8404129084,0.815836082,-0.9999989535,0.9995247829,0.9987382279,0.9999999049,-0.9993081609,0.9999665456,0.0509152395,-0.8630395179,0.4931944657,-0.1322178208,0.9999336481,1,0.4095700256,-0.2608455519,0.0890803147,0.3287271902,0.4880132997,0.6346281069,-0.0117173787,0.0520885687,-0.2136645978,0.1085839609,0.866751363,-0.3758290953,1 +outputCount=6 +weightIndex=0,120,367 +weights=-0.807860843,8.8038595602,-0.8887942697,-0.2482259862,-2.6715815966,-1.0147829779,7.2253854391,0.7677979664,1.7393951081,-7.2205204777,-0.7158564085,3.0659070964,3.460430261,-3.4329922327,0.4101927722,0.5453784703,0.8165530436,4.716875382,-9.6201236498,-5.7367951892,3.9799156577,9.3348279088,4.3915877547,-0.9147907016,-1.7637150424,-2.7951061173,7.6193279235,-4.4430554019,-0.6973245171,-1.8487781215,2.9578768242,0.6977835646,0.7270075459,1.2480878691,0.668025993,0.1428382909,-2.4617953279,-0.2217855075,0.0254528069,-2.981585079,1.6282585196,-0.123622186,-2.642368101,0.4103229791,5.5673626759,-0.421941354,-3.3722786503,1.8104388855,-2.7510241109,5.2326127548,-1.8029666076,-3.1279903984,-1.6582358081,0.0226427407,2.1153790407,2.4102985138,6.1979803649,-3.7889081155,-4.2349389036,-0.5113515473,-0.2616336967,1.9955826497,-0.5420221412,-0.1549681702,-1.0180144348,-0.1927509066,5.3269241013,-0.3952759864,0.0633167711,-8.7414544467,0.1551191587,-0.9060537306,3.4643463816,2.2219189245,-0.2830296756,-2.8926155153,2.6588479413,3.3352304344,0.2609626681,-9.065642271,0.7275716345,-1.2859638865,-3.7540899608,-5.3612454672,-6.9330880077,0.8274510555,-3.9138051076,-4.4586802452,2.1717905474,-3.3279739569,-3.74504423,1.8891972626,1.2931913191,-2.5456423367,-5.1830694786,-1.6635311191,-3.7291349263,0.286879429,2.1580527517,-0.2163243754,-5.6846687803,7.9164040735,0.5900152192,-0.2679985126,-1.3297131527,-2.133254549,-2.1924118344,6.4289779109,-0.8614422947,0.2892541908,6.1373131091,-0.2703515541,0.3932655947,2.9867383773,-0.6807448746,-0.095529382,0.2974641783,4.1823114205,-1.0837319058,-4.7038277485,0.4185182341,-0.9951654318,0.2924012395,-0.0815542105,-0.8483176531,-0.6343641976,-3.7267050898,4.1385523559,-0.7234322421,-0.0015920523,-0.4730048327,0.0128334369,-0.6515477238,0.8310683874,0.0521112099,-0.5004614845,-1.0406931325,1.3495184796,-0.2784626262,-0.947876886,0.6484202615,-0.2346390883,-0.2206284681,-0.03828563,-0.0329968586,-1.3922884721,0.9494749126,-0.3180778658,8.0211237756,-2.2580258465,-0.3995282874,-0.303448834,1.1066965634,24.0728334823,-0.2268280352,0.621235355,0.5665754615,0.1514082922,1.0879794154,1.1645559023,-0.0117356823,-1.3819606127,-3.3123220925,0.6648250903,-1.6811483001,-1.6092396571,1.1668127368,-0.091563689,1.3543509411,0.5426333618,-0.9005430424,0.6727610283,0.1508518783,0.7658848177,-0.6238762641,0.1918777366,0.9575425248,-0.7813803874,-4.4141316982,-2.9532385753,-1.195273283,-0.8080480854,-2.3065462071,0.0843507156,-0.2111857155,1.4642106112,-4.7755876,-0.5370941079,-1.5263216423,-0.1014997225,2.1228042729,-23.4394575118,0.4425709962,-2.7757958543,-2.3844200037,2.4050551606,1.0774484478,1.0461020878,1.8054486912,0.6288737367,0.4917246094,0.3816336935,0.2819198813,-0.0644500815,-1.0245826722,1.6927726875,-0.8068175833,3.2796910576,0.3827983311,1.9838446556,0.1663296295,0.4224175548,-3.2757536796,0.9584898403,-1.2231130137,0.0180498101,1.2252324384,2.218881373,-0.3344132966,-0.3760729952,0.9674830185,-0.4498532874,-0.0358966168,-0.1184934549,-0.40083101,1.5611803497,-0.7624288785,-0.7570238654,-0.2308594882,0.0331855661,-0.2331280737,1.7124860429,11.8307142364,-4.9747223711,-3.6972670918,0.9359122321,0.2805586653,0.5789046139,-0.4821827218,-0.5012618865,3.3308922329,3.0138742365,-0.649170218,-0.9814744155,0.6945653399,0.6042909188,-0.1040725816,0.8212366277,-0.7628021895,0.7945614402,-0.2370907549,0.7213069448,-5.2216507996,12.1953689108,0.9492669179,0.303654359,3.829532799,-7.3786426345,0.80285708,-2.3124877047,1.2685793389,-0.1157147691,-0.5218090624,-4.0184887608,2.3634224307,-0.4882525326,6.7893181498,18.5185159236,0.7401208222,1.5431987902,-0.4885846641,0.798421274,-2.1382117969,-0.3478095562,0.5642447262,-0.0422708974,0.1442477143,0.5305670784,0.841046642,-0.1539811203,-2.7790660636,0.3551749119,1.483760715,-0.6033067485,0.3766643263,-1.6615927455,-1.9694684241,1.3991149167,-0.2560674616,-0.1958520363,-0.6078569689,6.8193613163,4.5918831032,-2.3098023508,1.20716916,0.4349728529,0.6212960796,-4.7749593857,-0.4298368881,1.128089427,-3.8929915406,0.2233455323,0.8800441891,0.4479777042,0.7693426614,-2.3334096263,-1.0958133765,-0.5217239264,-0.8230662116,1.0920240838,-1.4266851988,-3.2618651917,0.9524133401,0.3088891939,0.6451786072,0.5672551395,0.6086541809,-0.1986973089,-0.3584497656,1.1775602855,-2.2594346031,-1.0000204681,1.5632794451,-1.3091885793,-3.0474806335,0.5907196404,0.7939783867,-0.6395074293,0.6107121212,-2.6820035151,1.1298062973,1.1231689873,-0.0859923099,0.3190423508,10.8199124833,-1.2338391087,1.0758309334,5.02998815,-0.0794477004,2.2269367409,-0.2592628727,0.4566760146,-0.4808110322,0.6787999485,0.9621965111,-1.5319912869,1.6434800583,2.56489109,-2.8561671135,-1.2477765961,-0.9302886149,0.443918428,4.195332394,0.0876081994,1.8887291587,-4.2659978401,-0.4024067255,0.743976285,-0.7993538026,-0.3815844929,0.6602616772,-1.9021562524,-6.1477056809,-1.0920029222,1.8100708581,-0.3694162085,0.8981589549 biasActivation=0,1,1 [BASIC:ACTIVATION] "org.encog.engine.network.activation.ActivationTANH" diff --git a/datasets/backup/preference_data.csv b/datasets/backup/preference_data.csv index 12c125ce2bbdc9ec6bb9762f05f6a83c3b863bb0..264467a975f3de3001a57bc9902ec5d9308db23f 100644 --- a/datasets/backup/preference_data.csv +++ b/datasets/backup/preference_data.csv @@ -1,418 +1,600 @@ -7,20,12,13,2 -7,20,14,40,1 -7,20,14,40,2 -7,21,13,2,2 -7,21,13,2,2 -7,21,14,23,2 -7,21,14,23,2 -7,21,15,41,2 -7,21,16,54,2 -7,21,16,54,2 -7,21,17,45,3 -7,22,12,28,3 -7,22,15,35,2 -7,22,15,35,2 -7,22,18,59,3 -7,22,18,59,3 -7,23,12,32,2 -7,23,12,32,2 -7,23,16,7,2 -7,23,16,7,2 -7,23,16,7,2 -7,23,16,7,2 -7,23,16,7,2 -7,24,12,4,0 -7,24,12,4,0 -7,24,12,4,1 -7,24,14,38,2 -7,24,14,38,2 -7,24,18,54,3 -7,25,12,31,0 -7,25,12,32,1 -7,25,12,32,1 -7,25,15,6,3 -7,25,18,56,3 -7,26,13,41,2 -7,26,19,14,3 -7,27,11,39,2 -7,27,11,39,3 -7,27,11,46,3 -7,27,11,46,2 -7,27,13,8,2 -7,27,13,8,2 -7,27,13,9,2 -7,27,13,45,2 -7,27,13,45,2 -7,27,15,38,3 -7,28,12,12,2 -7,28,12,13,2 -7,28,12,41,2 -7,28,12,41,2 -7,28,12,41,2 -7,28,14,0,1 -7,28,14,0,2 -7,28,15,21,3 -7,28,18,56,3 -7,29,10,9,1 -7,29,10,9,1 -7,29,10,9,1 -7,29,11,54,0 -7,29,11,54,0 -7,29,11,54,0 -7,29,11,54,1 -7,29,14,10,2 -7,29,16,44,2 -7,29,16,44,2 -7,30,16,7,3 -7,30,18,45,3 -7,31,13,2,0 -7,31,13,2,1 -7,31,13,3,1 -7,31,13,3,1 -7,31,13,3,1 -7,31,18,39,3 -8,1,12,22,0 -8,1,12,22,1 -8,1,14,20,2 -8,1,14,20,2 -8,1,14,20,2 -8,1,15,55,3 -8,1,18,31,3 -8,1,18,37,3 -8,1,18,37,3 -8,1,19,2,3 -8,1,19,2,3 -8,1,20,5,3 -8,2,10,9,2 -8,2,10,9,1 -8,2,10,9,2 -8,2,10,9,2 -8,2,13,58,2 -8,2,13,58,2 -8,2,15,44,3 -8,2,15,44,3 -8,2,15,44,3 -8,2,17,21,3 -8,2,17,21,3 -8,2,17,21,3 -8,3,13,31,1 -8,3,13,31,2 -8,3,13,32,2 -8,3,16,43,3 -8,4,13,20,1 -8,4,13,20,2 -8,4,18,27,3 -8,5,13,37,2 -8,5,13,37,2 -8,5,18,33,3 -8,6,11,24,3 -8,6,11,24,3 -8,6,11,24,3 -8,6,13,50,3 -8,7,13,4,2 -8,7,13,4,2 -8,7,14,56,3 -8,8,12,13,2 -8,8,12,13,2 -8,8,15,51,2 -8,8,15,51,2 -8,8,15,51,3 -8,9,13,32,2 -8,9,13,32,2 -8,9,13,32,2 -8,9,15,8,2 -8,9,15,8,2 -8,9,15,8,2 -8,9,16,19,2 -8,10,11,32,0 -8,10,11,32,1 -8,10,11,32,1 -8,10,13,13,1 -8,10,13,13,1 -8,10,13,13,2 -8,10,16,42,3 -8,10,16,42,3 -8,11,14,6,2 -8,11,14,7,2 -8,11,18,54,3 -8,11,18,54,3 -8,11,18,54,3 -8,12,12,27,1 -8,12,12,27,1 -8,12,12,28,1 -8,12,13,53,2 -8,12,13,53,2 -8,12,13,53,2 -8,12,15,21,3 -8,13,13,16,1 -8,13,13,16,1 -8,13,13,16,1 -8,13,14,14,2 -8,13,14,14,2 -8,13,16,11,3 -8,13,17,18,3 -8,14,13,7,1 -8,14,13,7,1 -8,14,13,7,1 -8,14,13,7,1 -8,14,13,7,2 -8,14,13,7,2 -8,14,15,6,3 -8,15,14,5,2 -8,15,14,5,2 -8,15,14,6,2 -8,15,14,6,2 -8,15,16,41,3 -8,15,16,41,3 -8,15,17,30,3 -8,16,13,40,2 -8,16,13,40,2 -8,16,17,52,3 -8,16,17,53,3 -8,17,13,34,1 -8,17,13,35,2 -8,17,14,7,2 -8,17,19,2,3 -8,18,10,21,3 -8,18,11,14,2 -8,18,11,14,2 -8,18,11,14,2 -8,18,11,14,2 -8,18,14,25,2 -8,18,14,25,3 -8,18,14,25,2 -8,18,18,18,3 -8,18,18,19,3 -8,19,18,33,3 -8,19,18,33,3 -8,19,18,33,3 -8,19,18,33,3 -8,20,14,28,2 -8,20,14,28,2 -8,20,14,28,2 -8,20,14,28,2 -8,20,17,8,3 -8,20,18,22,3 -8,21,11,24,1 -8,21,11,24,1 -8,21,11,24,1 -8,21,15,34,3 -8,21,18,55,3 -8,22,12,3,1 -8,22,12,4,2 -8,22,12,4,2 -8,22,13,51,2 -8,22,13,51,2 -8,22,13,51,2 -8,22,18,12,3 -8,22,18,12,3 -8,22,18,12,3 -8,22,18,12,3 -8,22,18,40,3 -8,22,18,40,3 -8,23,13,42,1 -8,23,13,42,1 -8,23,17,32,3 -8,23,19,28,3 -8,23,20,27,3 -8,23,20,27,3 -8,23,21,49,3 -8,24,14,0,2 -8,24,14,0,2 -8,24,14,0,2 -8,24,14,0,2 -8,24,15,4,3 -8,24,15,4,3 -8,24,16,2,3 -8,24,16,3,3 -8,24,16,37,3 -8,24,17,9,3 -8,24,17,14,3 -8,25,13,34,1 -8,25,13,34,1 -8,25,13,34,1 -8,25,13,34,1 -8,25,13,34,1 -8,25,15,1,3 -8,25,17,58,3 -8,26,10,29,0 -8,26,10,29,0 -8,26,10,29,0 -8,26,10,29,0 -8,26,10,29,0 -8,26,16,42,3 -8,26,16,42,3 -8,26,18,41,3 -8,26,18,41,3 -8,27,13,41,2 -8,27,13,41,2 -8,27,13,41,2 -8,27,13,41,2 -8,27,17,42,3 -8,28,11,9,1 -8,28,11,9,1 -8,28,12,14,0 -8,28,12,14,1 -8,28,12,14,0 -8,28,15,3,2 -8,28,15,3,2 -8,28,16,31,3 -8,28,17,40,3 -8,29,14,44,3 -8,29,17,25,3 -8,30,12,5,0 -8,30,12,5,0 -8,30,12,5,0 -8,30,13,32,1 -8,30,13,32,1 -8,30,13,56,2 -8,30,14,23,2 -8,30,14,23,2 -8,30,14,23,2 -8,30,14,23,2 -8,30,14,41,2 -8,30,14,41,2 -8,30,14,41,2 -8,30,15,50,3 -8,30,17,0,3 -8,30,18,59,3 -8,30,18,59,3 -8,31,14,31,2 -8,31,14,31,2 -8,31,14,31,2 -8,31,17,59,3 -8,31,18,0,3 -9,1,16,13,3 -9,1,16,13,3 -9,1,16,13,3 -9,1,17,41,3 -9,2,13,44,1 -9,2,13,44,1 -9,2,13,44,1 -9,2,14,49,2 -9,2,14,49,2 -9,2,14,49,2 -9,2,16,6,3 -9,2,16,6,3 -9,2,17,2,3 -9,3,16,9,3 -9,3,17,35,3 -9,3,17,36,3 -9,4,12,57,1 -9,4,12,57,1 -9,4,15,8,3 -9,4,15,34,3 -9,4,16,26,3 -9,4,16,26,3 -9,4,18,37,3 -9,4,18,37,3 -9,4,18,37,3 -9,6,11,18,0 -9,6,11,18,0 -9,6,12,54,1 -9,6,12,54,1 -9,6,14,21,2 -9,6,14,21,2 -9,6,19,20,3 -9,7,11,50,0 -9,7,14,17,2 -9,7,14,57,3 -9,7,14,57,3 -9,7,16,56,3 -9,7,16,56,3 -9,7,16,56,3 -9,7,16,56,3 -9,7,18,38,3 -9,7,18,38,3 -9,8,11,4,2 -9,8,11,4,2 -9,8,11,13,0 -9,8,11,13,0 -9,8,11,13,0 -9,8,11,13,0 -9,8,11,13,0 -9,8,11,14,0 -9,8,11,14,1 -9,8,11,14,1 -9,8,12,1,0 -9,8,12,1,0 -9,8,12,1,0 -9,8,12,1,0 -9,8,12,1,0 -9,8,12,1,1 -9,8,12,36,0 -9,8,12,36,0 -9,8,12,36,0 -9,8,12,36,0 -9,8,12,36,0 -9,8,13,37,1 -9,8,13,37,1 -9,8,13,37,1 -9,8,14,20,2 -9,8,14,20,2 -9,8,18,20,3 -9,9,12,47,1 -9,9,12,47,2 -9,9,12,47,2 -9,9,19,5,3 -9,10,13,15,1 -9,10,13,15,1 -9,10,13,15,0 -9,10,16,49,3 -9,10,19,6,3 -9,10,21,5,3 -9,11,14,16,2 -9,11,14,16,2 -9,11,14,16,2 -9,11,18,41,3 -9,12,14,43,2 -9,12,14,43,2 -9,12,14,43,2 -9,12,16,14,3 -9,12,17,12,3 -9,12,17,12,2 -9,12,17,12,3 -9,12,17,12,2 -9,12,20,44,3 -9,13,19,52,3 -9,14,14,39,2 -9,14,14,39,2 -9,14,15,14,3 -9,14,17,29,3 -9,14,17,29,3 -9,14,17,29,3 -9,15,11,41,1 -9,15,11,41,1 -9,15,13,4,1 -9,15,14,3,1 -9,15,14,3,2 -9,16,12,36,1 -9,16,12,36,1 -9,16,12,36,1 -9,16,12,36,1 -9,16,12,48,1 -9,16,12,48,1 -9,16,13,51,1 -9,16,13,51,2 -9,16,13,51,1 -9,16,15,13,3 -9,16,15,14,3 -9,16,15,14,3 -9,17,10,27,0 -9,17,10,27,0 -9,17,11,10,0 -9,17,11,10,0 -9,17,11,10,0 -9,17,12,43,1 -9,17,12,43,1 -9,17,12,43,1 -9,17,13,32,1 -9,17,13,32,1 -9,17,14,5,1 -9,17,14,5,2 -9,17,14,6,2 -9,17,15,7,3 -9,17,15,49,3 -9,17,15,49,3 -9,17,18,12,3 -9,17,18,13,3 +walking,medium,120,70 +walking,bright,120,0 +walking,medium,120,70 +walking,bright,120,0 +walking,bright,120,0 +walking,medium,120,70 +walking,bright,120,0 +walking,bright,120,0 +walking,bright,120,0 +walking,medium,120,70 +walking,bright,120,0 +walking,bright,120,0 +walking,bright,120,0 +walking,bright,120,0 +walking,bright,120,0 +walking,medium,120,70 +walking,medium,120,70 +walking,dimmer,120,40 +walking,medium,120,70 +walking,bright,120,0 +walking,bright,120,0 +walking,bright,120,0 +walking,medium,120,70 +walking,bright,120,0 +walking,bright,120,0 +walking,medium,120,70 +walking,bright,120,0 +walking,bright,120,0 +walking,bright,120,0 +walking,bright,120,0 +walking,bright,120,0 +walking,bright,120,0 +walking,bright,120,0 +walking,medium,120,70 +walking,dark,120,100 +walking,bright,120,0 +walking,bright,120,0 +walking,bright,120,0 +walking,bright,120,0 +walking,medium,120,70 +walking,bright,120,0 +walking,medium,120,70 +walking,bright,120,0 +walking,bright,120,0 +walking,bright,120,0 +walking,bright,120,0 +walking,bright,120,0 +walking,medium,120,70 +walking,bright,120,0 +walking,bright,120,0 +walking,bright,120,0 +walking,medium,120,70 +walking,dimmer,120,40 +walking,bright,120,0 +walking,bright,120,0 +walking,bright,120,0 +walking,medium,120,70 +walking,bright,120,0 +walking,dark,120,100 +walking,medium,120,70 +walking,bright,120,0 +walking,bright,120,0 +walking,bright,120,0 +walking,bright,120,0 +walking,medium,120,70 +walking,medium,120,70 +walking,medium,120,70 +walking,medium,120,70 +walking,bright,120,0 +walking,medium,120,70 +walking,medium,120,70 +walking,bright,120,0 +walking,dark,120,100 +walking,medium,120,70 +walking,bright,120,0 +walking,dimmer,120,40 +walking,medium,120,70 +walking,medium,120,70 +walking,bright,120,0 +walking,bright,120,0 +walking,bright,120,0 +walking,medium,120,70 +walking,bright,120,0 +walking,bright,120,0 +walking,medium,120,70 +walking,bright,120,0 +walking,bright,120,0 +walking,bright,120,0 +walking,bright,120,0 +walking,medium,120,70 +walking,bright,120,0 +walking,bright,120,0 +walking,bright,120,0 +walking,medium,120,70 +walking,medium,120,70 +walking,bright,120,0 +walking,medium,120,70 +walking,bright,120,0 +walking,bright,120,0 +walking,bright,120,0 +reading,medium,180,70 +reading,medium,180,70 +reading,medium,180,70 +reading,bright,180,0 +reading,medium,180,70 +reading,bright,180,0 +reading,medium,180,70 +reading,bright,180,0 +reading,medium,180,70 +reading,bright,180,0 +reading,bright,180,0 +reading,medium,180,70 +reading,bright,180,0 +reading,bright,180,0 +reading,medium,180,70 +reading,bright,180,0 +reading,bright,180,0 +reading,medium,180,70 +reading,bright,180,0 +reading,dark,180,100 +reading,medium,180,70 +reading,medium,180,70 +reading,bright,180,0 +reading,bright,180,0 +reading,bright,180,0 +reading,bright,180,0 +reading,bright,180,0 +reading,dimmer,180,40 +reading,medium,180,70 +reading,bright,180,0 +reading,bright,180,0 +reading,bright,180,0 +reading,bright,180,0 +reading,dimmer,180,40 +reading,bright,180,0 +reading,medium,180,70 +reading,bright,180,0 +reading,bright,180,0 +reading,medium,180,70 +reading,medium,180,70 +reading,bright,180,0 +reading,bright,180,0 +reading,dimmer,180,40 +reading,bright,180,0 +reading,dark,180,100 +reading,bright,180,0 +reading,bright,180,0 +reading,bright,180,0 +reading,medium,180,70 +reading,medium,180,70 +reading,dimmer,180,40 +reading,bright,180,0 +reading,bright,180,0 +reading,bright,180,0 +reading,medium,180,70 +reading,bright,180,0 +reading,bright,180,0 +reading,bright,180,0 +reading,bright,180,0 +reading,bright,180,0 +reading,bright,180,0 +reading,dimmer,180,40 +reading,bright,180,0 +reading,dimmer,180,40 +reading,medium,180,70 +reading,dimmer,180,40 +reading,bright,180,0 +reading,medium,180,70 +reading,bright,180,0 +reading,medium,180,70 +reading,dimmer,180,40 +reading,bright,180,0 +reading,dark,180,100 +reading,bright,180,0 +reading,bright,180,0 +reading,bright,180,0 +reading,bright,180,0 +reading,bright,180,0 +reading,medium,180,70 +reading,bright,180,0 +reading,bright,180,0 +reading,medium,180,70 +reading,bright,180,0 +reading,bright,180,0 +reading,bright,180,0 +reading,bright,180,0 +reading,bright,180,0 +reading,bright,180,0 +reading,bright,180,0 +reading,bright,180,0 +reading,medium,180,70 +reading,bright,180,0 +reading,medium,180,70 +reading,dimmer,180,40 +reading,medium,180,70 +reading,bright,180,0 +reading,bright,180,0 +reading,bright,180,0 +reading,bright,180,0 +reading,medium,180,70 +working,medium,240,70 +working,medium,240,70 +working,medium,240,70 +working,medium,240,70 +working,dark,240,100 +working,bright,240,0 +working,bright,240,0 +working,medium,240,70 +working,medium,240,70 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,medium,240,70 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,medium,240,70 +working,bright,240,0 +working,medium,240,70 +working,bright,240,0 +working,bright,240,0 +working,medium,240,70 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,medium,240,70 +working,bright,240,0 +working,medium,240,70 +working,bright,240,0 +working,medium,240,70 +working,bright,240,0 +working,bright,240,0 +working,medium,240,70 +working,medium,240,70 +working,bright,240,0 +working,medium,240,70 +working,bright,240,0 +working,dimmer,240,40 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,medium,240,70 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,medium,240,70 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,medium,240,70 +working,medium,240,70 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,medium,240,70 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,medium,240,70 +working,medium,240,70 +working,bright,240,0 +working,bright,240,0 +working,medium,240,70 +working,medium,240,70 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,medium,240,70 +working,medium,240,70 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,medium,240,70 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,bright,240,0 +working,medium,240,70 +working,medium,240,70 +dancing,medium,300,70 +dancing,medium,300,70 +dancing,bright,300,0 +dancing,medium,300,70 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,medium,300,70 +dancing,medium,300,70 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,medium,300,70 +dancing,bright,300,0 +dancing,medium,300,70 +dancing,bright,300,0 +dancing,medium,300,70 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,medium,300,70 +dancing,bright,300,0 +dancing,medium,300,70 +dancing,bright,300,0 +dancing,medium,300,70 +dancing,bright,300,0 +dancing,medium,300,70 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,medium,300,70 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,medium,300,70 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,medium,300,70 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,medium,300,70 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,medium,300,70 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,dimmer,300,40 +dancing,medium,300,70 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,medium,300,70 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,dimmer,300,40 +dancing,dimmer,300,40 +dancing,medium,300,70 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,medium,300,70 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,medium,300,70 +dancing,medium,300,70 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,medium,300,70 +dancing,medium,300,70 +dancing,bright,300,0 +dancing,medium,300,70 +dancing,bright,300,0 +dancing,medium,300,70 +dancing,medium,300,70 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,medium,300,70 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,medium,300,70 +dancing,medium,300,70 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,medium,300,70 +dancing,dimmer,300,40 +dancing,bright,300,0 +dancing,bright,300,0 +dancing,medium,300,70 +lying,bright,7,0 +lying,bright,7,0 +lying,bright,7,0 +lying,medium,7,70 +lying,bright,7,0 +lying,bright,7,0 +lying,bright,7,0 +lying,bright,7,0 +lying,dimmer,7,40 +lying,bright,7,0 +lying,bright,7,0 +lying,dark,7,100 +lying,bright,7,0 +lying,dark,7,100 +lying,dimmer,7,40 +lying,medium,7,70 +lying,bright,7,0 +lying,medium,7,70 +lying,bright,7,0 +lying,bright,7,0 +lying,bright,7,0 +lying,bright,7,0 +lying,bright,7,0 +lying,bright,7,0 +lying,medium,7,70 +lying,medium,7,70 +lying,bright,7,0 +lying,bright,7,0 +lying,medium,7,70 +lying,medium,7,70 +lying,bright,7,0 +lying,dimmer,7,40 +lying,bright,7,0 +lying,bright,7,0 +lying,medium,7,70 +lying,bright,7,0 +lying,bright,7,0 +lying,medium,7,70 +lying,bright,7,0 +lying,bright,7,0 +lying,bright,7,0 +lying,bright,7,0 +lying,bright,7,0 +lying,bright,7,0 +lying,medium,7,70 +lying,bright,7,0 +lying,bright,7,0 +lying,bright,7,0 +lying,bright,7,0 +lying,bright,7,0 +lying,dimmer,7,40 +lying,medium,7,70 +lying,medium,7,70 +lying,dark,7,100 +lying,bright,7,0 +lying,bright,7,0 +lying,bright,7,0 +lying,bright,7,0 +lying,medium,7,70 +lying,bright,7,0 +lying,dimmer,7,40 +lying,bright,7,0 +lying,medium,7,70 +lying,bright,7,0 +lying,bright,7,0 +lying,bright,7,0 +lying,bright,7,0 +lying,bright,7,0 +lying,dimmer,7,40 +lying,bright,7,0 +lying,bright,7,0 +lying,bright,7,0 +lying,bright,7,0 +lying,bright,7,0 +lying,medium,7,70 +lying,bright,7,0 +lying,bright,7,0 +lying,bright,7,0 +lying,dimmer,7,40 +lying,medium,7,70 +lying,medium,7,70 +lying,dark,7,100 +lying,medium,7,70 +lying,medium,7,70 +lying,bright,7,0 +lying,medium,7,70 +lying,medium,7,70 +lying,bright,7,0 +lying,bright,7,0 +lying,medium,7,70 +lying,bright,7,0 +lying,bright,7,0 +lying,bright,7,0 +lying,bright,7,0 +lying,medium,7,70 +lying,bright,7,0 +lying,medium,7,70 +lying,medium,7,70 +lying,medium,7,70 +lying,medium,7,70 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,medium,60,70 +getting up,medium,60,70 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,medium,60,70 +getting up,dimmer,60,40 +getting up,medium,60,70 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,medium,60,70 +getting up,bright,60,0 +getting up,medium,60,70 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,medium,60,70 +getting up,medium,60,70 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,dimmer,60,40 +getting up,bright,60,0 +getting up,medium,60,70 +getting up,bright,60,0 +getting up,medium,60,70 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,medium,60,70 +getting up,bright,60,0 +getting up,medium,60,70 +getting up,medium,60,70 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,dark,60,100 +getting up,medium,60,70 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,medium,60,70 +getting up,bright,60,0 +getting up,medium,60,70 +getting up,bright,60,0 +getting up,medium,60,70 +getting up,bright,60,0 +getting up,medium,60,70 +getting up,bright,60,0 +getting up,medium,60,70 +getting up,medium,60,70 +getting up,bright,60,0 +getting up,medium,60,70 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,dimmer,60,40 +getting up,medium,60,70 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,dimmer,60,40 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,medium,60,70 +getting up,medium,60,70 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,dimmer,60,40 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,medium,60,70 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,bright,60,0 +getting up,medium,60,70 +getting up,medium,60,70 diff --git a/datasets/backup/preference_data_readme.txt b/datasets/backup/preference_data_readme.txt new file mode 100644 index 0000000000000000000000000000000000000000..44947a772810c26abf38c5a68474ec6bbc7930eb --- /dev/null +++ b/datasets/backup/preference_data_readme.txt @@ -0,0 +1,6 @@ +Columns: + +Col 1: Activity +Col 2: watch brightness range "bright, medium, dimmer, dark" +Col 3: hue_color_output(red 7; green 120; blue 240; yellow 60; sky blue 180; purple 300;) +Col 4: hue_brightness_output (1-100) \ No newline at end of file diff --git a/datasets/backup/preference_model.eg b/datasets/backup/preference_model.eg index d89080e7597a74eeaaeeaf446c888df5b71600d3..cade18634c901cab30b363c80045774c4db88849 100644 --- a/datasets/backup/preference_model.eg +++ b/datasets/backup/preference_model.eg @@ -1,4 +1,4 @@ -encog,BasicNetwork,java,3.4.0,1,1557488730417 +encog,BasicNetwork,java,3.4.0,1,1557911310910 [BASIC] [BASIC:PARAMS] [BASIC:NETWORK] @@ -8,15 +8,15 @@ contextTargetOffset=0,0,0 contextTargetSize=0,0,0 endTraining=2 hasContext=f -inputCount=4 -layerCounts=1,8,5 -layerFeedCounts=1,7,4 +inputCount=10 +layerCounts=2,7,11 +layerFeedCounts=2,6,10 layerContextCount=0,0,0 -layerIndex=0,1,9 -output=0.9469673794,-0.9648755961,0.8615541508,-0.8598528839,0.5985746411,0.8896383374,0.0598709889,-0.7822981866,1,0,0.5333333333,0.2727272727,-0.6949152542,1 -outputCount=1 -weightIndex=0,8,43 -weights=0.1888121717,0.4496118006,-1.3108981074,0.8611556326,0.5076833342,-0.5189541257,-0.2968254316,-0.6990598339,-0.8089266545,-0.1530258385,-0.87945706,1.4834066633,-0.6598364032,1.5228820144,1.169887457,3.2870010482,0.8457562238,0.3666779499,0.6063332336,-0.2016446519,-0.6531693308,0.0903625175,-0.944304788,-0.5361654522,-0.896277442,0.5212787332,-0.0307316926,1.0054148122,0.8043836161,-0.0353487384,4.7797646033,0.1127335867,0.2138097446,-0.5211129305,0.4496941391,0.33069296,0.2329707171,-0.1081882785,-1.2806698554,-1.433375251,1.5408642305,-0.1728879395,-0.8271776795 +layerIndex=0,2,9 +output=-0.9992727823,-0.9992696987,-0.9309740936,-0.5765606186,-0.9953403624,0.9980796561,0.9977514017,0.9923859296,1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,1 +outputCount=2 +weightIndex=0,14,80 +weights=1.9705514025,-0.3084166226,1.7528213458,-0.0974570978,-0.1499737841,-0.5540746477,0.2385935392,-0.1438372224,1.1557830664,0.0622712991,-1.8855878802,-1.2609309561,-0.6576113964,0.4297005747,-0.0311381565,0.1537766703,0.2964039735,1.5333395274,-1.0452772707,-0.9881976121,-0.2582409579,0.3716454615,0.4429387995,-0.0124670915,0.1443979736,-0.6120087732,-0.1460490608,0.298384149,-0.307728216,0.760185426,-0.5426063529,0.705179795,-1.7424144335,0.1061469767,1.1192085663,0.94546081,0.2091130262,0.2650630235,0.3748265294,0.9269442261,-0.9738232929,0.9948457131,0.5660549852,-0.7312612442,-0.6524477694,-0.4029404881,0.9567276632,-0.8347245317,0.2564905028,-0.8511409841,0.4024125147,-0.2976989124,0.2422415932,0.5954466086,0.5567668547,-0.1476278407,-1.8656056105,1.0121430706,-0.4530181582,-0.0465154741,0.3804366757,-0.2678650904,0.2841768014,-0.9278517911,-1.1565915328,3.2525598553,1.2799169446,0.4484322326,-0.8850576101,-1.1989224286,-0.7869492745,0.0781256597,-1.6645368809,-0.0024136924,0.21307976,-0.3029761097,-0.9576724355,0.8284677696,-1.5340053053,-0.6240855539 biasActivation=0,1,1 [BASIC:ACTIVATION] "org.encog.engine.network.activation.ActivationTANH" diff --git a/datasets/backup/test_data.csv b/datasets/backup/test_data.csv new file mode 100644 index 0000000000000000000000000000000000000000..12c125ce2bbdc9ec6bb9762f05f6a83c3b863bb0 --- /dev/null +++ b/datasets/backup/test_data.csv @@ -0,0 +1,418 @@ +7,20,12,13,2 +7,20,14,40,1 +7,20,14,40,2 +7,21,13,2,2 +7,21,13,2,2 +7,21,14,23,2 +7,21,14,23,2 +7,21,15,41,2 +7,21,16,54,2 +7,21,16,54,2 +7,21,17,45,3 +7,22,12,28,3 +7,22,15,35,2 +7,22,15,35,2 +7,22,18,59,3 +7,22,18,59,3 +7,23,12,32,2 +7,23,12,32,2 +7,23,16,7,2 +7,23,16,7,2 +7,23,16,7,2 +7,23,16,7,2 +7,23,16,7,2 +7,24,12,4,0 +7,24,12,4,0 +7,24,12,4,1 +7,24,14,38,2 +7,24,14,38,2 +7,24,18,54,3 +7,25,12,31,0 +7,25,12,32,1 +7,25,12,32,1 +7,25,15,6,3 +7,25,18,56,3 +7,26,13,41,2 +7,26,19,14,3 +7,27,11,39,2 +7,27,11,39,3 +7,27,11,46,3 +7,27,11,46,2 +7,27,13,8,2 +7,27,13,8,2 +7,27,13,9,2 +7,27,13,45,2 +7,27,13,45,2 +7,27,15,38,3 +7,28,12,12,2 +7,28,12,13,2 +7,28,12,41,2 +7,28,12,41,2 +7,28,12,41,2 +7,28,14,0,1 +7,28,14,0,2 +7,28,15,21,3 +7,28,18,56,3 +7,29,10,9,1 +7,29,10,9,1 +7,29,10,9,1 +7,29,11,54,0 +7,29,11,54,0 +7,29,11,54,0 +7,29,11,54,1 +7,29,14,10,2 +7,29,16,44,2 +7,29,16,44,2 +7,30,16,7,3 +7,30,18,45,3 +7,31,13,2,0 +7,31,13,2,1 +7,31,13,3,1 +7,31,13,3,1 +7,31,13,3,1 +7,31,18,39,3 +8,1,12,22,0 +8,1,12,22,1 +8,1,14,20,2 +8,1,14,20,2 +8,1,14,20,2 +8,1,15,55,3 +8,1,18,31,3 +8,1,18,37,3 +8,1,18,37,3 +8,1,19,2,3 +8,1,19,2,3 +8,1,20,5,3 +8,2,10,9,2 +8,2,10,9,1 +8,2,10,9,2 +8,2,10,9,2 +8,2,13,58,2 +8,2,13,58,2 +8,2,15,44,3 +8,2,15,44,3 +8,2,15,44,3 +8,2,17,21,3 +8,2,17,21,3 +8,2,17,21,3 +8,3,13,31,1 +8,3,13,31,2 +8,3,13,32,2 +8,3,16,43,3 +8,4,13,20,1 +8,4,13,20,2 +8,4,18,27,3 +8,5,13,37,2 +8,5,13,37,2 +8,5,18,33,3 +8,6,11,24,3 +8,6,11,24,3 +8,6,11,24,3 +8,6,13,50,3 +8,7,13,4,2 +8,7,13,4,2 +8,7,14,56,3 +8,8,12,13,2 +8,8,12,13,2 +8,8,15,51,2 +8,8,15,51,2 +8,8,15,51,3 +8,9,13,32,2 +8,9,13,32,2 +8,9,13,32,2 +8,9,15,8,2 +8,9,15,8,2 +8,9,15,8,2 +8,9,16,19,2 +8,10,11,32,0 +8,10,11,32,1 +8,10,11,32,1 +8,10,13,13,1 +8,10,13,13,1 +8,10,13,13,2 +8,10,16,42,3 +8,10,16,42,3 +8,11,14,6,2 +8,11,14,7,2 +8,11,18,54,3 +8,11,18,54,3 +8,11,18,54,3 +8,12,12,27,1 +8,12,12,27,1 +8,12,12,28,1 +8,12,13,53,2 +8,12,13,53,2 +8,12,13,53,2 +8,12,15,21,3 +8,13,13,16,1 +8,13,13,16,1 +8,13,13,16,1 +8,13,14,14,2 +8,13,14,14,2 +8,13,16,11,3 +8,13,17,18,3 +8,14,13,7,1 +8,14,13,7,1 +8,14,13,7,1 +8,14,13,7,1 +8,14,13,7,2 +8,14,13,7,2 +8,14,15,6,3 +8,15,14,5,2 +8,15,14,5,2 +8,15,14,6,2 +8,15,14,6,2 +8,15,16,41,3 +8,15,16,41,3 +8,15,17,30,3 +8,16,13,40,2 +8,16,13,40,2 +8,16,17,52,3 +8,16,17,53,3 +8,17,13,34,1 +8,17,13,35,2 +8,17,14,7,2 +8,17,19,2,3 +8,18,10,21,3 +8,18,11,14,2 +8,18,11,14,2 +8,18,11,14,2 +8,18,11,14,2 +8,18,14,25,2 +8,18,14,25,3 +8,18,14,25,2 +8,18,18,18,3 +8,18,18,19,3 +8,19,18,33,3 +8,19,18,33,3 +8,19,18,33,3 +8,19,18,33,3 +8,20,14,28,2 +8,20,14,28,2 +8,20,14,28,2 +8,20,14,28,2 +8,20,17,8,3 +8,20,18,22,3 +8,21,11,24,1 +8,21,11,24,1 +8,21,11,24,1 +8,21,15,34,3 +8,21,18,55,3 +8,22,12,3,1 +8,22,12,4,2 +8,22,12,4,2 +8,22,13,51,2 +8,22,13,51,2 +8,22,13,51,2 +8,22,18,12,3 +8,22,18,12,3 +8,22,18,12,3 +8,22,18,12,3 +8,22,18,40,3 +8,22,18,40,3 +8,23,13,42,1 +8,23,13,42,1 +8,23,17,32,3 +8,23,19,28,3 +8,23,20,27,3 +8,23,20,27,3 +8,23,21,49,3 +8,24,14,0,2 +8,24,14,0,2 +8,24,14,0,2 +8,24,14,0,2 +8,24,15,4,3 +8,24,15,4,3 +8,24,16,2,3 +8,24,16,3,3 +8,24,16,37,3 +8,24,17,9,3 +8,24,17,14,3 +8,25,13,34,1 +8,25,13,34,1 +8,25,13,34,1 +8,25,13,34,1 +8,25,13,34,1 +8,25,15,1,3 +8,25,17,58,3 +8,26,10,29,0 +8,26,10,29,0 +8,26,10,29,0 +8,26,10,29,0 +8,26,10,29,0 +8,26,16,42,3 +8,26,16,42,3 +8,26,18,41,3 +8,26,18,41,3 +8,27,13,41,2 +8,27,13,41,2 +8,27,13,41,2 +8,27,13,41,2 +8,27,17,42,3 +8,28,11,9,1 +8,28,11,9,1 +8,28,12,14,0 +8,28,12,14,1 +8,28,12,14,0 +8,28,15,3,2 +8,28,15,3,2 +8,28,16,31,3 +8,28,17,40,3 +8,29,14,44,3 +8,29,17,25,3 +8,30,12,5,0 +8,30,12,5,0 +8,30,12,5,0 +8,30,13,32,1 +8,30,13,32,1 +8,30,13,56,2 +8,30,14,23,2 +8,30,14,23,2 +8,30,14,23,2 +8,30,14,23,2 +8,30,14,41,2 +8,30,14,41,2 +8,30,14,41,2 +8,30,15,50,3 +8,30,17,0,3 +8,30,18,59,3 +8,30,18,59,3 +8,31,14,31,2 +8,31,14,31,2 +8,31,14,31,2 +8,31,17,59,3 +8,31,18,0,3 +9,1,16,13,3 +9,1,16,13,3 +9,1,16,13,3 +9,1,17,41,3 +9,2,13,44,1 +9,2,13,44,1 +9,2,13,44,1 +9,2,14,49,2 +9,2,14,49,2 +9,2,14,49,2 +9,2,16,6,3 +9,2,16,6,3 +9,2,17,2,3 +9,3,16,9,3 +9,3,17,35,3 +9,3,17,36,3 +9,4,12,57,1 +9,4,12,57,1 +9,4,15,8,3 +9,4,15,34,3 +9,4,16,26,3 +9,4,16,26,3 +9,4,18,37,3 +9,4,18,37,3 +9,4,18,37,3 +9,6,11,18,0 +9,6,11,18,0 +9,6,12,54,1 +9,6,12,54,1 +9,6,14,21,2 +9,6,14,21,2 +9,6,19,20,3 +9,7,11,50,0 +9,7,14,17,2 +9,7,14,57,3 +9,7,14,57,3 +9,7,16,56,3 +9,7,16,56,3 +9,7,16,56,3 +9,7,16,56,3 +9,7,18,38,3 +9,7,18,38,3 +9,8,11,4,2 +9,8,11,4,2 +9,8,11,13,0 +9,8,11,13,0 +9,8,11,13,0 +9,8,11,13,0 +9,8,11,13,0 +9,8,11,14,0 +9,8,11,14,1 +9,8,11,14,1 +9,8,12,1,0 +9,8,12,1,0 +9,8,12,1,0 +9,8,12,1,0 +9,8,12,1,0 +9,8,12,1,1 +9,8,12,36,0 +9,8,12,36,0 +9,8,12,36,0 +9,8,12,36,0 +9,8,12,36,0 +9,8,13,37,1 +9,8,13,37,1 +9,8,13,37,1 +9,8,14,20,2 +9,8,14,20,2 +9,8,18,20,3 +9,9,12,47,1 +9,9,12,47,2 +9,9,12,47,2 +9,9,19,5,3 +9,10,13,15,1 +9,10,13,15,1 +9,10,13,15,0 +9,10,16,49,3 +9,10,19,6,3 +9,10,21,5,3 +9,11,14,16,2 +9,11,14,16,2 +9,11,14,16,2 +9,11,18,41,3 +9,12,14,43,2 +9,12,14,43,2 +9,12,14,43,2 +9,12,16,14,3 +9,12,17,12,3 +9,12,17,12,2 +9,12,17,12,3 +9,12,17,12,2 +9,12,20,44,3 +9,13,19,52,3 +9,14,14,39,2 +9,14,14,39,2 +9,14,15,14,3 +9,14,17,29,3 +9,14,17,29,3 +9,14,17,29,3 +9,15,11,41,1 +9,15,11,41,1 +9,15,13,4,1 +9,15,14,3,1 +9,15,14,3,2 +9,16,12,36,1 +9,16,12,36,1 +9,16,12,36,1 +9,16,12,36,1 +9,16,12,48,1 +9,16,12,48,1 +9,16,13,51,1 +9,16,13,51,2 +9,16,13,51,1 +9,16,15,13,3 +9,16,15,14,3 +9,16,15,14,3 +9,17,10,27,0 +9,17,10,27,0 +9,17,11,10,0 +9,17,11,10,0 +9,17,11,10,0 +9,17,12,43,1 +9,17,12,43,1 +9,17,12,43,1 +9,17,13,32,1 +9,17,13,32,1 +9,17,14,5,1 +9,17,14,5,2 +9,17,14,6,2 +9,17,15,7,3 +9,17,15,49,3 +9,17,15,49,3 +9,17,18,12,3 +9,17,18,13,3 diff --git a/eraser-base/build.gradle b/eraser-base/build.gradle index 2d0b1f8e78a2333cf594e8732e9ba30657a78db2..fbe5f76ec7b7097ca4ef1ca48181b4c26eb71433 100644 --- a/eraser-base/build.gradle +++ b/eraser-base/build.gradle @@ -118,6 +118,7 @@ task copyRagdoc(type: Copy, dependsOn: cleanRagdoc) { } generateAst.dependsOn preprocess +generateAst.inputs.files file("./src/main/jastadd/mainGen.ast"), file("./src/main/jastadd/mainGen.jadd") //compileJava.dependsOn jastadd // //// always run jastadd diff --git a/eraser-base/src/main/jastadd/Item.jrag b/eraser-base/src/main/jastadd/Item.jrag index c143c2bbdc23e9a0a3035f7293af1700baee740c..0b370142cf57c377775294bb6c758dafa7db036f 100644 --- a/eraser-base/src/main/jastadd/Item.jrag +++ b/eraser-base/src/main/jastadd/Item.jrag @@ -10,12 +10,19 @@ aspect ItemHandling { public void Item.enableSendState() { sendState = true; } public final boolean Item.isSendState() { return sendState; } + //--- DateTimeItem.ALTERNATIVE_FORMAT --- + private static final java.time.format.DateTimeFormatter DateTimeItem.ALTERNATIVE_FORMAT = new java.time.format.DateTimeFormatterBuilder() + .appendPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ") + .toFormatter() + .withZone(java.time.ZoneId.of("UTC")); + //--- getStateAsString --- syn String Item.getStateAsString(); eq ColorItem.getStateAsString() = getState().toString(); eq DateTimeItem.getStateAsString() = getState().toString(); eq ItemWithBooleanState.getStateAsString() = Boolean.toString(getState()); eq SwitchItem.getStateAsString() = getState() ? "ON" : "OFF"; + eq ContactItem.getStateAsString() = getState() ? "OPEN" : "CLOSED"; eq ItemWithDoubleState.getStateAsString() = Double.toString(getState()); eq ItemWithStringState.getStateAsString() = getState(); @@ -50,19 +57,24 @@ aspect ItemHandling { } } public void DateTimeItem.setStateFromString(String value) { - try{ + Exception exception = null; + // try normal instant parsing. Format example: 2019-07-22T12:58:08.960Z + try { this.setState(Instant.parse(value)); - } catch (java.time.format.DateTimeParseException e1) { - // try to read input as number and use that - try { - long time = Long.parseLong(value); - this.setStateFromLong(time); - // exit the method to avoid printing the error message for e1 - return; - } catch (NumberFormatException e2) { - logger.catching(e2); - } - logger.catching(e1); + return; + } catch (java.time.format.DateTimeParseException e) { /* empty */ } + // try openHAB parsing. Format example: 2019-07-22T12:58:08.960+0000 + try { + this.setState(ALTERNATIVE_FORMAT.parse(value, Instant::from)); + return; + } catch (java.time.format.DateTimeParseException e) { /* empty */ } + // try to read input as number and use that + try { + long time = Long.parseLong(value); + this.setStateFromLong(time); + return; + } catch (NumberFormatException e) { + logger.warn("Could not parse date value from {}", value); } } public void ItemWithBooleanState.setStateFromString(String value) { @@ -75,6 +87,20 @@ aspect ItemHandling { default: super.setStateFromString(value); } } + public void ContactItem.setStateFromString(String value) { + switch (value) { + case "OPEN": this.setState(true); break; + case "CLOSED": this.setState(false); break; + default: super.setStateFromString(value); + } + } + public void RollerShutterItem.setStateFromString(String value) { + switch (value) { + case "UP": this.setState(0); break; + case "DOWN": this.setState(100); break; + default: super.setStateFromString(value); + } + } public void ItemWithDoubleState.setStateFromString(String value) { this.setState(Double.parseDouble(value)); } @@ -288,7 +314,7 @@ aspect ItemHandling { //--- sendState --- protected void Item.sendState() throws Exception { for (MachineLearningModel model : getRelevantInMachineLearningModels()) { - model.getEncoder().newData(getRoot(), java.util.Collections.singletonList(this)); + model.getEncoder().newData(Collections.singletonList(this)); } } diff --git a/eraser-base/src/main/jastadd/Logging.jadd b/eraser-base/src/main/jastadd/Logging.jadd index dd41bc70f125081ea2ab6291ae48fa0272eea4c4..710bd79a7bce048213ce0d52bb42cae5176b832a 100644 --- a/eraser-base/src/main/jastadd/Logging.jadd +++ b/eraser-base/src/main/jastadd/Logging.jadd @@ -1,12 +1,21 @@ 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 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 Rule.logger = org.apache.logging.log4j.LogManager.getLogger(Rule.class); - private org.apache.logging.log4j.Logger MqttRoot.logger = org.apache.logging.log4j.LogManager.getLogger(MqttRoot.class); - private org.apache.logging.log4j.Logger InternalMachineLearningModel.logger = org.apache.logging.log4j.LogManager.getLogger(MachineLearningModel.class); + private org.apache.logging.log4j.Logger InternalMachineLearningModel.logger = org.apache.logging.log4j.LogManager.getLogger(InternalMachineLearningModel.class); + private org.apache.logging.log4j.Logger ExternalMachineLearningModel.logger = org.apache.logging.log4j.LogManager.getLogger(ExternalMachineLearningModel.class); + + // NeuralNetwork 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); + 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); } diff --git a/eraser-base/src/main/jastadd/MachineLearning.jrag b/eraser-base/src/main/jastadd/MachineLearning.jrag index e5fc2f6f3e8c2dd8e9cb17c38d1dfd2c88f4a465..e584d8f2f6b9f1b2b0ce140a46c005b32887e1dd 100644 --- a/eraser-base/src/main/jastadd/MachineLearning.jrag +++ b/eraser-base/src/main/jastadd/MachineLearning.jrag @@ -112,7 +112,8 @@ aspect MachineLearning { @Override 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 --- @@ -160,7 +161,33 @@ aspect MachineLearning { return this.decoder; } - // refine Item.stateUpdated +} + +aspect ChangeEvents { + private static final java.util.concurrent.atomic.AtomicInteger ChangeEvent.idCounter = new java.util.concurrent.atomic.AtomicInteger(0); + + //--- createRecognitionEvent --- + public static RecognitionEvent RecognitionEvent.createRecognitionEvent(MachineLearningModel modelOfRecognition) { + RecognitionEvent result = new RecognitionEvent(); + result.initChangeEvent(); + for (Item relevantItem : modelOfRecognition.getRelevantItems()) { + result.addChangedItem(ChangedItem.newFromItem(relevantItem)); + } + return result; + } + //--- newFromItem --- + public static ChangedItem ChangedItem.newFromItem(Item source) { + ChangedItem result = new ChangedItem(); + result.setItem(source); + result.setNewStateAsString(source.getStateAsString()); + return result; + } + + //--- initChangeEvent --- + protected void ChangeEvent.initChangeEvent() { + this.setCreated(Instant.now()); + this.setIdentifier(idCounter.incrementAndGet()); + } } diff --git a/eraser-base/src/main/jastadd/MachineLearning.relast b/eraser-base/src/main/jastadd/MachineLearning.relast index b31dacb02aea2143c22828f9d6fa15d24ad9c545..906d344b8f123fca5d617b174078dcfa56f7f4c8 100644 --- a/eraser-base/src/main/jastadd/MachineLearning.relast +++ b/eraser-base/src/main/jastadd/MachineLearning.relast @@ -3,7 +3,7 @@ MachineLearningRoot ::= [ActivityRecognition:MachineLearningModel] [PreferenceLe Activity ::= <Identifier:int> <Label:String> ; -abstract ChangeEvent ::= <Identifier:int> <Timestamp:long> ChangedItem* ; +abstract ChangeEvent ::= <Identifier:int> <Created:Instant> ChangedItem* ; ChangedItem ::= <NewStateAsString:String> ; rel ChangedItem.Item -> Item ; diff --git a/eraser-base/src/main/jastadd/Printing.jrag b/eraser-base/src/main/jastadd/Printing.jrag index 53206bc16b2a09708a33386393ade1f3310e1666..7402973f563eb21924f1f54a54ae8dc6d2bea848 100644 --- a/eraser-base/src/main/jastadd/Printing.jrag +++ b/eraser-base/src/main/jastadd/Printing.jrag @@ -207,4 +207,29 @@ aspect Printing { .build(); } +// Expressions + syn String ParenthesizedNumberExpression.prettyPrint() = "(" + getOperand().prettyPrint() + ")"; + syn String NumberLiteralExpression.prettyPrint() = Double.toString(getValue()); + syn String AddExpression.prettyPrint() = "(" + getLeftOperand().prettyPrint() + " + " + getRightOperand().prettyPrint() + ")"; + syn String SubExpression.prettyPrint() = "(" + getLeftOperand().prettyPrint() + " - " + getRightOperand().prettyPrint() + ")"; + syn String MultExpression.prettyPrint() = "(" + getLeftOperand().prettyPrint() + " * " + getRightOperand().prettyPrint() + ")"; + syn String DivExpression.prettyPrint() = "(" + getLeftOperand().prettyPrint() + " / " + getRightOperand().prettyPrint() + ")"; + syn String PowerExpression.prettyPrint() = "(" + getLeftOperand().prettyPrint() + " ^ " + getRightOperand().prettyPrint() + ")"; + syn String ParenthesizedLogicalExpression.prettyPrint() = "(" + getOperand().prettyPrint() + ")"; + syn String NotExpression.prettyPrint() = "!" + getOperand().prettyPrint(); + syn String ComparingExpression.prettyPrint() { + switch (getComparator()) { + case NotEquals: return "(" + getLeftOperand().prettyPrint() + " != " + getRightOperand().prettyPrint() + ")"; + case Equals: return "(" + getLeftOperand().prettyPrint() + " == " + getRightOperand().prettyPrint() + ")"; + case LessThan: return "(" + getLeftOperand().prettyPrint() + " < " + getRightOperand().prettyPrint() + ")"; + case GreaterThan: return "(" + getLeftOperand().prettyPrint() + " > " + getRightOperand().prettyPrint() + ")"; + case LessOrEqualThan: return "(" + getLeftOperand().prettyPrint() + " <= " + getRightOperand().prettyPrint() + ")"; + case GreaterOrEqualThan: return "(" + getLeftOperand().prettyPrint() + " >= " + getRightOperand().prettyPrint() + ")"; + default: throw new IllegalArgumentException("Unknown compartor type: " + getComparator()); + } + } + syn String AndExpression.prettyPrint() = "(" + getLeftOperand().prettyPrint() + " & " + getRightOperand().prettyPrint() + ")"; + syn String OrExpression.prettyPrint() = "(" + getLeftOperand().prettyPrint() + " | " + getRightOperand().prettyPrint() + ")"; + syn String Designator.prettyPrint() = getItem().getID(); + } diff --git a/eraser-base/src/main/jastadd/Util.jrag b/eraser-base/src/main/jastadd/Util.jrag index 282a44413c80ee2b5c5d71dca179ce4cf45c1fde..b038ca0dfae51d7bbea748086965b78e40f0c3e6 100644 --- a/eraser-base/src/main/jastadd/Util.jrag +++ b/eraser-base/src/main/jastadd/Util.jrag @@ -6,6 +6,7 @@ aspect Util { // } public void MqttRoot.setHostByName(String hostName) { setHost(ExternalHost.of(hostName, DEFAULT_PORT)); + flushCache(); } public void InfluxRoot.setHostByName(String hostName) { diff --git a/eraser-base/src/main/jastadd/eraser.flex b/eraser-base/src/main/jastadd/eraser.flex index 2bd49e50fdfadebce430f728fa056be76573e8d6..bc9b3e8d9a41c9bd4cc51d1879f081b32538f103 100644 --- a/eraser-base/src/main/jastadd/eraser.flex +++ b/eraser-base/src/main/jastadd/eraser.flex @@ -106,7 +106,7 @@ Comment = "//" [^\n\r]+ "<=" { return sym(Terminals.LE); } "==" { return sym(Terminals.EQ); } "!=" { return sym(Terminals.NE); } -"=>" { return sym(Terminals.GE); } +">=" { return sym(Terminals.GE); } ">" { return sym(Terminals.GT); } "+" { return sym(Terminals.PLUS); } "*" { return sym(Terminals.MULT); } diff --git a/eraser-base/src/main/jastadd/mqtt.jrag b/eraser-base/src/main/jastadd/mqtt.jrag index ee7e06e00e5979a416ab300cf5163cc731af2072..b3f9c2a24a0a62ccc1f360fdadaad4cd7bafe3b5 100644 --- a/eraser-base/src/main/jastadd/mqtt.jrag +++ b/eraser-base/src/main/jastadd/mqtt.jrag @@ -74,4 +74,14 @@ aspect MQTT { getMqttRoot().getMqttSender().publish(getOutgoingTopic(), message); } + refine OpenHAB2 public void OpenHAB2Model.addNewItem(Item item) { + refined(item); + // update mqtt-topic to new mqtt-root + JavaUtils.ifPresentOrElse( + getRoot().getMqttRoot().resolveTopicSuffix(item.getTopic().getTopicString()), + topic -> item.setTopic(topic), + () -> de.tudresden.inf.st.eraser.util.ParserUtils.createMqttTopic(item, item.getTopic().getTopicString(), getRoot()) + ); + } + } diff --git a/eraser-base/src/main/jastadd/openhab.jrag b/eraser-base/src/main/jastadd/openhab.jrag index 6d30e4b3e0fb91225c9e8ea08bfdf3ab1afb1357..56aa89f36ac62aa817352f45a639ae7c4aa62206 100644 --- a/eraser-base/src/main/jastadd/openhab.jrag +++ b/eraser-base/src/main/jastadd/openhab.jrag @@ -2,4 +2,12 @@ aspect OpenHAB2 { syn ActivityItem OpenHAB2Model.getActivityItem() { return new ActivityItem(); } + + public void OpenHAB2Model.addNewItem(Item item) { + JavaUtils.ifPresentOrElse( + resolveGroup(de.tudresden.inf.st.eraser.util.ParserUtils.UNKNOWN_GROUP_NAME), + group -> group.addItem(item), + () -> de.tudresden.inf.st.eraser.util.ParserUtils.createUnknownGroup(this, Collections.singletonList(item))); + } + } diff --git a/eraser-base/src/main/jastadd/openhab.relast b/eraser-base/src/main/jastadd/openhab.relast index 7d7d9afa27f9f9998f6c5bd4b9822f0dfa774e8d..575f875734994ee52ba5259e5cfe570aa488c139 100644 --- a/eraser-base/src/main/jastadd/openhab.relast +++ b/eraser-base/src/main/jastadd/openhab.relast @@ -40,7 +40,7 @@ ImageItem : ItemWithStringState ; LocationItem : ItemWithStringState ; NumberItem : ItemWithDoubleState ; PlayerItem : ItemWithStringState ; -RollerShutterItem : ItemWithBooleanState ; +RollerShutterItem : ItemWithDoubleState ; StringItem : ItemWithStringState ; SwitchItem : ItemWithBooleanState ; DefaultItem : ItemWithStringState ; diff --git a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/InternalMachineLearningHandler.java b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/InternalMachineLearningHandler.java index 2c59f46ca48fc18afa7aa096571a19ef9bef4b44..75d2a1d8cfc28c0293f1d55cc4e6714a6e37818a 100644 --- a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/InternalMachineLearningHandler.java +++ b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/InternalMachineLearningHandler.java @@ -22,7 +22,12 @@ public class InternalMachineLearningHandler implements MachineLearningEncoder, M } @Override - public void newData(Root model, List<Item> changedItems) { + public void setKnowledgeBaseRoot(Root root) { + // ignored + } + + @Override + public void newData(List<Item> changedItems) { logger.debug("Ignored new data of {}", changedItems); } diff --git a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MachineLearningDecoder.java b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MachineLearningDecoder.java index a6e01fb945226bcf91e4bc94663c24b561f7cd6f..045c7695ba325429a3ba82a4e1319e0926aa043b 100644 --- a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MachineLearningDecoder.java +++ b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MachineLearningDecoder.java @@ -9,7 +9,7 @@ import java.time.Instant; * @author rschoene - Initial contribution */ @SuppressWarnings("unused") -public interface MachineLearningDecoder { +public interface MachineLearningDecoder extends MachineLearningSetRoot { /** * Execute the machine learning model and returns the classification result. diff --git a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MachineLearningEncoder.java b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MachineLearningEncoder.java index 8cf4d78fd92a2c18bd4914ab5b805db63995be85..23ca8959f468b8210c287b163a217a0224f7d283 100644 --- a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MachineLearningEncoder.java +++ b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MachineLearningEncoder.java @@ -1,8 +1,5 @@ package de.tudresden.inf.st.eraser.jastadd.model; -import de.tudresden.inf.st.eraser.jastadd.model.Item; -import de.tudresden.inf.st.eraser.jastadd.model.Root; - import java.util.List; /** @@ -13,14 +10,13 @@ import java.util.List; * @author rschoene - Initial contribution */ @SuppressWarnings("unused") -public interface MachineLearningEncoder { +public interface MachineLearningEncoder extends MachineLearningSetRoot { /** * Update when new data is available. - * @param model The underlying model * @param changedItems A list of items whose state has changed */ - void newData(Root model, List<Item> changedItems); + void newData(List<Item> changedItems); // to be discussed, in which form this is specified diff --git a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MachineLearningSetRoot.java b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MachineLearningSetRoot.java new file mode 100644 index 0000000000000000000000000000000000000000..13fec09c243d0d15c4f5e41a8c8851321c26d5d5 --- /dev/null +++ b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/jastadd/model/MachineLearningSetRoot.java @@ -0,0 +1,17 @@ +package de.tudresden.inf.st.eraser.jastadd.model; + +/** + * Common interface for both {@link MachineLearningDecoder} and {@link MachineLearningEncoder}. + * + * @author rschoene - Initial contribution + */ +public interface MachineLearningSetRoot { + + /** + * Informs this handler of the knowledge base. + * This method is called before any other of the interface methods. + * @param root The root node of the knowledge base + */ + void setKnowledgeBaseRoot(Root root); + +} diff --git a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/parser/EraserParserHelper.java b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/parser/EraserParserHelper.java index fe88455606c2bb7b6d78a877059077686edf12fc..5d1b1af27c4bf36e15768bd12facc02ca3a1e773 100644 --- a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/parser/EraserParserHelper.java +++ b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/parser/EraserParserHelper.java @@ -7,7 +7,6 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.*; -import java.util.Comparator; import java.util.function.BiConsumer; /** diff --git a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/MqttReceiver.java b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/MqttReceiver.java index 1f013ea25872e57e452a603616e95126bdd69e11..5fa9ad6800b3964369d0a1f140db6a4c3e0d164f 100644 --- a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/MqttReceiver.java +++ b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/MqttReceiver.java @@ -133,6 +133,17 @@ public class MqttReceiver implements AutoCloseable { connection.connect(new Callback<Void>() { @Override public void onSuccess(Void value) { + connection.publish("components", "Eraser is listening".getBytes(), QoS.AT_LEAST_ONCE, false, new Callback<Void>() { + @Override + public void onSuccess(Void value) { + logger.debug("success sending welcome message"); + } + + @Override + public void onFailure(Throwable value) { + logger.debug("failure sending welcome message", value); + } + }); Topic[] topicArray = Arrays.stream(topics).map(topicName -> new Topic(topicName, qos)).toArray(Topic[]::new); logger.info("Connected, subscribing to {} topic(s) now.", topicArray.length); connection.subscribe(topicArray, new Callback<byte[]>() { @@ -150,7 +161,7 @@ public class MqttReceiver implements AutoCloseable { @Override public void onFailure(Throwable cause) { - logger.error("Could not subscribe, because {}", cause); + logger.error("Could not subscribe", cause); } }); } diff --git a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/ParserUtils.java b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/ParserUtils.java index c45f02562fa72036b24749ab4fdca47fbf87ed41..716f63f9caa9462665b8819c9347aef466637a76 100644 --- a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/ParserUtils.java +++ b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/ParserUtils.java @@ -241,6 +241,7 @@ public class ParserUtils { EraserScanner scanner = new EraserScanner(reader); EraserParser parser = new EraserParser(); Root root = (Root) parser.parse(scanner); + parser.resolveReferences(); reader.close(); int size = root.getOpenHAB2Model().items().size(); if (size == 0) { diff --git a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/ExpressionEvalTest.java b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/ExpressionEvalTest.java index d9c64c57553133162dc2a355360f50fc3716cf33..1758931346632a63c9f3297912b1fb7d1430da46 100644 --- a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/ExpressionEvalTest.java +++ b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/ExpressionEvalTest.java @@ -73,6 +73,19 @@ public class ExpressionEvalTest { assertThat(divExpression.getRightOperand().eval(), equalTo(4.0)); } + @Test + public void expressionWithItem() throws IOException, Parser.Exception { + double itemValue = 5.3; + Item referenceItem = ParserUtils.parseItem("Number Item: id=\"myItem\" state=\"" + itemValue + "\";"); + NumberExpression sut = ParserUtils.parseNumberExpression("(myItem * 3)", referenceItem.getRoot()); + assertThat(sut.eval(), equalTo(itemValue * 3)); + + // set item state to new value + itemValue = 17; + referenceItem.setStateFromDouble(itemValue); + assertThat(sut.eval(), equalTo(itemValue * 3)); + } + @Test public void comparingExpressions() throws IOException, Parser.Exception { comparingExpression(1, "<", 2, true); @@ -89,9 +102,9 @@ public class ExpressionEvalTest { comparingExpression(7, "!=", 8, true); comparingExpression(8, "!=", 8, false); - comparingExpression(9, "=>", 10, false); - comparingExpression(10, "=>", 10, true); - comparingExpression(11, "=>", 10, true); + comparingExpression(9, ">=", 10, false); + comparingExpression(10, ">=", 10, true); + comparingExpression(11, ">=", 10, true); comparingExpression(11,">", 12, false); comparingExpression(12,">", 12, false); @@ -99,7 +112,8 @@ public class ExpressionEvalTest { } private void comparingExpression(double left, String actualComparatorString, double right, boolean expectedResult) throws IOException, Parser.Exception { - LogicalExpression sut = ParserUtils.parseLogicalExpression(String.format("(%f %s %f)", left, actualComparatorString, right)); + String expression = String.format("(%s %s %s)", Double.toString(left), actualComparatorString, Double.toString(right)); + LogicalExpression sut = ParserUtils.parseLogicalExpression(expression); assertThat(sut.eval(), equalTo(expectedResult)); } diff --git a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/ExpressionParserTest.java b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/ExpressionParserTest.java index c01d93df0fe1e259b3be5d7f27e0c80a6e3ba2f6..a034d3c8f8699046c9c89d2f139f14880a80b704 100644 --- a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/ExpressionParserTest.java +++ b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/ExpressionParserTest.java @@ -19,9 +19,11 @@ import static org.junit.Assert.assertThat; */ public class ExpressionParserTest { + private static final String TRUE_EXPRESSION = "(0.0==0.0)"; + @Test public void plusExpression() throws IOException, Parser.Exception { - NumberExpression sut = ParserUtils.parseNumberExpression("(3 + 4)"); + NumberExpression sut = parseWithRoundTripNumberExpression("(3 + 4)"); assertThat(sut, instanceOf(AddExpression.class)); AddExpression addExpression = (AddExpression) sut; assertThat(addExpression.getLeftOperand(), instanceOf(NumberLiteralExpression.class)); @@ -34,7 +36,7 @@ public class ExpressionParserTest { @Test public void minusExpression() throws IOException, Parser.Exception { - NumberExpression sut = ParserUtils.parseNumberExpression("(12.5 - 4.1)"); + NumberExpression sut = parseWithRoundTripNumberExpression("(12.5 - 4.1)"); assertThat(sut, instanceOf(SubExpression.class)); SubExpression subExpression = (SubExpression) sut; assertThat(subExpression.getLeftOperand(), instanceOf(NumberLiteralExpression.class)); @@ -47,7 +49,7 @@ public class ExpressionParserTest { @Test public void multExpression() throws IOException, Parser.Exception { - NumberExpression sut = ParserUtils.parseNumberExpression("(0 * 0)"); + NumberExpression sut = parseWithRoundTripNumberExpression("(0 * 0)"); assertThat(sut, instanceOf(MultExpression.class)); MultExpression multExpression = (MultExpression) sut; assertThat(multExpression.getLeftOperand(), instanceOf(NumberLiteralExpression.class)); @@ -60,7 +62,7 @@ public class ExpressionParserTest { @Test public void divExpression() throws IOException, Parser.Exception { - NumberExpression sut = ParserUtils.parseNumberExpression("(1.1 / 0.0)"); + NumberExpression sut = parseWithRoundTripNumberExpression("(1.1 / 0.0)"); assertThat(sut, instanceOf(DivExpression.class)); DivExpression divExpression = (DivExpression) sut; assertThat(divExpression.getLeftOperand(), instanceOf(NumberLiteralExpression.class)); @@ -73,7 +75,7 @@ public class ExpressionParserTest { @Test public void powerExpression() throws IOException, Parser.Exception { - NumberExpression sut = ParserUtils.parseNumberExpression("(3 ^ 0.5)"); + NumberExpression sut = parseWithRoundTripNumberExpression("(3 ^ 0.5)"); assertThat(sut, instanceOf(PowerExpression.class)); PowerExpression powExpression = (PowerExpression) sut; assertThat(powExpression.getLeftOperand(), instanceOf(NumberLiteralExpression.class)); @@ -86,7 +88,7 @@ public class ExpressionParserTest { @Test public void parenthesizedExpression() throws IOException, Parser.Exception { - NumberExpression sut = ParserUtils.parseNumberExpression("(3)"); + NumberExpression sut = parseWithRoundTripNumberExpression("(3)"); assertThat(sut, instanceOf(ParenthesizedNumberExpression.class)); ParenthesizedNumberExpression parenExpression = (ParenthesizedNumberExpression) sut; assertThat(parenExpression.getOperand(), instanceOf(NumberLiteralExpression.class)); @@ -96,7 +98,7 @@ public class ExpressionParserTest { @Test public void complexExpression() throws IOException, Parser.Exception { - NumberExpression sut = ParserUtils.parseNumberExpression("((3 + 4) * (1 / (12 - 8)))"); + NumberExpression sut = parseWithRoundTripNumberExpression("((3 + 4) * (1 / (12 - 8)))"); assertThat(sut, instanceOf(MultExpression.class)); MultExpression multExpression = (MultExpression) sut; @@ -130,13 +132,17 @@ public class ExpressionParserTest { } @Test - public void expressionWithItem() { - try { - ParserUtils.parseNumberExpression("(myItem * 3)"); - } catch (IOException | Parser.Exception e) { - e.printStackTrace(); - Assert.fail(e.getMessage()); - } + public void expressionWithItem() throws IOException, Parser.Exception { + Item referenceItem = ParserUtils.parseItem("Number Item: id=\"myItem\";"); + NumberExpression sut = parseWithRoundTripNumberExpression("(myItem * 3)", referenceItem.getRoot()); + assertThat(sut, instanceOf(MultExpression.class)); + MultExpression multExpression = (MultExpression) sut; + assertThat(multExpression.getLeftOperand(), instanceOf(Designator.class)); + Designator left = (Designator) multExpression.getLeftOperand(); + assertThat(left.getItem(), equalTo(referenceItem)); + assertThat(multExpression.getRightOperand(), instanceOf(NumberLiteralExpression.class)); + NumberLiteralExpression right = (NumberLiteralExpression) multExpression.getRightOperand(); + assertThat(right.getValue(), equalTo(3.0)); } @Test @@ -145,12 +151,13 @@ public class ExpressionParserTest { comparingExpression("<=", ComparatorType.LessOrEqualThan, 3, 4); comparingExpression("==", ComparatorType.Equals, 5, 6); comparingExpression("!=", ComparatorType.NotEquals, 7, 8); - comparingExpression("=>", ComparatorType.GreaterOrEqualThan, 9, 10); + comparingExpression(">=", ComparatorType.GreaterOrEqualThan, 9, 10); comparingExpression(">", ComparatorType.GreaterThan, 11, 12); } private void comparingExpression(String actualComparatorString, ComparatorType expectedComparatorType, double left, double right) throws IOException, Parser.Exception { - LogicalExpression sut = ParserUtils.parseLogicalExpression(String.format("(%f %s %f)", left, actualComparatorString, right)); + String expression = String.format("(%s %s %s)", Double.toString(left), actualComparatorString, Double.toString(right)); + LogicalExpression sut = parseWithRoundTripLogicalExpression(expression); assertThat(sut, instanceOf(ComparingExpression.class)); ComparingExpression comparingExpression = (ComparingExpression) sut; assertThat(comparingExpression.getLeftOperand(), instanceOf(NumberLiteralExpression.class)); @@ -164,7 +171,7 @@ public class ExpressionParserTest { @Test public void notExpression() throws IOException, Parser.Exception { - LogicalExpression sut = ParserUtils.parseLogicalExpression("!(0==0)"); + LogicalExpression sut = parseWithRoundTripLogicalExpression("!" + TRUE_EXPRESSION); assertThat(sut, instanceOf(NotExpression.class)); NotExpression notExpression = (NotExpression) sut; checkZeroEqualsZero(notExpression.getOperand()); @@ -172,7 +179,7 @@ public class ExpressionParserTest { @Test public void andExpression() throws IOException, Parser.Exception { - LogicalExpression sut = ParserUtils.parseLogicalExpression("((0==0) & (0==0))"); + LogicalExpression sut = parseWithRoundTripLogicalExpression("(" + TRUE_EXPRESSION + " & " + TRUE_EXPRESSION + ")"); assertThat(sut, instanceOf(AndExpression.class)); AndExpression notExpression = (AndExpression) sut; checkZeroEqualsZero(notExpression.getLeftOperand()); @@ -181,7 +188,7 @@ public class ExpressionParserTest { @Test public void orExpression() throws IOException, Parser.Exception { - LogicalExpression sut = ParserUtils.parseLogicalExpression("((0==0) | (0==0))"); + LogicalExpression sut = parseWithRoundTripLogicalExpression("(" + TRUE_EXPRESSION + " | " + TRUE_EXPRESSION + ")"); assertThat(sut, instanceOf(OrExpression.class)); OrExpression notExpression = (OrExpression) sut; checkZeroEqualsZero(notExpression.getLeftOperand()); @@ -190,12 +197,34 @@ public class ExpressionParserTest { @Test public void parenthesizedLogicalExpression() throws IOException, Parser.Exception { - LogicalExpression sut = ParserUtils.parseLogicalExpression("((0==0))"); + LogicalExpression sut = parseWithRoundTripLogicalExpression("(" + TRUE_EXPRESSION + ")"); assertThat(sut, instanceOf(ParenthesizedLogicalExpression.class)); ParenthesizedLogicalExpression parenthesizedLogicalExpression = (ParenthesizedLogicalExpression) sut; checkZeroEqualsZero(parenthesizedLogicalExpression.getOperand()); } + private NumberExpression parseWithRoundTripNumberExpression(String numberExpression) throws IOException, Parser.Exception { + return parseWithRoundTripNumberExpression(numberExpression, null); + } + + private NumberExpression parseWithRoundTripNumberExpression(String numberExpression, Root root) throws IOException, Parser.Exception { + NumberExpression sut = ParserUtils.parseNumberExpression(numberExpression, root); + String first = sut.prettyPrint(); + NumberExpression reParsed = ParserUtils.parseNumberExpression(first, root); + String second = reParsed.prettyPrint(); + assertThat(first, equalTo(second)); + return sut; + } + + private LogicalExpression parseWithRoundTripLogicalExpression(String logicalExpression) throws IOException, Parser.Exception { + LogicalExpression sut = ParserUtils.parseLogicalExpression(logicalExpression); + String first = sut.prettyPrint(); + LogicalExpression reParsed = ParserUtils.parseLogicalExpression(first); + String second = reParsed.prettyPrint(); + assertThat(first, equalTo(second)); + return sut; + } + private void checkZeroEqualsZero(LogicalExpression logicalExpression) { assertThat(logicalExpression, instanceOf(ComparingExpression.class)); ComparingExpression comparingExpression = (ComparingExpression) logicalExpression; diff --git a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/InfluxTest.java b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/InfluxTest.java index a7d76202ffc30da22280f9a5ec95c643cb4aee42..9526a4db04802684261f820e807db35d6a47c24f 100644 --- a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/InfluxTest.java +++ b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/InfluxTest.java @@ -33,8 +33,8 @@ public class InfluxTest { @ClassRule public static InfluxDBContainer influxDbContainer = new InfluxDBContainer() .withDatabase(InfluxRoot.createDefault().getDbName()) - .withUsername(InfluxRoot.createDefault().getUser()) - .withPassword(InfluxRoot.createDefault().getPassword()); + .withAdmin(InfluxRoot.createDefault().getUser()) + .withAdminPassword(InfluxRoot.createDefault().getPassword()); @Test public void oneItem() { @@ -154,9 +154,10 @@ public class InfluxTest { point -> points.add((DoubleStatePoint) point)); } else { influxRoot = InfluxRoot.createDefault(); - // use zih vm2098 running influx + // use container running influx influxRoot.setDbName(InfluxTest.class.getSimpleName()); - influxRoot.setHostByName("vm2098.zih.tu-dresden.de"); + System.out.println("ports: " + influxDbContainer.getPortBindings() + " url: '" + influxDbContainer.getUrl() + "'"); + influxRoot.setHostByName(influxDbContainer.getUrl().replaceAll("^http://", "")); } mai.model.getRoot().setInfluxRoot(influxRoot); Assume.assumeTrue(influxRoot.influxAdapter().isConnected()); diff --git a/eraser-base/src/test/resources/tests/ppc3/input.eraser b/eraser-base/src/test/resources/tests/ppc3/input.eraser index 5fad695027d88ad41935092e7a3175206a3dfb2d..9a8a80d0d47d21df28a233b13135c43a98be3f8a 100644 --- a/eraser-base/src/test/resources/tests/ppc3/input.eraser +++ b/eraser-base/src/test/resources/tests/ppc3/input.eraser @@ -14,7 +14,7 @@ Image Item : id="image1" label="an Image Item" state="def" topic="item/str/image Location Item : id="location1" label="a Location Item" state="ghi" topic="item/str/location1/state"; Number Item : id="number1" label="a Number Item" state="456" topic="item/double/number1/state"; Player Item : id="player1" label="a Player Item" state="jkl" topic="item/str/player1/state"; -RollerShutter Item : id="rollerShutter1" label="a RollerShutter Item" state="false" topic="item/str/rs1/state"; +RollerShutter Item : id="rollerShutter1" label="a RollerShutter Item" state="32" topic="item/str/rs1/state"; String Item : id="string1" label="a String Item" state="mno" topic="item/str/string1/state"; Switch Item : id="switch1" label="a Switch Item" state="true" topic="item/bool/switch1/state"; Switch Item : id="switch2" label="a second Switch Item" state="OFF" topic="item/bool/switch2/state"; diff --git a/eraser-base/src/test/resources/tests/ppc3/output.eraser b/eraser-base/src/test/resources/tests/ppc3/output.eraser index 9f209db2cbcac9ee3d862a7d005cfc159432a0a3..f480a5d4ecb8144e53e02334acf39b7e6b629868 100644 --- a/eraser-base/src/test/resources/tests/ppc3/output.eraser +++ b/eraser-base/src/test/resources/tests/ppc3/output.eraser @@ -1,5 +1,5 @@ Color Item: id="color1" label="a Color Item" state="1,2,3" topic="item/hsb/color1/state" ; -Contact Item: id="contact1" label="a Contact Item" state="true" topic="item/bool/contact1/state" ; +Contact Item: id="contact1" label="a Contact Item" state="OPEN" topic="item/bool/contact1/state" ; Image Item: id="image1" label="an Image Item" state="def" topic="item/str/image1/state" ; Location Item: id="location1" label="a Location Item" state="ghi" topic="item/str/location1/state" ; DateTime Item: id="datetime1" label="a DateTime Item" state="1970-01-18T20:43:35.826Z" topic="item/date/datetime1/state" ; @@ -7,7 +7,7 @@ Item: id="default1" label="a Default Item" state="pqr" topic="item/str/default1/ Dimmer Item: id="dimmer1" label="a Dimmer Item" state="123.0" topic="item/double/dimmer1/state" ; Player Item: id="player1" label="a Player Item" state="jkl" topic="item/str/player1/state" ; Number Item: id="number1" label="a Number Item" state="456.0" topic="item/double/number1/state" ; -RollerShutter Item: id="rollerShutter1" label="a RollerShutter Item" state="false" topic="item/str/rs1/state" ; +RollerShutter Item: id="rollerShutter1" label="a RollerShutter Item" state="32.0" topic="item/str/rs1/state" ; String Item: id="string1" label="a String Item" state="mno" topic="item/str/string1/state" ; Switch Item: id="switch1" label="a Switch Item" state="ON" topic="item/bool/switch1/state" ; Switch Item: id="switch2" label="a second Switch Item" state="OFF" topic="item/bool/switch2/state" ; diff --git a/eraser-base/src/test/resources/tests/ppc4/input.eraser b/eraser-base/src/test/resources/tests/ppc4/input.eraser index f5c7afff39c0a2d617f293076a86a794fa24263f..8687f881951aa3bc8766e209a87432a235e2a72a 100644 --- a/eraser-base/src/test/resources/tests/ppc4/input.eraser +++ b/eraser-base/src/test/resources/tests/ppc4/input.eraser @@ -8,13 +8,13 @@ Group: id="my-empty-group" ; Color Item : id="color1" label="a Color Item" state="1,2,3" topic="item/hsb/color1/state"; DateTime Item : id="datetime1" label="a DateTime Item" state="1543415826" topic="item/date/datetime1/state"; -Contact Item : id="contact1" label="a Contact Item" state="true" topic="item/bool/contact1/state"; +Contact Item : id="contact1" label="a Contact Item" state="CLOSED" topic="item/bool/contact1/state"; Dimmer Item : id="dimmer1" label="a Dimmer Item" state="123" topic="item/double/dimmer1/state" controls=["color1", "datetime1"]; Image Item : id="image1" label="an Image Item" state="def" topic="item/str/image1/state" controls=[]; Location Item : id="location1" label="a Location Item" state="ghi" topic="item/str/location1/state"; Number Item : id="number1" label="a Number Item" state="456" topic="item/double/number1/state" controls=["string1"]; Player Item : id="player1" label="a Player Item" state="jkl" topic="item/str/player1/state"; -RollerShutter Item : id="rollerShutter1" label="a RollerShutter Item" state="false" topic="item/str/rs1/state"; +RollerShutter Item : id="rollerShutter1" label="a RollerShutter Item" state="0" topic="item/str/rs1/state"; Activity Item: id="activity"; String Item : id="string1" label="a String Item" state="mno" topic="item/str/string1/state"; Switch Item : id="switch1" label="a Switch Item" state="true" topic="item/bool/switch1/state" controls=["rollerShutter1"]; diff --git a/eraser-base/src/test/resources/tests/ppc4/output.eraser b/eraser-base/src/test/resources/tests/ppc4/output.eraser index 651bf7220435c60edee891b3a244a42cce706261..d4934300c2f7e3c0c8be65bf4f4932bbc4b7be52 100644 --- a/eraser-base/src/test/resources/tests/ppc4/output.eraser +++ b/eraser-base/src/test/resources/tests/ppc4/output.eraser @@ -1,5 +1,5 @@ Color Item: id="color1" label="a Color Item" state="1,2,3" topic="item/hsb/color1/state" ; -Contact Item: id="contact1" label="a Contact Item" state="true" topic="item/bool/contact1/state" ; +Contact Item: id="contact1" label="a Contact Item" state="CLOSED" topic="item/bool/contact1/state" ; Image Item: id="image1" label="an Image Item" state="def" topic="item/str/image1/state" ; Location Item: id="location1" label="a Location Item" state="ghi" topic="item/str/location1/state" ; DateTime Item: id="datetime1" label="a DateTime Item" state="1970-01-18T20:43:35.826Z" topic="item/date/datetime1/state" ; @@ -7,7 +7,7 @@ Item: id="default1" label="a Default Item" state="pqr" topic="item/str/default1/ Dimmer Item: id="dimmer1" label="a Dimmer Item" state="123.0" topic="item/double/dimmer1/state" controls=["color1", "datetime1"] ; Player Item: id="player1" label="a Player Item" state="jkl" topic="item/str/player1/state" ; Number Item: id="number1" label="a Number Item" state="456.0" topic="item/double/number1/state" controls=["string1"] ; -RollerShutter Item: id="rollerShutter1" label="a RollerShutter Item" state="false" topic="item/str/rs1/state" ; +RollerShutter Item: id="rollerShutter1" label="a RollerShutter Item" state="0.0" topic="item/str/rs1/state" ; Activity Item: id="activity" ; String Item: id="string1" label="a String Item" state="mno" topic="item/str/string1/state" ; Switch Item: id="switch1" label="a Switch Item" state="ON" topic="item/bool/switch1/state" controls=["rollerShutter1"] ; diff --git a/eraser.spark/src/main/java/de/tudresden/inf/st/eraser/spark/Application.java b/eraser.spark/src/main/java/de/tudresden/inf/st/eraser/spark/Application.java index c1c8c2f40e4a3847e4dbfa7ea4b95a406df4d1d2..4d8df7dfaa448fe34c6cef1ed51a30d4dd2bc1ae 100644 --- a/eraser.spark/src/main/java/de/tudresden/inf/st/eraser/spark/Application.java +++ b/eraser.spark/src/main/java/de/tudresden/inf/st/eraser/spark/Application.java @@ -6,12 +6,10 @@ import de.tudresden.inf.st.eraser.util.JavaUtils; import de.tudresden.inf.st.eraser.util.ParserUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.eclipse.jetty.http.HttpStatus; import spark.Request; import spark.Response; import spark.Spark; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -41,7 +39,7 @@ public class Application { private void createRules() { ObjectMapper mapper = new ObjectMapper(); - Spark.path("/", () -> Spark.before((request, response) -> logger.debug(request.pathInfo()))); + Spark.path("/", () -> Spark.before((request, response) -> logger.debug("{}: {}", request.pathInfo(), request.body()))); Spark.path("/activity", () -> { @@ -116,13 +114,12 @@ public class Application { OpenHAB2Model openHAB2Model = root.getOpenHAB2Model(); Item item = ParserUtils.parseItem(request.body()); if (!openHAB2Model.resolveItem(item.getID()).isPresent()) { - JavaUtils.ifPresentOrElse( - root.getOpenHAB2Model().resolveGroup(ParserUtils.UNKNOWN_GROUP_NAME), - group -> group.addItem(item), - () -> ParserUtils.createUnknownGroup(root.getOpenHAB2Model(), Collections.singletonList(item))); + root.getOpenHAB2Model().addNewItem(item); response.status(201); + return "OK"; + } else { + return makeError(response, 409, "Item already exists."); } - return "OK"; }); //--- GET /model/items/:identifier/state --- @@ -169,7 +166,7 @@ public class Application { private Object safeItemRoute(Request request, Response response, Function<Item, String> action) { return JavaUtils.ifPresentOrElseReturn(root.getOpenHAB2Model().resolveItem(request.params("identifier")), action, - () -> makeError(response, 404, "Item '" + request.body() + "' not found")); + () -> makeError(response, 404, "Item '" + request.params("identifier") + "' not found")); } private String makeHistory(Item item, Response response) { diff --git a/eraser.spark/src/main/java/de/tudresden/inf/st/eraser/spark/DummyDataCreator.java b/eraser.spark/src/main/java/de/tudresden/inf/st/eraser/spark/DummyDataCreator.java index e548a6bc95012ba72675131395b9956f4a84466f..65885823f7960465adadf30bbda4f82744c54903 100644 --- a/eraser.spark/src/main/java/de/tudresden/inf/st/eraser/spark/DummyDataCreator.java +++ b/eraser.spark/src/main/java/de/tudresden/inf/st/eraser/spark/DummyDataCreator.java @@ -3,6 +3,9 @@ package de.tudresden.inf.st.eraser.spark; import de.tudresden.inf.st.eraser.jastadd.model.*; import de.tudresden.inf.st.eraser.util.JavaUtils; +import java.time.Duration; +import java.time.Instant; + /** * Creates some activities and change events. * @@ -28,12 +31,13 @@ class DummyDataCreator { Item iris1 = getOrCreateColorItem("iris1", "Hue Iris 1"); Item go1 = getOrCreateColorItem("go1", "Hue Go 1"); Item go2 = getOrCreateColorItem("go2", "Hue Go 2"); - mlRoot.addChangeEvent(newRecognitionEvent(1, 1547637740, 1, + Instant now = Instant.now(); + mlRoot.addChangeEvent(newRecognitionEvent(1, now, 1, new ChangedItem("green", iris1), new ChangedItem("green", go1))); - mlRoot.addChangeEvent(newRecognitionEvent(2, 1547637750, 1)); - mlRoot.addChangeEvent(newRecognitionEvent(4, 1547623460, 2, + mlRoot.addChangeEvent(newRecognitionEvent(2, now.plusSeconds(1), 1)); + mlRoot.addChangeEvent(newRecognitionEvent(3, now.plusSeconds(3), 2, new ChangedItem("off", go2))); - mlRoot.addChangeEvent(newManualChangeEvent(1501146256, 5, + mlRoot.addChangeEvent(newManualChangeEvent(4, now.plusSeconds(17), new ChangedItem("green", iris1), new ChangedItem("red", go1), new ChangedItem("#EE7F00", go2))); @@ -51,23 +55,23 @@ class DummyDataCreator { }); } - private RecognitionEvent newRecognitionEvent(int identifier, long timestamp, int activityIdentifier, ChangedItem... changedItems) { + private RecognitionEvent newRecognitionEvent(int identifier, Instant when, int activityIdentifier, ChangedItem... changedItems) { RecognitionEvent result = new RecognitionEvent(); JavaUtils.ifPresentOrElse(root.resolveActivity(activityIdentifier), result::setActivity, () -> { throw new RuntimeException("No activity found for identifier " + activityIdentifier); }); - initChangeEvent(result, identifier, timestamp, changedItems); + initChangeEvent(result, identifier, when, changedItems); return result; } @SuppressWarnings("SameParameterValue") - private ManualChangeEvent newManualChangeEvent(int identifier, long timestamp, ChangedItem... changedItems) { + private ManualChangeEvent newManualChangeEvent(int identifier, Instant when, ChangedItem... changedItems) { ManualChangeEvent result = new ManualChangeEvent(); - initChangeEvent(result, identifier, timestamp, changedItems); + initChangeEvent(result, identifier, when, changedItems); return result; } - private void initChangeEvent(ChangeEvent result, int identifier, long timestamp, ChangedItem... changedItems) { + private void initChangeEvent(ChangeEvent result, int identifier, Instant when, ChangedItem... changedItems) { result.setIdentifier(identifier); - result.setTimestamp(timestamp); + result.setCreated(when); for (ChangedItem changedItem : changedItems) { result.addChangedItem(changedItem); } diff --git a/eraser.spark/src/main/java/de/tudresden/inf/st/eraser/spark/SimpleChangeEvent.java b/eraser.spark/src/main/java/de/tudresden/inf/st/eraser/spark/SimpleChangeEvent.java index 07894ede8b266b46bf4aa364bb4495d07abc8740..6a1c1a91bc3d8cdc28d44b07b766168e645786bf 100644 --- a/eraser.spark/src/main/java/de/tudresden/inf/st/eraser/spark/SimpleChangeEvent.java +++ b/eraser.spark/src/main/java/de/tudresden/inf/st/eraser/spark/SimpleChangeEvent.java @@ -3,6 +3,7 @@ package de.tudresden.inf.st.eraser.spark; import lombok.AllArgsConstructor; import lombok.Data; +import java.time.Instant; import java.util.List; /** @@ -13,7 +14,7 @@ import java.util.List; @Data @AllArgsConstructor public abstract class SimpleChangeEvent { - public final long timestamp; + public final Instant created; public final int identifier; public final List<SimpleChangedItem> changed_items; } diff --git a/eraser.spark/src/main/java/de/tudresden/inf/st/eraser/spark/SimpleManualChangeEvent.java b/eraser.spark/src/main/java/de/tudresden/inf/st/eraser/spark/SimpleManualChangeEvent.java index 71e43cdbbcce6eb65704d280540220db880ed3b6..685436cd376b993403db98d4a6192b4de94975d5 100644 --- a/eraser.spark/src/main/java/de/tudresden/inf/st/eraser/spark/SimpleManualChangeEvent.java +++ b/eraser.spark/src/main/java/de/tudresden/inf/st/eraser/spark/SimpleManualChangeEvent.java @@ -5,6 +5,7 @@ import de.tudresden.inf.st.eraser.util.JavaUtils; import lombok.Data; import lombok.EqualsAndHashCode; +import java.time.Instant; import java.util.List; import java.util.stream.Collectors; @@ -18,12 +19,12 @@ import java.util.stream.Collectors; public class SimpleManualChangeEvent extends SimpleChangeEvent { public final String type = "manual"; - public SimpleManualChangeEvent(long timestamp, int identifier, List<SimpleChangedItem> changedItems) { - super(timestamp, identifier, changedItems); + public SimpleManualChangeEvent(Instant created, int identifier, List<SimpleChangedItem> changedItems) { + super(created, identifier, changedItems); } static SimpleManualChangeEvent createFrom(ManualChangeEvent event) { - return new SimpleManualChangeEvent(event.getTimestamp(), event.getIdentifier(), + return new SimpleManualChangeEvent(event.getCreated(), event.getIdentifier(), JavaUtils.toStream(event.getChangedItems()).map(SimpleChangedItem::createFrom).collect(Collectors.toList())); } } diff --git a/eraser.spark/src/main/java/de/tudresden/inf/st/eraser/spark/SimpleRecognitionEvent.java b/eraser.spark/src/main/java/de/tudresden/inf/st/eraser/spark/SimpleRecognitionEvent.java index 587c3ae127da7cf3be1064a4351e36f6bbf81e7d..0a3821e4fc49d9fa2b2d0e75717da5477c0a3fa7 100644 --- a/eraser.spark/src/main/java/de/tudresden/inf/st/eraser/spark/SimpleRecognitionEvent.java +++ b/eraser.spark/src/main/java/de/tudresden/inf/st/eraser/spark/SimpleRecognitionEvent.java @@ -5,6 +5,7 @@ import de.tudresden.inf.st.eraser.util.JavaUtils; import lombok.Data; import lombok.EqualsAndHashCode; +import java.time.Instant; import java.util.List; import java.util.stream.Collectors; @@ -20,14 +21,14 @@ public class SimpleRecognitionEvent extends SimpleChangeEvent { public final String description; public final String type = "recognition"; - public SimpleRecognitionEvent(long timestamp, int identifier, List<SimpleChangedItem> changedItems, int activity, String description) { - super(timestamp, identifier, changedItems); + public SimpleRecognitionEvent(Instant created, int identifier, List<SimpleChangedItem> changedItems, int activity, String description) { + super(created, identifier, changedItems); this.activity = activity; this.description = description; } static SimpleRecognitionEvent createFrom(RecognitionEvent event) { - return new SimpleRecognitionEvent(event.getTimestamp(), event.getIdentifier(), + return new SimpleRecognitionEvent(event.getCreated(), event.getIdentifier(), JavaUtils.toStream(event.getChangedItems()).map(SimpleChangedItem::createFrom).collect(Collectors.toList()), event.getActivity().getIdentifier(), event.getActivity().getLabel()); } diff --git a/eraser.starter/build.gradle b/eraser.starter/build.gradle index ddb56ddf0b9a90f815f09b20d117485c48300c70..186e75a1e448ab9f0e61c5f8df2d3ac94da2f1f9 100644 --- a/eraser.starter/build.gradle +++ b/eraser.starter/build.gradle @@ -18,10 +18,13 @@ dependencies { compile project(':feedbackloop.analyze') compile project(':feedbackloop.plan') compile project(':feedbackloop.execute') - compile project(':feedbackloop.learner') + compile project(':feedbackloop.learner_backup') + compile project(':datasets') compile group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.9.8' compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.8' compile group: 'net.sourceforge.argparse4j', name: 'argparse4j', version: '0.8.1' + // compile project(':feedbackloop.learner') + } run { diff --git a/eraser.starter/src/main/java/de/tudresden/inf/st/eraser/starter/EraserStarter.java b/eraser.starter/src/main/java/de/tudresden/inf/st/eraser/starter/EraserStarter.java index b263fd586f95781c26345076e7a3132472f20eab..acc4b93a471d0b3a02676d37cb0314c85756ed1c 100644 --- a/eraser.starter/src/main/java/de/tudresden/inf/st/eraser/starter/EraserStarter.java +++ b/eraser.starter/src/main/java/de/tudresden/inf/st/eraser/starter/EraserStarter.java @@ -6,18 +6,15 @@ import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; 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.Execute; -import de.tudresden.inf.st.eraser.feedbackloop.api.Learner; 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.learner.LearnerHelper; -import de.tudresden.inf.st.eraser.feedbackloop.learner.LearnerImpl; +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.plan.PlanImpl; import de.tudresden.inf.st.eraser.jastadd.model.*; import de.tudresden.inf.st.eraser.openhab2.OpenHab2Importer; import de.tudresden.inf.st.eraser.openhab2.mqtt.MQTTUpdater; 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 net.sourceforge.argparse4j.ArgumentParsers; import net.sourceforge.argparse4j.annotation.Arg; @@ -28,10 +25,10 @@ import org.apache.logging.log4j.Logger; import java.io.File; import java.io.IOException; -import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; -import java.util.Collections; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; @@ -113,53 +110,100 @@ public class EraserStarter { } } + // initialize backup learner + Learner learner = new Learner(); + // initialize activity recognition MachineLearningRoot machineLearningRoot = root.getMachineLearningRoot(); if (settings.activity.dummy) { - logger.info("Using dummy activity recognition"); + logger.info("Using dummy activity recognition, ignoring other settings for this"); machineLearningRoot.setActivityRecognition(DummyMachineLearningModel.createDefault()); } else { - logger.error("Reading activity recognition from file is not supported yet!"); - // TODO + MachineLearningImpl handler = new MachineLearningImpl(learner, MachineLearningImpl.GOAL_ACTIVITY_PHONE_AND_WATCH); + handler.setKnowledgeBaseRoot(root); + logger.info("Reading activity recognition from csv file {}", settings.activity.file); + handler.initActivities(settings.activity.realURL().getFile()); + ExternalMachineLearningModel machineLearningModel = new ExternalMachineLearningModel(); + machineLearningModel.setEncoder(handler); + machineLearningModel.setDecoder(handler); + 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 if (settings.preference.dummy) { - logger.info("Using dummy preference learning"); + logger.info("Using dummy preference learning, ignoring other settings for this"); machineLearningRoot.setPreferenceLearning(DummyMachineLearningModel.createDefault()); } else { - logger.info("Reading preference learning from file {}", settings.preference.file); - Learner learner = new LearnerImpl(); - // there should be a method to load a model using an URL - boolean loadingSuccessful = false; - try (InputStream input = settings.preference.realURL().openStream()) { - loadingSuccessful = learner.loadModelFromFile(input, settings.preference.id, - Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), Collections.emptyList()); - } catch (IOException e) { - logger.catching(e); - loadingSuccessful = false; - } -// Model preference = learner.getTrainedModel(settings.preference.realURL(), settings.preference.id); - logger.debug("Loading of {} was {}", settings.preference.realURL(), loadingSuccessful ? "successful" : "failed"); - if (loadingSuccessful) { - EncogModel preference = learner.getTrainedModel(settings.preference.id); - NeuralNetworkRoot neuralNetwork = LearnerHelper.transform(preference); - if (neuralNetwork == null) { - logger.error("Could not create preference model, see possible previous errors."); - } else { - machineLearningRoot.setPreferenceLearning(neuralNetwork); - neuralNetwork.setOutputApplication(zeroToThree -> 33 * zeroToThree); - JavaUtils.ifPresentOrElse( - model.resolveItem(settings.preference.affectedItem), - item -> neuralNetwork.getOutputLayer().setAffectedItem(item), - () -> logger.error("Output item not set from value '{}'", settings.preference.affectedItem)); - } - } else { - // loading was not successful - logger.warn("Falling back to dummy preference learning"); - machineLearningRoot.setPreferenceLearning(DummyMachineLearningModel.createDefault()); + logger.info("Reading preference learning from csv file {}", settings.preference.file); + MachineLearningImpl handler = new MachineLearningImpl(learner, MachineLearningImpl.GOAL_PREFERENCE_BRIGHTNESS_IRIS); + handler.setKnowledgeBaseRoot(root); + handler.initPreferences(settings.preference.realURL().getFile()); + ExternalMachineLearningModel machineLearningModel = new ExternalMachineLearningModel(); + machineLearningModel.setEncoder(handler); + machineLearningModel.setDecoder(handler); + 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); if (!machineLearningRoot.getActivityRecognition().check()) { logger.fatal("Invalid activity recognition!"); diff --git a/eraser.starter/src/main/java/de/tudresden/inf/st/eraser/starter/Setting.java b/eraser.starter/src/main/java/de/tudresden/inf/st/eraser/starter/Setting.java index dacbb4287bb16d2f4fcdb5ba2e2cb4b67cf6406e..09af126b0a66f54aa2b6c88fb04bda9cb7218cb3 100644 --- a/eraser.starter/src/main/java/de/tudresden/inf/st/eraser/starter/Setting.java +++ b/eraser.starter/src/main/java/de/tudresden/inf/st/eraser/starter/Setting.java @@ -32,7 +32,7 @@ class Setting { URL realURL() { if (external) { try { - return Paths.get(file).toUri().toURL(); + return Paths.get(file).toUri().normalize().toURL(); } catch (MalformedURLException e) { logger.catching(e); return null; diff --git a/eraser.starter/src/main/resources/starter.eraser b/eraser.starter/src/main/resources/starter.eraser index 25505fe24d64d3ed08ecdc0a3d741625b25e46ad..a8dc0c5731c9f5ce106c55aa4d2a87fc8f85df4f 100644 --- a/eraser.starter/src/main/resources/starter.eraser +++ b/eraser.starter/src/main/resources/starter.eraser @@ -3,26 +3,38 @@ Number Item: id="datetime_month" label="Month" state="1" topic="datetime_month"; Number Item: id="datetime_day" label="Day" state="31" topic="datetime_day"; Number Item: id="datetime_hour" label="Hour" state="13" topic="datetime_hour"; Number Item: id="datetime_minute" label="Minute" state="37" topic="datetime_minute"; -Number Item: id="bias" label="bias item" state="1" ; -Activity Item: id="activity" ; +Number Item: id="bias" label="bias item" state="1"; + + +String Item: id="m_accel_x" label="" state="0.2717419" topic="m_accel_x"; +String Item: id="m_accel_y" label="" state="8.698134" topic="m_accel_y"; +String Item: id="m_accel_z" label="" state="4.471172" topic="m_accel_z"; +String Item: id="m_rotation_x" label="" state="0.043741" topic="m_rotation_x"; +String Item: id="m_rotation_y" label="" state="0.515962" topic="m_rotation_y"; +String Item: id="m_rotation_z" label="" state="0.854318" topic="m_rotation_z"; +String Item: id="w_accel_x" label="" state="1.8818425" topic="w_accel_x"; +String Item: id="w_accel_y" label="" state="4.9320555" topic="w_accel_y"; +String Item: id="w_accel_z" label="" state="8.145074" topic="w_accel_z"; +String Item: id="w_rotation_x" label="" state="0.2374878" topic="w_rotation_x"; +String Item: id="w_rotation_y" label="" state="-0.032836914" topic="w_rotation_y"; +String Item: id="w_rotation_z" label="" state="0.3381958" topic="w_rotation_y"; +String Item: id="w_brightness" label="" state="bright" topic="w_brightness"; +//String Item: id="activity" label="" state="lying" topic="activity"; +Activity Item: id="activity" topic="activity"; Group: id="Lights" items=["iris1_item"]; Group: id="Datetime" items=["datetime_month", "datetime_day", "datetime_hour", "datetime_minute"]; -Mqtt: incoming="oh2/out/" outgoing="oh2/in/" host="localhost:2883" ; +Mqtt: incoming="oh2/out/" outgoing="oh2/in/" host="localhost:1883" ; //Mqtt: incoming="oh2/out/" outgoing="oh2/in/" host="192.168.1.250" ; Influx: host="172.22.1.152" ; - +//"working", "walking", "dancing", "lying", "getting up", "reading" ML: activities={ - 0: "Open door in empty room", - 1: "Door closed in empty room", - 2: "Open door with person in room", - 3: "Door closed with person in room", - 4: "Working", - 5: "Watch TV", - 6: "Reading", - 7: "Listening to music", - 8: "Going to sleep", - 9: "Wake up" + 0: "working", + 1: "walking", + 2: "dancing", + 3: "lying", + 4: "getting up", + 5: "reading" } ; diff --git a/eraser.starter/starter-setting.yaml b/eraser.starter/starter-setting.yaml index f29763c43dfa4b789f872efc9eec88439930eff9..e8f438cf3eeb22d71d44c675e7328e61ba612562 100644 --- a/eraser.starter/starter-setting.yaml +++ b/eraser.starter/starter-setting.yaml @@ -24,28 +24,29 @@ load: # Model for activity recognition. If dummy is true, then the file parameter is ignored. activity: - # File to read in. Expected format = eg - file: activity.eg + # File to read in. Expected format = csv /Users/boqi/eraser/datasets + file: ../datasets/backup/activity_data.csv + external: true # Use dummy model in which the current activity is directly editable. Default: false. - dummy: true + dummy: false # Model id. Default: 1. id: 1 + # Item to change with classification result + affectedItem: activity # Model for preference learning. If dummy is true, then the file parameter is ignored. preference: - # File to read in. Expected format = eg - file: preference.eg + # File to read in. Expected format = csv + file: ../datasets/backup/preference_data.csv + external: true # Use dummy model in which the current activity is directly editable. Default: false. dummy: false # Model id. Default: 1. id: 1 # Items to connect to inputs items: - - datetime_month - - datetime_day - - datetime_hour - - datetime_minute -# - activity + - activity + - w_brightness # Item to change with classification result affectedItem: iris1_item diff --git a/feedbackloop.learner/.settings/org.eclipse.buildship.core.prefs b/feedbackloop.learner/.settings/org.eclipse.buildship.core.prefs deleted file mode 100644 index b1886adb46c085de842f1283c1a3c25151bfc988..0000000000000000000000000000000000000000 --- a/feedbackloop.learner/.settings/org.eclipse.buildship.core.prefs +++ /dev/null @@ -1,2 +0,0 @@ -connection.project.dir=.. -eclipse.preferences.version=1 diff --git a/feedbackloop.learner_backup/build.gradle b/feedbackloop.learner_backup/build.gradle index d0cf7913f010772f11df428d587fc351d8df634a..6199fa8da5b905d3d5d4cb02d6c6858218f3ffdd 100644 --- a/feedbackloop.learner_backup/build.gradle +++ b/feedbackloop.learner_backup/build.gradle @@ -8,6 +8,13 @@ dependencies { testCompile group: 'junit', name: 'junit', version: '4.12' testCompile group: 'org.hamcrest', name: 'hamcrest-junit', version: '2.0.0.0' compile group: 'org.encog', name: 'encog-core', version: '3.4' + implementation group: 'com.opencsv', name: 'opencsv', version: '4.1' + implementation group: 'commons-io', name: 'commons-io', version: '2.5' + implementation group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.8' + implementation group: 'org.apache.httpcomponents', name: 'fluent-hc', version: '4.5.8' + // https://mvnrepository.com/artifact/org.apache.spark/spark-mllib + //runtime group: 'org.apache.spark', name: 'spark-mllib_2.10', version: '1.3.0' + compile group: 'com.sparkjava', name: 'spark-core', version: '2.9.0' } run { diff --git a/feedbackloop.learner_backup/out/production/classes/de/tudresden/inf/st/eraser/feedbackloop/learner_backup/Learner.class b/feedbackloop.learner_backup/out/production/classes/de/tudresden/inf/st/eraser/feedbackloop/learner_backup/Learner.class deleted file mode 100644 index b5c7ac883ec06fd2a4a8edc9f6dec90d4ef8408a..0000000000000000000000000000000000000000 Binary files a/feedbackloop.learner_backup/out/production/classes/de/tudresden/inf/st/eraser/feedbackloop/learner_backup/Learner.class and /dev/null differ diff --git a/feedbackloop.learner_backup/out/production/classes/de/tudresden/inf/st/eraser/feedbackloop/learner_backup/Main.class b/feedbackloop.learner_backup/out/production/classes/de/tudresden/inf/st/eraser/feedbackloop/learner_backup/Main.class deleted file mode 100644 index dade9fc50c465dd099158b290d8ea2e2a0b7b776..0000000000000000000000000000000000000000 Binary files a/feedbackloop.learner_backup/out/production/classes/de/tudresden/inf/st/eraser/feedbackloop/learner_backup/Main.class and /dev/null differ diff --git a/feedbackloop.learner_backup/out/test/classes/de/tudresden/inf/st/eraser/feedbackloop/learner_backup/ATest.class b/feedbackloop.learner_backup/out/test/classes/de/tudresden/inf/st/eraser/feedbackloop/learner_backup/ATest.class deleted file mode 100644 index 680ab03419aa1af885787e2374c71cf5ff4437df..0000000000000000000000000000000000000000 Binary files a/feedbackloop.learner_backup/out/test/classes/de/tudresden/inf/st/eraser/feedbackloop/learner_backup/ATest.class and /dev/null differ diff --git a/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/CsvTransfer.java b/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/CsvTransfer.java new file mode 100644 index 0000000000000000000000000000000000000000..1c08268d59dd4003149e551d2e3e60895d30e3f6 --- /dev/null +++ b/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/CsvTransfer.java @@ -0,0 +1,60 @@ +package de.tudresden.inf.st.eraser.feedbackloop.learner_backup; + +import java.io.*; +import java.util.*; + +import com.opencsv.CSVReader; +import com.opencsv.CSVWriter; + + +public class CsvTransfer { + public static void main(String[] args){ + Learner learner=new Learner(); + learner.train("datasets/backup/activity_data.csv","datasets/backup/preference_data.csv"); + } + + //learner.train("datasets/backup/activity_data.csv","datasets/backup/preference_data.csv"); + /**private static final String CSV_FILE_PATH + = "datasets/backup/activity_data_example.csv"; + private static final String OUTPUT_FILE_PATH + = "datasets/backup/activity_data.csv"; + public static void main(String[] args) + { + addDataToCSV(CSV_FILE_PATH, OUTPUT_FILE_PATH); + } + public static void addDataToCSV(String input, String output) + { + File input_file = new File(input); + File output_file = new File(output); + try { + // create FileWriter object with file as parameter + FileReader reader = new FileReader(input_file); + CSVReader csv_reader = new CSVReader(reader); + String[] nextRecord; + FileWriter writer = new FileWriter(output_file); + CSVWriter csv_writer = new CSVWriter(writer, ',', + CSVWriter.NO_QUOTE_CHARACTER, + CSVWriter.DEFAULT_ESCAPE_CHARACTER, + CSVWriter.DEFAULT_LINE_END); + List<String[]> data = new ArrayList<String[]>(); + + while ((nextRecord = csv_reader.readNext()) != null) { + data.add(nextRecord); + + for (String cell : nextRecord) { + System.out.print(cell + "\t"); + } + System.out.println(); + } + csv_writer.writeAll(data); + writer.close(); + csv_reader.close(); + } + catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + }*/ +} + + diff --git a/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/DummyPreference.java b/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/DummyPreference.java new file mode 100644 index 0000000000000000000000000000000000000000..59f3ad9f43fd11eab315e145b1780d4152b82181 --- /dev/null +++ b/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/DummyPreference.java @@ -0,0 +1,75 @@ +package de.tudresden.inf.st.eraser.feedbackloop.learner_backup; +import com.opencsv.CSVWriter; + +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class DummyPreference { + private static String activity; //Activity: walking, reading, working, dancing, lying, getting up + private static String watch_brightness; //dark: <45; dimmer 45-70; bright >70; + private static String light_color_openhab_H; //red 7; green 120; blue 240; yellow 60; sky blue 180; purple 300; + private static String brightness_output; //1-100**/ + private static Random random = new Random(); + + public static void main(String[] args) { + creator(); + } + static void creator(){ + + + try{ + FileWriter writer = new FileWriter("datasets/backup/preference_data.csv",true); + CSVWriter csv_writer = new CSVWriter(writer, ',', + CSVWriter.NO_QUOTE_CHARACTER, + CSVWriter.DEFAULT_ESCAPE_CHARACTER, + CSVWriter.DEFAULT_LINE_END); + + + //activity="walking" green + activity ="walking"; + + // activity ="reading"; + csv_writer.writeAll(generator("walking","green")); + csv_writer.writeAll(generator("reading","sky blue")); + csv_writer.writeAll(generator("working","blue")); + csv_writer.writeAll(generator("dancing","purple")); + csv_writer.writeAll(generator("lying","red")); + csv_writer.writeAll(generator("getting up","yellow")); + csv_writer.close(); + writer.close(); + }catch (IOException e){e.printStackTrace();} + } + static List<String[]> generator(String activity_input, String color){ + List<String[]> data = new ArrayList<String[]>(); + activity = activity_input; + light_color_openhab_H =color; + //100 walking with different lighting intensity + for (int i=0; i<100; i++){ + String[] add_data = new String[4]; + int brightness = random.nextInt(3000); + System.out.println(brightness); + if (brightness<45){ + watch_brightness = "dark"; + brightness_output ="100"; + }else if(45<=brightness && brightness<200){ + watch_brightness = "dimmer"; + brightness_output ="40"; + }else if( 200<=brightness && brightness<1000){ + watch_brightness = "medium"; + brightness_output ="70"; + }else{ + watch_brightness = "bright"; + brightness_output ="0"; + } + add_data[0] = activity; + add_data[1] = watch_brightness; + add_data[2] = light_color_openhab_H; + add_data[3] = brightness_output; + data.add(add_data); + } + return data; + } +} diff --git a/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/Learner.java b/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/Learner.java index c728eed8e76b70b64c74455633edec388e16ce3e..5d8021d8faf7519d9ec15305f0752cfbcd742a0c 100644 --- a/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/Learner.java +++ b/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/Learner.java @@ -1,16 +1,15 @@ package de.tudresden.inf.st.eraser.feedbackloop.learner_backup; import java.io.File; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.Arrays; - -import com.sun.javafx.tools.packager.Log; -import org.encog.ConsoleStatusReportable; +import java.io.IOException; +//import java.util.ArrayList; +//import com.sun.javafx.tools.packager.Log; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +//import org.encog.ConsoleStatusReportable; import org.encog.Encog; -import org.encog.bot.BotUtil; -import org.encog.ml.MLInput; -import org.encog.ml.MLRegression; +import org.encog.ml.MLClassification; +//import org.encog.ml.MLRegression; import org.encog.ml.data.MLData; import org.encog.ml.data.versatile.NormalizationHelper; import org.encog.ml.data.versatile.VersatileMLDataSet; @@ -22,8 +21,6 @@ import org.encog.ml.factory.MLMethodFactory; import org.encog.ml.model.EncogModel; import org.encog.neural.networks.BasicNetwork; import org.encog.util.csv.CSVFormat; -import org.encog.util.csv.ReadCSV; -import org.encog.util.simple.EncogUtility; import static org.encog.persist.EncogDirectoryPersistence.*; public class Learner { @@ -31,129 +28,163 @@ public class Learner { /** * intial train * */ - private String csv_url_activity; - private String csv_url_perference; - private String save_activity_model_file = "datasets/backup/activity_model.eg"; - private String save_perference_model_file = "datasets/backup/preference_model.eg"; + private File save_activity_model_file; + private File save_preference_model_file; private File csv_file; - private VersatileDataSource souce; - private VersatileMLDataSet data; - private EncogModel model; + private VersatileMLDataSet a_data; + private VersatileMLDataSet p_data; + private EncogModel a_model; + private EncogModel p_model; private NormalizationHelper activity_helper; private NormalizationHelper preference_helper; - private MLRegression best_method; - private String[] new_data; - private String activity_result; - private String preference_result; + private MLClassification a_best_method; + private MLClassification p_best_method; + private final Logger logger = LogManager.getLogger(Learner.class); + + 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){ - this.csv_url_activity = activity_csv_url; + VersatileDataSource a_souce; + String csv_url_activity; + csv_url_activity = activity_csv_url; this.csv_file = new File(csv_url_activity); - souce = new CSVDataSource(csv_file,false,CSVFormat.DECIMAL_POINT); - data = new VersatileMLDataSet(souce); - data.defineSourceColumn("monat", 0, ColumnType.continuous); - data.defineSourceColumn("day", 1, ColumnType.continuous); - data.defineSourceColumn("hour", 2, ColumnType.continuous); - data.defineSourceColumn("minute", 3, ColumnType.continuous); - ColumnDefinition outputColumn = data.defineSourceColumn("labels", 4, ColumnType.continuous); - data.defineSingleOutputOthersInput(outputColumn); - data.analyze(); - System.out.println("get data "); - model = new EncogModel(data); - model.selectMethod(data, MLMethodFactory.TYPE_FEEDFORWARD); - data.normalize(); - activity_helper = data.getNormHelper(); - System.out.println(activity_helper.toString()); + a_souce = new CSVDataSource(csv_file,false,CSVFormat.DECIMAL_POINT); + a_data = new VersatileMLDataSet(a_souce); + String[] activity_inputs={"m_accel_x","m_accel_y", "m_accel_z", + "m_rotation_x","m_rotation_y", "m_rotation_z", + "w_accel_x","w_accel_y", "w_accel_z", + "w_rotation_x","w_rotation_y","w_rotation_z" + }; + for(int i=0; i < activity_inputs.length; i++){ + a_data.defineSourceColumn(activity_inputs[i], i, ColumnType.continuous); + } + ColumnDefinition outputColumn = a_data.defineSourceColumn("labels", 12, ColumnType.nominal); + a_data.defineSingleOutputOthersInput(outputColumn); + a_data.analyze(); + a_model = new EncogModel(a_data); + a_model.selectMethod(a_data, MLMethodFactory.TYPE_FEEDFORWARD); + a_data.normalize(); + activity_helper = a_data.getNormHelper(); } - private void perferenceDataAnalyser(String perference_csv_url){ - this.csv_url_perference = perference_csv_url; - this.csv_file = new File(this.csv_url_perference); - souce = new CSVDataSource(csv_file,false,CSVFormat.DECIMAL_POINT); - data = new VersatileMLDataSet(souce); - data.defineSourceColumn("activity", 0, ColumnType.continuous); - data.defineSourceColumn("brightness", 1, ColumnType.continuous); - data.defineSourceColumn("time", 2, ColumnType.continuous); - data.defineSourceColumn("minute", 3, ColumnType.continuous); - ColumnDefinition outputColumn = data.defineSourceColumn("labels", 4, ColumnType.continuous); - data.defineSingleOutputOthersInput(outputColumn); - data.analyze(); - model = new EncogModel(data); - model.selectMethod(data, MLMethodFactory.TYPE_FEEDFORWARD); - //model.setReport(new ConsoleStatusReportable()); - data.normalize(); - preference_helper = data.getNormHelper(); - System.out.println(activity_helper.toString()); + private void preferenceDataAnalyser(String preference_csv_url){ + VersatileDataSource p_source; + String csv_url_preference; + csv_url_preference = preference_csv_url; + this.csv_file = new File(csv_url_preference); + p_source = new CSVDataSource(csv_file,false,CSVFormat.DECIMAL_POINT); + p_data = new VersatileMLDataSet(p_source); + p_data.defineSourceColumn("activity", 0, ColumnType.nominal); + p_data.defineSourceColumn("w_brightness", 1, ColumnType.nominal); + ColumnDefinition outputColumn1 = p_data.defineSourceColumn("label1", 2, ColumnType.continuous); + ColumnDefinition outputColumn2 = p_data.defineSourceColumn("label2", 3, ColumnType.continuous); + ColumnDefinition[] outputs = new ColumnDefinition[2]; + outputs[0] = outputColumn1; + outputs[1] = outputColumn2; + p_data.defineMultipleOutputsOthersInput(outputs); + p_data.analyze(); + p_model = new EncogModel(p_data); + p_model.selectMethod(p_data, MLMethodFactory.TYPE_FEEDFORWARD); + p_data.normalize(); + preference_helper = p_data.getNormHelper(); } - void train(String activity_url,String perference_url){ + void train(String activity_url,String preference_url){ activity_train(activity_url); - Log.info("activity training finished"); - preference_train(perference_url); - Log.info("preference training finished"); + preference_train(preference_url); + Encog.getInstance().shutdown(); } - private void activity_train(String activity_csv_url){ + + void activity_train(String activity_csv_url){ + logger.info("Activity training is beginning ... ..."); activityDataAnalyser(activity_csv_url); - model.holdBackValidation(0.3, true, 1001); - model.selectTrainingType(data); - best_method = (MLRegression)model.crossvalidate(5, true); - System.out.println(best_method); + a_model.holdBackValidation(0.3, true, 1001); + a_model.selectTrainingType(a_data); + a_best_method = (MLClassification)a_model.crossvalidate(5, true); saveEncogModel(save_activity_model_file); + logger.info("Activity training is finished ... ..."); + Encog.getInstance().shutdown(); } - private void preference_train(String perfence_csv_url){ - perferenceDataAnalyser(perfence_csv_url); - model.holdBackValidation(0.3, true, 1001); - model.selectTrainingType(data); - best_method = (MLRegression)model.crossvalidate(5, true); - System.out.println(best_method); - saveEncogModel(save_perference_model_file); + void preference_train(String prefence_csv_url){ + logger.info("Preference training is beginning ... ..."); + preferenceDataAnalyser(prefence_csv_url); + p_model.holdBackValidation(0.3, true, 1001); + p_model.selectTrainingType(p_data); + p_best_method = (MLClassification)p_model.crossvalidate(5, true); + saveEncogModel(save_preference_model_file); + logger.info("Preference training is finished ... ..."); + Encog.getInstance().shutdown(); } String[] predictor(String[] new_data){ - this.new_data = new_data; - activityDataAnalyser("datasets/backup/activity_data.csv"); - perferenceDataAnalyser("datasets/backup/preference_data.csv"); - String[] result = new String[2]; - result[0] = activity_predictor(); - result[1] = perference_predictor(); + String[] preference_data = new String[2]; + String[] result = new String[3]; + String[] activity_data= new String[12]; + for(int i=0; i<new_data.length;i++){ + activity_data[i]=new_data[i]; + } + result[0] = activity_predictor(activity_data); + preference_data[0]=result[0]; + preference_data[1]=new_data[12]; + result[1] = preference_predictor(preference_data)[0]; + result[2] = preference_predictor(preference_data)[1]; Encog.getInstance().shutdown(); return result; } - private String activity_predictor(){ - BasicNetwork activity_method = (BasicNetwork) loadObject(new File(save_activity_model_file)); + String activity_predictor(String[] new_data){ + logger.info("Activity predicting ... ..."); + String activity_result; + activityDataAnalyser("../datasets/backup/activity_data.csv"); + BasicNetwork activity_method = (BasicNetwork) loadObject(save_activity_model_file); MLData input = activity_helper.allocateInputVector(); - String[] activity_new_data = new String[4]; - activity_new_data[0] = new_data[0]; - activity_new_data[1] = new_data[1]; - activity_new_data[2] = new_data[2]; - activity_new_data[3] = new_data[3]; - activity_helper.normalizeInputVector(activity_new_data,input.getData(),false); + activity_helper.normalizeInputVector(new_data,input.getData(),false); MLData output = activity_method.compute(input); - System.out.println("input:"+input); - System.out.println("output"+output); activity_result = activity_helper.denormalizeOutputVectorToString(output)[0]; - System.out.println("output activity"+ activity_result); + Encog.getInstance().shutdown(); + logger.debug("Activity Predictor result is: {}",activity_result); return activity_result; } - private String perference_predictor(){ - BasicNetwork preference_method = (BasicNetwork)loadObject(new File(save_perference_model_file)); + String[] preference_predictor(String[] new_data){ + logger.info("Activity predicting ... ..."); + String[] preference_result; + preference_result = new String[2]; + preferenceDataAnalyser("../datasets/backup/preference_data.csv"); + BasicNetwork preference_method = (BasicNetwork)loadObject(save_preference_model_file); MLData input = preference_helper.allocateInputVector(); - String[] perference_new_data = new String[4]; - perference_new_data[0] = activity_result; - perference_new_data[1] = new_data[4]; - perference_new_data[2] = new_data[5]; - perference_new_data[3] = new_data[6]; - preference_helper.normalizeInputVector(perference_new_data, input.getData(),false); + preference_helper.normalizeInputVector(new_data, input.getData(),false); MLData output = preference_method.compute(input); - preference_result = preference_helper.denormalizeOutputVectorToString(output)[0]; + preference_result[0] = preference_helper.denormalizeOutputVectorToString(output)[0]; + preference_result[1] = preference_helper.denormalizeOutputVectorToString(output)[1]; + Encog.getInstance().shutdown(); + logger.debug("Preference Predictor result is, Color: {}",Math.round(Float.valueOf(preference_result[0]))); + logger.debug("Preference Predictor result is, Brightness: {} ",Math.round(Float.valueOf(preference_result[1]))); return preference_result; } + private void saveEncogModel(File modelFile){ + if (modelFile.equals(save_activity_model_file)) { + saveObject(modelFile, this.a_best_method); + } else { + saveObject(modelFile, this.p_best_method); + } - private void saveEncogModel(String model_file_url){ - saveObject(new File(model_file_url), this.best_method); } } diff --git a/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/MachineLearningImpl.java b/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/MachineLearningImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..dc16aa2353ea216a49d2d1e75d8cfcff4d36abbc --- /dev/null +++ b/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/MachineLearningImpl.java @@ -0,0 +1,211 @@ +package de.tudresden.inf.st.eraser.feedbackloop.learner_backup; + + + +//import com.sun.javafx.tools.packager.Log; +import de.tudresden.inf.st.eraser.jastadd.model.*; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.time.Instant; +import java.util.*; +import java.util.stream.Collectors; + + +public class MachineLearningImpl implements MachineLearningDecoder, MachineLearningEncoder { + + private List<Item> target_item_list; + private List<Item> relevant_item_list; + private String[] preference_result; + + private Root root; + private final Logger logger = LogManager.getLogger(MachineLearningImpl.class); + private final Learner learner; + private final int goal; + + public static final int GOAL_ACTIVITY_PHONE_AND_WATCH = 1; + public static final int GOAL_PREFERENCE_BRIGHTNESS_IRIS = 2; + public String activity_result; + private String[] activites= new String[]{"working", "walking", "dancing", "lying", "getting up", "reading"}; + public MachineLearningImpl(Learner learner, int goal) { + this.learner = learner; + this.goal = goal; + } + + @Override + public void setKnowledgeBaseRoot(Root root) { + this.root = root; + updateItems(); + } + + private void updateItems() { + OpenHAB2Model model = root.getOpenHAB2Model(); + List<String> targetItemNames, relevantItemNames; + switch (this.goal) { + case GOAL_ACTIVITY_PHONE_AND_WATCH: + targetItemNames = Collections.singletonList("activity"); + relevantItemNames = Arrays.asList( + "m_accel_x", + "m_accel_y", + "m_accel_z", + "m_rotation_x", + "m_rotation_y", + "m_rotation_z", + "w_accel_x", + "w_accel_y", + "w_accel_z", + "w_rotation_x", + "w_rotation_y", + "w_rotation_z" + ); + break; + case GOAL_PREFERENCE_BRIGHTNESS_IRIS: + targetItemNames = Collections.singletonList("iris1_item"); + relevantItemNames = Arrays.asList( + "activity", + "w_brightness" + ); + break; + default: + logger.error("Unknown goal value ({}) set", this.goal); + targetItemNames = Collections.emptyList(); + relevantItemNames = Collections.emptyList(); + } + target_item_list = targetItemNames.stream() + .map(name -> resolve(model, name)) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + relevant_item_list = relevantItemNames.stream() + .map(name -> resolve(model, name)) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } + + private Item resolve(OpenHAB2Model model, String id) { + Optional<Item> maybeItem = model.resolveItem(id); + if (maybeItem.isPresent()) { + return maybeItem.get(); + } else { + logger.warn("Could not find item with id {}", id); + return null; + } + } + + @Override + public void newData(List<Item> changedItems) { + /* String topic = changedItems.get(0).getTopic().toString(); + if(topic.equals("oh2/samsung/items1")){ + new_data[0]=changedItems.get(0).influxMeasurementName(); + } + model.getOpenHAB2Model().items(); + Item iris_item=model.getOpenHAB2Model().resolveItem("iris_item").get(); + iris_item.getStateAsString();*/ + /* FIXME either save state of unchanged items here (if only changed items are reported) <- pull model + or let knowledge base pass all relevant items <- push model + */ + if(this.goal==GOAL_ACTIVITY_PHONE_AND_WATCH){ + String[] new_data = new String[12]; + for (int i =0; i< new_data.length; i++){ + new_data[i] ="0"; + } + for(Item item: changedItems){ + int i = 0; + for(Item item1: relevant_item_list){ + if(item.getTopic().toString().equals(item1.getTopic().toString())){ + new_data[i]=item.getStateAsString(); + } + i++; + } + } + this.activity_result = learner.activity_predictor(new_data); + + }else if(this.goal==GOAL_PREFERENCE_BRIGHTNESS_IRIS){ + String[] new_data = new String[2]; + for(Item item: changedItems){ + if(root.getOpenHAB2Model().getActivityItem().equals(item)) + { + String test=item.getStateAsString(); + int index = Math.round(Float.valueOf(test)); + new_data[0]=activites[index]; + } + if(item.getID().equals("w_brightness")){ + new_data[1]=item.getStateAsString(); + } + } + this.preference_result=learner.preference_predictor(new_data); + } + } + + @Override + public List<Item> getTargets() { + return target_item_list; + } + + @Override + public List<Item> getRelevantItems() { + return relevant_item_list; + } + + @Override + public void triggerTraining() { + logger.debug("Ignore trigger training call"); + } + + @Override + public Instant lastModelUpdate() { + return null; + } + + @Override + public MachineLearningResult classify() { + switch (this.goal) { + case GOAL_ACTIVITY_PHONE_AND_WATCH: + String activityStringValue = activity_result; + Item activityItem = resolve(this.root.getOpenHAB2Model(), "activity"); + //activityItem.setStateFromString(activityStringValue); + // 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++){ + if(activites[i].equals(activityStringValue)){ + activityItem.setStateFromString(String.valueOf(i)); + } + } + logger.debug("Classify would return activity: {}", activityStringValue); + ItemPreference classifiedActivity = new ItemPreferenceDouble(activityItem, 0); + return new MachineLearningResultImpl(classifiedActivity); + case GOAL_PREFERENCE_BRIGHTNESS_IRIS: +// String[] preference = {result[1], result[2]}; + // FIXME what is the meaning of result[1] and result[2] + Item iris1 = resolve(this.root.getOpenHAB2Model(), "iris1_item"); + int color = 0; + int brightness = 0; + if (preference_result != null){ + color = Math.round(Float.valueOf(preference_result[0])); + brightness = Math.round(Float.valueOf(preference_result[1])); + } + + ItemPreference classifiedPreference = new ItemPreferenceColor(iris1, TupleHSB.of(color, 100, brightness)); + return new MachineLearningResultImpl(classifiedPreference); + default: + logger.error("Unknown goal value ({}) set in classify", this.goal); + return new EmptyMachineLearningResult(); + } + } + + public void initActivities(String filenameOfCsv) { + logger.debug(filenameOfCsv); + learner.activity_train(filenameOfCsv); + } + + public void initPreferences(String filenameOfCsv) { + learner.preference_train(filenameOfCsv); + } + + class EmptyMachineLearningResult implements MachineLearningResult { + + @Override + public List<ItemPreference> getPreferences() { + return Collections.emptyList(); + } + } + +} diff --git a/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/MachineLearningResultImpl.java b/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/MachineLearningResultImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..61d483a566255d51ce424d23adb014df1eec8109 --- /dev/null +++ b/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/MachineLearningResultImpl.java @@ -0,0 +1,26 @@ +package de.tudresden.inf.st.eraser.feedbackloop.learner_backup; + +import de.tudresden.inf.st.eraser.jastadd.model.ItemPreference; +import de.tudresden.inf.st.eraser.jastadd.model.MachineLearningResult; + +import java.util.Collections; +import java.util.List; + +/** + * TODO: Add description. + * + * @author rschoene - Initial contribution + */ +public class MachineLearningResultImpl implements MachineLearningResult { + + private final ItemPreference preference; + + MachineLearningResultImpl(ItemPreference preference) { + this.preference = preference; + } + + @Override + public List<ItemPreference> getPreferences() { + return Collections.singletonList(preference); + } +} diff --git a/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/Main.java b/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/Main.java index 8ef9e85f7e0bcb95e5f430e87fe48ac81fad2733..2580847d5ace8e832bde76159dad2e85974115a2 100644 --- a/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/Main.java +++ b/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/Main.java @@ -1,6 +1,9 @@ package de.tudresden.inf.st.eraser.feedbackloop.learner_backup; -import de.tudresden.inf.st.eraser.jastadd.model.*; +import org.encog.util.csv.CSVFormat; +import org.encog.util.csv.ReadCSV; + +import java.util.Arrays; public class Main { @@ -8,22 +11,154 @@ public class Main { /** * new data from KB * */ - String[] new_data = new String[7]; - new_data[0]="7"; - new_data[1]="20"; - new_data[2]="12"; - new_data[3]="13"; - new_data[4]="7"; - new_data[5]="25"; - new_data[6]="12"; + //ReaderCSV reader = new ReaderCSV("datasets/backup/activity_data.csv","preference"); + //reader.updater(); + Learner learner=new Learner(); + //learner.preference_train("../datasets/backup/preference_data.csv"); + //learner.train("datasets/backup/activity_data.csv","datasets/backup/preference_data.csv"); + //0.5793968,1.2126632,-4.6244006,-0.030779,0.801127,0.590978,-3.1411927,-0.93373865,-0.31124622,-0.35992432,0.33746338,-0.79608154,dancing + /**String[] new_data = new String[12]; + new_data[0]="0.5793968"; + new_data[1]="1.2126632"; + new_data[2]="-4.6244006"; + new_data[3]="-0.030779"; + new_data[4]="0.801127"; + new_data[5]="0.590978"; + new_data[6]="-3.1411927"; + new_data[7]="-0.93373865"; + new_data[8]="-0.31124622"; + new_data[9]="-0.35992432"; + new_data[10]="0.33746338"; + new_data[11]="-0.79608154"; + + String result =learner.activity_predictor(new_data); + System.out.println(result); + + List k=new ArrayList(); + + k.add(new_data);*/ + + //learner.preference_train("datasets/backup/preference_data.csv"); + //learner.train("datasets/backup/activity_data.csv","datasets/backup/preference_data.csv"); + //walking,medium,120,70 + //reading,bright,180,0 + + //activity_validation_learner(); + //0.10654198,8.6574335,4.414908,0.040269,0.516884,0.853285,1.2066777,-1.1444284,9.648633,1.2207031E-4,-0.055358887,0.5834961 working + String[] new_data = new String[12]; + new_data[0]="0.010773907"; + new_data[1]="8.610746"; + new_data[2]="4.4963107"; + new_data[3]="0.047136"; + new_data[4]="0.515427"; + new_data[5]="0.852877"; + new_data[6]="0.9720459"; + new_data[7]="-1.3694834"; + new_data[8]="9.696517"; + new_data[9]="-0.0056152344"; + new_data[10]="-0.049438477"; + new_data[11]="0.5576782"; + //0.010773907,8.610746,4.4963107,0.047136,0.515427,0.852877,0.9720459,-1.3694834,9.696517,-0.0056152344,-0.049438477,0.5576782 working + //0.9999999988939648,-0.9995820798966354,-0.9999999999999997,-0.9999988062118802,-0.9974031940544938,-1.0 + + //String result =learner.activity_predictor(new_data); + //System.out.println(result); + + /**String[] new_data_1 =new String[12]; + //-2.6252422,8.619126,-2.7030537,0.552147,0.5078,0.450302,-8.1881695,-1.2641385,0.038307227,-0.34222412,0.49102783,-0.016540527,walking + new_data_1[0]="-2.6252422"; + new_data_1[1]="8.619126"; + new_data_1[2]="-2.7030537"; + new_data_1[3]="0.552147"; + new_data_1[4]="0.5078"; + new_data_1[5]="0.450302"; + new_data_1[6]="-8.1881695"; + new_data_1[7]="-1.2641385"; + new_data_1[8]="0.038307227"; + new_data_1[9]="-0.34222412"; + new_data_1[10]="0.49102783"; + new_data_1[11]="-0.016540527"; + String result1 =learner.activity_predictor(new_data_1); + System.out.println(result1); /** * learner.train(activity_csv_url, preference_data_url) * learner.predictor get the result from predictor for new data * */ + /**String[] new_data_2 = new String[12]; + //-6.5565214,5.717354,5.6658783,0.185591,0.464146,0.413321,-20.580557,3.8498764,-0.4261679,0.7647095,-0.4713745,0.23999023,dancing + new_data_2[0]="-6.5565214"; + new_data_2[1]="5.717354"; + new_data_2[2]="5.6658783"; + new_data_2[3]="0.185591"; + new_data_2[4]="0.464146"; + new_data_2[5]="0.413321"; + new_data_2[6]="-20.580557"; + new_data_2[7]="3.8498764"; + new_data_2[8]="-0.4261679"; + new_data_2[9]="0.7647095"; + new_data_2[10]="-0.4713745"; + new_data_2[11]="0.23999023"; + + String[] new_data_3 = new String[12]; + new_data_3[0]="-5.3881507"; + new_data_3[1]="0.25378537"; + new_data_3[2]="7.69257"; + new_data_3[3]="-0.122974"; + new_data_3[4]="0.247411"; + new_data_3[5]="0.439031"; + new_data_3[6]="4.9224787"; + new_data_3[7]="-10.601525"; + new_data_3[8]="-4.927267"; + new_data_3[9]="0.7946167"; + new_data_3[10]="0.35272217"; + new_data_3[11]="0.16192627"; + //"-5.3881507","0.25378537","7.69257","-0.122974","0.247411","0.439031","4.9224787","-10.601525","-4.927267","0.7946167","0.35272217","0.16192627","lying" Learner learner=new Learner(); - //learner.train("datasets/activity_data.csv", "datasets/preference_data.csv"); - String[] result = learner.predictor(new_data); + //learner.train("datasets/backup/activity_data.csv", "datasets/preference_data.csv"); + String[] result = learner.predictor(new_data_3); System.out.println("activity is:" + result[0]); - System.out.println("perference is: "+ result[1]); + //System.out.println("perference is: "+ result[1]);**/ + } + public static void activity_validation_learner(){ + ReadCSV csv = new ReadCSV("datasets/backup/activity_data.csv", false, CSVFormat.DECIMAL_POINT); + String[] line = new String[12]; + Learner learner=new Learner(); + int wrong=0; + int right=0; + while(csv.next()) { + StringBuilder result = new StringBuilder(); + line[0] = csv.get(0); + line[1] = csv.get(1); + line[2] = csv.get(2); + line[3] = csv.get(3); + line[4] = csv.get(4); + line[5] = csv.get(5); + line[6] = csv.get(6); + line[7] = csv.get(7); + line[8] = csv.get(8); + line[9] = csv.get(9); + line[10] = csv.get(10); + line[11] = csv.get(11); + String correct = csv.get(12); + String irisChosen = learner.predictor(line)[0]; + result.append(Arrays.toString(line)); + result.append(" -> predicted: "); + result.append(irisChosen); + result.append("(correct: "); + result.append(correct); + result.append(")"); + if (irisChosen.equals(correct)!=true){ + System.out.println(correct); + System.out.println(irisChosen); + ++wrong; + }else{ + ++right; + } + System.out.println(result.toString()); + } + System.out.println("wrong number"+wrong); + System.out.println("right number"+right); + //double validation = (double(right))/(double(wrong+right)); + //System.out.println("%.2f"+validation); } } diff --git a/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/ReaderCSV.java b/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/ReaderCSV.java new file mode 100644 index 0000000000000000000000000000000000000000..76c1ce791b00843befc9ed8b9d0f1941532ac386 --- /dev/null +++ b/feedbackloop.learner_backup/src/main/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/ReaderCSV.java @@ -0,0 +1,116 @@ +package de.tudresden.inf.st.eraser.feedbackloop.learner_backup; + +import java.awt.*; +import java.io.FileReader; +import java.io.*; +import java.util.Arrays; + +import com.opencsv.CSVReader; +import org.apache.http.client.fluent.Request; +import org.apache.http.HttpResponse; +import org.apache.http.entity.ContentType; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.ReentrantLock; + +public class ReaderCSV{ + + //read every 5 s from csv + //activity CSV + /** + * Col 1: smartphone acceleration x + * Col 2: smartphone acceleration y + * Col 3: smartphone acceleration z + * Col 4: smartphone rotation x + * Col 5: smartphone rotation y + * Col 6: smartphone rotation z + * Col 7: watch acceleration x + * Col 8: watch acceleration y + * Col 9: watch acceleration z + * Col 10: watch rotation x + * Col 11: watch rotation y + * Col 12: watch rotation z/*/ + //preference CSV + /** + * Col 1: Activity + * Col 2: watch brightness range "bright, medium, dimmer, dark"*/ + + private static int TIME_PERIOD = 5000; //5 second update new value + private String csv_file_path; + private String csv_typ; + private File file; + private FileReader file_reader; + private CSVReader csv_reader; + private String[] next_record; + private static final Logger logger = LogManager.getLogger(ReaderCSV.class); + private static final String ERASER_ITEM_URI = "http://localhost:4567/model/items/"; + //TODO ITEM_NAME HAS TO BE DISCUSSED + private static final String[] ACTIVITY_ITEM_NAME = { + "m_accel_x", "m_accel_y", "m_accel_z", "m_rotation_x", + "m_rotation_y", "m_rotation_z", "w_accel_x", "w_accel_y", + "w_accel_z", "w_rotation_x", "w_rotation_y", "w_rotation_z"}; + private static final String[] PREFERENCE_ITEM_NAME = { + "w_brightness" + }; + + //csv_type is activity or preference + public ReaderCSV(String csv_file_path, String csv_type) { + this.csv_file_path = csv_file_path; + this.csv_typ = csv_type; + } + + public void updater(){ + file=new File(csv_file_path); + try { + file_reader =new FileReader(file); + csv_reader = new CSVReader(file_reader); + while ((next_record = csv_reader.readNext()) != null) { + Thread.sleep(TIME_PERIOD); + if (csv_typ =="activity"){ + String[] values = Arrays.copyOf(next_record,12); + setNewValue(values, ACTIVITY_ITEM_NAME); + + } else { + String[] values = Arrays.copyOf(next_record,2); + setNewValue(values, PREFERENCE_ITEM_NAME); + } + } + } + catch (Exception e){ + e.printStackTrace(); + } + } + private void setNewValue(String[] values, String[] name){ + if(this.csv_typ.equals("activity")) + { + int i = 0; + for(String value : values){ + String uri = ERASER_ITEM_URI + name[i] + "/state"; + logger.info("reader:",value); + try { + HttpResponse httpResponse = Request.Put(uri) + .bodyString(value, ContentType.TEXT_PLAIN) + .execute().returnResponse(); + }catch (Exception e){ + e.printStackTrace(); + } + i+=1; + } + + }else{ + String uri= ERASER_ITEM_URI + "w_brightness" +"/state"; + logger.info("reader:",values[1]); + try { + HttpResponse httpResponse = Request.Put(uri) + .bodyString(values[1], ContentType.TEXT_PLAIN) + .execute().returnResponse(); + }catch (Exception e){ + e.printStackTrace(); + } + + } + + } +} \ No newline at end of file diff --git a/feedbackloop.learner_backup/src/test/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/ATest.java b/feedbackloop.learner_backup/src/test/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/ATest.java deleted file mode 100644 index 45adf05d4acbbe801d7f9ced98e2173fdf1d259d..0000000000000000000000000000000000000000 --- a/feedbackloop.learner_backup/src/test/java/de/tudresden/inf/st/eraser/feedbackloop.learner_backup/ATest.java +++ /dev/null @@ -1,22 +0,0 @@ -package de.tudresden.inf.st.eraser.feedbackloop.learner_backup; - -import de.tudresden.inf.st.eraser.jastadd.model.*; -import org.junit.Test; - -import java.util.Set; - -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.fail; - -/** - * TODO: Add description. - * - * @author rschoene - Initial contribution - */ -public class ATest { - - @Test - public void test1() { - fail(); - } -} diff --git a/feedbackloop.plan/src/main/java/de/tudresden/inf/st/eraser/feedbackloop/plan/PlanImpl.java b/feedbackloop.plan/src/main/java/de/tudresden/inf/st/eraser/feedbackloop/plan/PlanImpl.java index 7175767134e29d3ab39e2c27cb0858d6cb4cb119..e7f256b2928dfbbdd35e48b2dbf5b1797eee727d 100644 --- a/feedbackloop.plan/src/main/java/de/tudresden/inf/st/eraser/feedbackloop/plan/PlanImpl.java +++ b/feedbackloop.plan/src/main/java/de/tudresden/inf/st/eraser/feedbackloop/plan/PlanImpl.java @@ -2,9 +2,7 @@ package de.tudresden.inf.st.eraser.feedbackloop.plan; import de.tudresden.inf.st.eraser.feedbackloop.api.Execute; 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.ItemPreference; -import de.tudresden.inf.st.eraser.jastadd.model.Root; +import de.tudresden.inf.st.eraser.jastadd.model.*; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -38,9 +36,15 @@ public class PlanImpl implements Plan { @Override public void planToMatchPreferences(Activity activity) { - // TODO actually use activity logger.info("Plan got new activity [{}]: {}", activity.getIdentifier(), activity.getLabel()); List<ItemPreference> preferences = knowledgeBase.currentPreferences(); + knowledgeBase.getMachineLearningRoot().addChangeEvent(createRecognitionEvent(activity)); informExecute(preferences); } + + private ChangeEvent createRecognitionEvent(Activity activity) { + RecognitionEvent result = RecognitionEvent.createRecognitionEvent(knowledgeBase.getMachineLearningRoot().getActivityRecognition()); + result.setActivity(activity); + return result; + } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index fb7ef980f26942c36accd5674b80128f6cf43abe..030ec1f8a437a05e86702c10632c66340d98ba0f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +#Tue May 07 14:40:56 CEST 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/learner_test/.gitignore b/learner_test/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..84c048a73cc2e5dd24f807669eb99b0ce3123195 --- /dev/null +++ b/learner_test/.gitignore @@ -0,0 +1 @@ +/build/ diff --git a/learner_test/build.gradle b/learner_test/build.gradle new file mode 100644 index 0000000000000000000000000000000000000000..64ba25868ab02f58ed90c006f52cfb3e9563c411 --- /dev/null +++ b/learner_test/build.gradle @@ -0,0 +1,35 @@ +repositories { + mavenCentral() +} + +sourceCompatibility = 1.8 + +apply plugin: 'java' +apply plugin: 'application' + +dependencies { + compile project(':eraser-base') + compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.8.8.1' + compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.10.0' + compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.10.0' + testCompile group: 'junit', name: 'junit', version: '4.12' + testCompile group: 'org.hamcrest', name: 'hamcrest-junit', version: '1.0.0.0' + + compile 'org.encog:encog-core:3.4' +} + +run { + mainClassName = 'de.tudresden.inf.st.eraser.learner_test.Main' + standardInput = System.in + if (project.hasProperty("appArgs")) { + args Eval.me(appArgs) + } +} + +sourceSets { + main { + java { + srcDir 'src/main/java' + } + } +} diff --git a/learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/Main.java b/learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/Main.java new file mode 100644 index 0000000000000000000000000000000000000000..62f00cb624f4dbae09c84bca772d09318f5c9964 --- /dev/null +++ b/learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/Main.java @@ -0,0 +1,112 @@ +package de.tudresden.inf.st.eraser.learner_test; +import org.encog.Encog; +import org.encog.ml.MLClassification; +import org.encog.ml.data.MLData; +import org.encog.persist.EncogDirectoryPersistence; +import org.encog.util.csv.CSVFormat; +import org.encog.util.csv.ReadCSV; +import org.encog.util.simple.EncogUtility; + +import org.encog.ml.data.versatile.NormalizationHelper; +import org.encog.ml.data.versatile.VersatileMLDataSet; +import org.encog.ml.data.versatile.columns.ColumnDefinition; +import org.encog.ml.data.versatile.columns.ColumnType; +import org.encog.ml.data.versatile.sources.VersatileDataSource; +import org.encog.ml.data.versatile.sources.CSVDataSource; +import org.encog.ml.factory.MLMethodFactory; +import org.encog.ml.model.EncogModel; +import org.encog.ConsoleStatusReportable; +import org.encog.ml.MLRegression; +import java.io.File; +import java.util.Arrays; +import static org.encog.persist.EncogDirectoryPersistence.*; + +public class Main { + + public static void main(String[] args) { + //mapping the data into model + String savefile = "src/main/java/de/tudresden/inf/st/eraser/learner_test/save_model.eg"; + String File = "src/main/java/de/tudresden/inf/st/eraser/learner_test/preference_data.csv"; + File file = new File(File); + VersatileDataSource source = new CSVDataSource(file, false, CSVFormat.DECIMAL_POINT); + VersatileMLDataSet data = new VersatileMLDataSet(source); + data.defineSourceColumn("monat", 0, ColumnType.continuous); + data.defineSourceColumn("day", 1, ColumnType.continuous); + data.defineSourceColumn("hour", 2, ColumnType.continuous); + data.defineSourceColumn("minute", 3, ColumnType.continuous); + ColumnDefinition outputColumn = data.defineSourceColumn("labels", 4, ColumnType.continuous); + data.defineSingleOutputOthersInput(outputColumn); + data.analyze(); + System.out.println("get data "); + EncogModel model = new EncogModel(data); + model.selectMethod(data, MLMethodFactory.TYPE_FEEDFORWARD); + //model.setReport(new ConsoleStatusReportable()); + data.normalize(); + NormalizationHelper helper = data.getNormHelper(); + System.out.println(helper.toString()); + model.holdBackValidation(0.3, true, 1001); + model.selectTrainingType(data); + MLRegression bestMethod = (MLRegression)model.crossvalidate(5, true); + MLClassification bestMethodtest=(MLClassification)model.crossvalidate(5,true); + /**System.out.println( "Training error: " + EncogUtility.calculateRegressionError(bestMethod, model.getTrainingDataset())); + System.out.println( "testTraining error: " + EncogUtility.calculateClassificationError(bestMethodtest, model.getTrainingDataset())); + System.out.println( "Validation error: " + EncogUtility.calculateRegressionError(bestMethod, model.getValidationDataset())); + System.out.println( "testValidation error: " + EncogUtility.calculateClassificationError(bestMethodtest, model.getValidationDataset())); + + System.out.println(helper.getClass()); + System.out.println(helper.toString()); + System.out.println("Final model: " + bestMethod); + System.out.println("Final testmodel: " + bestMethodtest);**/ + //NormalizationHelper helper = data.getNormHelper(); + + //test + String helperstr=helper.toString(); + String [] split=helperstr.split(";"); + String [] finalStr = split[split.length-1].replace("]","").replace("[",""). + split(","); + System.out.println(helper); + + // save network... + //to delete + saveObject(new File(savefile), bestMethodtest); + ReadCSV csv = new ReadCSV(File, false, CSVFormat.DECIMAL_POINT); + String[] line = new String[4]; + MLData input = helper.allocateInputVector(); + System.out.println("input test---------------"); + System.out.println(input); + while(csv.next()) { + StringBuilder result = new StringBuilder(); + line[0] = csv.get(0); + line[1] = csv.get(1); + line[2] = csv.get(2); + line[3] = csv.get(3); + String correct = csv.get(4); + helper.normalizeInputVector(line,input.getData(),false); + + MLData output = bestMethod.compute(input); + System.out.println("inputs:"); + System.out.println(input); + System.out.println("outputs:"); + System.out.println(output); + String brightnessChosen = helper.denormalizeOutputVectorToString(output)[0]; + + result.append(Arrays.toString(line)); + result.append(" -> predicted: "); + result.append(brightnessChosen); + result.append("(correct: "); + result.append(correct); + result.append(")"); + System.out.println(result.toString()); + break; + + } + // Delete data file and shut down. + //File.delete(); + Encog.getInstance().shutdown(); + /**Training error: 0.299928703107046 + testTraining error: 0.9931740614334471 + Validation error: 0.41277024952020763 + testValidation error: 0.992*/ + + } +} diff --git a/learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/final_data.csv b/learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/final_data.csv new file mode 100644 index 0000000000000000000000000000000000000000..a1e263194d3ee4f95c64c3eff3b5123fb2246cf5 --- /dev/null +++ b/learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/final_data.csv @@ -0,0 +1,418 @@ +7,20,12,13,2 +7,20,14,40,1 +7,20,14,40,2 +7,21,13,2,2 +7,21,13,2,2 +7,21,14,23,2 +7,21,14,23,2 +7,21,15,41,2 +7,21,16,54,2 +7,21,16,54,2 +7,21,17,45,3 +7,22,12,28,3 +7,22,15,35,2 +7,22,15,35,2 +7,22,18,59,3 +7,22,18,59,3 +7,23,12,32,2 +7,23,12,32,2 +7,23,16,7,2 +7,23,16,7,2 +7,23,16,7,2 +7,23,16,7,2 +7,23,16,7,2 +7,24,12,4,0 +7,24,12,4,0 +7,24,12,4,1 +7,24,14,38,2 +7,24,14,38,2 +7,24,18,54,3 +7,25,12,31,0 +7,25,12,32,1 +7,25,12,32,1 +7,25,15,6,3 +7,25,18,56,3 +7,26,13,41,2 +7,26,19,14,3 +7,27,11,39,2 +7,27,11,39,3 +7,27,11,46,3 +7,27,11,46,2 +7,27,13,8,2 +7,27,13,8,2 +7,27,13,9,2 +7,27,13,45,2 +7,27,13,45,2 +7,27,15,38,3 +7,28,12,12,2 +7,28,12,13,2 +7,28,12,41,2 +7,28,12,41,2 +7,28,12,41,2 +7,28,14,0,1 +7,28,14,0,2 +7,28,15,21,3 +7,28,18,56,3 +7,29,10,9,1 +7,29,10,9,1 +7,29,10,9,1 +7,29,11,54,0 +7,29,11,54,0 +7,29,11,54,0 +7,29,11,54,1 +7,29,14,10,2 +7,29,16,44,2 +7,29,16,44,2 +7,30,16,7,3 +7,30,18,45,3 +7,31,13,2,0 +7,31,13,2,1 +7,31,13,3,1 +7,31,13,3,1 +7,31,13,3,1 +7,31,18,39,3 +8,1,12,22,0 +8,1,12,22,1 +8,1,14,20,2 +8,1,14,20,2 +8,1,14,20,2 +8,1,15,55,3 +8,1,18,31,3 +8,1,18,37,3 +8,1,18,37,3 +8,1,19,2,3 +8,1,19,2,3 +8,1,20,5,3 +8,2,10,9,2 +8,2,10,9,1 +8,2,10,9,2 +8,2,10,9,2 +8,2,13,58,2 +8,2,13,58,2 +8,2,15,44,3 +8,2,15,44,3 +8,2,15,44,3 +8,2,17,21,3 +8,2,17,21,3 +8,2,17,21,3 +8,3,13,31,1 +8,3,13,31,2 +8,3,13,32,2 +8,3,16,43,3 +8,4,13,20,1 +8,4,13,20,2 +8,4,18,27,3 +8,5,13,37,2 +8,5,13,37,2 +8,5,18,33,3 +8,6,11,24,3 +8,6,11,24,3 +8,6,11,24,3 +8,6,13,50,3 +8,7,13,4,2 +8,7,13,4,2 +8,7,14,56,3 +8,8,12,13,2 +8,8,12,13,2 +8,8,15,51,2 +8,8,15,51,2 +8,8,15,51,3 +8,9,13,32,2 +8,9,13,32,2 +8,9,13,32,2 +8,9,15,8,2 +8,9,15,8,2 +8,9,15,8,2 +8,9,16,19,2 +8,10,11,32,0 +8,10,11,32,1 +8,10,11,32,1 +8,10,13,13,1 +8,10,13,13,1 +8,10,13,13,2 +8,10,16,42,3 +8,10,16,42,3 +8,11,14,6,2 +8,11,14,7,2 +8,11,18,54,3 +8,11,18,54,3 +8,11,18,54,3 +8,12,12,27,1 +8,12,12,27,1 +8,12,12,28,1 +8,12,13,53,2 +8,12,13,53,2 +8,12,13,53,2 +8,12,15,21,3 +8,13,13,16,1 +8,13,13,16,1 +8,13,13,16,1 +8,13,14,14,2 +8,13,14,14,2 +8,13,16,11,3 +8,13,17,18,3 +8,14,13,7,1 +8,14,13,7,1 +8,14,13,7,1 +8,14,13,7,1 +8,14,13,7,2 +8,14,13,7,2 +8,14,15,6,3 +8,15,14,5,2 +8,15,14,5,2 +8,15,14,6,2 +8,15,14,6,2 +8,15,16,41,3 +8,15,16,41,3 +8,15,17,30,3 +8,16,13,40,2 +8,16,13,40,2 +8,16,17,52,3 +8,16,17,53,3 +8,17,13,34,1 +8,17,13,35,2 +8,17,14,7,2 +8,17,19,2,3 +8,18,10,21,3 +8,18,11,14,2 +8,18,11,14,2 +8,18,11,14,2 +8,18,11,14,2 +8,18,14,25,2 +8,18,14,25,3 +8,18,14,25,2 +8,18,18,18,3 +8,18,18,19,3 +8,19,18,33,3 +8,19,18,33,3 +8,19,18,33,3 +8,19,18,33,3 +8,20,14,28,2 +8,20,14,28,2 +8,20,14,28,2 +8,20,14,28,2 +8,20,17,8,3 +8,20,18,22,3 +8,21,11,24,1 +8,21,11,24,1 +8,21,11,24,1 +8,21,15,34,3 +8,21,18,55,3 +8,22,12,3,1 +8,22,12,4,2 +8,22,12,4,2 +8,22,13,51,2 +8,22,13,51,2 +8,22,13,51,2 +8,22,18,12,3 +8,22,18,12,3 +8,22,18,12,3 +8,22,18,12,3 +8,22,18,40,3 +8,22,18,40,3 +8,23,13,42,1 +8,23,13,42,1 +8,23,17,32,3 +8,23,19,28,3 +8,23,20,27,3 +8,23,20,27,3 +8,23,21,49,3 +8,24,14,0,2 +8,24,14,0,2 +8,24,14,0,2 +8,24,14,0,2 +8,24,15,4,3 +8,24,15,4,3 +8,24,16,2,3 +8,24,16,3,3 +8,24,16,37,3 +8,24,17,9,3 +8,24,17,14,3 +8,25,13,34,1 +8,25,13,34,1 +8,25,13,34,1 +8,25,13,34,1 +8,25,13,34,1 +8,25,15,1,3 +8,25,17,58,3 +8,26,10,29,0 +8,26,10,29,0 +8,26,10,29,0 +8,26,10,29,0 +8,26,10,29,0 +8,26,16,42,3 +8,26,16,42,3 +8,26,18,41,3 +8,26,18,41,3 +8,27,13,41,2 +8,27,13,41,2 +8,27,13,41,2 +8,27,13,41,2 +8,27,17,42,3 +8,28,11,9,1 +8,28,11,9,1 +8,28,12,14,0 +8,28,12,14,1 +8,28,12,14,0 +8,28,15,3,2 +8,28,15,3,2 +8,28,16,31,3 +8,28,17,40,3 +8,29,14,44,3 +8,29,17,25,3 +8,30,12,5,0 +8,30,12,5,0 +8,30,12,5,0 +8,30,13,32,1 +8,30,13,32,1 +8,30,13,56,2 +8,30,14,23,2 +8,30,14,23,2 +8,30,14,23,2 +8,30,14,23,2 +8,30,14,41,2 +8,30,14,41,2 +8,30,14,41,2 +8,30,15,50,3 +8,30,17,0,3 +8,30,18,59,3 +8,30,18,59,3 +8,31,14,31,2 +8,31,14,31,2 +8,31,14,31,2 +8,31,17,59,3 +8,31,18,0,3 +9,1,16,13,3 +9,1,16,13,3 +9,1,16,13,3 +9,1,17,41,3 +9,2,13,44,1 +9,2,13,44,1 +9,2,13,44,1 +9,2,14,49,2 +9,2,14,49,2 +9,2,14,49,2 +9,2,16,6,3 +9,2,16,6,3 +9,2,17,2,3 +9,3,16,9,3 +9,3,17,35,3 +9,3,17,36,3 +9,4,12,57,1 +9,4,12,57,1 +9,4,15,8,3 +9,4,15,34,3 +9,4,16,26,3 +9,4,16,26,3 +9,4,18,37,3 +9,4,18,37,3 +9,4,18,37,3 +9,6,11,18,0 +9,6,11,18,0 +9,6,12,54,1 +9,6,12,54,1 +9,6,14,21,2 +9,6,14,21,2 +9,6,19,20,3 +9,7,11,50,0 +9,7,14,17,2 +9,7,14,57,3 +9,7,14,57,3 +9,7,16,56,3 +9,7,16,56,3 +9,7,16,56,3 +9,7,16,56,3 +9,7,18,38,3 +9,7,18,38,3 +9,8,11,4,2 +9,8,11,4,2 +9,8,11,13,0 +9,8,11,13,0 +9,8,11,13,0 +9,8,11,13,0 +9,8,11,13,0 +9,8,11,14,0 +9,8,11,14,1 +9,8,11,14,1 +9,8,12,1,0 +9,8,12,1,0 +9,8,12,1,0 +9,8,12,1,0 +9,8,12,1,0 +9,8,12,1,1 +9,8,12,36,0 +9,8,12,36,0 +9,8,12,36,0 +9,8,12,36,0 +9,8,12,36,0 +9,8,13,37,1 +9,8,13,37,1 +9,8,13,37,1 +9,8,14,20,2 +9,8,14,20,2 +9,8,18,20,3 +9,9,12,47,1 +9,9,12,47,2 +9,9,12,47,2 +9,9,19,5,3 +9,10,13,15,1 +9,10,13,15,1 +9,10,13,15,0 +9,10,16,49,3 +9,10,19,6,3 +9,10,21,5,3 +9,11,14,16,2 +9,11,14,16,2 +9,11,14,16,2 +9,11,18,41,3 +9,12,14,43,2 +9,12,14,43,2 +9,12,14,43,2 +9,12,16,14,3 +9,12,17,12,3 +9,12,17,12,2 +9,12,17,12,3 +9,12,17,12,2 +9,12,20,44,3 +9,13,19,52,3 +9,14,14,39,2 +9,14,14,39,2 +9,14,15,14,3 +9,14,17,29,3 +9,14,17,29,3 +9,14,17,29,3 +9,15,11,41,1 +9,15,11,41,1 +9,15,13,4,1 +9,15,14,3,1 +9,15,14,3,2 +9,16,12,36,1 +9,16,12,36,1 +9,16,12,36,1 +9,16,12,36,1 +9,16,12,48,1 +9,16,12,48,1 +9,16,13,51,1 +9,16,13,51,2 +9,16,13,51,1 +9,16,15,13,3 +9,16,15,14,3 +9,16,15,14,3 +9,17,10,27,0 +9,17,10,27,0 +9,17,11,10,0 +9,17,11,10,0 +9,17,11,10,0 +9,17,12,43,1 +9,17,12,43,1 +9,17,12,43,1 +9,17,13,32,1 +9,17,13,32,1 +9,17,14,5,1 +9,17,14,5,2 +9,17,14,6,2 +9,17,15,7,3 +9,17,15,49,3 +9,17,15,49,3 +9,17,18,12,3 +9,17,18,13,3 diff --git a/learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/save_model.eg b/learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/save_model.eg new file mode 100644 index 0000000000000000000000000000000000000000..47c37ff28ef95b7b22a2df05ec050c3ffeb53a30 --- /dev/null +++ b/learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/save_model.eg @@ -0,0 +1,24 @@ +encog,BasicNetwork,java,3.4.0,1,1554196571101 +[BASIC] +[BASIC:PARAMS] +[BASIC:NETWORK] +beginTraining=0 +connectionLimit=0 +contextTargetOffset=0,0,0 +contextTargetSize=0,0,0 +endTraining=2 +hasContext=f +inputCount=4 +layerCounts=1,8,5 +layerFeedCounts=1,7,4 +layerContextCount=0,0,0 +layerIndex=0,1,9 +output=0.2537517424,0.3154675575,-0.8739039638,-0.4408848221,-0.8484433638,-0.999915299,-0.6964984771,-0.208278439,1,0,0,-0.4545454545,0.3559322034,1 +outputCount=1 +weightIndex=0,8,43 +weights=0.5976774048,-0.7925906525,0.7127327881,-0.9611660362,0.8031350986,-0.7286657218,1.0990482817,-0.5985785536,-0.0783115433,0.575612931,1.1267500918,1.7184744034,0.2271044512,-1.0525796764,0.0900869671,1.1492323512,0.6141715555,-1.0455927965,-0.0925453451,0.2471651431,2.3634316872,0.3939369257,0.4607437082,-0.1435186798,0.8428535365,-0.0848896791,-0.070602589,-1.2640263565,2.4899996734,-0.2185394776,10.3421332361,-0.1650898311,-0.2750133571,-0.79680959,-0.8051139953,0.8219933747,-0.0727160299,-0.4609522002,-1.0410685492,-0.5354063412,0.3028724456,-0.6835374219,0.169591233 +biasActivation=0,1,1 +[BASIC:ACTIVATION] +"org.encog.engine.network.activation.ActivationTANH" +"org.encog.engine.network.activation.ActivationTANH" +"org.encog.engine.network.activation.ActivationLinear" diff --git a/learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/save_model_test.eg b/learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/save_model_test.eg new file mode 100644 index 0000000000000000000000000000000000000000..62fe6421d95e164aa14e123b950e831e37a5f23c --- /dev/null +++ b/learner_test/src/main/java/de/tudresden/inf/st/eraser/learner_test/save_model_test.eg @@ -0,0 +1,24 @@ +encog,BasicNetwork,java,3.4.0,1,1548158734516 +[BASIC] +[BASIC:PARAMS] +[BASIC:NETWORK] +beginTraining=0 +connectionLimit=0 +contextTargetOffset=0,0,0 +contextTargetSize=0,0,0 +endTraining=2 +hasContext=f +inputCount=4 +layerCounts=4,8,5 +layerFeedCounts=4,7,4 +layerContextCount=0,0,0 +layerIndex=0,4,12 +output=0.6991387348,-0.8711034513,-0.996886038,-0.832747291,-0.0935682806,-0.9996163977,0.5399150265,0.9411173394,-0.5084989975,0.4850010791,0.9999999957,1,0,-0.6666666667,-0.4545454545,0.6949152542,1 +outputCount=4 +weightIndex=0,32,67 +weights=-2.6901880743,0.6512821123,-1.2270002115,1.63124668,0.1982387305,-0.2994789552,1.5833040739,-0.9450411677,2.0541422847,-0.718279397,-1.1761952241,0.5028631512,0.0690323612,-1.496141565,-0.1955149568,-0.7453976822,-0.3691141073,0.9854755554,2.2113850088,-1.5216550292,0.9652087936,-1.3028209693,-1.3346156171,0.4142247818,1.0821207364,0.1987534858,0.6202881884,-0.2940331887,-1.4643282498,2.6960334656,-0.0167663298,-2.9907087565,0.3469960227,-0.0441249736,-2.5998575813,-0.7106361301,-0.8111809962,2.2216158678,-0.5482762437,-1.7996398291,-3.6734127565,-2.9102547958,0.4845401914,0.3760471288,-0.0124987546,0.3784047483,0.5860932613,-0.2682876707,0.7429004186,-7.559247176,-3.4421363532,1.1989747484,-2.3340717496,-1.4740773042,-0.7795788072,-1.8241693655,-0.630132295,-0.8191869009,-0.4060569987,-1.0997423162,-0.5495165849,0.1407829068,-2.2964930412,0.0798893221,-19.5271913755,2.0474187009,-0.2622671892 +biasActivation=0,1,1 +[BASIC:ACTIVATION] +"org.encog.engine.network.activation.ActivationTANH" +"org.encog.engine.network.activation.ActivationTANH" +"org.encog.engine.network.activation.ActivationLinear" diff --git a/learner_test/src/main/resources/log4j2.xml b/learner_test/src/main/resources/log4j2.xml new file mode 100644 index 0000000000000000000000000000000000000000..0594576fac98ba859e411597c90c8e3d989378bd --- /dev/null +++ b/learner_test/src/main/resources/log4j2.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Configuration> + <Appenders> + <Console name="Console"> + <PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} %-5level} %c{1.} - %msg%n"/> + </Console> + <RollingFile name="RollingFile" fileName="logs/jastadd-mquat.log" + filePattern="logs/jastadd-mquat-%i.log"> + <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/> + <Policies> + <OnStartupTriggeringPolicy/> + </Policies> + <DefaultRolloverStrategy max="20"/> + </RollingFile> + </Appenders> + <Loggers> + <Root level="debug"> + <AppenderRef ref="Console"/> + <AppenderRef ref="RollingFile"/> + </Root> + </Loggers> +</Configuration> diff --git a/make-new-project.py b/make-new-project.py index afd3a51931e3a7dc6823d47e1b9c97a65a2a2e76..635755567333e0d326ff346d5852d7d62437bbcb 100755 --- a/make-new-project.py +++ b/make-new-project.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python2.7 import argparse import os import shutil diff --git a/ml_test_boqi/.gitignore b/ml_test_boqi/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..70b583e34c3316bcd77c807e2d6b85db5e7d49f6 --- /dev/null +++ b/ml_test_boqi/.gitignore @@ -0,0 +1,3 @@ +/build/ +/bin/ +logs/ diff --git a/ml_test_boqi/build.gradle b/ml_test_boqi/build.gradle new file mode 100644 index 0000000000000000000000000000000000000000..d07b5930b7d3c75216b36bb9f5d9fa08b5d9d2c0 --- /dev/null +++ b/ml_test_boqi/build.gradle @@ -0,0 +1,33 @@ +repositories { + mavenCentral() +} + +sourceCompatibility = 1.8 + +apply plugin: 'java' +apply plugin: 'application' + +dependencies { + compile project(':eraser-base') + compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.8' + compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.11.1' + compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.1' + testCompile group: 'junit', name: 'junit', version: '4.12' + testCompile group: 'org.hamcrest', name: 'hamcrest-junit', version: '2.0.0.0' +} + +run { + mainClassName = 'de.tudresden.inf.st.eraser.ml_test_boqi.Main' + standardInput = System.in + if (project.hasProperty("appArgs")) { + args Eval.me(appArgs) + } +} + +sourceSets { + main { + java { + srcDir 'src/main/java' + } + } +} diff --git a/ml_test_boqi/src/main/java/de/tudresden/inf/st/eraser/ml_test_boqi/Main.java b/ml_test_boqi/src/main/java/de/tudresden/inf/st/eraser/ml_test_boqi/Main.java new file mode 100644 index 0000000000000000000000000000000000000000..f42663472e3a986c82df86e4bf89d0f9ff706441 --- /dev/null +++ b/ml_test_boqi/src/main/java/de/tudresden/inf/st/eraser/ml_test_boqi/Main.java @@ -0,0 +1,219 @@ +package de.tudresden.inf.st.eraser.ml_test_boqi; + +import de.tudresden.inf.st.eraser.jastadd.model.*; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.function.Function; +import java.util.stream.Collectors; +import org.apache.commons.math3.stat.StatUtils; +import de.tudresden.inf.st.eraser.jastadd.model.Item; + + +public class Main { + + private static final Logger logger = LogManager.getLogger(Main.class); + + public static void main(String[] args) { + + logger.info("Hello World!"); + createAndTestBrightnessNetwork(); + } + private static Root createModel() { + Root model = Root.createEmptyRoot(); + Group group = new Group(); + group.setID("Group1"); + model.addGroup(group); + + // inputs items muss normalize 1.0, 0.06666666666666665, 0.4545454545454546, -0.5593220338983051, 1(bias) + + NumberItem monthItem = new NumberItem(); + monthItem.setState(-1.0); + monthItem.setID("month"); + monthItem.setLabel("datetime-month"); + + NumberItem dayItem = new NumberItem(); + dayItem.setState(0.2666666666666666); + dayItem.setID("day"); + dayItem.setLabel("datetime-day"); + + NumberItem hourItem = new NumberItem(); + hourItem.setState(-0.6363636363636364); + hourItem.setID("hour"); + hourItem.setLabel("datetime-hour"); + + NumberItem minuteItem = new NumberItem(); + minuteItem.setState(-0.5593220338983051); + minuteItem.setID("minute"); + minuteItem.setLabel("datetime-minute"); + + NumberItem biasItem = new NumberItem(); + biasItem.setState(1); + biasItem.setID("bias"); + biasItem.setLabel("bias"); + + group.addItem(monthItem); + group.addItem(dayItem); + group.addItem(hourItem); + group.addItem(minuteItem); + group.addItem(biasItem); + return model; + } + private static final int REPETITIONS = 1; + private static void classifyTimed( + NeuralNetworkRoot nn, + Function<NeuralNetworkRoot, DoubleNumber> classify, + Function<DoubleNumber, String> leafToString) { + List<String> results = new ArrayList<>(); + List<Long> times = new ArrayList<>(); + long before = System.nanoTime(); + DoubleNumber classification = classify.apply(nn); + long diff = System.nanoTime() - before; + results.add(leafToString.apply(classification)); + times.add(TimeUnit.NANOSECONDS.toMillis(diff)); + 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 on average: {}ms", + Arrays.stream(times.toArray(new Long[0])).mapToLong(l -> l).average().orElse(-1)); + logger.info("Took on median: {}ms", + Arrays.stream(times.toArray(new Long[0])).mapToLong(l -> l).sorted() + .skip((REPETITIONS - 1) / 2).limit(2 - REPETITIONS % 2).average().orElse(Double.NaN)); + } + + /** + * Purpose: Create a neural network with 3 layers (5 + 8 + 4 neurons) + */ + private static void createAndTestBrightnessNetwork() { + Root model = createModel(); + Item monthItem = model.resolveItem("month").orElseThrow( + () -> new RuntimeException("Month not found")); + Item dayItem = model.resolveItem("day").orElseThrow( + () -> new RuntimeException("Day not found")); + Item hourItem = model.resolveItem("hour").orElseThrow( + () -> new RuntimeException("Hour not found")); + Item minuteItem = model.resolveItem("minute").orElseThrow( + () -> new RuntimeException("Minute not found")); + Item biasItem = model.resolveItem("bias").orElseThrow( + () -> new RuntimeException("Bias not found")); + + NeuralNetworkRoot nn = new NeuralNetworkRoot(); + + DoubleArrayDoubleFunction sigmoid = inputs -> Math.signum(Arrays.stream(inputs).sum()); + DoubleArrayDoubleFunction tanh= inputs ->Math.tanh(Arrays.stream(inputs).sum()); + DoubleArrayDoubleFunction function_one= inputs->function_one(); + + //Weights outputs from learner Module + ArrayList<Double> weights= new ArrayList<Double>(Arrays.asList( + -4.8288886204,0.6723236931,2.1451097188,-0.8551053267,-0.7858304445,4.1369566727,-3.3096691918, + -0.2190980261,2.6871317298,1.2272772167,-2.5292510941,-1.2860407542,-4.2280191541,1.004752063, + 0.8345207039,0.0123185817,-0.5921808915,0.0967336988,-0.305892589,0.5572392781,-0.7190098073, + -1.6247354373,0.4589248822,-0.0269816271,2.2208040852,-3.6281085698,0.2204999381,4.7263701556, + -4.8348948698,0.231141867,8.7120706018,-1.4912707741,0.9482851705,0.1377551973,-6.6525856465, + -1.321197315,-2.7369948929,17.664289214,-3.1279212743,-0.8245974167,-1.4251924355,0.8370511414, + 2.0841638143,-0.210152817,-1.9414132298,-1.7973688846,-2.1977997794,-3.6046836685,-3.3403186721, + -6.1556924635,-2.8952903587,-1.0773989561,0.2300429028,-0.2184650371,0.0297181797,0.5709092417, + 1.3960358442,-3.1577981239,0.0423944625,-17.8143314027,-1.4439317172,-0.5137688896,1.0166045804, + 0.3059149818,1.0938282764,0.6203368549,0.702449827)); + // input layer + InputNeuron month = new InputNeuron(); + month.setItem(monthItem); + InputNeuron day = new InputNeuron(); + day.setItem(dayItem); + InputNeuron hour = new InputNeuron(); + hour.setItem(hourItem); + InputNeuron minute = new InputNeuron(); + minute.setItem(minuteItem); + InputNeuron bias = new InputNeuron(); + bias.setItem(biasItem); + + nn.addInputNeuron(month); + nn.addInputNeuron(day); + nn.addInputNeuron(hour); + nn.addInputNeuron(minute); + nn.addInputNeuron(bias); + + // output layer + OutputLayer outputLayer = new OutputLayer(); + OutputNeuron output0 = new OutputNeuron(); + output0.setActivationFormula(tanh); + OutputNeuron output1 = new OutputNeuron(); + output1.setActivationFormula(tanh); + OutputNeuron output2 = new OutputNeuron(); + output2.setActivationFormula(tanh); + OutputNeuron output3 = new OutputNeuron(); + output3.setActivationFormula(tanh); + + outputLayer.addOutputNeuron(output0); + outputLayer.addOutputNeuron(output1); + outputLayer.addOutputNeuron(output2); + outputLayer.addOutputNeuron(output3); + + outputLayer.setCombinator(inputs->predictor(inputs)); + nn.setOutputLayer(outputLayer); + + // hidden layer + HiddenNeuron[] hiddenNeurons = new HiddenNeuron[8]; + for (int i = 0; i < (hiddenNeurons.length); i++) { + + if (i==7){ + HiddenNeuron hiddenNeuron = new HiddenNeuron(); + hiddenNeuron.setActivationFormula(function_one); + hiddenNeurons[i] = hiddenNeuron; + nn.addHiddenNeuron(hiddenNeuron); + bias.connectTo(hiddenNeuron,1.0); + hiddenNeuron.connectTo(output0, weights.get(i)); + hiddenNeuron.connectTo(output1, weights.get(i+8)); + hiddenNeuron.connectTo(output2, weights.get(i+8*2)); + hiddenNeuron.connectTo(output3, weights.get(i+8*3)); + } + else{ + HiddenNeuron hiddenNeuron = new HiddenNeuron(); + hiddenNeuron.setActivationFormula(tanh); + hiddenNeurons[i] = hiddenNeuron; + nn.addHiddenNeuron(hiddenNeuron); + + month.connectTo(hiddenNeuron, weights.get((hiddenNeurons.length*4)+i*5)); + day.connectTo(hiddenNeuron, weights.get((hiddenNeurons.length*4+1)+i*5)); + hour.connectTo(hiddenNeuron, weights.get((hiddenNeurons.length*4+2)+i*5)); + minute.connectTo(hiddenNeuron, weights.get((hiddenNeurons.length*4+3)+i*5)); + bias.connectTo(hiddenNeuron,weights.get((hiddenNeurons.length*4+4)+i*5)); + hiddenNeuron.connectTo(output0, weights.get(i)); + hiddenNeuron.connectTo(output1, weights.get(i+8)); + hiddenNeuron.connectTo(output2, weights.get(i+8*2)); + hiddenNeuron.connectTo(output3, weights.get(i+8*3));} + } + + model.getMachineLearningRoot().setPreferenceLearning(nn); + System.out.println(model.prettyPrint()); + + classifyTimed(nn, NeuralNetworkRoot::classify, + classification -> Double.toString(classification.number)); + } + private static double function_one() { + return 1.0; + } + private static double predictor(double[] inputs) { + int index=0; + double maxinput=StatUtils.max(inputs); + System.out.println(inputs); + for (int i = 0; i < inputs.length; i++) + { + if (inputs[i] == maxinput){ + index=i; + } + } + //outputs from learner + ArrayList<Double> outputs= new ArrayList<Double>(Arrays.asList(2.0,1.0,3.0,0.0)); + double output=outputs.get(index); + return output; + } +} + +//inputs: +//[BasicMLData:-1.0,0.2666666666666666,-0.6363636363636364,-0.5593220338983051] +//outputs: +//[BasicMLData:-0.9151867668336432,-0.1568555041251098,-0.9786996639280675,-0.9436628188408074] +//[7, 20, 12, 13] -> predicted: 1(correct: 2) \ No newline at end of file diff --git a/ml_test_boqi/src/main/resources/log4j2.xml b/ml_test_boqi/src/main/resources/log4j2.xml new file mode 100644 index 0000000000000000000000000000000000000000..0594576fac98ba859e411597c90c8e3d989378bd --- /dev/null +++ b/ml_test_boqi/src/main/resources/log4j2.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Configuration> + <Appenders> + <Console name="Console"> + <PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} %-5level} %c{1.} - %msg%n"/> + </Console> + <RollingFile name="RollingFile" fileName="logs/jastadd-mquat.log" + filePattern="logs/jastadd-mquat-%i.log"> + <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/> + <Policies> + <OnStartupTriggeringPolicy/> + </Policies> + <DefaultRolloverStrategy max="20"/> + </RollingFile> + </Appenders> + <Loggers> + <Root level="debug"> + <AppenderRef ref="Console"/> + <AppenderRef ref="RollingFile"/> + </Root> + </Loggers> +</Configuration> diff --git a/settings.gradle b/settings.gradle index 4492d856ad2d58bf8a3fe0eedca93b30b9c05bb2..0a118ec458b406dfae388bf1218c2abd4bfd356b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -3,6 +3,7 @@ rootProject.name = 'eraser' include ':eraser-base' include 'openhab-mock' include 'integration' +include ':benchmark' include ':commons.color' include ':skywriter-hue-integration' include ':org.openhab.action.machinelearn' @@ -19,4 +20,5 @@ include ':feedbackloop.learner' include ':influx_test' include ':eraser.spark' include ':eraser.starter' -include ':integration_test' +include ':feedbackloop.learner_backup' +include ':datasets' diff --git a/skywriter-hue-integration/src/main/resources/smart_arrive.eraser b/skywriter-hue-integration/src/main/resources/smart_arrive.eraser new file mode 100644 index 0000000000000000000000000000000000000000..44b67cf94d3bb8da666cc38743f008552041a152 --- /dev/null +++ b/skywriter-hue-integration/src/main/resources/smart_arrive.eraser @@ -0,0 +1,44 @@ +ThingType: id="hue:bridge" label="Hue Bridge" description="The hue bridge represents the Philips hue bridge." parameters=[] channelTypes=[] ; +ThingType: id="hue:0200" label="Color Light" description="A dimmable light with changeable colors." ; +ThingType: id="hue:0210" label="Extended Color Light" description="A dimmable light with changeable colors and tunable color temperature." parameters=[] channelTypes=[]; +ThingType: id="skywriter-hat" label="SkyWriterHAT" description="SkyWriterHAT Gesture Recognition" parameters=["brokername"] channelTypes=["flick-type", "skywriter-x", "skywriter-y"] ; + +Thing: id="hue:bridge:0017880adcf4" label="Philips hue (10.8.0.160)" type="hue:bridge" channels=[] ; +Thing: id="hue:0210:0017880adcf4:1" label="Wohnzimmer" type="hue:0210" channels=["hue:0210:0017880adcf4:1:color_temperature", "hue:0210:0017880adcf4:1:effect"] ; +Thing: id="hue:0200:0017880adcf4:5" label="Hue iris 1" type="hue:0200" channels=["hue:0210:0017880adcf4:4:color", "hue:0210:0017880adcf4:4:color_temperature", "hue:0210:0017880adcf4:4:alert", "hue:0210:0017880adcf4:4:effect"] ; +Thing: id="hue:0210:0017880adcf4:4" label="Hue go 1" type="hue:0210" channels=["hue:0200:0017880adcf4:5:color", "hue:0200:0017880adcf4:5:alert", "hue:0200:0017880adcf4:5:effect"] ; +Thing: id="skywriter1" label="Our skywriter" type="skywriter-hat" channels=["skywriter1-flick", "skywriter1-x", "skywriter1-y"] ; + +ChannelType: id="hue:color" label="Color" description="The color channel allows to control the color of a light. It is also possible to dim values and switch the light on and off." itemType="Color" category="ColorLight" ; +ChannelType: id="hue:alert" label="Alert" description="The alert channel allows a temporary change to the bulb’s state." itemType="String" category="Unknown" ; +ChannelType: id="hue:effect" label="Color Loop" description="The effect channel allows putting the bulb in a color looping mode." itemType="Switch" category="ColorLight" ; +ChannelType: id="hue:color_temperature" label="Color Temperature" description="The color temperature channel allows to set the color temperature of a light from 0 (cold) to 100 (warm)." itemType="Dimmer" category="ColorLight" ; +ChannelType: id="flick-type" itemType="String" label="Last Flick" description="Last Flick detected (and its direction)" category="Motion" readOnly ; +ChannelType: id="skywriter-x" itemType="String" label="Current X coordinate" description="Current X coordinate" category="Motion" readOnly ; +ChannelType: id="skywriter-y" itemType="String" label="Current Y coordinate" description="Current Y coordinate" category="Motion" readOnly ; + +Channel: id="hue:0210:0017880adcf4:1:color_temperature" type="hue:color_temperature" links=[] ; +Channel: id="hue:0210:0017880adcf4:1:effect" type="hue:effect" links=[] ; +Channel: id="hue:0210:0017880adcf4:4:color" type="hue:color" links=[] ; +Channel: id="hue:0210:0017880adcf4:4:color_temperature" type="hue:color_temperature" links=[] ; +Channel: id="hue:0210:0017880adcf4:4:alert" type="hue:alert" links=[] ; +Channel: id="hue:0210:0017880adcf4:4:effect" type="hue:effect" links=[] ; +Channel: id="hue:0200:0017880adcf4:5:color" type="hue:color" links=["iris1_item"] ; +Channel: id="hue:0200:0017880adcf4:5:alert" type="hue:alert" links=[] ; +Channel: id="hue:0200:0017880adcf4:5:effect" type="hue:color" links=[] ; +Channel: id="skywriter1-flick" type="flick-type" links=[]; +Channel: id="skywriter1-x" type="skywriter-x" links=["skywriter1_x"]; +Channel: id="skywriter1-y" type="skywriter-y" links=["skywriter1_y"]; + +Item: id="iris1_item" label="Iris 1" state="121,88,68" topic="iris1_item/state"; +Item: id="skywriter1_x" label="X" state="0" topic="skywriter/x"; +Item: id="skywriter1_y" label="Y" state="0" topic="skywriter/y"; +//Item: id="skywriter1_xyz" label="Y" state="0" topic="skywriter/xyz"; + +Group: id="Lights" items=["iris1_item"]; +Group: id="Skywriter" items=["skywriter1_x", "skywriter1_y"]; + +Parameter: id="brokername" label="Broker Name" description="Name of the broker as defined in the <broker>.url in services/mqtt.cfg. See the MQTT Binding for more information on how to configure MQTT broker connections." type="Text" context="service" default="mosquitto" required ; + +// MqttHost is set programmatically +Mqtt: incoming="oh2/out/" outgoing="oh2/in/" ;