diff --git a/src/shogun/base/SGObject.cpp b/src/shogun/base/SGObject.cpp index e7a22dd4ee1..cf08d3d4c3e 100644 --- a/src/shogun/base/SGObject.cpp +++ b/src/shogun/base/SGObject.cpp @@ -711,24 +711,6 @@ bool CSGObject::equals(CSGObject* other, float64_t accuracy, bool tolerant) SG_DEBUG("comparing parameter \"%s\" to other's \"%s\"\n", this_param->m_name, other_param->m_name); - /* hard-wired exception for DynamicObjectArray parameter num_elements */ - if (!strcmp("DynamicObjectArray", get_name()) && - !strcmp(this_param->m_name, "num_elements") && - !strcmp(other_param->m_name, "num_elements")) - { - SG_DEBUG("Ignoring DynamicObjectArray::num_elements field\n"); - continue; - } - - /* hard-wired exception for DynamicArray parameter num_elements */ - if (!strcmp("DynamicArray", get_name()) && - !strcmp(this_param->m_name, "num_elements") && - !strcmp(other_param->m_name, "num_elements")) - { - SG_DEBUG("Ignoring DynamicArray::num_elements field\n"); - continue; - } - /* use equals method of TParameter from here */ if (!this_param->equals(other_param, accuracy, tolerant)) { diff --git a/src/shogun/lib/DynamicArray.h b/src/shogun/lib/DynamicArray.h index 602247c33bf..17eec32be59 100644 --- a/src/shogun/lib/DynamicArray.h +++ b/src/shogun/lib/DynamicArray.h @@ -32,7 +32,7 @@ template class CDynamicArray :public CSGObject public: /** default constructor */ CDynamicArray() - : CSGObject(), m_array(), name("Array") + : CSGObject(), m_array() { dim1_size=1; dim2_size=1; @@ -48,7 +48,7 @@ template class CDynamicArray :public CSGObject * @param p_dim3_size dimension 3 */ CDynamicArray(int32_t p_dim1_size, int32_t p_dim2_size=1, int32_t p_dim3_size=1) - : CSGObject(), m_array(p_dim1_size*p_dim2_size*p_dim3_size), name("Array") + : CSGObject(), m_array(p_dim1_size*p_dim2_size*p_dim3_size) { dim1_size=p_dim1_size; dim2_size=p_dim2_size; @@ -65,7 +65,7 @@ template class CDynamicArray :public CSGObject * @param p_copy_array if array must be copied */ CDynamicArray(T* p_array, int32_t p_dim1_size, bool p_free_array, bool p_copy_array) - : CSGObject(), m_array(p_array, p_dim1_size, p_free_array, p_copy_array), name("Array") + : CSGObject(), m_array(p_array, p_dim1_size, p_free_array, p_copy_array) { dim1_size=p_dim1_size; dim2_size=1; @@ -84,7 +84,7 @@ template class CDynamicArray :public CSGObject */ CDynamicArray(T* p_array, int32_t p_dim1_size, int32_t p_dim2_size, bool p_free_array, bool p_copy_array) - : CSGObject(), m_array(p_array, p_dim1_size*p_dim2_size, p_free_array, p_copy_array), name("Array") + : CSGObject(), m_array(p_array, p_dim1_size*p_dim2_size, p_free_array, p_copy_array) { dim1_size=p_dim1_size; dim2_size=p_dim2_size; @@ -104,7 +104,7 @@ template class CDynamicArray :public CSGObject */ CDynamicArray(T* p_array, int32_t p_dim1_size, int32_t p_dim2_size, int32_t p_dim3_size, bool p_free_array, bool p_copy_array) - : CSGObject(), m_array(p_array, p_dim1_size*p_dim2_size*p_dim3_size, p_free_array, p_copy_array), name("Array") + : CSGObject(), m_array(p_array, p_dim1_size*p_dim2_size*p_dim3_size, p_free_array, p_copy_array) { dim1_size=p_dim1_size; dim2_size=p_dim2_size; @@ -121,7 +121,7 @@ template class CDynamicArray :public CSGObject * @param p_dim3_size dimension 3 */ CDynamicArray(const T* p_array, int32_t p_dim1_size=1, int32_t p_dim2_size=1, int32_t p_dim3_size=1) - : CSGObject(), m_array(p_array, p_dim1_size*p_dim2_size*p_dim3_size), name("Array") + : CSGObject(), m_array(p_array, p_dim1_size*p_dim2_size*p_dim3_size) { dim1_size=p_dim1_size; dim2_size=p_dim2_size; @@ -545,21 +545,6 @@ template class CDynamicArray :public CSGObject /** shuffles the array with external random state */ inline void shuffle(CRandom * rand) { m_array.shuffle(rand); } - /** set array's name - * - * @param p_name new name - */ - inline void set_array_name(const char* p_name) - { - name=p_name; - } - - /** get array's name - * - * @return array's name - */ - inline const char* get_array_name() const { return name; } - /** display this array */ inline void display_array() { @@ -619,6 +604,16 @@ template class CDynamicArray :public CSGObject m_array.resize_array(m_array.get_num_elements(), true); } + virtual CSGObject* clone() + { + CDynamicArray * cloned = (CDynamicArray*) CSGObject::clone(); + // Since the array vector is registered with + // current_num_elements as size (see parameter + // registration) the cloned version has less memory + // allocated than known to dynarray. We fix this here. + cloned->m_array.num_elements = cloned->m_array.current_num_elements; + return cloned; + } private: @@ -630,9 +625,6 @@ template class CDynamicArray :public CSGObject m_parameters->add_vector(&m_array.array, &m_array.current_num_elements, "array", "Memory for dynamic array."); - SG_ADD(&m_array.num_elements, - "num_elements", - "Number of Elements.", MS_NOT_AVAILABLE); SG_ADD(&m_array.resize_granularity, "resize_granularity", "shrink/grow step size.", MS_NOT_AVAILABLE); @@ -644,6 +636,9 @@ template class CDynamicArray :public CSGObject "free_array", "whether array must be freed", MS_NOT_AVAILABLE); + SG_ADD(&dim1_size, "dim1_size", "Dimension 1", MS_NOT_AVAILABLE); + SG_ADD(&dim2_size, "dim2_size", "Dimension 2", MS_NOT_AVAILABLE); + SG_ADD(&dim3_size, "dim3_size", "Dimension 3", MS_NOT_AVAILABLE); } protected: @@ -659,9 +654,6 @@ template class CDynamicArray :public CSGObject /** dimension 3 */ int32_t dim3_size; - - /** array's name */ - const char* name; }; } #endif /* _DYNAMIC_ARRAY_H_ */ diff --git a/src/shogun/lib/DynamicObjectArray.h b/src/shogun/lib/DynamicObjectArray.h index aa46d1f0404..7209c058576 100644 --- a/src/shogun/lib/DynamicObjectArray.h +++ b/src/shogun/lib/DynamicObjectArray.h @@ -33,7 +33,7 @@ class CDynamicObjectArray : public CSGObject public: /** default constructor */ CDynamicObjectArray() - : CSGObject(), m_array(), name("Array") + : CSGObject(), m_array() { dim1_size=1; dim2_size=1; @@ -49,7 +49,7 @@ class CDynamicObjectArray : public CSGObject * @param dim3 dimension 3 */ CDynamicObjectArray(int32_t dim1, int32_t dim2=1, int32_t dim3=1) - : CSGObject(), m_array(dim1*dim2*dim3), name("Array") + : CSGObject(), m_array(dim1*dim2*dim3) { dim1_size=dim1; dim2_size=dim2; @@ -66,7 +66,7 @@ class CDynamicObjectArray : public CSGObject * @param p_copy_array if array must be copied */ CDynamicObjectArray(CSGObject** p_array, int32_t p_dim1_size, bool p_free_array=true, bool p_copy_array=false) - : CSGObject(), m_array(p_array, p_dim1_size, p_free_array, p_copy_array), name("Array") + : CSGObject(), m_array(p_array, p_dim1_size, p_free_array, p_copy_array) { dim1_size=p_dim1_size; dim2_size=1; @@ -85,7 +85,7 @@ class CDynamicObjectArray : public CSGObject */ CDynamicObjectArray(CSGObject** p_array, int32_t p_dim1_size, int32_t p_dim2_size, bool p_free_array=true, bool p_copy_array=false) - : CSGObject(), m_array(p_array, p_dim1_size*p_dim2_size, p_free_array, p_copy_array), name("Array") + : CSGObject(), m_array(p_array, p_dim1_size*p_dim2_size, p_free_array, p_copy_array) { dim1_size=p_dim1_size; dim2_size=p_dim2_size; @@ -105,7 +105,7 @@ class CDynamicObjectArray : public CSGObject */ CDynamicObjectArray(CSGObject** p_array, int32_t p_dim1_size, int32_t p_dim2_size, int32_t p_dim3_size, bool p_free_array=true, bool p_copy_array=false) - : CSGObject(), m_array(p_array, p_dim1_size*p_dim2_size*p_dim3_size, p_free_array, p_copy_array), name("Array") + : CSGObject(), m_array(p_array, p_dim1_size*p_dim2_size*p_dim3_size, p_free_array, p_copy_array) { dim1_size=p_dim1_size; dim2_size=p_dim2_size; @@ -393,21 +393,6 @@ class CDynamicObjectArray : public CSGObject /** shuffles the array with external random state */ inline void shuffle(CRandom * rand) { m_array.shuffle(rand); } - /** set array's name - * - * @param p_name new name - */ - inline void set_array_name(const char* p_name) - { - name=p_name; - } - - /** get array's name - * - * @return array's name - */ - inline const char* get_array_name() const { return name; } - /** @return object name */ virtual const char* get_name() const { return "DynamicObjectArray"; } @@ -442,16 +427,23 @@ class CDynamicObjectArray : public CSGObject m_array.resize_array(m_array.get_num_elements(), true); } - private: + virtual CSGObject* clone() + { + CDynamicObjectArray* cloned = (CDynamicObjectArray*) CSGObject::clone(); + // Since the array vector is registered with + // current_num_elements as size (see parameter + // registration) the cloned version has less memory + // allocated than known to dynarray. We fix this here. + cloned->m_array.num_elements = cloned->m_array.current_num_elements; + return cloned; + } + private: /** register parameters */ virtual void init() { m_parameters->add_vector(&m_array.array, &m_array.current_num_elements, "array", "Memory for dynamic array."); - SG_ADD(&m_array.num_elements, - "num_elements", - "Number of Elements.", MS_NOT_AVAILABLE); SG_ADD(&m_array.resize_granularity, "resize_granularity", "shrink/grow step size.", MS_NOT_AVAILABLE); @@ -463,6 +455,9 @@ class CDynamicObjectArray : public CSGObject "free_array", "whether array must be freed", MS_NOT_AVAILABLE); + SG_ADD(&dim1_size, "dim1_size", "Dimension 1", MS_NOT_AVAILABLE); + SG_ADD(&dim2_size, "dim2_size", "Dimension 2", MS_NOT_AVAILABLE); + SG_ADD(&dim3_size, "dim3_size", "Dimension 3", MS_NOT_AVAILABLE); } /** de-reference all elements of this array once */ @@ -487,10 +482,6 @@ class CDynamicObjectArray : public CSGObject /** dimension 3 */ int32_t dim3_size; - - /** array's name */ - const char* name; - }; } #endif /* _DYNAMIC_OBJECT_ARRAY_H_ */ diff --git a/src/shogun/structure/DynProg.cpp b/src/shogun/structure/DynProg.cpp index 4337304f6f9..51326eac2d1 100644 --- a/src/shogun/structure/DynProg.cpp +++ b/src/shogun/structure/DynProg.cpp @@ -118,24 +118,6 @@ CDynProg::CDynProg(int32_t num_svms /*= 8 */) m_num_lin_feat_plifs_cum = SG_MALLOC(int32_t, 100); m_num_lin_feat_plifs_cum[0] = m_num_svms; m_num_raw_data = 0; -#ifdef ARRAY_STATISTICS - m_word_degree.set_array_name("word_degree"); -#endif - - m_transition_matrix_a_id.set_array_name("transition_matrix_a_id"); - m_transition_matrix_a.set_array_name("transition_matrix_a"); - m_transition_matrix_a_deriv.set_array_name("transition_matrix_a_deriv"); - m_mod_words.set_array_name("mod_words"); - m_orf_info.set_array_name("orf_info"); - m_segment_sum_weights.set_array_name("segment_sum_weights"); - m_dict_weights.set_array_name("dict_weights"); - m_states.set_array_name("states"); - m_positions.set_array_name("positions"); - m_lin_feat.set_array_name("lin_feat"); - - - m_observation_matrix.set_array_name("m_observation_matrix"); - m_segment_loss.set_array_name("m_segment_loss"); m_seg_loss_obj = new CSegmentLoss(); } @@ -199,7 +181,6 @@ void CDynProg::precompute_stop_codons() m_genestr_stop.resize_array(length) ; m_genestr_stop.set_const(0) ; - m_genestr_stop.set_array_name("genestr_stop") ; { for (int32_t i=0; i orf_info) SG_ERROR("orf_info size incorrect %i!=2\n", orf_info.num_cols) m_orf_info.set_array(orf_info.matrix, orf_info.num_rows, orf_info.num_cols, true, true) ; - m_orf_info.set_array_name("orf_info") ; } void CDynProg::set_sparse_features(CSparseFeatures* seq_sparse1, CSparseFeatures* seq_sparse2) @@ -823,9 +803,7 @@ void CDynProg::best_path_set_segment_ids_mask( max_id = CMath::max(max_id,segment_ids[i]); //SG_PRINT("max_id: %i, m:%i\n",max_id, m) m_segment_ids.set_array(segment_ids, m, true, true) ; - m_segment_ids.set_array_name("m_segment_ids"); m_segment_mask.set_array(segment_mask, m, true, true) ; - m_segment_mask.set_array_name("m_segment_mask"); m_seg_loss_obj->set_segment_mask(&m_segment_mask); m_seg_loss_obj->set_segment_ids(&m_segment_ids); @@ -1000,7 +978,6 @@ void CDynProg::compute_nbest_paths(int32_t max_num_signals, bool use_orf, } #ifdef DYNPROG_DEBUG - m_transition_matrix_a.set_array_name("transition_matrix"); m_transition_matrix_a.display_array(); m_mod_words.display_array() ; m_sign_words.display_array() ; @@ -1017,13 +994,10 @@ void CDynProg::compute_nbest_paths(int32_t max_num_signals, bool use_orf, // SG_PRINT("(%i)%0.2f ",i,seq_array[i]) CDynamicObjectArray PEN((CSGObject**) Plif_matrix, m_N, m_N, false, false) ; // 2d, CPlifBase* - PEN.set_array_name("PEN"); CDynamicObjectArray PEN_state_signals((CSGObject**) Plif_state_signals, m_N, max_num_signals, false, false) ; // 2d, CPlifBase* - PEN_state_signals.set_array_name("state_signals"); CDynamicArray seq(m_N, m_seq_len) ; // 2d - seq.set_array_name("seq") ; seq.set_const(0) ; #ifdef DYNPROG_DEBUG @@ -1051,7 +1025,6 @@ void CDynProg::compute_nbest_paths(int32_t max_num_signals, bool use_orf, //SG_PRINT("using dense seq_array\n") seq_input=new CDynamicArray(seq_array, m_N, m_seq_len, max_num_signals) ; - seq_input->set_array_name("seq_input") ; //seq_input.display_array() ; ASSERT(m_seq_sparse1==NULL) @@ -1130,29 +1103,21 @@ void CDynProg::compute_nbest_paths(int32_t max_num_signals, bool use_orf, // allow longer transitions than look_back bool long_transitions = m_long_transitions ; CDynamicArray long_transition_content_start_position(m_N,m_N) ; // 2d - long_transition_content_start_position.set_array_name("long_transition_content_start_position"); #ifdef DYNPROG_DEBUG CDynamicArray long_transition_content_end_position(m_N,m_N) ; // 2d - long_transition_content_end_position.set_array_name("long_transition_content_end_position"); #endif CDynamicArray long_transition_content_start(m_N,m_N) ; // 2d - long_transition_content_start.set_array_name("long_transition_content_start"); CDynamicArray long_transition_content_scores(m_N,m_N) ; // 2d - long_transition_content_scores.set_array_name("long_transition_content_scores"); #ifdef DYNPROG_DEBUG CDynamicArray long_transition_content_scores_pen(m_N,m_N) ; // 2d - long_transition_content_scores_pen.set_array_name("long_transition_content_scores_pen"); CDynamicArray long_transition_content_scores_prev(m_N,m_N) ; // 2d - long_transition_content_scores_prev.set_array_name("long_transition_content_scores_prev"); CDynamicArray long_transition_content_scores_elem(m_N,m_N) ; // 2d - long_transition_content_scores_elem.set_array_name("long_transition_content_scores_elem"); #endif CDynamicArray long_transition_content_scores_loss(m_N,m_N) ; // 2d - long_transition_content_scores_loss.set_array_name("long_transition_content_scores_loss"); if (nbest!=1) { @@ -1180,9 +1145,7 @@ void CDynProg::compute_nbest_paths(int32_t max_num_signals, bool use_orf, } CDynamicArray look_back(m_N,m_N) ; // 2d - look_back.set_array_name("look_back"); //CDynamicArray look_back_orig(m_N,m_N) ; - //look_back.set_array_name("look_back_orig"); { // determine maximal length of look-back @@ -1289,32 +1252,25 @@ void CDynProg::compute_nbest_paths(int32_t max_num_signals, bool use_orf, ASSERT(nbest<32000) CDynamicArray delta(m_seq_len, m_N, nbest) ; // 3d - delta.set_array_name("delta"); float64_t* delta_array = delta.get_array() ; //delta.set_const(0) ; CDynamicArray psi(m_seq_len, m_N, nbest) ; // 3d - psi.set_array_name("psi"); //psi.set_const(0) ; CDynamicArray ktable(m_seq_len, m_N, nbest) ; // 3d - ktable.set_array_name("ktable"); //ktable.set_const(0) ; CDynamicArray ptable(m_seq_len, m_N, nbest) ; // 3d - ptable.set_array_name("ptable"); //ptable.set_const(0) ; CDynamicArray delta_end(nbest) ; - delta_end.set_array_name("delta_end"); //delta_end.set_const(0) ; CDynamicArray path_ends(nbest) ; - path_ends.set_array_name("path_ends"); //path_ends.set_const(0) ; CDynamicArray ktable_end(nbest) ; - ktable_end.set_array_name("ktable_end"); //ktable_end.set_const(0) ; float64_t * fixedtempvv=SG_MALLOC(float64_t, look_back_buflen); @@ -1323,60 +1279,22 @@ void CDynProg::compute_nbest_paths(int32_t max_num_signals, bool use_orf, memset(fixedtempii, 0, look_back_buflen*sizeof(int32_t)) ; CDynamicArray oldtempvv(look_back_buflen) ; - oldtempvv.set_array_name("oldtempvv"); CDynamicArray oldtempvv2(look_back_buflen) ; - oldtempvv2.set_array_name("oldtempvv2"); //oldtempvv.set_const(0) ; //oldtempvv.display_size() ; CDynamicArray oldtempii(look_back_buflen) ; - oldtempii.set_array_name("oldtempii"); CDynamicArray oldtempii2(look_back_buflen) ; - oldtempii2.set_array_name("oldtempii2"); //oldtempii.set_const(0) ; CDynamicArray state_seq(m_seq_len) ; - state_seq.set_array_name("state_seq"); //state_seq.set_const(0) ; CDynamicArray pos_seq(m_seq_len) ; - pos_seq.set_array_name("pos_seq"); //pos_seq.set_const(0) ; - - m_dict_weights.set_array_name("dict_weights") ; - m_word_degree.set_array_name("word_degree") ; - m_cum_num_words.set_array_name("cum_num_words") ; - m_num_words.set_array_name("num_words") ; - //word_used.set_array_name("word_used") ; - //svm_values_unnormalized.set_array_name("svm_values_unnormalized") ; - //m_svm_pos_start.set_array_name("svm_pos_start") ; - m_num_unique_words.set_array_name("num_unique_words") ; - - PEN.set_array_name("PEN") ; - seq.set_array_name("seq") ; - - delta.set_array_name("delta") ; - psi.set_array_name("psi") ; - ktable.set_array_name("ktable") ; - ptable.set_array_name("ptable") ; - delta_end.set_array_name("delta_end") ; - path_ends.set_array_name("path_ends") ; - ktable_end.set_array_name("ktable_end") ; - -#ifdef USE_TMP_ARRAYCLASS - fixedtempvv.set_array_name("fixedtempvv") ; - fixedtempii.set_array_name("fixedtempvv") ; -#endif - - oldtempvv.set_array_name("oldtempvv") ; - oldtempvv2.set_array_name("oldtempvv2") ; - oldtempii.set_array_name("oldtempii") ; - oldtempii2.set_array_name("oldtempii2") ; - - //////////////////////////////////////////////////////////////////////////////// #ifdef DYNPROG_DEBUG @@ -2078,13 +1996,10 @@ void CDynProg::best_path_trans_deriv( bool use_svm = false ; CDynamicObjectArray PEN((CSGObject**) Plif_matrix, m_N, m_N, false, false) ; // 2d, CPlifBase* - PEN.set_array_name("PEN"); CDynamicObjectArray PEN_state_signals((CSGObject**) Plif_state_signals, m_N, max_num_signals, false, false) ; // 2d, CPlifBase* - PEN_state_signals.set_array_name("PEN_state_signals"); CDynamicArray seq_input(seq_array, m_N, m_seq_len, max_num_signals) ; - seq_input.set_array_name("seq_input"); { // determine whether to use svm outputs and clear derivatives for (int32_t i=0; i +#include +#include + +using namespace shogun; + +TEST(DynamicObjectArray,clone) +{ + CDynamicObjectArray * orig_array = new CDynamicObjectArray(); + + // Something relatively simple to add + CSubset * subset = new CSubset(); + orig_array->append_element(subset); + + CDynamicObjectArray * cloned_array = (CDynamicObjectArray*) orig_array->clone(); + // Expand the cloned array into reserved space to check if the cloned + // array has correctly allocated memory + for (index_t i=0; i < 100; ++i) + cloned_array->append_element(new CSubset()); + + // Check sizes + EXPECT_EQ(orig_array->get_num_elements(), 1); + EXPECT_EQ(cloned_array->get_num_elements(), 101); + + SG_UNREF(orig_array); + SG_UNREF(cloned_array); +} diff --git a/tests/unit/base/DynamicObjectArray_unittest.cc.jinja2 b/tests/unit/base/DynamicObjectArray_unittest_generated.cc.jinja2 similarity index 100% rename from tests/unit/base/DynamicObjectArray_unittest.cc.jinja2 rename to tests/unit/base/DynamicObjectArray_unittest_generated.cc.jinja2