package au.gov.amsa.risky.format;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;
import rx.functions.Action1;
import rx.functions.Func1;
import au.gov.amsa.risky.format.OperatorMinEffectiveSpeedThreshold.FixWithPreAndPostEffectiveSpeed;
import au.gov.amsa.util.Files;
import com.github.davidmoten.rx.slf4j.Logging;
public class LibSvmMain {
public static void main(String[] args) throws IOException {
// open an output writer
final Writer writer = new FileWriter("/media/an/fixes.libsvm");
// specify which files have the fixes to process
List<File> files = Files.find(new File("/media/an/binary-fixes-5-minute/2014"),
Pattern.compile(".*\\.track"));
// process the fixes in the files
BinaryFixes.from(files)
// log
.lift(Logging.<HasFix> logger().showCount().every(1000000).log())
// just class A vessels
.filter(classAOnly())
// only fixes that have course, heading and speed present
.filter(hasCourseHeadingSpeed())
// emit with params
.lift(new OperatorMinEffectiveSpeedThreshold(TimeUnit.HOURS.toMillis(1)))
// log
// write the fixes in LIBSVM format
.forEach(writeFix(writer), t -> t.printStackTrace());
// close the writer
writer.close();
System.out.println("finished");
}
private static Action1<FixWithPreAndPostEffectiveSpeed> writeFix(final Writer writer) {
return f -> {
int navStatus;
if (f.fix().navigationalStatus().isPresent()) {
if (f.fix().navigationalStatus().get() == NavigationalStatus.MOORED)
navStatus = 1;
else if (f.fix().navigationalStatus().get() == NavigationalStatus.AT_ANCHOR)
navStatus = 2;
else
navStatus = 0;
} else
navStatus = 0;
Fix fix = f.fix();
float diff = Math.abs(fix.courseOverGroundDegrees().get() - fix.headingDegrees().get());
LibSvm.write(writer, navStatus, f.fix().lat(), f.fix().lon(), fix
.speedOverGroundKnots().get(), diff, f.preEffectiveSpeedKnots(), f.preError(),
f.postEffectiveSpeedKnots(), f.postError());
};
}
private static Func1<HasFix, Boolean> hasCourseHeadingSpeed() {
return fix -> {
Fix f = fix.fix();
return f.courseOverGroundDegrees().isPresent() && f.headingDegrees().isPresent()
&& f.speedOverGroundKnots().isPresent();
};
}
private static Func1<HasFix, Boolean> classAOnly() {
return fix -> {
Fix f = fix.fix();
return (f.aisClass() == AisClass.A);
};
}
}