26 static int num_allocated;
28 static double memory_in_use;
29 static double memory_returned;
30 static bool write_enabled;
31 static bool show_index_check_message;
32 static void memory(
const std::string& prefix=
"");
33 static void stats(
const std::string& prefix=
"");
57 Vector(
const int size, T* data)
59 reference_data_ =
true;
64 Vector(std::initializer_list<T> values)
66 if (values.size() == 0) {
70 allocate(values.size());
71 std::copy(values.begin(), values.end(), data_);
78 if (data_ !=
nullptr) {
79 if (!reference_data_) {
82 memory_in_use -=
sizeof(T)*size_;
83 memory_returned +=
sizeof(T)*size_;
98 for (
int i = 0; i < rhs.size_; i++) {
99 data_[i] = rhs.data_[i];
105 bool allocated()
const
107 return is_allocated_ ;
116 if (data_ !=
nullptr) {
117 if (reference_data_) {
118 throw std::runtime_error(
"[Vector] Can't clear a Vector with reference data.");
121 memory_in_use -=
sizeof(T) * size_;;
122 memory_returned +=
sizeof(T) * size_;;
125 is_allocated_ =
false;
130 void print(
const std::string& label)
132 printf(
"%s (%d): \n", label.c_str(), size_);
133 for (
int i = 0; i < size_; i++) {
134 printf(
"%s %d %g\n", label.c_str(), i+1, data_[i]);
146 if (data_ !=
nullptr) {
147 if (reference_data_) {
148 throw std::runtime_error(
"[Vector] Can't resize a Vector with reference data.");
151 memory_in_use -=
sizeof(T) * size_;;
152 memory_returned +=
sizeof(T) * size_;;
161 void grow(
const int size, T value={})
167 memory_in_use +=
sizeof(T) * size;;
168 int new_size = size_ + size;
169 T* new_data =
new T [new_size];
170 for (
int i = 0; i < size; i++) {
171 new_data[i+size_] = value;
173 memcpy(new_data, data_,
sizeof(T)*size_);
174 if (reference_data_) {
175 throw std::runtime_error(
"[Vector] Can't grow a Vector with reference data.");
182 void set_values(std::initializer_list<T> values)
184 if (values.size() == 0) {
188 allocate(values.size());
189 std::copy(values.begin(), values.end(), data_);
192 void set_values(std::vector<T> values)
194 if (values.size() == 0) {
198 allocate(values.size());
199 std::copy(values.begin(), values.end(), data_);
202 void read(
const std::string& file_name)
204 auto fp = fopen(file_name.c_str(),
"rb");
206 fread(&size,
sizeof(
int), 1, fp);
207 fread(data_,
sizeof(T), size_, fp);
211 void write(
const std::string& label,
const T offset={})
const
213 if (!write_enabled) {
217 auto file_prefix = build_file_prefix(label);
218 auto file_name = file_prefix +
"_cm.bin";
222 auto fp = fopen(file_name.c_str(),
"wb");
223 fwrite(&size_,
sizeof(
int), 1, fp);
224 fwrite(data_,
sizeof(T), size_, fp);
244 if (rhs.size_ <= 0) {
252 if (size_ != rhs.size_) {
257 memcpy(data_, rhs.data_,
sizeof(T) * size_);
264 for (
int i = 0; i < size_; i++) {
276 return size_ *
sizeof(T);
281 const T& operator()(
const int i)
const
283 #ifdef Vector_check_enabled
289 T& operator()(
const int i)
291 #ifdef Vector_check_enabled
297 const T& operator[](
const int i)
const
299 #ifdef Vector_check_enabled
305 T& operator[](
const int i)
307 #ifdef Vector_check_enabled
313 friend std::ostream& operator << (std::ostream& out,
const Vector<T>& lhs)
315 for (
int i = 0; i < lhs.size(); i++) {
317 if (i != lhs.size()-1) {
332 if (size_ != vec.size()) {
333 throw std::runtime_error(
"[Vector dot product] Vectors have diffrenct sizes: " +
334 std::to_string(size_) +
" != " + std::to_string(vec.size()) +
".");
337 for (
int i = 0; i < size_; i++) {
338 result(i) = data_[i] + vec[i];
346 for (
int i = 0; i < size_; i++) {
347 result(i) = data_[i] - x(i);
357 for (
int i = 0; i < size_; i++) {
358 result(i) = data_[i] + value;
366 for (
int i = 0; i < rhs.size_; i++) {
367 result(i) = rhs.data_[i] + value;
375 for (
int i = 0; i < size_; i++) {
376 result(i) = data_[i] - value;
384 for (
int i = 0; i < rhs.size_; i++) {
385 result(i) = value - rhs.data_[i];
395 for (
int i = 0; i < size_; i++) {
396 result(i) = data_[i] / value;
404 for (
int i = 0; i < rhs.size_; i++) {
405 result(i) = rhs.data_[i] / value;
415 for (
int i = 0; i < size_; i++) {
416 result(i) = value * data_[i];
424 for (
int i = 0; i < rhs.size_; i++) {
425 result(i) = value * rhs.data_[i];
435 for (
int i = 0; i < size_; i++) {
436 result(i) = -data_[i];
445 for (
int i = 0; i < size_; i++) {
446 result(i) = std::abs(data_[i]);
456 result(0) = (*this)(1)*v2(2) - (*this)(2)*v2(1);
457 result(1) = (*this)(2)*v2(0) - (*this)(0)*v2(2);
458 result(2) = (*this)(0)*v2(1) - (*this)(1)*v2(0);
466 if (size_ != v2.size()) {
467 throw std::runtime_error(
"[Vector dot product] Vectors have diffrenct sizes: " +
468 std::to_string(size_) +
" != " + std::to_string(v2.size()) +
".");
471 for (
int i = 0; i < size_; i++) {
472 sum += (*this)(i) * v2(i);
479 if (v1.size() != v2.size()) {
480 throw std::runtime_error(
"[Vector dot product] Vectors have diffrenct sizes: " +
481 std::to_string(v1.size()) +
" != " + std::to_string(v2.size()) +
".");
484 for (
int i = 0; i < v1.size(); i++) {
485 sum += v1[i] * v2[i];
497 return *std::min_element((*this).begin(), (*this).end());
507 return *std::max_element((*this).begin(), (*this).end());
513 for (
int i = 0; i < size_; i++) {
528 typedef T value_type;
529 typedef T& reference;
531 typedef int difference_type;
532 typedef std::forward_iterator_tag iterator_category;
536 Iterator& operator++() { this->ptr_ ++;
return *
this; }
537 Iterator& operator--() { this->ptr_ --;
return *
this; }
538 Iterator& operator++(
int) { this->ptr_ ++;
return *
this; }
539 Iterator& operator--(
int) { this->ptr_ --;
return *
this; }
540 T& operator*() {
return *this->ptr_; };
541 bool operator==(
const Iterator& iter) {
return this->ptr_ == iter.ptr_; }
542 bool operator!=(
const Iterator& iter) {
return this->ptr_ != iter.ptr_; }
554 return Iterator(data_+size_);
562 void allocate(
const int size)
570 data_ =
new T [size_];
571 memset(data_, 0,
sizeof(T)*(size_));
572 memory_in_use +=
sizeof(T)*size_;
575 void check_index(
const int i)
const
577 if (show_index_check_message) {
578 std::cout <<
"[Vector] **********************************" << std::endl;
579 std::cout <<
"[Vector] WARNING: Index checking is enabled " << std::endl;
580 std::cout <<
"[Vector] **********************************" << std::endl;
581 show_index_check_message =
false;
584 if (data_ ==
nullptr) {
585 std::cout <<
"[Vector] WARNING: Accessing null data in Vector at " << i << std::endl;
590 if ((i < 0) || (i >= size_)) {
591 auto index_str = std::to_string(i);
592 auto dims = std::to_string(size_);
593 throw std::runtime_error( +
"Index i=" + index_str +
" is out of bounds for " + dims +
" vector.");
601 if (!std::is_same<T, double>::value && !std::is_same<T, int>::value &&
602 !std::is_same<T,
Vector<double>>::value && !std::is_same<T, float>::value) {
603 std::string msg = std::string(
"Cannot use Vector class template for type '") +
typeid(T).name() +
"'.";
604 throw std::runtime_error(msg);
609 bool is_allocated_ =
false;
611 bool reference_data_ =
false;