29 static int num_allocated;
31 static double memory_in_use;
32 static double memory_returned;
33 static bool write_enabled;
34 static void memory(
const std::string& prefix=
"");
35 static void stats(
const std::string& prefix=
"");
59 Vector(
const int size, T* data)
61 reference_data_ =
true;
66 Vector(std::initializer_list<T> values)
68 if (values.size() == 0) {
72 allocate(values.size());
73 std::copy(values.begin(), values.end(), data_);
80 if (data_ !=
nullptr) {
81 if (!reference_data_) {
84 memory_in_use -=
sizeof(T)*size_;
85 memory_returned +=
sizeof(T)*size_;
100 for (
int i = 0; i < rhs.size_; i++) {
101 data_[i] = rhs.data_[i];
107 bool allocated()
const
109 return is_allocated_ ;
118 if (data_ !=
nullptr) {
119 if (reference_data_) {
120 throw std::runtime_error(
"[Vector] Can't clear a Vector with reference data.");
123 memory_in_use -=
sizeof(T) * size_;;
124 memory_returned +=
sizeof(T) * size_;;
127 is_allocated_ =
false;
132 void print(
const std::string& label)
134 printf(
"%s (%d): \n", label.c_str(), size_);
135 for (
int i = 0; i < size_; i++) {
136 printf(
"%s %d %g\n", label.c_str(), i+1, data_[i]);
148 if (data_ !=
nullptr) {
149 if (reference_data_) {
150 throw std::runtime_error(
"[Vector] Can't resize a Vector with reference data.");
153 memory_in_use -=
sizeof(T) * size_;;
154 memory_returned +=
sizeof(T) * size_;;
163 void grow(
const int size, T value={})
169 memory_in_use +=
sizeof(T) * size;;
170 int new_size = size_ + size;
171 T* new_data =
new T [new_size];
172 for (
int i = 0; i < size; i++) {
173 new_data[i+size_] = value;
175 memcpy(new_data, data_,
sizeof(T)*size_);
176 if (reference_data_) {
177 throw std::runtime_error(
"[Vector] Can't grow a Vector with reference data.");
184 void set_values(std::initializer_list<T> values)
186 if (values.size() == 0) {
190 allocate(values.size());
191 std::copy(values.begin(), values.end(), data_);
194 void set_values(std::vector<T> values)
196 if (values.size() == 0) {
200 allocate(values.size());
201 std::copy(values.begin(), values.end(), data_);
204 void read(
const std::string& file_name)
206 auto fp = fopen(file_name.c_str(),
"rb");
208 fread(&size,
sizeof(
int), 1, fp);
209 fread(data_,
sizeof(T), size_, fp);
213 void write(
const std::string& label,
const T offset={})
const
215 if (!write_enabled) {
219 auto file_prefix = build_file_prefix(label);
220 auto file_name = file_prefix +
"_cm.bin";
224 auto fp = fopen(file_name.c_str(),
"wb");
225 fwrite(&size_,
sizeof(
int), 1, fp);
226 fwrite(data_,
sizeof(T), size_, fp);
246 if (rhs.size_ <= 0) {
254 if (size_ != rhs.size_) {
259 memcpy(data_, rhs.data_,
sizeof(T) * size_);
266 for (
int i = 0; i < size_; i++) {
278 return size_ *
sizeof(T);
283 const T& operator()(
const int i)
const
285 #ifdef Vector_check_enabled
291 T& operator()(
const int i)
293 #ifdef Vector_check_enabled
299 const T& operator[](
const int i)
const
301 #ifdef Vector_check_enabled
307 T& operator[](
const int i)
309 #ifdef Vector_check_enabled
315 friend std::ostream& operator << (std::ostream& out,
const Vector<T>& lhs)
317 for (
int i = 0; i < lhs.size(); i++) {
319 if (i != lhs.size()-1) {
334 if (size_ != vec.size()) {
335 throw std::runtime_error(
336 "[Vector dot product] Vectors have different sizes: " +
337 std::to_string(size_) +
" != " + std::to_string(vec.size()) +
".");
340 for (
int i = 0; i < size_; i++) {
341 result(i) = data_[i] + vec[i];
352 if (size_ != vec.size()) {
353 svmp::raise<svmp::FE::InvalidArgumentException>(
354 "Vectors have diffrenct sizes: " + std::to_string(size_) +
355 " != " + std::to_string(vec.size()));
358 for (
int i = 0; i < size_; i++) {
359 data_[i] += c * vec[i];
368 for (
int i = 0; i < size_; i++) {
369 result(i) = data_[i] - x(i);
379 for (
int i = 0; i < size_; i++) {
380 result(i) = data_[i] + value;
388 for (
int i = 0; i < rhs.size_; i++) {
389 result(i) = rhs.data_[i] + value;
397 for (
int i = 0; i < size_; i++) {
398 result(i) = data_[i] - value;
406 for (
int i = 0; i < rhs.size_; i++) {
407 result(i) = value - rhs.data_[i];
417 for (
int i = 0; i < size_; i++) {
418 result(i) = data_[i] / value;
426 for (
int i = 0; i < rhs.size_; i++) {
427 result(i) = rhs.data_[i] / value;
437 for (
int i = 0; i < size_; i++) {
438 result(i) = value * data_[i];
446 for (
int i = 0; i < rhs.size_; i++) {
447 result(i) = value * rhs.data_[i];
457 for (
int i = 0; i < size_; i++) {
458 result(i) = -data_[i];
467 for (
int i = 0; i < size_; i++) {
468 result(i) = std::abs(data_[i]);
478 result(0) = (*this)(1)*v2(2) - (*this)(2)*v2(1);
479 result(1) = (*this)(2)*v2(0) - (*this)(0)*v2(2);
480 result(2) = (*this)(0)*v2(1) - (*this)(1)*v2(0);
488 if (size_ != v2.size()) {
489 throw std::runtime_error(
"[Vector dot product] Vectors have diffrenct sizes: " +
490 std::to_string(size_) +
" != " + std::to_string(v2.size()) +
".");
493 for (
int i = 0; i < size_; i++) {
494 sum += (*this)(i) * v2(i);
501 if (v1.size() != v2.size()) {
502 throw std::runtime_error(
"[Vector dot product] Vectors have diffrenct sizes: " +
503 std::to_string(v1.size()) +
" != " + std::to_string(v2.size()) +
".");
506 for (
int i = 0; i < v1.size(); i++) {
507 sum += v1[i] * v2[i];
519 return *std::min_element((*this).begin(), (*this).end());
529 return *std::max_element((*this).begin(), (*this).end());
535 for (
int i = 0; i < size_; i++) {
550 typedef T value_type;
551 typedef T& reference;
553 typedef int difference_type;
554 typedef std::forward_iterator_tag iterator_category;
558 Iterator& operator++() { this->ptr_ ++;
return *
this; }
559 Iterator& operator--() { this->ptr_ --;
return *
this; }
560 Iterator& operator++(
int) { this->ptr_ ++;
return *
this; }
561 Iterator& operator--(
int) { this->ptr_ --;
return *
this; }
562 T& operator*() {
return *this->ptr_; };
563 bool operator==(
const Iterator& iter) {
return this->ptr_ == iter.ptr_; }
564 bool operator!=(
const Iterator& iter) {
return this->ptr_ != iter.ptr_; }
576 return Iterator(data_+size_);
584 void allocate(
const int size)
592 data_ =
new T [size_];
593 memset(data_, 0,
sizeof(T)*(size_));
594 memory_in_use +=
sizeof(T)*size_;
597 void check_index(
const int i)
const
599 if (data_ ==
nullptr) {
600 std::cout <<
"[Vector] WARNING: Accessing null data in Vector at " << i << std::endl;
605 if ((i < 0) || (i >= size_)) {
606 auto index_str = std::to_string(i);
607 auto dims = std::to_string(size_);
608 throw std::runtime_error( +
"Index i=" + index_str +
" is out of bounds for " + dims +
" vector.");
616 if (!std::is_same<T, double>::value && !std::is_same<T, int>::value &&
617 !std::is_same<T,
Vector<double>>::value && !std::is_same<T, float>::value) {
618 std::string msg = std::string(
"Cannot use Vector class template for type '") +
typeid(T).name() +
"'.";
619 throw std::runtime_error(msg);
624 bool is_allocated_ =
false;
626 bool reference_data_ =
false;