package wcet.dsvmfp;
import com.jopdesign.sys.Native;
import util.Dbg;
import joprt.RtThread;
import wcet.dsvmfp.util.UdpJop;
import wcet.dsvmfp.model.smo.classification.SMOBinaryClassifierFP;
import wcet.dsvmfp.model.smo.kernel.FP;
import wcet.dsvmfp.util.DsvmPacket;
/**
*
* @author rup.inf
* GPL
*/
public class JopClient {
// Set by UdpJop receive thread
static boolean info;
static UdpJop udpJop;
static int sendcnt;
static int BOOTSTATE = 0;
static int INITSTATE = 1;
static int TRAININGSTATE = 2;
static int TESTINGSTATE = 3;
static int ENDSTATE = 4;
static int NEVER = 100;
static int state;
static boolean receivedPacket;
static int counter = 0;
static int m;
static int n = 1;
static int[][] data_fp;
static int[] y_fp;
// PC IP //130.226.36.11
static int destIp;
static int destPort;
static int receivePort;
static public void main(String[] args) {
Dbg.initSerWait();
DsvmPacket.init();
receivedPacket = false;
state = BOOTSTATE;
sendcnt = 0;
info = false;
counter = 0;
// SVM data and the place to decide the size of the training set
m = 100; // i, number of data
n = 2; // j, dimensions
data_fp = new int[m][];
y_fp = new int[m];
// PC IP //130.226.36.11
destIp = (130 << 24) + (226 << 16) + (36 << 8) + 11;
destPort = 1234;
receivePort = 2345;
// 24-2-2006: Hack to get the thread to init now because "new UdpJop..."
// causes a stack overflow if the thread init is done in that
// call flow
new RtThread(0,1000000000){
public void run(){
for(;;){
waitForNextPeriod();
}
}
};
udpJop = new UdpJop(destIp, destPort, receivePort);
// new RtThread(20, 100000) {
// public void run() {
// for (;;) {
// if (SMOBinaryClassifierFP.printSMOInfo) {
// SMOBinaryClassifierFP.smoInfo();
// SMOBinaryClassifierFP.printSMOInfo = false;
// }
// waitForNextPeriod();
// }
// }
// };
//
// new RtThread(19, 100000) {
// public void run() {
// for (;;) {
// if (SMOBinaryClassifierFP.takeStepFlag
// && SMOBinaryClassifierFP.go) {
// SMOBinaryClassifierFP.takeStep();
// SMOBinaryClassifierFP.takeStepFlag = false;
// }
// waitForNextPeriod();
// }
// }
// };
// class Test extends SwEvent {
// static Test testsmo;
// public Test(int priority, int minTime) {
// super(priority, minTime);
// }
//
// public void handle() {
// test();
// }
// };
RtThread.startMission();
// System.out.println("about to sleep");
//RtThread.sleepMs(2000); // Waiting for alive packet to initialize arp
// System.out.println("slept");
/*
* DsvmPacket dp = new DsvmPacket(); dp.setData(new int[2]);
* System.out.println("about to send"); udpJop.send(dp);
* System.out.println("test packet sent"); okSend = true;
* System.out.println("HERE2");
*/
int cnt = 0;
// gccheck();
// System.out.println("before initstate loop");
// System.out.println("state " + state);
while (state != INITSTATE) {
RtThread.sleepMs(100);
}
System.out.println("INITSTATE");
RtThread.sleepMs(1000);
DsvmPacket.setCommand(DsvmPacket.INIT);
// System.out.println("about to send init");
udpJop.send(); // Training
RtThread.sleepMs(500);
System.out.println("TRAINING");
for (int i = 0; i < m; i++) {
// System.out.println("About to DsvmPacket.TRAININGDATAREQUEST" +
// i);
DsvmPacket.setCommand(DsvmPacket.TRAININGDATAREQUEST);
receivedPacket = false;
udpJop.send();
waitForReply();
// System.out.println("got training data i=" + i);
if (DsvmPacket.getCommand() != DsvmPacket.TRAININGDATA) {
System.out.println("Expected training data!");
System.exit(1);
}
//Creates a new object
data_fp[i] = DsvmPacket.getDataFP();
y_fp[i] = DsvmPacket.getLabelFP();
if (info) {
System.out.println((counter++) + " trainingData={");
for (int j = 0; j < n; j++) {
System.out.println("data_fp[" + i + "][" + j + "]="
+ data_fp[i][j]);
}
System.out.println("}, y_fp[" + i + "]=" + y_fp[i]);
}
}
SMOBinaryClassifierFP.setData_fp(data_fp);
SMOBinaryClassifierFP.setY_fp(y_fp);
//SMOBinaryClassifierFP.smo.fire();
SMOBinaryClassifierFP.mainRoutine();
//while(!SMOBinaryClassifierFP.done)
// RtThread.sleepMs(500);
System.out.println("About to test");
test();
for (;;) {
System.out.println("cnt " + (cnt++));
// Timer.wd();
RtThread.sleepMs(1000);
if (state == NEVER)
break;
}
}
public static void test() {
for (int i = 0; i < SMOBinaryClassifierFP.m; i++) {
DsvmPacket.setCommand(DsvmPacket.TESTDATAREQUEST);
receivedPacket = false;
udpJop.send();
System.out.println("DsvmPacket.TESTDATAREQUEST sent");
waitForReply();
System.out.println("Receive command="+DsvmPacket.getCommand());
if (DsvmPacket.getCommand() != DsvmPacket.TESTDATA){
System.out.println("Expected test data! Not "+DsvmPacket.getCommand());
System.exit(-1);
}
int[] testData_fp = DsvmPacket.getDataFP();
int funcOut_fp = SMOBinaryClassifierFP
.getFunctionOutputTestPointFP(testData_fp);
int yguess_fp = 0;
if (funcOut_fp >= 0)
yguess_fp = FP.ONE;
else
yguess_fp = -FP.ONE;
//packetData = DsvmPacket.makeLabelFP(yguess_fp);
DsvmPacket.setCommand(DsvmPacket.TESTDATAGUESS);
DsvmPacket.setLabelFP(yguess_fp);
udpJop.send();
receivedPacket = false;
System.out.println("DsvmPacket.TESTDATAGUESS sent");
waitForReply();
if (DsvmPacket.getCommand() != DsvmPacket.TESTDATAANSWER){
System.out.println("Expected test data answer! Not "+DsvmPacket.getCommand());
System.exit(-1);
}
int yanswer_fp = DsvmPacket.getLabelFP();
boolean ok;
if (yanswer_fp == yguess_fp)
ok = true;
else
ok = false;
if (info) {
int counter = 0;
System.out.println((counter++) + " testData_fp={");
for (int j = 0; j < SMOBinaryClassifierFP.n; j++) {
System.out.println("testData_fp[" + j + "]="
+ testData_fp[j]);
}
if (ok)
System.out.println("}, correct:true");
else
System.out.println("}, correct:false");
}
}
SMOBinaryClassifierFP.smoInfo();
DsvmPacket.setCommand(DsvmPacket.END);
udpJop.send();
System.out.println("Training error count="
+ SMOBinaryClassifierFP.getTrainingErrorCountFP());
}
private static void waitForReply() {
while (!receivedPacket){
RtThread.sleepMs(10);
}
}
public static void receive() {
System.out.print("R ");
System.out.println(DsvmPacket.getCommand());
if (info) {
for (int i = 0; i < DsvmPacket.length; i++) {
System.out.println("JopCliet.receive, rcv.payLoad[" + i
+ "] = " + DsvmPacket.pLoad[i]);
}
}
if (DsvmPacket.getCommand() == DsvmPacket.ALIVEREQUEST) {
System.out.println("ALIVEREQUEST");
DsvmPacket.setCommand(DsvmPacket.ALIVEREPLY);
DsvmPacket.setId(sendcnt++);
udpJop.send();
state = INITSTATE;
}
receivedPacket = true;
}
public static void gccheck() {
System.out.print("GC free words ");
//System.out.println(GC.free());
}
}