package clear.model; import clear.train.kernel.PolynomialKernel; import clear.util.tuple.JIntDoubleTuple; import com.carrotsearch.hppc.IntArrayList; import java.io.BufferedReader; import java.io.IOException; import java.io.PrintStream; import java.util.ArrayList; public class SupportVectorModel { public int n_sv; public boolean b_binary; public double[] d_alpha; public int[][] i_sv; public double[][] d_sv; public SupportVectorModel() { } public SupportVectorModel(double[] alpha, int[][] iSVs, double[][] dSVs) { n_sv = alpha.length; b_binary = dSVs == null; d_alpha = alpha; i_sv = iSVs; d_sv = dSVs; } public void load(BufferedReader fin) throws Exception { n_sv = Integer.parseInt(fin.readLine()); b_binary = Boolean.parseBoolean(fin.readLine()); loadAlphas(fin); loadSupportVectors(fin); } private void loadAlphas(BufferedReader fin) throws IOException { String[] tmp = fin.readLine().split(" "); d_alpha = new double[n_sv]; for (int i = 0; i < n_sv; i++) { d_alpha[i] = Double.parseDouble(tmp[i]); } } private void loadSupportVectors(BufferedReader fin) throws IOException { int gap = b_binary ? 1 : 2, i, j, k, length; String[] tmp; i_sv = new int[n_sv][]; if (!b_binary) { d_sv = new double[n_sv][]; } for (i = 0; i < n_sv; i++) { tmp = fin.readLine().split(" "); length = tmp.length / gap; int[] xi = new int[length]; for (j = 0; j < length; j++) { xi[j] = Integer.parseInt(tmp[j]); } i_sv[i] = xi; if (!b_binary) { double[] vi = new double[length]; for (j = 0, k = length; j < length; j++, k++) { vi[j] = Double.parseDouble(tmp[k]); } d_sv[i] = vi; } } } public void print(PrintStream fout) { fout.println(n_sv); fout.println(b_binary); printAlphas(fout); printSupportVectors(fout); } private void printAlphas(PrintStream fout) { StringBuilder build = new StringBuilder(); for (int i = 0; i < d_alpha.length; i++) { build.append(d_alpha[i]); build.append(" "); } fout.println(build.toString()); } private void printSupportVectors(PrintStream fout) { StringBuilder build = new StringBuilder(); int i, j; int[] xi; double[] vi; for (i = 0; i < n_sv; i++) { xi = i_sv[i]; for (j = 0; j < xi.length; j++) { build.append(xi[j]); build.append(" "); } if (!b_binary) { vi = d_sv[i]; for (j = 0; j < vi.length; j++) { build.append(vi[j]); build.append(" "); } } build.append("\n"); } fout.print(build.toString()); } public double getScore(int[] x, double gamma, double coef, int degree) { double score = 0, scala; int i; for (i = 0; i < n_sv; i++) { scala = PolynomialKernel.getScala(x, i_sv[i]); score += d_alpha[i] * PolynomialKernel.getPolyValue(scala, gamma, coef, degree); } return score; } public double getScore(IntArrayList x, double gamma, double coef, int degree) { double score = 0, scala; int i; for (i = 0; i < n_sv; i++) { scala = PolynomialKernel.getScala(x, i_sv[i]); score += d_alpha[i] * PolynomialKernel.getPolyValue(scala, gamma, coef, degree); } return score; } public double getScore(ArrayList<JIntDoubleTuple> x, double gamma, double coef, int degree) { double score = 0, scala; int i; for (i = 0; i < n_sv; i++) { scala = PolynomialKernel.getScala(x, i_sv[i], d_sv[i]); score += d_alpha[i] * PolynomialKernel.getPolyValue(scala, gamma, coef, degree); } return score; } }