diff options
Diffstat (limited to 'SD-VBS/benchmarks/svm/src/c/takeStep.c')
-rw-r--r-- | SD-VBS/benchmarks/svm/src/c/takeStep.c | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/SD-VBS/benchmarks/svm/src/c/takeStep.c b/SD-VBS/benchmarks/svm/src/c/takeStep.c new file mode 100644 index 0000000..ae550c2 --- /dev/null +++ b/SD-VBS/benchmarks/svm/src/c/takeStep.c | |||
@@ -0,0 +1,188 @@ | |||
1 | /******************************** | ||
2 | Author: Sravanthi Kota Venkata | ||
3 | ********************************/ | ||
4 | |||
5 | #include "svm.h" | ||
6 | |||
7 | int takeStep(int i, int j, F2D* a, float C, F2D* e, F2D* Y, F2D* X, float eps, float* b, int N, int dim) | ||
8 | { | ||
9 | int ret=1; | ||
10 | float s; | ||
11 | int m, n, k; | ||
12 | float Ei, Ej, gamma, L, H; | ||
13 | F2D *a_old; | ||
14 | float k11, k12, k22, eta; | ||
15 | F2D *temp, *temp1, *temp2; | ||
16 | float t, t1, t2; | ||
17 | float bnew, delta_b; | ||
18 | float c1, c2, Lobj, Hobj; | ||
19 | |||
20 | if(i==j) | ||
21 | return 0; | ||
22 | |||
23 | a_old = fDeepCopy(a); | ||
24 | |||
25 | if( asubsref(a_old,i)>0 && asubsref(a_old,i)<C ) | ||
26 | Ei = asubsref(e,i); | ||
27 | else | ||
28 | Ei = cal_learned_func(i, a, b, N, Y, X, dim) - asubsref(Y,i); | ||
29 | |||
30 | if( asubsref(a_old,j)>0 && asubsref(a_old,j)<C ) | ||
31 | Ej = asubsref(e,j); | ||
32 | else | ||
33 | Ej = cal_learned_func(j, a, b, N, Y, X, dim) - asubsref(Y,j); | ||
34 | |||
35 | s = asubsref(Y,i) * asubsref(Y,j); | ||
36 | |||
37 | if( asubsref(Y,i) == asubsref(Y,j) ) | ||
38 | { | ||
39 | gamma = asubsref(a_old,i) + asubsref(a_old,j); | ||
40 | if(gamma > C) | ||
41 | { | ||
42 | L = gamma - C; | ||
43 | H = C; | ||
44 | } | ||
45 | else | ||
46 | { | ||
47 | L = 0; | ||
48 | H = gamma; | ||
49 | } | ||
50 | } | ||
51 | else | ||
52 | { | ||
53 | gamma = asubsref(a_old,i) - asubsref(a_old,j); | ||
54 | if(gamma > 0) | ||
55 | { | ||
56 | L = 0; | ||
57 | H = C - gamma; | ||
58 | } | ||
59 | else | ||
60 | { | ||
61 | L = -gamma; | ||
62 | H = C; | ||
63 | } | ||
64 | } | ||
65 | |||
66 | |||
67 | if(L==H) | ||
68 | { | ||
69 | fFreeHandle(a_old); | ||
70 | return 0; | ||
71 | } | ||
72 | |||
73 | temp = fMallocHandle(1, X->width); | ||
74 | temp1 = fMallocHandle(1, X->width); | ||
75 | |||
76 | for(m=0; m<X->width; m++) | ||
77 | { | ||
78 | asubsref(temp,m) = subsref(X,i,m); | ||
79 | asubsref(temp1,m) = subsref(X,j,m); | ||
80 | } | ||
81 | |||
82 | k11 = polynomial(3, temp, temp, dim); | ||
83 | k12 = polynomial(3, temp, temp1, dim); | ||
84 | k22 = polynomial(3, temp1, temp1, dim); | ||
85 | eta = 2 * k12 - k11 - k22; | ||
86 | |||
87 | fFreeHandle(temp1); | ||
88 | fFreeHandle(temp); | ||
89 | |||
90 | if(eta<0) | ||
91 | { | ||
92 | asubsref(a,j) = asubsref(a_old,j) + asubsref(Y,j) * (Ej-Ei)/eta; | ||
93 | if( asubsref(a,j) < L) | ||
94 | asubsref(a,j) = L; | ||
95 | else if( asubsref(a,j) > H ) | ||
96 | asubsref(a,j) = H; | ||
97 | } | ||
98 | else | ||
99 | { | ||
100 | c1 = eta/2; | ||
101 | c2 = asubsref(Y,j) * (Ei-Ej) - eta * asubsref(a_old,j); | ||
102 | Lobj = c1 * L * L + c2 * L; | ||
103 | Hobj = c1 * H * H + c2 * H; | ||
104 | |||
105 | if (Lobj > (Hobj+eps)) | ||
106 | asubsref(a,j) = L; | ||
107 | else if (Lobj < (Hobj-eps)) | ||
108 | asubsref(a,j) = H; | ||
109 | else | ||
110 | asubsref(a,j) = asubsref(a_old,j); | ||
111 | } | ||
112 | |||
113 | if( fabsf( asubsref(a,j)- asubsref(a_old,j) ) < (eps* (asubsref(a,j) + asubsref(a_old,j) +eps)) ) | ||
114 | { | ||
115 | fFreeHandle(a_old); | ||
116 | return 0; | ||
117 | } | ||
118 | |||
119 | asubsref(a,i) = asubsref(a_old,i) - s * ( asubsref(a,j) - asubsref(a_old,j) ); | ||
120 | |||
121 | if( asubsref(a,i) < 0) | ||
122 | { | ||
123 | asubsref(a,j) = asubsref(a,j) + s * asubsref(a,i); | ||
124 | asubsref(a,i) = 0; | ||
125 | } | ||
126 | else if (asubsref(a,i) > C) | ||
127 | { | ||
128 | t = asubsref(a,i) - C; | ||
129 | asubsref(a,j) = asubsref(a,j) + s * t; | ||
130 | asubsref(a,i) = C; | ||
131 | } | ||
132 | |||
133 | /** Update threshold to react change in Lagrange multipliers **/ | ||
134 | |||
135 | if( asubsref(a,i) > 0 && asubsref(a,i) < C ) | ||
136 | bnew = arrayref(b,0) + Ei + asubsref(Y,i) * (asubsref(a,i) - asubsref(a_old,i)) * k11 + asubsref(Y,j) * (asubsref(a,j) - asubsref(a_old,j)) * k12; | ||
137 | else | ||
138 | { | ||
139 | if( asubsref(a,j) > 0 && asubsref(a,j) < C ) | ||
140 | bnew = arrayref(b,0) + Ej + asubsref(Y,i) * (asubsref(a,i) - asubsref(a_old,i)) * k12 + asubsref(Y,j) * (asubsref(a,j) - asubsref(a_old,j)) * k22; | ||
141 | else | ||
142 | { | ||
143 | float b1, b2; | ||
144 | b1 = arrayref(b,0) + Ei + asubsref(Y,i) * (asubsref(a,i) - asubsref(a_old,i)) * k11 + asubsref(Y,j) * (asubsref(a,j) - asubsref(a_old,j)) * k12; | ||
145 | b2 = arrayref(b,0) + Ej + asubsref(Y,i) * (asubsref(a,i) - asubsref(a_old,i)) * k12 + asubsref(Y,j) * (asubsref(a,j) - asubsref(a_old,j)) * k22; | ||
146 | bnew = (b1 + b2) / 2; | ||
147 | } | ||
148 | } | ||
149 | delta_b = bnew - arrayref(b,0); | ||
150 | arrayref(b,0) = bnew; | ||
151 | |||
152 | /** Update error cache using new Lagrange multipliers 24ai **/ | ||
153 | |||
154 | t1 = asubsref(Y,i) * (asubsref(a,i)-asubsref(a_old,i)); | ||
155 | t2 = asubsref(Y,j) * (asubsref(a,j)-asubsref(a_old,j)); | ||
156 | |||
157 | temp = fMallocHandle(1, X->width); | ||
158 | temp1 = fMallocHandle(1, X->width); | ||
159 | temp2 = fMallocHandle(1, X->width); | ||
160 | |||
161 | for (k=0; k<N; k++) | ||
162 | { | ||
163 | if (0 < asubsref(a_old,i) && asubsref(a_old,i) < C ) | ||
164 | { | ||
165 | |||
166 | for(m=0; m<X->width; m++) | ||
167 | { | ||
168 | asubsref(temp,m) = subsref(X,i,m); | ||
169 | asubsref(temp1,m) = subsref(X,k,m); | ||
170 | asubsref(temp2,m) = subsref(X,j,m); | ||
171 | } | ||
172 | |||
173 | asubsref(e,k) = asubsref(e,k)+t1 * polynomial(3, temp, temp1, dim) + t2 * polynomial(3, temp2, temp1, dim) - delta_b; | ||
174 | asubsref(e,i) = 0; | ||
175 | asubsref(e,j) = 0; | ||
176 | } | ||
177 | } | ||
178 | |||
179 | fFreeHandle(a_old); | ||
180 | fFreeHandle(temp); | ||
181 | fFreeHandle(temp1); | ||
182 | fFreeHandle(temp2); | ||
183 | ret = 1; | ||
184 | return ret; | ||
185 | } | ||
186 | |||
187 | |||
188 | |||