summaryrefslogtreecommitdiffstats
path: root/SD-VBS/benchmarks/svm/src/c/takeStep.c
diff options
context:
space:
mode:
authorLeo Chan <leochanj@live.unc.edu>2020-10-22 01:53:21 -0400
committerJoshua Bakita <jbakita@cs.unc.edu>2020-10-22 01:56:35 -0400
commitd17b33131c14864bd1eae275f49a3f148e21cf29 (patch)
tree0d8f77922e8d193cb0f6edab83018f057aad64a0 /SD-VBS/benchmarks/svm/src/c/takeStep.c
parent601ed25a4c5b66cb75315832c15613a727db2c26 (diff)
Squashed commit of the sb-vbs branch.
Includes the SD-VBS benchmarks modified to: - Use libextra to loop as realtime jobs - Preallocate memory before starting their main computation - Accept input via stdin instead of via argc Does not include the SD-VBS matlab code. Fixes libextra execution in LITMUS^RT.
Diffstat (limited to 'SD-VBS/benchmarks/svm/src/c/takeStep.c')
-rw-r--r--SD-VBS/benchmarks/svm/src/c/takeStep.c188
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/********************************
2Author: Sravanthi Kota Venkata
3********************************/
4
5#include "svm.h"
6
7int 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