/**
*
*/
package eu.quanticol.carma.examples.gc;
import org.apache.commons.math3.random.RandomGenerator;
import eu.quanticol.carma.simulator.CarmaAction;
import eu.quanticol.carma.simulator.CarmaComponent;
import eu.quanticol.carma.simulator.CarmaInput;
import eu.quanticol.carma.simulator.CarmaOutput;
import eu.quanticol.carma.simulator.CarmaPredicate;
import eu.quanticol.carma.simulator.CarmaProcess;
import eu.quanticol.carma.simulator.CarmaProcessAutomaton;
import eu.quanticol.carma.simulator.CarmaSequentialProcess;
import eu.quanticol.carma.simulator.CarmaStore;
import eu.quanticol.carma.simulator.CarmaStoreUpdate;
import eu.quanticol.carma.simulator.CarmaSystem;
/**
* @author loreti
*
*/
public class GroupiesCelebritiesDefinitions {
public final static int KIND_A = 0;
public final static int KIND_B = 1;
public final static int ACTION_ID = 0;
public final static String KIND_ATTRIBUTE = "kind";
public final static CarmaProcessAutomaton GroupyAutomaton = createGroupyAutomaton();
public final static CarmaProcessAutomaton CelebrityAutomaton = createCelebrityAutomaton();
public static CarmaProcess getGroupyProcess( CarmaComponent component ) {
return new CarmaSequentialProcess(component, GroupyAutomaton);
}
public static CarmaProcess getCelebrityProcess( CarmaComponent component ) {
return new CarmaSequentialProcess(component, CelebrityAutomaton);
}
private static CarmaProcessAutomaton createGroupyAutomaton() {
CarmaProcessAutomaton automaton = new CarmaProcessAutomaton("Groupy");
CarmaProcessAutomaton.State state = automaton.newState("G");
CarmaAction spreadAction = new CarmaOutput( ACTION_ID , true ) {
@Override
protected Object getValue(CarmaSystem sys, CarmaStore store, double now) {
return store.get("kind", Integer.class);
}
@Override
protected CarmaStoreUpdate getUpdate(CarmaSystem sys, double now) {
return null;
}
@Override
protected CarmaPredicate getPredicate(CarmaSystem sys, CarmaStore store) {
return CarmaPredicate.TRUE;
}
};
CarmaInput inputAction = new CarmaInput( ACTION_ID , true ) {
@Override
protected CarmaPredicate getPredicate(CarmaSystem sys, CarmaStore store, Object value) {
return CarmaPredicate.TRUE;
}
@Override
protected CarmaStoreUpdate getUpdate(CarmaSystem sys, final Object value, double now) {
return new CarmaStoreUpdate() {
@Override
public void update(RandomGenerator r, CarmaStore store ) {
store.set(KIND_ATTRIBUTE, value);
}
};
}
};
automaton.addTransition(state, spreadAction, state);
automaton.addTransition(state, inputAction, state);
return automaton;
}
private static CarmaProcessAutomaton createCelebrityAutomaton() {
CarmaProcessAutomaton automaton = new CarmaProcessAutomaton("Celebrity");
CarmaProcessAutomaton.State state = automaton.newState("C");
CarmaAction spreadAction = new CarmaOutput( ACTION_ID , true ) {
@Override
protected Object getValue(CarmaSystem sys, CarmaStore store, double now) {
return store.get("kind", Integer.class);
}
@Override
protected CarmaStoreUpdate getUpdate(CarmaSystem sys, double now) {
return null;
}
@Override
protected CarmaPredicate getPredicate(CarmaSystem sys, CarmaStore store) {
return CarmaPredicate.TRUE;
}
};
CarmaInput inputAction = new CarmaInput( ACTION_ID , true ) {
@Override
protected CarmaPredicate getPredicate(CarmaSystem sys, CarmaStore localStore, Object value) {
final int kind = localStore.get(KIND_ATTRIBUTE, Integer.class).intValue();
return new CarmaPredicate() {
@Override
public boolean satisfy(double now,CarmaStore store) {
return kind == store.get(KIND_ATTRIBUTE, Integer.class).intValue();
}
};
}
@Override
protected CarmaStoreUpdate getUpdate(CarmaSystem sys, final Object value, double now) {
return new CarmaStoreUpdate() {
@Override
public void update(RandomGenerator r, CarmaStore store ) {
int value = store.get(KIND_ATTRIBUTE, Integer.class);
store.set(KIND_ATTRIBUTE, ((value+1)%2) );
}
};
}
};
automaton.addTransition(state, spreadAction, state);
automaton.addTransition(state, inputAction, state);
return automaton;
}
}