/*
* Here comes the text of your license
* Each line should be prefixed with *
*/
package nars.lab.predict;
import java.util.logging.Level;
import java.util.logging.Logger;
import nars.NAR;
//import nars.control.ImmediateProcess;
import nars.entity.Concept;
import nars.entity.Task;
import nars.io.Symbols;
import nars.io.Narsese;
import nars.language.Instance;
import nars.language.Tense;
import nars.language.Term;
/**
*
* @author me
*/
public class Discretize {
private final NAR nar;
private int discretization;
/** levels >=2 */
public Discretize(NAR n, int levels) {
this.nar = n;
this.discretization = levels;
}
public int i(double v) {
if (v <= 0) {
return 0;
}
if (v >= 1f) {
return discretization-1;
}
int x = (int)Math.round(-0.5 + v * (discretization));
return x;
}
public void setDiscretization(int discretization) {
this.discretization = discretization;
}
public double d(double v) {
if (v <= 0) {
return 0;
}
if (v >= 1f) {
return discretization-1;
}
double x = (-0.5 + v * (discretization));
return x;
}
/** inverse of discretize */
public double continuous(double discretized) {
return ((double)discretized) / ((double)discretization-1);
}
public double continuous(int discretized) {
return continuous((double)discretized);
}
/** calculate proportion that value 'v' is at level 'l', or somewhere in between levels */
public double pDiscrete(double v, int i) {
int center = i(v);
if (i == center) return 1.0;
return 0.0;
}
/** calculate proportion that value 'v' is at level 'l', or somewhere in between levels */
public double pSmooth(double v, int l) {
double center = d(v);
double levelsFromCenter = Math.abs(l - center);
double sharpness = 10.0;
return 1.0 / (1 + levelsFromCenter/(discretization/2)*sharpness); }
/** assign 1.0 to the closest discretized level regardless */
public double pSmoothDiscrete(double v, int l) {
double center = d(v);
int centerDisc = i(v);
if (centerDisc == l) return 1.0;
double levelsFromCenter = Math.abs(l - center);
double sharpness = 10.0;
return 1.0 / (1 + levelsFromCenter/(discretization/2)*sharpness);
}
public Term getValueTerm(String prefix, int level) {
return Instance.make( Term.get(prefix), Term.get("y" + level)); }
public Term[] getValueTerms(String prefix) {
Term t[] = new Term[discretization];
for (int i = 0; i < discretization; i++) {
t[i] = getValueTerm(prefix, i);
}
return t;
}
public Concept[] getValueConcepts(String prefix) {
Concept t[] = new Concept[discretization];
for (int i = 0; i < discretization; i++) {
t[i] = nar.memory.concept(getValueTerm(prefix, i));
}
return t;
}
public Term getValueTerm(double y) {
return Term.get("y" + i((float)y));
}
/**
*
* @param variable
* @param signal
* @param dt zero = now, + = future cycles, - = past cycles
*/
void believe(String variable, double signal, int dt) {
for (int i = 0; i < discretization; i++) {
//double p = pDiscrete(signal, i);
double p = pSmoothDiscrete(signal, i);
believe(variable, i, dt, (float)p, 0.95f, BeliefInsertion.MemoryInput);
}
}
public static enum BeliefInsertion {
Input, MemoryInput, ImmediateProcess, BeliefInsertion
}
//TODO input method: normal input, memory input, immediate process, direct belief insertion
void believe(String variable, int level, int dt, float freq, float conf, BeliefInsertion mode) {
//TODO handle 'dt'
if (mode == BeliefInsertion.Input) {
try {
nar.believe(getValueTerm(variable, level).toString(), Tense.Present, freq, conf);
} catch (Narsese.InvalidInputException ex) {
Logger.getLogger(Discretize.class.getName()).log(Level.SEVERE, null, ex);
}
}
else if ((mode == BeliefInsertion.MemoryInput)|| (mode == BeliefInsertion.ImmediateProcess)) {
Task t = nar.memory.newTask(getValueTerm(variable, level), Symbols.JUDGMENT_MARK, freq, conf, 1.0f, 0.8f);
System.out.println(t);
if (mode == BeliefInsertion.MemoryInput)
nar.memory.inputTask(t);
//else if (mode == BeliefInsertion.ImmediateProcess)
// new ImmediateProcess(nar.memory, t).run();
}
}
}