DuQuad  v1.0
Quadratic Programming Optimizations
 All Data Structures Files Functions Variables Typedefs Macros
math_functions.c
Go to the documentation of this file.
1 /*
2  * functions.c
3  *
4  * Created on: Aug 21, 2014
5  * Author: Sverre
6  */
7 
8 #include "math_functions.h"
9 
10 static void mtx_vec_mul_small(const real_t *mtx, const real_t *v, real_t *res, const uint32_t rows, const uint32_t cols)
11 {
12  uint32_t i; /* row number */
13  uint32_t j; /* column number */
14  uint32_t k = 0; /* matrix index (row * col) */
15  for (i=0;i<rows;i++) {
16  res[i] = 0.0;
17  for (j=0;j<cols;j++) {
18  res[i] += mtx[k++] * v[j];
19  }
20  }
21 }
22 
23 void mtx_vec_mul(const real_t *mtx, const real_t *v, real_t *res, const uint32_t rows, const uint32_t cols)
24 
25 {
26  if(rows < 10 || cols < 10){
27  mtx_vec_mul_small(mtx,v,res,rows,cols);
28  }
29  else{
30  uint32_t i; /* row number */
31  uint32_t j; /* column number */
32  uint32_t k;
33  real_t temp;
34  k = 0;
35  for (i=0;i<rows;i++) {
36  temp = 0.0;
37  for (j=0;j<=cols-4;j+=4) {
38  temp += (mtx[k] * v[j] +
39  mtx[k+1] * v[j+1] +
40  mtx[k+2] * v[j+2] +
41  mtx[k+3] * v[j+3] );
42  k+=4;
43  }
44  for (; j<cols; j++){
45  temp += mtx[k++] * v[j];
46  }
47  res[i] = temp;
48  }
49  }
50 }
51 
52 void mtx_transpose(const real_t * mtx, real_t * mtx_t, const uint32_t rows, const uint32_t cols)
53 {
54  uint32_t i; /* row number */
55  uint32_t j; /* column number */
56  uint32_t k = 0; /* matrix index (row * column) */
57  uint32_t kT; /* matrix transpose index */
58  for (i=0;i<rows;i++) {
59  for (j=0;j<cols;j++) {
60  kT = j * rows + i;
61  mtx_t[kT] = mtx[k];
62  k++;
63  }
64  }
65 }
66 
67 void vector_min(const real_t *v1, const real_t *v2, real_t *res, const uint32_t length)
68 {
69  uint32_t i;
70  for(i=0;i<length;i++){
71  if(v1[i] < v2[i])
72  res[i] = v1[i];
73  else
74  res[i] = v2[i];
75  }
76 }
77 
78 void vector_max(const real_t *v1, const real_t *v2, real_t *res, const uint32_t length)
79 {
80  uint32_t i;
81  for(i=0;i<length;i++){
82  if(v1[i] > v2[i])
83  res[i] = v1[i];
84  else
85  res[i] = v2[i];
86  }
87 }
88 
89 void vector_sub(const real_t *v1, const real_t *v2, real_t *res, const uint32_t length)
90 {
91  uint32_t i;
92  for(i=0;i<length;i++){
93  res[i] = v1[i] - v2[i];
94  }
95 }
96 
97 void vector_add(const real_t *v1, const real_t *v2, real_t *res, const uint32_t length)
98 {
99  uint32_t i;
100  for(i=0;i<length;i++){
101  res[i] = v1[i] + v2[i];
102  }
103 }
104 
105 real_t vector_mul(const real_t *v1,const real_t *v2, const uint32_t length)
106 {
107  uint32_t i;
108  real_t val = 0.0;
109  for(i=0;i<length;i++){
110  val += v1[i] * v2[i];
111  }
112  return val;
113 }
114 
115 void vector_scalar_mul(const real_t *v1, const real_t scalar, real_t *res, const uint32_t length)
116 {
117  uint32_t i;
118  for(i=0;i<length;i++){
119  res[i] = v1[i] * scalar;
120  }
121 }
122 
123 void vector_elements_to_zero(real_t *v, const uint32_t length)// may not be optimal
124 {
125  uint32_t i;
126  for(i=0;i<length;i++){
127  v[i] = 0.0;
128  }
129 }
130 
131 uint32_t vector_is_equal(const real_t *v1, const real_t *v2, const uint32_t length)
132 {
133  uint32_t i;
134  for(i=0;i<length;i++){
135  if (v1[i] != v2[i])
136  return FALSE;
137  }
138  return TRUE;
139 }
140 
141 void vector_copy(const real_t *v1, real_t *v2, const uint32_t length)
142 {
143  uint32_t i;
144  for(i=0;i<length;i++){
145  v2[i] = v1[i];
146  }
147 }
148 
149 void vector_max_with_zero(real_t *v, const uint32_t length)
150 {
151  uint32_t i;
152  for(i=0;i<length;i++){
153  if(v[i] < 0.0)
154  v[i] = 0.0;
155  }
156 }
157 
159 {
160 
161  uint32_t i;
162  real_t m_sum = 0.0;
163  for (i=0;i<length;i++)
164  {
165  m_sum += v[i] * v[i];
166  }
167  return sqrt(m_sum); // might overflow
168 // A safer algorithm would be:
169 // y=max(abs(x))
170 // for (uint32_t i = 1; i<=n;i++){
171 // m_sum+=(x(i)/y)^2;
172 // }
173 // return y*sqrt(m_sum);
174 
175 }
176 
178 {
179  if(a < 0.0)
180  return a * -1.0;
181  return a;
182 }
183 
184 real_t obj(const real_t *z, const real_t *H, const real_t *c, real_t *temp)
185 {
186  // Calculate: f_value = z'*H*z + c'z
187  real_t f_value = 0.0;
188  mtx_vec_mul(H,z,temp,N,N); // z' * H
189  f_value += vector_mul(temp,z,N);// * z
190  f_value *= 0.5; // * 0.5
191  f_value += vector_mul(c,z,N); // + c'z
192  return f_value;
193 }
194 
195 
196 
unsigned int uint32_t
Definition: typedefs.h:19
void vector_copy(const real_t *v1, real_t *v2, const uint32_t length)
#define TRUE
Definition: head.h:29
void mtx_transpose(const real_t *mtx, real_t *mtx_t, const uint32_t rows, const uint32_t cols)
real_t vector_mul(const real_t *v1, const real_t *v2, const uint32_t length)
void mtx_vec_mul(const real_t *mtx, const real_t *v, real_t *res, const uint32_t rows, const uint32_t cols)
real_t obj(const real_t *z, const real_t *H, const real_t *c, real_t *temp)
real_t vector_norm_2(real_t *v, const uint32_t length)
void vector_min(const real_t *v1, const real_t *v2, real_t *res, const uint32_t length)
void vector_max(const real_t *v1, const real_t *v2, real_t *res, const uint32_t length)
real_t * z
Definition: falm.h:28
struct Result * res
Definition: falm.h:25
void vector_scalar_mul(const real_t *v1, const real_t scalar, real_t *res, const uint32_t length)
float64_t real_t
Definition: typedefs.h:25
void vector_sub(const real_t *v1, const real_t *v2, real_t *res, const uint32_t length)
#define FALSE
Definition: head.h:30
void vector_elements_to_zero(real_t *v, const uint32_t length)
void vector_add(const real_t *v1, const real_t *v2, real_t *res, const uint32_t length)
real_t abs_2(const real_t a)
void vector_max_with_zero(real_t *v, const uint32_t length)
uint32_t vector_is_equal(const real_t *v1, const real_t *v2, const uint32_t length)
uint32_t N
Definition: head.h:33