import edu.indiana.soic.spidal.common.BinaryReader2D;
import edu.indiana.soic.spidal.common.Range;
import org.apache.commons.cli.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.nio.ByteOrder;
import java.util.*;
public class ConsecutiveDistancePrint {
private String vectorFolder;
private int distanceType;
private String distanceFolder;
public ConsecutiveDistancePrint(String vectorFolder, int distanceType, String distanceFolder) {
this.vectorFolder = vectorFolder;
this.distanceType = distanceType;
this.distanceFolder = distanceFolder;
}
public static void main(String[] args) {
Options options = new Options();
options.addOption("v", true, "Input Vector folder");
options.addOption(Utils.createOption("d", true, "distance folder", false));
options.addOption("sd", true, "Start date");
options.addOption("ed", true, "End date");
options.addOption("dm", true, "Date mode");
options.addOption("t", true, "distance type");
options.addOption("i", true, "Original file");
options.addOption("sy", true, "Symbol");
CommandLineParser commandLineParser = new BasicParser();
try {
CommandLine cmd = commandLineParser.parse(options, args);
String vectorFolder = cmd.getOptionValue("v");
int distanceType = Integer.parseInt(cmd.getOptionValue("t"));
int mode = Integer.parseInt(cmd.getOptionValue("dm"));
String input = cmd.getOptionValue("i");
String sd = cmd.getOptionValue("sd");
String ed = cmd.getOptionValue("ed");
String symbol = cmd.getOptionValue("sy");
String distanceFolder = cmd.getOptionValue("d");
Date startDate = Utils.parseDateString(sd);
Date endDate = Utils.parseDateString(ed);
List<Date> dates;
if (mode == 6 || mode == 9 || mode == 10) {
Set<Date> dateSet = DateUtils.retrieveDates(input);
dates = DateUtils.sortDates(dateSet);
} else {
dates = new ArrayList<Date>();
}
List<String> dateString = DateUtils.genDateList(startDate, endDate, mode, dates);
Map<Integer, String> mappings = Utils.loadMapping(input);
Map<String, Integer> intervtedMappings = invert(mappings);
int permNo = intervtedMappings.get(symbol);
ConsecutiveDistancePrint consecutiveDistancePrint = new ConsecutiveDistancePrint(vectorFolder, distanceType, distanceFolder);
consecutiveDistancePrint.process(dateString, permNo, distanceType);
} catch (ParseException e) {
e.printStackTrace();
System.out.println(options.toString());
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
private static <V, K> Map<V, K> invert(Map<K, V> map) {
Map<V, K> inv = new HashMap<V, K>();
for (Map.Entry<K, V> entry : map.entrySet())
inv.put(entry.getValue(), entry.getKey());
return inv;
}
public void process(List<String> dateString, int permNo, int dist) {
for (int i = 0; i < dateString.size(); i++) {
StringBuilder sb = new StringBuilder();
String name = dateString.get(i);
String fileName = vectorFolder + "/" + name + ".csv";
File file = new File(fileName);
List<VectorPoint> vectorPoints = Utils.readVectors(file, 0, 7000);
// get the vector point
int vc1Index = getVectorPoint(permNo, vectorPoints);
int vc2Index = getVectorPoint(1, vectorPoints);
VectorPoint vc1 = vectorPoints.get(vc1Index);
VectorPoint vc2 = vectorPoints.get(vc2Index);
double cor = vc1.correlation(vc2, dist);
sb.append(name).append(": ").append(cor);
if (distanceFolder != null) {
String distanceFileName = distanceFolder + "/" + name + ".csv";
short d = getDistance(vc1Index, vc2Index, distanceFileName, vectorPoints.size());
sb.append(": ").append(d);
}
System.out.println(sb.toString());
}
}
public short getDistance(int i, int j, String file, int size) {
short [][]a = BinaryReader2D.readRowRange(file, new Range(i, i), size, ByteOrder.BIG_ENDIAN, true, null);
return a[0][j];
}
public int getVectorPoint(int permNo, List<VectorPoint> vectorPoints) {
for (int i = 0; i < vectorPoints.size(); i++) {
VectorPoint vectorPoint = vectorPoints.get(i);
if (vectorPoint.getKey() == permNo) {
return i;
}
}
return -1;
}
}