224 lines
7.1 KiB
Java
224 lines
7.1 KiB
Java
import java.io.File;
|
|
import java.io.BufferedReader;
|
|
import java.io.FileReader;
|
|
import java.io.FileNotFoundException;
|
|
import java.io.IOException;
|
|
import java.io.Closeable;
|
|
import java.io.DataOutputStream;
|
|
import java.io.FileOutputStream;
|
|
import java.io.DataInputStream;
|
|
import java.io.FileInputStream;
|
|
import java.io.BufferedInputStream;
|
|
|
|
/**
|
|
* Converts text-based letter stores to binary-based stores.
|
|
*/
|
|
public class Converter {
|
|
private final File mFile;
|
|
private static final short VERSION_NUMBER = 1;
|
|
|
|
Converter(File file) {
|
|
mFile = file;
|
|
}
|
|
|
|
private void convert() {
|
|
boolean read = false;
|
|
|
|
String[] classes = null;
|
|
int iCount = 0;
|
|
int hCount = 0;
|
|
int oCount = 0;
|
|
float[][] iWeights = null;
|
|
float[][] oWeights = null;
|
|
|
|
BufferedReader reader = null;
|
|
|
|
try {
|
|
reader = new BufferedReader(new FileReader(mFile));
|
|
|
|
long start = System.nanoTime();
|
|
|
|
String line = reader.readLine();
|
|
int startIndex = 0;
|
|
int endIndex;
|
|
endIndex = line.indexOf(" ", startIndex);
|
|
iCount = Integer.parseInt(line.substring(startIndex, endIndex));
|
|
|
|
startIndex = endIndex + 1;
|
|
endIndex = line.indexOf(" ", startIndex);
|
|
hCount = Integer.parseInt(line.substring(startIndex, endIndex));
|
|
|
|
startIndex = endIndex + 1;
|
|
endIndex = line.length();
|
|
oCount = Integer.parseInt(line.substring(startIndex, endIndex));
|
|
|
|
classes = new String[oCount];
|
|
line = reader.readLine();
|
|
startIndex = 0;
|
|
|
|
for (int i = 0; i < oCount; i++) {
|
|
endIndex = line.indexOf(" ", startIndex);
|
|
classes[i] = line.substring(startIndex, endIndex);
|
|
startIndex = endIndex + 1;
|
|
}
|
|
|
|
iWeights = new float[hCount][];
|
|
for (int i = 0; i < hCount; i++) {
|
|
iWeights[i] = new float[iCount + 1];
|
|
line = reader.readLine();
|
|
startIndex = 0;
|
|
for (int j = 0; j <= iCount; j++) {
|
|
endIndex = line.indexOf(" ", startIndex);
|
|
iWeights[i][j] = Float.parseFloat(line.substring(startIndex, endIndex));
|
|
startIndex = endIndex + 1;
|
|
}
|
|
}
|
|
|
|
oWeights = new float[oCount][];
|
|
for (int i = 0; i < oCount; i++) {
|
|
oWeights[i] = new float[hCount + 1];
|
|
line = reader.readLine();
|
|
startIndex = 0;
|
|
for (int j = 0; j <= hCount; j++) {
|
|
endIndex = line.indexOf(" ", startIndex);
|
|
oWeights[i][j] = Float.parseFloat(line.substring(startIndex, endIndex));
|
|
startIndex = endIndex + 1;
|
|
}
|
|
}
|
|
|
|
long end = System.nanoTime();
|
|
System.out.println("time to read text file = " +
|
|
((end - start) / 1000.0f / 1000.0f) + " ms");
|
|
|
|
read = true;
|
|
} catch (FileNotFoundException e) {
|
|
e.printStackTrace();
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
} finally {
|
|
close(reader);
|
|
}
|
|
|
|
if (read) {
|
|
boolean wrote = false;
|
|
DataOutputStream out = null;
|
|
|
|
try {
|
|
out = new DataOutputStream(new FileOutputStream(mFile));
|
|
|
|
out.writeShort(VERSION_NUMBER);
|
|
out.writeInt(iCount);
|
|
out.writeInt(hCount);
|
|
out.writeInt(oCount);
|
|
|
|
for (String aClass : classes) {
|
|
out.writeUTF(aClass);
|
|
}
|
|
|
|
for (float[] weights : iWeights) {
|
|
for (float weight : weights) {
|
|
out.writeFloat(weight);
|
|
}
|
|
}
|
|
|
|
for (float[] weights : oWeights) {
|
|
for (float weight : weights) {
|
|
out.writeFloat(weight);
|
|
}
|
|
}
|
|
|
|
out.flush();
|
|
|
|
wrote = true;
|
|
} catch (FileNotFoundException e) {
|
|
e.printStackTrace();
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
} finally {
|
|
close(out);
|
|
}
|
|
|
|
if (wrote) {
|
|
DataInputStream in = null;
|
|
|
|
try {
|
|
in = new DataInputStream(new BufferedInputStream(new FileInputStream(mFile)));
|
|
|
|
long start = System.nanoTime();
|
|
|
|
iCount = in.readInt();
|
|
hCount = in.readInt();
|
|
oCount = in.readInt();
|
|
|
|
classes = new String[oCount];
|
|
for (int i = 0; i < classes.length; i++) {
|
|
classes[i] = in.readUTF();
|
|
}
|
|
|
|
iWeights = new float[hCount][];
|
|
for (int i = 0; i < iWeights.length; i++) {
|
|
iWeights[i] = new float[iCount];
|
|
for (int j = 0; j < iCount; j++) {
|
|
iWeights[i][j] = in.readFloat();
|
|
}
|
|
}
|
|
|
|
oWeights = new float[oCount][];
|
|
for (int i = 0; i < oWeights.length; i++) {
|
|
oWeights[i] = new float[hCount];
|
|
for (int j = 0; j < hCount; j++) {
|
|
oWeights[i][j] = in.readFloat();
|
|
}
|
|
}
|
|
|
|
long end = System.nanoTime();
|
|
System.out.println("time to read binary file = " +
|
|
((end - start) / 1000.0f / 1000.0f) + " ms");
|
|
|
|
} catch (FileNotFoundException e) {
|
|
e.printStackTrace();
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
} finally {
|
|
close(in);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private static void close(Closeable reader) {
|
|
if (reader != null) {
|
|
try {
|
|
reader.close();
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
String fileName = args[0];
|
|
if (fileName != null) {
|
|
File file = new File(fileName);
|
|
if (!file.exists()) {
|
|
printHelp(fileName);
|
|
} else {
|
|
new Converter(file).convert();
|
|
}
|
|
} else {
|
|
printHelp(null);
|
|
}
|
|
}
|
|
|
|
private static void printHelp(String name) {
|
|
if (name == null) {
|
|
System.out.println("You must specify the name of the file to convert:");
|
|
} else {
|
|
System.out.println("The specified file does not exist: " + name);
|
|
}
|
|
System.out.println("java Converter [filename]");
|
|
System.out.println("");
|
|
System.out.println("\t[filename]\tPath to the file to convert. The file is replaced by "
|
|
+ "the conversion result.");
|
|
}
|
|
} |