/*
 * Problem3.java
 * Created on Apr 11, 2005
 */
package kernel;

import java.awt.Image;
import java.io.IOException;

import javax.vecmath.GMatrix;
import javax.vecmath.GVector;

/**
 * problem 3.
 */
public final class Problem3 {
    
    private static final String[] SUITS = {"club", "diamond", "heart", "spade"};
    private static final String[] NUMS  =
    	{"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14"};
    private static final int NUM_POINTS = SUITS.length * NUMS.length - 1;
    
    private static final int WIDTH  = 75;
    private static final int HEIGHT = 100;
    private static final int DIM = WIDTH * HEIGHT * 3;
    
    private static final double LAMBDA = 0.5;
    
    private Problem3() {}

    public static void main(String[] args) throws IOException {
        String leaveOutNum = args[0];
        String leaveOutSuit = args[1];
        System.out.println("leaving out " + leaveOutNum + " of " + leaveOutSuit + "s");
        
        GMatrix data   = new GMatrix(DIM, NUM_POINTS);
        GVector suitValues = new GVector(NUM_POINTS);
        //GVector numValues  = new GVector(NUM_POINTS);
        
        System.out.println("loading data . . . ");
        boolean leftOut = false;
        
        for(int i = 0; i < SUITS.length; i++) {
            for(int j = 0; j < NUMS.length; j++) {
                if(NUMS[j].equals(leaveOutNum) && SUITS[i].equals(leaveOutSuit)) {
                    leftOut = true;
                } else {
                    String filename = "train/" + SUITS[i] + "-" + NUMS[j] + ".gif";
	                Image image = Images.fromFile(filename);
	                GVector imageData = Images.asVector(image, WIDTH, HEIGHT);
	                int numPoint = i * NUMS.length + j;
	                if (leftOut) numPoint--;
	                data.setColumn(numPoint, imageData);
	                suitValues.setElement(numPoint, i - 1.5);
	                //numValues.setElement(numPoint, j);
                }
            }
        }
        System.out.println("data loaded");
        //System.out.println("actual suits:");
        //System.out.println(suitValues);
        
        // solve the regression
        Kernel kernel = LinearKernel.KERNEL;
        System.out.println("solving suit regression . . .");
        Representer suitRep = Regression.solve(data, suitValues, kernel, LAMBDA);
        System.out.println("suit regression solved");
        //System.out.println("suit representer coeffs: " + suitRep.coeffs());
        //GVector repSuits = Matrices.map(suitRep, data);
        //System.out.println("suit representer values: " + repSuits);
        
        // test against the left out
        String leaveOutFile = "train/" + leaveOutSuit + "-" + leaveOutNum + ".gif";
        Image leaveOutImage = Images.fromFile(leaveOutFile);
        GVector leaveOutData = Images.asVector(leaveOutImage, WIDTH, HEIGHT);
        System.out.println(suitRep.eval(leaveOutData));
        int guessSuit = (int)Math.round(suitRep.eval(leaveOutData) + 1.5);
        System.out.println("is this your suit? " + SUITS[guessSuit]);
    }
    
}
