package recunn.datasets;
import java.util.*;
import recunn.datastructs.DataSequence;
import recunn.datastructs.DataSet;
import recunn.datastructs.DataStep;
import recunn.loss.LossMultiDimensionalBinary;
import recunn.loss.LossSumOfSquares;
import recunn.model.Model;
import recunn.model.Nonlinearity;
import recunn.model.SigmoidUnit;
public class EmbeddedReberGrammar extends DataSet {
static public class State {
public State(Transition[] transitions) {
this.transitions = transitions;
}
public Transition[] transitions;
}
static public class Transition {
public Transition(int next_state_id, int token) {
this.next_state_id = next_state_id;
this.token = token;
}
public int next_state_id;
public int token;
}
public EmbeddedReberGrammar(Random r) throws Exception {
int total_sequences = 1000;
inputDimension = 7;
outputDimension = 7;
lossTraining = new LossSumOfSquares();
lossReporting = new LossMultiDimensionalBinary();
training = generateSequences(r, total_sequences);
validation = generateSequences(r, total_sequences);
testing = generateSequences(r, total_sequences);
}
public static List generateSequences(Random r, int sequences) {
List result = new ArrayList<>();
final int B = 0;
final int T = 1;
final int P = 2;
final int S = 3;
final int X = 4;
final int V = 5;
final int E = 6;
State[] states = new State[19];
states[0] = new State(new Transition[] {new Transition(1,B)});
states[1] = new State(new Transition[] {new Transition(2,T), new Transition(11,P)});
states[2] = new State(new Transition[] {new Transition(3,B)});
states[3] = new State(new Transition[] {new Transition(4,T), new Transition(9,P)});
states[4] = new State(new Transition[] {new Transition(4,S), new Transition(5,X)});
states[5] = new State(new Transition[] {new Transition(6,S), new Transition(9,X)});
states[6] = new State(new Transition[] {new Transition(7,E)});
states[7] = new State(new Transition[] {new Transition(8,T)});
states[8] = new State(new Transition[] {new Transition(0,E)});
states[9] = new State(new Transition[] {new Transition(9,T), new Transition(10,V)});
states[10] = new State(new Transition[] {new Transition(5,P), new Transition(6,V)});
states[11] = new State(new Transition[] {new Transition(12,B)});
states[12] = new State(new Transition[] {new Transition(13,T), new Transition(17,P)});
states[13] = new State(new Transition[] {new Transition(13,S), new Transition(14,X)});
states[14] = new State(new Transition[] {new Transition(15,S), new Transition(17,X)});
states[15] = new State(new Transition[] {new Transition(16,E)});
states[16] = new State(new Transition[] {new Transition(8,P)});
states[17] = new State(new Transition[] {new Transition(17,T), new Transition(18,V)});
states[18] = new State(new Transition[] {new Transition(14,P), new Transition(15,V)});
for (int sequence = 0; sequence < sequences; sequence++) {
List steps = new ArrayList<>();;
int state_id = 0;
while (true) {
int transition = -1;
if (states[state_id].transitions.length == 1) {
transition = 0;
}
else if (states[state_id].transitions.length == 2) {
transition = r.nextInt(2);
}
double[] observation = null;
observation = new double[7];
observation[states[state_id].transitions[transition].token] = 1.0;
state_id = states[state_id].transitions[transition].next_state_id;
if (state_id == 0) { //exit at end of sequence
break;
}
double[] target_output = new double[7];
for (int i = 0; i < states[state_id].transitions.length; i++) {
target_output[states[state_id].transitions[i].token] = 1.0;
}
steps.add(new DataStep(observation, target_output));
}
result.add(new DataSequence(steps));
}
return result;
}
@Override
public void DisplayReport(Model model, Random rng) throws Exception {
// TODO Auto-generated method stub
}
@Override
public Nonlinearity getModelOutputUnitToUse() {
return new SigmoidUnit();
}
}
Ads help maintain this website.