import sys, os

SVMLIGHTDIR = "./svm_light"
SVMLEARN = os.path.join(SVMLIGHTDIR, "svm_learn")
SVMCLASSIFY = os.path.join(SVMLIGHTDIR, "svm_classify")
MODELFILE = "./tmp/model"
PREDFILE = "./tmp/pred"


KERNELS = [("linear", "-t 0"),
           ("poly (2)", "-t 1 -d 2"),
           ("poly (3)", "-t 1 -d 3"),
           ("poly (10)", "-t 1 -d 10"),
           ("RB ($\sigma = 1/2$)", "-t 2 -g 2"),
           ("RB ($\sigma = 1/10$)", "-t 2 -g 10"),
           ("RB ($\sigma = 1/50$)", "-t 2 -g 50")]
CVALS = [0.1, 1, 20]

def runClassify(trainfile, testfile, kernel, cval):
    cmd = "%s %s -c %f %s %s" % (SVMLEARN, kernel[1],
                                 cval, trainfile, MODELFILE)
#    print cmd
    p = os.popen(cmd)
    for l in p.readlines():
        if l.startswith("Optimization finished"):
            t = l.split(" ")
            misclassified = int(t[2][1:])
#            print misclassified, "Misclassified"
        elif l.startswith("Number of SV"):
            t = l.split(" ")
            svs = int(t[3])
#            print svs, "SVs"
    p.close()

    cmd = "%s %s %s %s" % (SVMCLASSIFY, testfile, MODELFILE, PREDFILE)
    p = os.popen(cmd)
    for l in p.readlines():
        if l.startswith("Accuracy on test set"):
            t = l.split(" ")
            accuracy = t[4]

    return (svs, misclassified, accuracy)

def runTests(trainfile, testfile):
    for k in KERNELS:
        for c in CVALS:
            svs, misclassified, accuracy = runClassify(trainfile, testfile,
                                                       k, c)
            print k[0], "&", c, "&", svs, "&", misclassified, "&", \
                  accuracy, r"\\"

runTests("ex2/circdata.txt", "ex2/circtest.txt")
