2 #include "base_utility.h"
3 #include "lapack_connector.h"
16 using real_t =
typename to_real<T>::type;
17 using cplx_t =
typename to_cplx<T>::type;
22 constexpr
static const double EQUAL_THRES = DOUBLE_EQUAL_THRES;
24 vec(): n(0), c(
nullptr) { zero_out(); }
25 vec(
const int &n_in): n(n_in), c(
nullptr) {
if (n_in > 0) c =
new T [n]; zero_out(); }
26 vec(
const int &n_in,
const T *
const valarr): n(n_in), c(
nullptr)
34 for (
int i = 0; i < size(); i++)
37 vec(
const std::vector<T> &v): n(v.size()), c(
nullptr)
43 for (
int i = 0; i < size(); i++)
51 memcpy(c, v.c, n*
sizeof(T));
60 ~
vec() { n = 0;
if (c) {
delete [] c; c =
nullptr;}}
62 int size()
const {
return n; }
64 void zero_out() {
for (
int i = 0; i < size(); i++) c[i] = 0; }
68 if (!this->is_complex)
return;
69 for (
int i = 0; i < this->size(); i++)
70 this->c[i] = get_conj(this->c[i]);
72 T &operator[](
const int i) {
return c[i]; }
73 const T &operator[](
const int i)
const {
return c[i]; }
77 if (
this == &v)
return *
this;
79 memcpy(c, v.c, n*
sizeof(T));
85 if (
this == &v)
return *
this;
96 for (
int i = 0; i < this->size(); i++)
97 newv[i] = -this->c[i];
101 bool operator<(
const vec<T> &v)
const
103 return norm2(*
this) < norm2(v);
106 bool operator>(
const vec<T> &v)
const
108 return norm2(*
this) > norm2(v);
111 void resize(
const int &n_new)
113 const int size_new = n_new;
118 if ( size_new != size() )
136 bool operator==(
const vec<T> &v)
const
141 void operator+=(
const T &cnum)
143 for (
int i = 0; i < size(); i++)
147 void operator+=(
const vec<T> &v)
150 for (
int i = 0; i < size(); i++)
154 void operator-=(
const T &cnum)
156 for (
int i = 0; i < size(); i++)
160 void operator-=(
const vec<T> &v)
163 for (
int i = 0; i < size(); i++)
167 void operator*=(
const T &cnum)
169 for (
int i = 0; i < size(); i++)
173 void operator/=(
const T &cnum)
175 assert(fabs(cnum) > 0);
176 for (
int i = 0; i < size(); i++)
181 template <
typename T>
189 template <
typename T>
197 template <
typename T>
203 template <
typename T>
206 assert(v1.n == v2.n);
212 template <
typename T>
215 assert(v1.n == v2.n);
221 template <
typename T>
229 template <
typename T>
235 template <
typename T>
236 std::ostream & operator<<(std::ostream & os,
const vec<T> &v)
238 for (
int i = 0; i < v.n - 1; i++)
245 template <
typename T>
254 template <
typename T>
260 template <typename T, typename TR = typename to_real<T>::type>
263 return norm(v.c, v.n, 2);
266 template <
typename T>
267 bool vec_equal(
const vec<T> &v1,
const vec<T> &v2,
double thres)
270 if (v1.size() == 0 || v2.size() == 0)
272 int size = std::min(v1.size(), v2.size());
273 for (
int i = 0; i < size; i++)
274 if (fabs(v1.c[i] - v2.c[i]) > thres)
return false;
278 template <
typename T>
281 assert(v1.size() == v2.size());
282 return LapackConnector::dot(v1.size(), v1.c, 1, v2.c, 1);
285 template <
typename T>
286 std::string str(
const vec<T> &v)
289 if (v.size() > 0) s = std::to_string(v[0]);
290 for (
int i = 1; i < v.size(); i++)
291 s = s +
" " + std::to_string(v[i]);
295 template <
typename T>
296 std::string str(
const vec<std::complex<T>> &v)
299 if (v.size() > 0) s =
"(" + std::to_string(v[0].real()) +
"," + std::to_string(v[0].imag()) +
")";
300 for (
int i = 1; i < v.size(); i++)
301 s = s +
" (" + std::to_string(v[0].real()) +
"," + std::to_string(v[0].imag()) +
")";
Definition: base_utility.h:11