|
package paysim; |
|
|
|
import java.io.BufferedReader; |
|
import java.io.BufferedWriter; |
|
import java.io.File; |
|
import java.io.FileReader; |
|
import java.io.FileWriter; |
|
import java.util.ArrayList; |
|
import java.util.Date; |
|
|
|
|
|
public class ParameterizedPaySim extends PaySim{ |
|
|
|
public static String simulatorName = ""; |
|
ParameterizedPaySim parameterizedPaysim = null; |
|
ArrayList<String> paramFile = new ArrayList<String>(); |
|
ArrayList<String> actions = new ArrayList<String>(); |
|
BufferedWriter bufWriter; |
|
String filePath = ""; |
|
long begin = 0; |
|
long end = 0; |
|
static long numOfSteps = 1; |
|
int numOfRepeat = 0; |
|
public static int currentLoop = 0; |
|
double incRepeat = 0; |
|
|
|
public ParameterizedPaySim(long seed) { |
|
super(seed); |
|
super.setTagName("1"); |
|
|
|
} |
|
|
|
public ParameterizedPaySim(){ |
|
super(1); |
|
super.setTagName("1"); |
|
} |
|
|
|
public void setCurrentLoop(int currentLoop){ |
|
ParameterizedPaySim.currentLoop = currentLoop; |
|
} |
|
|
|
|
|
public void parseArgs(String args[]){ |
|
|
|
for (int x = 0; x < args.length - 1; x++){ |
|
if (args[x].equals("-file")) { |
|
filePath = args[x + 1]; |
|
super.setPropertiesFile(filePath); |
|
|
|
|
|
} else if (args[x].equals("-for")) { |
|
|
|
numOfSteps = Long.parseLong(args[x + 1].toString()); |
|
|
|
|
|
} else if (args[x].equals("-r")) { |
|
numOfRepeat = Integer.parseInt(args[x + 1].toString()); |
|
|
|
} else if (args[x].equals("-inc")) { |
|
incRepeat = Double.parseDouble(args[x + 1].toString()); |
|
} |
|
} |
|
} |
|
|
|
public void runSimulation(String args[]){ |
|
parseArgs(args); |
|
|
|
numOfRepeat = 1; |
|
executeSimulation(); |
|
|
|
|
|
} |
|
|
|
private void loadAggregatedFile(){ |
|
|
|
paramFile = new ArrayList<String>(); |
|
try { |
|
|
|
FileReader reader = new FileReader(new File(super.parameterFilePath)); |
|
BufferedReader bufReader = new BufferedReader(reader); |
|
|
|
String tempLine = ""; |
|
|
|
while((tempLine = bufReader.readLine()) != null){ |
|
paramFile.add(tempLine); |
|
} |
|
bufReader.close(); |
|
} catch (Exception e) { |
|
e.printStackTrace(); |
|
} |
|
|
|
this.actions.add("CASH_IN"); |
|
this.actions.add("CASH_OUT"); |
|
this.actions.add("DEBIT"); |
|
this.actions.add("DEPOSIT"); |
|
this.actions.add("PAYMENT"); |
|
this.actions.add("TRANSFER"); |
|
|
|
} |
|
|
|
private void initBufWriter(String logFileName){ |
|
long time = System.currentTimeMillis(); |
|
try { |
|
FileWriter writer = new FileWriter(new File(logFileName)); |
|
this.bufWriter = new BufferedWriter(writer); |
|
bufWriter.write("step,type,amount,nameOrig,oldbalanceOrg,newbalanceOrig,nameDest,oldbalanceDest,newbalanceDest,isFraud,isFlaggedFraud\n"); |
|
bufWriter.close(); |
|
}catch(Exception e){ |
|
e.printStackTrace(); |
|
} |
|
} |
|
|
|
|
|
|
|
private void initSimulatorName(){ |
|
Date d = new Date(); |
|
ParameterizedPaySim.simulatorName = "PS_" + (d.getYear() + 1900) + (d.getMonth() + 1) + d.getDate() + d.getHours() + d.getMinutes() |
|
+ d.getSeconds() + "_" + this.seed; |
|
|
|
File f = new File(System.getProperty("user.dir") +"//outputs//" + ParameterizedPaySim.simulatorName); |
|
f.mkdir(); |
|
} |
|
|
|
public void executeSimulation(){ |
|
|
|
super.loadParametersFromFile(); |
|
|
|
|
|
|
|
initSimulatorName(); |
|
loadAggregatedFile(); |
|
|
|
this.logFileName = System.getProperty("user.dir") +"//outputs//" + ParameterizedPaySim.simulatorName |
|
+ "//" + ParameterizedPaySim.simulatorName + "_log.txt"; |
|
initBufWriter(logFileName); |
|
|
|
|
|
|
|
|
|
|
|
if (debugFlag) |
|
System.out.println("Size of paramFile:\t" + this.paramFile.size() + "\n"); |
|
setParamFileList(this.paramFile); |
|
|
|
|
|
setActionTypes(this.actions); |
|
|
|
|
|
setWriter(this.bufWriter); |
|
|
|
|
|
setNrOfSteps(numOfSteps); |
|
super.start(); |
|
begin = System.currentTimeMillis(); |
|
System.out.println("Starting PaySim Running for " |
|
+ numOfSteps + " steps. Current loop:" + ParameterizedPaySim.currentLoop); |
|
|
|
|
|
long time; |
|
while ((time = (long) super.schedule.getSteps()) < numOfSteps) { |
|
if (!super.schedule.step(this)) |
|
break; |
|
if (time % 100 == 0 && time != 0) { |
|
System.out.println("Time Step " + time); |
|
} |
|
else { |
|
System.out.print("*"); |
|
} |
|
|
|
} |
|
System.out.println(" - Finished running " + time + " steps "); |
|
|
|
super.finish(); |
|
end = System.currentTimeMillis(); |
|
|
|
double total = end - begin; |
|
total = total/1000; |
|
System.out.println("\nIt took:\t" + total/60 + " minutes to execute the simulation\n"); |
|
System.out.println("Simulation name: " + this.simulatorName); |
|
} |
|
|
|
public void refresh(){ |
|
System.out.println("Refreshing\n"); |
|
super.refresh(); |
|
this.paramFile = new ArrayList<String>(); |
|
this.bufWriter = null; |
|
} |
|
|
|
|
|
public static void main(String args[]){ |
|
|
|
int nrOfTimesRepeat = Integer.parseInt(args[5]); |
|
|
|
for(int i=0; i<nrOfTimesRepeat; i++){ |
|
ParameterizedPaySim p = new ParameterizedPaySim(1); |
|
p.setCurrentLoop(i); |
|
p.runSimulation(args); |
|
} |
|
|
|
|
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|