/*
* Here comes the text of your license
* Each line should be prefixed with *
*/
package nars.lab.predict;
import automenta.vivisect.TreeMLData;
import automenta.vivisect.swing.NWindow;
import automenta.vivisect.swing.PCanvas;
import automenta.vivisect.timeline.BarChart;
import automenta.vivisect.timeline.LineChart;
import automenta.vivisect.timeline.TimelineVis;
import java.awt.Color;
import nars.util.Events.TaskImmediateProcess;
import nars.NAR;
import nars.config.Parameters;
import nars.config.Plugins;
import nars.control.DerivationContext;
import nars.entity.Task;
import nars.gui.NARSwing;
import nars.lab.ioutils.ChangedTextInput;
import nars.io.Narsese;
import nars.language.Term;
/**
*
* https://github.com/encog/encog-java-examples/blob/master/src/main/java/org/encog/examples/neural/predict/sunspot/PredictSunspotElman.java
* https://github.com/encog/encog-java-examples/blob/master/src/main/java/org/encog/examples/neural/recurrent/elman/ElmanXOR.java
*
* @author me
*/
public class Predict_NARS_Core {
static float signal = 0;
static TreeMLData[] predictions;
static double maxval=0;
public static void main(String[] args) throws Narsese.InvalidInputException, InterruptedException {
Parameters.DEBUG = false;
int duration = 8;
float freq = 1.0f / duration * 0.1f;
int thinkInterval = 50;
double discretization = 3;
NAR n = new NAR();
n.param.duration.set(duration);
n.param.noiseLevel.set(0);
//n.param.conceptForgetDurations.set(16);
n.on(TaskImmediateProcess.class, new TaskImmediateProcess() {
int curmax=0;
@Override
public void onProcessed(Task t, DerivationContext n) {
if (t.sentence.getOccurenceTime() >= n.memory.time() && t.sentence.truth.getExpectation()>0.5) {
Term term = t.getTerm();
int time = (int) t.sentence.getOccurenceTime();
int value = -1;
String ts = term.toString();
if (ts.startsWith("<{x} --> y")) {
char cc = ts.charAt("<{x} --> y".length());
value = cc - '0';
if(time>=curmax) {
curmax=time;
}
maxval=Math.max(maxval, (value)/10.0);
predictions[0].add(time, (value)/10.0 );
}
}
}
});
TreeMLData observed = new TreeMLData("value", Color.WHITE).setRange(0, 1f);
predictions = new TreeMLData[(int)discretization];
TreeMLData[] reflections = new TreeMLData[(int)discretization];
for (int i = 0; i < predictions.length; i++) {
predictions[i] = new TreeMLData("Pred" + i,
Color.getHSBColor(0.25f + i / 4f, 0.85f, 0.85f));
reflections[i] = new TreeMLData("Refl" + i,
Color.getHSBColor(0.25f + i / 4f, 0.85f, 0.85f));
reflections[i].setDefaultValue(0.0);
}
TimelineVis tc = new TimelineVis(
new LineChart(0,1,observed).thickness(16f).height(128), new LineChart(predictions[0]).thickness(16f).height(128)
//new BarChart(reflections).thickness(16f).height(128)
/*new LineChart(predictions[1]).thickness(16f).height(128),
new LineChart(predictions[2]).thickness(16f).height(128),*/
);
new NWindow("_", new PCanvas(tc)).show(800, 800, true);
n.run((int)discretization*4);
NARSwing.themeInvert();
new NARSwing(n);
ChangedTextInput chg=new ChangedTextInput(n);
double lastsignal=0;
double lasttime=0;
while (true) {
n.run(thinkInterval);
Thread.sleep(30);
//signal = (float)Math.max(0, Math.min(1.0, Math.tan(freq * n.time()) * 0.5f + 0.5f));
signal = (float)Math.sin(freq * n.time()) * 0.5f + 0.5f;
//signal = ((float) Math.sin(freq * n.time()) > 0 ? 1f : -1f) * 0.5f + 0.5f;
//signal *= 1.0 + (Math.random()-0.5f)* 2f * noiseRate;
observed.removeData((int) (lasttime+1)); //this
observed.removeData((int) (lasttime+2)); //is not good practice
observed.add((int) n.time(), signal);
observed.add((int) n.time()+1, -1); //but is fine
observed.add((int) n.time()+2, 1); //for now (just wanted a line at the end)
lastsignal=signal;
lasttime=n.time();
predictions[0].setData(0, maxval);
//if(cnt<1000) { //switch to see what NARS does when observations end :)
int val=(int)(((int)((signal*discretization))*(10.0/discretization)));
chg.set("<{x} --> y"+val+">. :|:");
//System.out.println(val);
/*} else if (cnt==1000){
System.out.println("observation phase end, residual predictions follow");
}*/
}
}
}