v2DM-DOCI  1.0
Vector.cpp
Go to the documentation of this file.
1 /*
2  * @BEGIN LICENSE
3  *
4  * Copyright (C) 2014-2015 Ward Poelmans
5  *
6  * This file is part of v2DM-DOCI.
7  *
8  * v2DM-DOCI is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * Foobar is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
20  *
21  * @END LICENSE
22  */
23 
24 #include <iostream>
25 #include <fstream>
26 #include <algorithm>
27 #include <time.h>
28 #include <cmath>
29 #include <cstring>
30 #include <assert.h>
31 
32 using std::endl;
33 using std::ostream;
34 using std::ofstream;
35 using std::ifstream;
36 
37 #include "Vector.h"
38 #include "lapack.h"
39 
40 using namespace doci2DM;
41 
47 {
48  this->n = n;
49 
50  vector.reset(new double[n]);
51 }
52 
57 {
58  //allocate
59  this->n = matrix.gn();
60 
61  vector.reset(new double[n]);
62 
63  diagonalize(matrix);
64 }
65 
70 Vector::Vector(const Vector &vec_copy)
71 {
72  this->n = vec_copy.n;
73 
74  vector.reset(new double[n]);
75 
76  std::memcpy(vector.get(), vec_copy.vector.get(), n*sizeof(double));
77 }
78 
80 {
81  this->n = vec_copy.n;
82 
83  vector = std::move(vec_copy.vector);
84 }
85 
86 
91 {
92 }
93 
98 Vector &Vector::operator=(const Vector &vec_copy)
99 {
100  assert(vec_copy.n == n);
101  std::memcpy(vector.get(), vec_copy.vector.get(), n*sizeof(double));
102 
103  return *this;
104 }
105 
107 {
108  assert(vec_copy.n == n);
109 
110  vector = std::move(vec_copy.vector);
111 
112  return *this;
113 }
114 
120 {
121  for(int i = 0;i < n;++i)
122  vector[i] = a;
123 
124  return *this;
125 }
126 
131 Vector &Vector::operator+=(const Vector &vector_pl)
132 {
133  daxpy(1,vector_pl);
134 
135  return *this;
136 }
137 
142 Vector &Vector::operator-=(const Vector &vector_pl)
143 {
144  daxpy(-1,vector_pl);
145 
146  return *this;
147 }
148 
154 Vector &Vector::daxpy(double alpha,const Vector &vector_pl)
155 {
156  int inc = 1;
157 
158  daxpy_(&n,&alpha,vector_pl.vector.get(),&inc,vector.get(),&inc);
159 
160  return *this;
161 }
162 
168 {
169  dscal(1.0/c);
170 
171  return *this;
172 }
173 
179 {
180  dscal(c);
181 
182  return *this;
183 }
184 
190 double &Vector::operator[](int i)
191 {
192  assert(i<n);
193 
194  return vector[i];
195 }
196 
202 double Vector::operator[](int i) const
203 {
204  assert(i<n);
205 
206  return vector[i];
207 }
208 
214 {
215  *this = matrix.diagonalize();
216 }
217 
222 {
223  return vector.get();
224 }
225 
229 const double *Vector::gVector() const
230 {
231  return vector.get();
232 }
233 
237 int Vector::gn() const
238 {
239  return n;
240 }
241 
245 double Vector::sum() const
246 {
247  double ward = 0;
248 
249  for(int i = 0;i < n;++i)
250  ward += vector[i];
251 
252  return ward;
253 }
254 
255 double Vector::trace() const
256 {
257  return sum();
258 }
259 
263 double Vector::log_product() const
264 {
265  double ward = 0;
266 
267  for(int i = 0;i < n;++i)
268  ward += log(vector[i]);
269 
270  return ward;
271 }
272 
277 double Vector::ddot(const Vector &vector_i) const
278 {
279  int inc = 1;
280 
281  return ddot_(&n,vector.get(),&inc,vector_i.vector.get(),&inc);
282 }
283 
288 void Vector::dscal(double alpha)
289 {
290  int inc = 1;
291 
292  dscal_(&n,&alpha,vector.get(),&inc);
293 }
294 
299 {
300  fill_Random(time(NULL));
301 }
302 
307 void Vector::fill_Random(int seed)
308 {
309  srand(seed);
310 
311  for(int i = 0;i < n;++i)
312  vector[i] = (double) rand()/RAND_MAX;
313 }
314 
315 namespace doci2DM
316 {
317  std::ostream &operator<<(std::ostream &output,const doci2DM::Vector &vector_p)
318  {
319  for(int i = 0;i < vector_p.gn();++i)
320  output << i << "\t" << vector_p[i] << endl;
321 
322  return output;
323  }
324 }
325 
330 double Vector::min() const
331 {
332  double min = vector[0];
333 
334  for(int i=1;i<n;i++)
335  if(vector[i]<min)
336  min = vector[i];
337 
338  return min;
339 }
340 
345 double Vector::max() const
346 {
347  double max = vector[n-1];
348 
349  for(int i=n-2;i>=0;i--)
350  if(vector[i]>max)
351  max = vector[i];
352 
353  return max;
354 }
355 
357 {
358  for(int i = 0;i < n;++i)
359  vector[i] = 1.0/vector[i];
360 }
361 
362 void Vector::sqrt(int option)
363 {
364  if(option == 1)
365  for(int i = 0;i < n;++i)
366  vector[i] = std::sqrt(vector[i]);
367  else
368  for(int i = 0;i < n;++i)
369  vector[i] = 1.0/std::sqrt(vector[i]);
370 }
371 
373 {
374 }
375 
376 void Vector::L_map(const Vector &a,const Vector &b)
377 {
378  assert(a.n == n && b.n == n);
379 
380  for(int i = 0;i < n;++i)
381  vector[i] = a[i] * b[i] * a[i];
382 }
383 
384 Vector &Vector::mprod(const Vector &x,const Vector &y)
385 {
386  assert(x.n == n && y.n == n);
387 
388  for(int i = 0;i < n;++i)
389  vector[i] = x[i] * y[i];
390 
391  return *this;
392 }
393 
398 {
399  std::sort(vector.get(), &vector.get()[n] );
400 }
401 
402 void Vector::sep_pm(Vector &pos, Vector &neg)
403 {
404  assert(pos.n == n && neg.n == n);
405  pos = 0;
406  neg = 0;
407 
408  for(int i=0;i<n;i++)
409  if(vector[i] < 0)
410  neg[i] = vector[i];
411  else
412  pos[i] = vector[i];
413 }
414 
415 /* vim: set ts=3 sw=3 expandtab :*/
virtual ~Vector()
Definition: Vector.cpp:90
double ddot_(int *n, double *x, int *incx, double *y, int *incy)
double & operator[](int i)
Definition: Vector.cpp:190
Vector & operator+=(const Vector &)
Definition: Vector.cpp:131
Vector & daxpy(double alpha, const Vector &)
Definition: Vector.cpp:154
std::unique_ptr< double[]> vector
pointer of doubles, contains the numbers, the vector
Definition: Vector.h:142
int gn() const
Definition: Vector.cpp:237
void invert()
Definition: Vector.cpp:356
Vector & operator-=(const Vector &)
Definition: Vector.cpp:142
void sqrt(int)
Definition: Vector.cpp:362
Vector & operator/=(double)
Definition: Vector.cpp:167
int n
dimension of the vector
Definition: Vector.h:145
std::ostream & operator<<(std::ostream &output, const doci2DM::BlockStructure< MyBlockType > &blocks_p)
double min() const
Definition: Vector.cpp:330
double ddot(const Vector &) const
Definition: Vector.cpp:277
void symmetrize()
Definition: Vector.cpp:372
double log_product() const
Definition: Vector.cpp:263
void L_map(const Vector &, const Vector &)
Definition: Vector.cpp:376
double * gVector()
Definition: Vector.cpp:221
Vector & operator=(const Vector &)
Definition: Vector.cpp:98
void dscal(double alpha)
Definition: Vector.cpp:288
void daxpy_(int *n, double *alpha, double *x, int *incx, double *y, int *incy)
Vector & operator*=(double)
Definition: Vector.cpp:178
Vector diagonalize()
Definition: Matrix.cpp:259
void sep_pm(Vector &, Vector &)
Definition: Vector.cpp:402
int gn() const
Definition: Matrix.cpp:236
Vector & mprod(const Vector &, const Vector &)
Definition: Vector.cpp:384
double trace() const
Definition: Vector.cpp:255
double sum() const
Definition: Vector.cpp:245
double max() const
Definition: Vector.cpp:345
void diagonalize(Matrix &)
Definition: Vector.cpp:213
void dscal_(int *n, double *alpha, double *x, int *incx)
void fill_Random()
Definition: Vector.cpp:298