SHOGUN
v2.0.0
|
00001 /* 00002 * This program is free software; you can redistribute it and/or modify 00003 * it under the terms of the GNU General Public License as published by 00004 * the Free Software Foundation; either version 3 of the License, or 00005 * (at your option) any later version. 00006 * 00007 * Written (W) 1999-2009 Soeren Sonnenburg 00008 * Copyright (C) 1999-2009 Fraunhofer Institute FIRST and Max-Planck-Society 00009 */ 00010 00011 #ifndef _DYNAMIC_ARRAY_H_ 00012 #define _DYNAMIC_ARRAY_H_ 00013 00014 #include <shogun/base/SGObject.h> 00015 #include <shogun/base/DynArray.h> 00016 #include <shogun/base/Parameter.h> 00017 00018 namespace shogun 00019 { 00028 template <class T> class CDynamicArray :public CSGObject 00029 { 00030 public: 00032 CDynamicArray() 00033 : CSGObject(), m_array(), name("Array") 00034 { 00035 set_generic<T>(); 00036 00037 m_parameters->add_vector(&m_array.array, &m_array.num_elements, "array", 00038 "Memory for dynamic array."); 00039 00040 SG_ADD(&m_array.last_element_idx, 00041 "last_element_idx", 00042 "Element with largest index.", MS_NOT_AVAILABLE); 00043 SG_ADD(&m_array.resize_granularity, 00044 "resize_granularity", 00045 "shrink/grow step size.", MS_NOT_AVAILABLE); 00046 00047 dim1_size=1; 00048 dim2_size=1; 00049 dim3_size=1; 00050 } 00051 00058 CDynamicArray(int32_t p_dim1_size, int32_t p_dim2_size=1, int32_t p_dim3_size=1) 00059 : CSGObject(), m_array(p_dim1_size*p_dim2_size*p_dim3_size), name("Array") 00060 { 00061 set_generic<T>(); 00062 00063 m_parameters->add_vector(&m_array.array, 00064 &m_array.num_elements, "array", 00065 "Memory for dynamic array."); 00066 m_parameters->add(&m_array.last_element_idx, 00067 "last_element_idx", 00068 "Element with largest index."); 00069 m_parameters->add(&m_array.resize_granularity, 00070 "resize_granularity", 00071 "shrink/grow step size."); 00072 00073 dim1_size=p_dim1_size; 00074 dim2_size=p_dim2_size; 00075 dim3_size=p_dim3_size; 00076 } 00077 00085 CDynamicArray(T* p_array, int32_t p_dim1_size, bool p_free_array, bool p_copy_array) 00086 : CSGObject(), m_array(p_array, p_dim1_size, p_free_array, p_copy_array), name("Array") 00087 { 00088 set_generic<T>(); 00089 00090 m_parameters->add_vector(&m_array.array, &m_array.num_elements, "array", 00091 "Memory for dynamic array."); 00092 00093 SG_ADD(&m_array.last_element_idx, 00094 "last_element_idx", 00095 "Element with largest index.", MS_NOT_AVAILABLE); 00096 SG_ADD(&m_array.resize_granularity, 00097 "resize_granularity", 00098 "shrink/grow step size.", MS_NOT_AVAILABLE); 00099 dim1_size=p_dim1_size; 00100 dim2_size=1; 00101 dim3_size=1; 00102 } 00103 00112 CDynamicArray(T* p_array, int32_t p_dim1_size, int32_t p_dim2_size, 00113 bool p_free_array, bool p_copy_array) 00114 : CSGObject(), m_array(p_array, p_dim1_size*p_dim2_size, p_free_array, p_copy_array), name("Array") 00115 { 00116 set_generic<T>(); 00117 00118 m_parameters->add_vector(&m_array.array, &m_array.num_elements, "array", 00119 "Memory for dynamic array."); 00120 00121 SG_ADD(&m_array.last_element_idx, 00122 "last_element_idx", 00123 "Element with largest index.", MS_NOT_AVAILABLE); 00124 SG_ADD(&m_array.resize_granularity, 00125 "resize_granularity", 00126 "shrink/grow step size.", MS_NOT_AVAILABLE); 00127 00128 dim1_size=p_dim1_size; 00129 dim2_size=p_dim2_size; 00130 dim3_size=1; 00131 } 00132 00142 CDynamicArray(T* p_array, int32_t p_dim1_size, int32_t p_dim2_size, 00143 int32_t p_dim3_size, bool p_free_array, bool p_copy_array) 00144 : CSGObject(), m_array(p_array, p_dim1_size*p_dim2_size*p_dim3_size, p_free_array, p_copy_array), name("Array") 00145 { 00146 set_generic<T>(); 00147 00148 m_parameters->add_vector(&m_array.array, &m_array.num_elements, "array", 00149 "Memory for dynamic array."); 00150 00151 SG_ADD(&m_array.last_element_idx, 00152 "last_element_idx", 00153 "Element with largest index.", MS_NOT_AVAILABLE); 00154 SG_ADD(&m_array.resize_granularity, 00155 "resize_granularity", 00156 "shrink/grow step size.", MS_NOT_AVAILABLE); 00157 00158 dim1_size=p_dim1_size; 00159 dim2_size=p_dim2_size; 00160 dim3_size=p_dim3_size; 00161 } 00162 00170 CDynamicArray(const T* p_array, int32_t p_dim1_size=1, int32_t p_dim2_size=1, int32_t p_dim3_size=1) 00171 : CSGObject(), m_array(p_array, p_dim1_size*p_dim2_size*p_dim3_size), name("Array") 00172 { 00173 set_generic<T>(); 00174 00175 m_parameters->add_vector(&m_array.array, &m_array.num_elements, "array", 00176 "Memory for dynamic array."); 00177 00178 SG_ADD(&m_array.last_element_idx, 00179 "last_element_idx", 00180 "Element with largest index.", MS_NOT_AVAILABLE); 00181 SG_ADD(&m_array.resize_granularity, 00182 "resize_granularity", 00183 "shrink/grow step size.", MS_NOT_AVAILABLE); 00184 00185 dim1_size=p_dim1_size; 00186 dim2_size=p_dim2_size; 00187 dim3_size=p_dim3_size; 00188 } 00189 00190 virtual ~CDynamicArray() {} 00191 00197 inline int32_t set_granularity(int32_t g) 00198 { 00199 return m_array.set_granularity(g); 00200 } 00201 00206 inline int32_t get_array_size() 00207 { 00208 return m_array.get_array_size(); 00209 } 00210 00216 inline void get_array_size(int32_t& dim1, int32_t& dim2) 00217 { 00218 dim1=dim1_size; 00219 dim2=dim2_size; 00220 } 00221 00228 inline void get_array_size(int32_t& dim1, int32_t& dim2, int32_t& dim3) 00229 { 00230 dim1=dim1_size; 00231 dim2=dim2_size; 00232 dim3=dim3_size; 00233 } 00234 00239 inline int32_t get_dim1() { return dim1_size; } 00240 00245 inline int32_t get_dim2() { return dim2_size; } 00246 00251 inline int32_t get_dim3() { return dim3_size; } 00252 00257 inline int32_t get_num_elements() const 00258 { 00259 return m_array.get_num_elements(); 00260 } 00261 00269 inline const T& get_element(int32_t idx1, int32_t idx2=0, int32_t idx3=0) const 00270 { 00271 return m_array.get_array()[idx1+dim1_size*(idx2+dim2_size*idx3)]; 00272 } 00273 00281 inline const T& element(int32_t idx1, int32_t idx2=0, int32_t idx3=0) const 00282 { 00283 return get_element(idx1, idx2, idx3); 00284 } 00285 00293 inline T& element(int32_t idx1, int32_t idx2=0, int32_t idx3=0) 00294 { 00295 return m_array.get_array()[idx1+dim1_size*(idx2+dim2_size*idx3)]; 00296 } 00297 00306 inline T& element(T* p_array, int32_t idx1, int32_t idx2=0, int32_t idx3=0) 00307 { 00308 ASSERT(idx1>=0 && idx1<dim1_size); 00309 ASSERT(idx2>=0 && idx2<dim2_size); 00310 ASSERT(idx3>=0 && idx3<dim3_size); 00311 return p_array[idx1+dim1_size*(idx2+dim2_size*idx3)]; 00312 } 00313 00324 inline T& element(T* p_array, int32_t idx1, int32_t idx2, int32_t idx3, int32_t p_dim1_size, int32_t p_dim2_size) 00325 { 00326 ASSERT(p_dim1_size==dim1_size); 00327 ASSERT(p_dim2_size==dim2_size); 00328 ASSERT(idx1>=0 && idx1<p_dim1_size); 00329 ASSERT(idx2>=0 && idx2<p_dim2_size); 00330 ASSERT(idx3>=0 && idx3<dim3_size); 00331 return p_array[idx1+p_dim1_size*(idx2+p_dim2_size*idx3)]; 00332 } 00333 00338 inline T get_last_element() const 00339 { 00340 return m_array.get_last_element(); 00341 } 00342 00350 inline T get_element_safe(int32_t index) const 00351 { 00352 return m_array.get_element_safe(index); 00353 } 00354 00363 inline bool set_element(T e, int32_t idx1, int32_t idx2=0, int32_t idx3=0) 00364 { 00365 return m_array.set_element(e, idx1+dim1_size*(idx2+dim2_size*idx3)); 00366 } 00367 00374 inline bool insert_element(T e, int32_t index) 00375 { 00376 return m_array.insert_element(e, index); 00377 } 00378 00384 inline bool append_element(T e) 00385 { 00386 return m_array.append_element(e); 00387 } 00388 00394 inline void push_back(T e) 00395 { m_array.push_back(e); } 00396 00400 inline void pop_back() 00401 { 00402 m_array.pop_back(); 00403 } 00404 00410 inline T back() 00411 { 00412 return m_array.back(); 00413 } 00414 00421 inline int32_t find_element(T e) 00422 { 00423 return m_array.find_element(e); 00424 } 00425 00432 inline bool delete_element(int32_t idx) 00433 { 00434 return m_array.delete_element(idx); 00435 } 00436 00444 inline bool resize_array(int32_t ndim1, int32_t ndim2=1, int32_t ndim3=1) 00445 { 00446 dim1_size=ndim1; 00447 dim2_size=ndim2; 00448 dim3_size=ndim3; 00449 return m_array.resize_array(ndim1*ndim2*ndim3); 00450 } 00451 00453 void set_const(const T& const_element) 00454 { 00455 m_array.set_const(const_element); 00456 } 00457 00465 inline T* get_array() const 00466 { 00467 return m_array.get_array(); 00468 } 00469 00476 inline void set_array(T* p_array, int32_t p_num_elements, 00477 int32_t array_size) 00478 { 00479 m_array.set_array(p_array, p_num_elements, array_size); 00480 } 00481 00489 inline void set_array(T* p_array, int32_t dim1, 00490 bool p_free_array, bool copy_array) 00491 { 00492 dim1_size=dim1; 00493 dim2_size=1; 00494 dim3_size=1; 00495 m_array.set_array(p_array, dim1, dim1, p_free_array, copy_array); 00496 } 00497 00506 inline void set_array(T* p_array, int32_t dim1, 00507 int32_t dim2, bool p_free_array, bool copy_array) 00508 { 00509 dim1_size=dim1; 00510 dim2_size=dim2; 00511 dim3_size=1; 00512 00513 m_array.set_array(p_array, dim1*dim2, dim1*dim2, p_free_array, copy_array); 00514 } 00515 00525 inline void set_array(T* p_array, int32_t dim1, 00526 int32_t dim2, int32_t dim3, bool p_free_array, bool copy_array) 00527 { 00528 dim1_size=dim1; 00529 dim2_size=dim2; 00530 dim3_size=dim3; 00531 m_array.set_array(p_array, dim1*dim2*dim3, dim1*dim2*dim3, p_free_array, copy_array); 00532 } 00533 00539 inline void set_array(const T* p_array, int32_t p_size) 00540 { 00541 m_array.set_array(p_array, p_size, p_size); 00542 } 00543 00545 inline void clear_array() 00546 { 00547 m_array.clear_array(); 00548 } 00549 00559 inline const T& operator[](int32_t index) const 00560 { 00561 return get_element(index); 00562 } 00563 00571 inline T& operator[](int32_t index) 00572 { 00573 return element(index); 00574 } 00575 00581 inline CDynamicArray<T>& operator=(CDynamicArray<T>& orig) 00582 { 00583 m_array=orig.m_array; 00584 dim1_size=orig.dim1_size; 00585 dim2_size=orig.dim2_size; 00586 dim3_size=orig.dim3_size; 00587 00588 return *this; 00589 } 00590 00592 inline void shuffle() { m_array.shuffle(); } 00593 00598 inline void set_array_name(const char* p_name) 00599 { 00600 name=p_name; 00601 } 00602 00607 inline const char* get_array_name() const { return name; } 00608 00610 inline void display_array() 00611 { 00612 if (get_name()) 00613 SG_PRINT( "DynamicArray '%s' of size: %dx%dx%d\n", get_name(), dim1_size, dim2_size, dim3_size); 00614 else 00615 SG_PRINT( "DynamicArray of size: %dx%dx%d\n",dim1_size, dim2_size, dim3_size); 00616 00617 for (int32_t k=0; k<dim3_size; k++) 00618 for (int32_t i=0; i<dim1_size; i++) 00619 { 00620 SG_PRINT( "element(%d,:,%d) = [ ",i, k); 00621 for (int32_t j=0; j<dim2_size; j++) 00622 SG_PRINT( "%1.1f,", (float32_t) element(i,j,k)); 00623 SG_PRINT( " ]\n"); 00624 } 00625 } 00626 00628 inline void display_size() 00629 { 00630 SG_PRINT( "DynamicArray of size: %dx%dx%d\n",dim1_size, dim2_size, dim3_size); 00631 } 00632 00634 inline virtual const char* get_name() const 00635 { 00636 return "DynamicArray"; 00637 } 00638 00639 protected: 00640 00642 DynArray<T> m_array; 00643 00645 int32_t dim1_size; 00646 00648 int32_t dim2_size; 00649 00651 int32_t dim3_size; 00652 00654 const char* name; 00655 }; 00656 } 00657 #endif /* _DYNAMIC_ARRAY_H_ */