1 package liblinear;
2
3 class L2R_LrFunction implements Function {
4
5 private final double[] C;
6 private final double[] z;
7 private final double[] D;
8 private final Problem prob;
9
10 public L2R_LrFunction( Problem prob, double Cp, double Cn ) {
11 int i;
12 int l = prob.l;
13 int[] y = prob.y;
14
15 this.prob = prob;
16
17 z = new double[l];
18 D = new double[l];
19 C = new double[l];
20
21 for (i = 0; i < l; i++) {
22 if (y[i] == 1)
23 C[i] = Cp;
24 else
25 C[i] = Cn;
26 }
27 }
28
29
30 private void Xv(double[] v, double[] Xv) {
31
32 for (int i = 0; i < prob.l; i++) {
33 Xv[i] = 0;
34 for (FeatureNode s : prob.x[i]) {
35 Xv[i] += v[s.index - 1] * s.value;
36 }
37 }
38 }
39
40 private void XTv(double[] v, double[] XTv) {
41 int l = prob.l;
42 int w_size = get_nr_variable();
43 FeatureNode[][] x = prob.x;
44
45 for (int i = 0; i < w_size; i++)
46 XTv[i] = 0;
47
48 for (int i = 0; i < l; i++) {
49 for (FeatureNode s : x[i]) {
50 XTv[s.index - 1] += v[i] * s.value;
51 }
52 }
53 }
54
55
56 public double fun(double[] w) {
57 int i;
58 double f = 0;
59 int[] y = prob.y;
60 int l = prob.l;
61 int w_size = get_nr_variable();
62
63 Xv(w, z);
64 for (i = 0; i < l; i++) {
65 double yz = y[i] * z[i];
66 if (yz >= 0)
67 f += C[i] * Math.log(1 + Math.exp(-yz));
68 else
69 f += C[i] * (-yz + Math.log(1 + Math.exp(yz)));
70 }
71 f = 2.0 * f;
72 for (i = 0; i < w_size; i++)
73 f += w[i] * w[i];
74 f /= 2.0;
75
76 return (f);
77 }
78
79 public void grad(double[] w, double[] g) {
80 int i;
81 int[] y = prob.y;
82 int l = prob.l;
83 int w_size = get_nr_variable();
84
85 for (i = 0; i < l; i++) {
86 z[i] = 1 / (1 + Math.exp(-y[i] * z[i]));
87 D[i] = z[i] * (1 - z[i]);
88 z[i] = C[i] * (z[i] - 1) * y[i];
89 }
90 XTv(z, g);
91
92 for (i = 0; i < w_size; i++)
93 g[i] = w[i] + g[i];
94 }
95
96 public void Hv(double[] s, double[] Hs) {
97 int i;
98 int l = prob.l;
99 int w_size = get_nr_variable();
100 double[] wa = new double[l];
101
102 Xv(s, wa);
103 for (i = 0; i < l; i++)
104 wa[i] = C[i] * D[i] * wa[i];
105
106 XTv(wa, Hs);
107 for (i = 0; i < w_size; i++)
108 Hs[i] = s[i] + Hs[i];
109
110 }
111
112 public int get_nr_variable() {
113 return prob.n;
114 }
115
116 }