package eu.quanticol.carma.examples.smarttaxis;
import org.apache.commons.math3.random.RandomGenerator;
import org.cmg.ml.sam.sim.SimulationEnvironment;
import org.cmg.ml.sam.sim.sampling.SamplingCollection;
import org.cmg.ml.sam.sim.sampling.StatisticSampling;
import eu.quanticol.carma.examples.smarttaxis.SmartTaxisDefinitions.InfoClass;
import eu.quanticol.carma.simulator.CarmaComponent;
import eu.quanticol.carma.simulator.CarmaProcess;
import eu.quanticol.carma.simulator.CarmaProcessPredicate;
import eu.quanticol.carma.simulator.CarmaSequentialProcess;
import eu.quanticol.carma.simulator.CarmaStore;
import eu.quanticol.carma.simulator.CarmaSystem;
import eu.quanticol.carma.simulator.ComponentPredicate;
public class SmartTaxis extends CarmaSystem {
public SmartTaxis( int taxis , int users ) {
for( int l=0 ; l<SmartTaxisDefinitions.NUMBER_OF_LOCATIONS ; l++ ) {
for( int i=0 ; i<taxis ; i++ ) {
CarmaComponent taxi = getTaxi( l );
addComponent(taxi);
}
}
for( int l=0 ; l<SmartTaxisDefinitions.NUMBER_OF_LOCATIONS ; l++ ) {
CarmaComponent arrival = getArrivalComponent( l );
addComponent( arrival );
}
// for( int l=0 ; l<SmartTaxisDefinitions.NUMBER_OF_LOCATIONS ; l++ ) {
// for( int i=0 ; i<users ; i++ ) {
// CaspaComponent user = getUserComponent( l );
// addComponent( user );
// }
// }
}
private CarmaComponent getArrivalComponent(int l) {
CarmaComponent c = new CarmaComponent();
c.set( SmartTaxisDefinitions.LOC_ATTRIBUTE , l );
c.addAgent( new CarmaSequentialProcess(c, SmartTaxisDefinitions.ArrivalProcess ) );
return c;
}
private CarmaComponent getTaxi(int loc) {
CarmaComponent c = new CarmaComponent();
c.set( SmartTaxisDefinitions.LOC_ATTRIBUTE , loc );
c.set( SmartTaxisDefinitions.INFO_ATTRIBUTE , new SmartTaxisDefinitions.InfoClass( SmartTaxisDefinitions.NUMBER_OF_LOCATIONS ) );
c.set( SmartTaxisDefinitions.DEST_ATTRIBUTE , -1 );
c.set( SmartTaxisDefinitions.OCCUPIED_ATTRIBUTE, false);
c.addAgent( new CarmaSequentialProcess(c, SmartTaxisDefinitions.TaxiProcess ) );
// c.addAgent( new CaspaSequentialProcess(c, SmartTaxisDefinitions.InfoProcess ) );
return c;
}
@Override
public double broadcastProbability(CarmaStore sender, CarmaStore receiver,
int action) {
return SmartTaxisDefinitions.P_LOST;
}
private double getMoveTime(double now, Integer from, Integer to) {
return SmartTaxisDefinitions.STEP_RATE*SmartTaxisDefinitions.steps(from,to);
}
@Override
public double unicastProbability(final CarmaStore sender, CarmaStore receiver,
int action) {
if (action == SmartTaxisDefinitions.TAKE) {
double foo = measure(new ComponentPredicate() {
@Override
public boolean eval(double now,CarmaComponent c) {
int loc = sender.get(SmartTaxisDefinitions.LOC_ATTRIBUTE, SmartTaxisDefinitions.LOC_ATTRIBUTE_TYPE);
if (c.get(SmartTaxisDefinitions.LOC_ATTRIBUTE, SmartTaxisDefinitions.LOC_ATTRIBUTE_TYPE).equals(loc)) {
return c.isRunning( new CarmaProcessPredicate() {
@Override
public boolean eval(CarmaProcess p) {
if (p instanceof CarmaSequentialProcess) {
CarmaSequentialProcess csp = (CarmaSequentialProcess) p;
return csp.getName().equals("Taxi")&&csp.getState().getName().equals("F");
}
return false;
}
});
}
return false;
}
});
if (foo != 0) {
return 1/foo;
}
}
if (action == SmartTaxisDefinitions.CALL) {
return 1.0;
}
return 0;
}
@Override
public double broadcastRate(CarmaStore sender, int action) {
if (action == SmartTaxisDefinitions.CALL) {
return SmartTaxisDefinitions.CALL_RATE;
}
if (action == SmartTaxisDefinitions.EXCH) {
SmartTaxisDefinitions.InfoClass info = sender.get(SmartTaxisDefinitions.INFO_ATTRIBUTE, SmartTaxisDefinitions.INFO_ATTRIBUTE_TYPE);
if ((info == null)||(info.elements()==0)) {
return 0.0;
} else {
return SmartTaxisDefinitions.EXCH_RATE;
}
}
if (action == SmartTaxisDefinitions.CHANGE) {
InfoClass ic = sender.get(SmartTaxisDefinitions.INFO_ATTRIBUTE, SmartTaxisDefinitions.INFO_ATTRIBUTE_TYPE);
int loc = sender.get(SmartTaxisDefinitions.LOC_ATTRIBUTE, SmartTaxisDefinitions.LOC_ATTRIBUTE_TYPE);
return SmartTaxisDefinitions.CHANGE_RATE*ic.getMovingProbability( loc );
}
if (action == SmartTaxisDefinitions.MOVE) {
return getMoveTime(
now() ,
sender.get(SmartTaxisDefinitions.LOC_ATTRIBUTE, SmartTaxisDefinitions.LOC_ATTRIBUTE_TYPE ) ,
sender.get(SmartTaxisDefinitions.DEST_ATTRIBUTE, SmartTaxisDefinitions.LOC_ATTRIBUTE_TYPE )
);
}
if (action == SmartTaxisDefinitions.AGE) {
SmartTaxisDefinitions.InfoClass info = sender.get(SmartTaxisDefinitions.INFO_ATTRIBUTE, SmartTaxisDefinitions.INFO_ATTRIBUTE_TYPE);
if ((info == null)||(info.elements()==0)) {
return 0.0;
} else {
return SmartTaxisDefinitions.AGE_RATE;
}
}
if (action == SmartTaxisDefinitions.ARRIVE) {
return SmartTaxisDefinitions.arrivalRate( now() , sender.get(SmartTaxisDefinitions.LOC_ATTRIBUTE, SmartTaxisDefinitions.LOC_ATTRIBUTE_TYPE ) );
}
return 0;
}
@Override
public double unicastRate(CarmaStore sender, int action) {
if (action == SmartTaxisDefinitions.TAKE) {
return SmartTaxisDefinitions.TAKE_RATE;
}
if (action == SmartTaxisDefinitions.CALL) {
return SmartTaxisDefinitions.CALL_RATE;
}
return 0;
}
@Override
public void broadcastUpdate(RandomGenerator r , CarmaStore sender, int action, Object value) {
if (action == SmartTaxisDefinitions.ARRIVE) {
int loc = sender.get(SmartTaxisDefinitions.LOC_ATTRIBUTE, SmartTaxisDefinitions.LOC_ATTRIBUTE_TYPE);
int dest = SmartTaxisDefinitions.getDestination( now , loc , r );
addComponent(
getUserComponent(
loc ,
dest//r.nextInt(SmartTaxisDefinitions.NUMBER_OF_LOCATIONS)
));
}
}
private CarmaComponent getUserComponent(int loc , int dest ) {
CarmaComponent c = new CarmaComponent();
c.set(SmartTaxisDefinitions.LOC_ATTRIBUTE, loc);
c.set(SmartTaxisDefinitions.DEST_ATTRIBUTE, dest);
c.addAgent( new CarmaSequentialProcess(c, SmartTaxisDefinitions.UserProcess) );
return c;
}
@Override
public void unicastUpdate(RandomGenerator r , CarmaStore sender, CarmaStore receiver, int action, Object value) {
}
public static void main( String[] argv ) {
SimulationEnvironment<CarmaSystem> system = new SimulationEnvironment<CarmaSystem>(
new SmartTaxisFactory(SmartTaxisDefinitions.TAXIS, 0)
);
int deadline = (int) SmartTaxisDefinitions.LIMIT;
StatisticSampling<CarmaSystem> waitingUsers0 =
new StatisticSampling<CarmaSystem>(deadline+1, 1.0, SmartTaxisDefinitions.getMeasureOfWaitingUsers(SmartTaxisDefinitions.getLocId(1, 1)));
StatisticSampling<CarmaSystem> freeTaxis0 =
new StatisticSampling<CarmaSystem>(deadline+1, 1.0, SmartTaxisDefinitions.getMeasureOfAvailabelTaxis(SmartTaxisDefinitions.getLocId(1, 1)));
StatisticSampling<CarmaSystem> movingTaxis =
new StatisticSampling<CarmaSystem>(deadline+1, 1.0, SmartTaxisDefinitions.getMeasureOfMovingTaxis());
StatisticSampling<CarmaSystem> waitingUsers1 =
new StatisticSampling<CarmaSystem>(deadline+1, 1.0, SmartTaxisDefinitions.getMeasureOfWaitingUsers(SmartTaxisDefinitions.getLocId(0, 0)));
StatisticSampling<CarmaSystem> freeTaxis1 =
new StatisticSampling<CarmaSystem>(deadline+1, 1.0, SmartTaxisDefinitions.getMeasureOfAvailabelTaxis(SmartTaxisDefinitions.getLocId(0, 0)));
system.setSampling( new SamplingCollection<CarmaSystem>( waitingUsers0 , waitingUsers1 ,movingTaxis, freeTaxis0 , freeTaxis1 ) );
system.simulate(200,deadline);
System.out.println("WAITING AT (1,1):");
waitingUsers0.printTimeSeries(System.out);
System.out.println("\n\nWAITING AT (0,0):");
waitingUsers1.printTimeSeries(System.out);
System.out.println("FREE AT (1,1):");
freeTaxis0.printTimeSeries(System.out);
System.out.println("FREE AT (1,1):");
freeTaxis1.printTimeSeries(System.out);
System.out.println("\n\nMOVING TAXIS:");
movingTaxis.printTimeSeries(System.out);
// minBikes.printTimeSeries(System.out);
// maxBikes.printTimeSeries(System.out);
// averageBikes.printTimeSeries(System.out);
}
}