import org.apache.commons.cli.*;
import java.io.*;
import java.util.*;
public class MDSPointGenerator {
private String pointFolder;
private String vectorFolder;
private String mdsFolder;
private String firstFile;
private String secondFile;
public static void main(String[] args) {
Options options = new Options();
options.addOption("v", true, "Input Vector folder");
options.addOption("p", true, "Points folder");
options.addOption(Utils.createOption("r", true, "MDS folder", true));
options.addOption(Utils.createOption("ff", true, "First file", false));
options.addOption(Utils.createOption("sf", true, "Second file", false));
CommandLineParser commandLineParser = new BasicParser();
try {
CommandLine cmd = commandLineParser.parse(options, args);
String vectorFolder = cmd.getOptionValue("v");
String pointsFolder = cmd.getOptionValue("p");
String rotateFolder = cmd.getOptionValue("r");
String firstFile = cmd.getOptionValue("ff");
String secondFile = cmd.getOptionValue("sf");
MDSPointGenerator pointTransformer = new MDSPointGenerator(pointsFolder, vectorFolder,
rotateFolder, firstFile, secondFile);
pointTransformer.process();
} catch (ParseException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public MDSPointGenerator(String pointFolder, String vectorFolder,
String mdsFolder,
String firstFile, String secondFile) {
this.pointFolder = pointFolder;
this.vectorFolder = vectorFolder;
this.firstFile = firstFile;
this.secondFile = secondFile;
this.mdsFolder = mdsFolder;
}
public void process() throws FileNotFoundException {
processPair(firstFile, secondFile);
}
private void processPair(String firstFileWithoutExt, String secondfFileWithoutExt) {
String firstVectorFileName = this.vectorFolder + "/" + firstFileWithoutExt + ".csv";
String secondVectorFileName = this.vectorFolder + "/" + secondfFileWithoutExt + ".csv";
String firstPointFileName = this.mdsFolder + "/" + firstFileWithoutExt + ".txt";
String secondPointFileName = this.pointFolder + "/" + secondfFileWithoutExt + ".txt";
System.out.println("Processing pair: " + firstVectorFileName + " " + secondVectorFileName + " " + firstPointFileName + " " + secondPointFileName);
// first lets read the vector keys
List<Integer> firstVectorKeys = Utils.readVectorKeys(new File(firstVectorFileName));
List<Integer> secondVectorKeys = Utils.readVectorKeys(new File(secondVectorFileName));
// now read the two point files
Map<Integer, Point> firstPoints = Utils.loadPoints(new File(firstPointFileName), firstVectorKeys);
// go through the second vector keys and output the corresponding point
Random random = new Random();
List<Point> secondPoints = new ArrayList<>();
for (int i = 0; i < secondVectorKeys.size(); i++) {
int key = secondVectorKeys.get(i);
Point p;
if (firstVectorKeys.contains(key)) {
p = firstPoints.get(key);
} else {
p = new Point(i, random.nextDouble(), random.nextDouble(), random.nextDouble(), 1);
}
secondPoints.add(p);
}
writePoints(secondPoints, secondPointFileName);
}
private void writePoints(List<Point> pointMap, String file) {
BufferedWriter bufWriter = null;
try {
FileOutputStream fos = new FileOutputStream(file);
bufWriter = new BufferedWriter(new OutputStreamWriter(fos));
int i = 0;
for (Point p : pointMap) {
p.setIndex(i++);
bufWriter.write(p.serializeXYZ());
bufWriter.newLine();
}
} catch (IOException e) {
throw new RuntimeException("Failed to write file", e);
} finally {
if (bufWriter != null) {
try {
bufWriter.close();
} catch (IOException ignore) {
}
}
}
}
}