From be3483b50c443fdcc5857cdded7a611fe54a24fe Mon Sep 17 00:00:00 2001 From: Heiko Strathmann Date: Sat, 21 Apr 2012 16:54:47 +0100 Subject: [PATCH] bugfixes and some new legality checks when a subset is added --- src/shogun/features/SubsetStack.cpp | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/shogun/features/SubsetStack.cpp b/src/shogun/features/SubsetStack.cpp index 3187a3b8c77..e485b800247 100644 --- a/src/shogun/features/SubsetStack.cpp +++ b/src/shogun/features/SubsetStack.cpp @@ -47,6 +47,29 @@ void CSubsetStack::init() void CSubsetStack::add_subset(SGVector subset) { + /* if there are already subsets on stack, do some legality checks */ + if (m_active_subsets_stack->get_num_elements()) + { + /* check that subsets may only be smaller or equal than existing */ + CSubset* latest=m_active_subsets_stack->get_last_element(); + if (subset.vlen>latest->m_subset_idx.vlen) + { + SG_ERROR("Error in %s::add_subset(): Provided index vector is " + "larger than the subsets on the stubset stack!\n", get_name()); + } + + /* check for range of indices */ + index_t max_index=CMath::max(subset.vector, subset.vlen); + if (max_index>=latest->m_subset_idx.vlen) + { + SG_ERROR("Error in %s::add_subset(): Provided index vector contains" + " indices larger than possible range!\n", get_name()); + } + + /* clean up */ + SG_UNREF(latest); + } + /* active subset will be changed anyway, no setting to NULL */ SG_UNREF(m_active_subset); @@ -58,6 +81,7 @@ void CSubsetStack::add_subset(SGVector subset) /* get latest current subset */ CSubset* latest=m_active_subsets_stack->get_last_element(); + CMath::display_vector(latest->m_subset_idx.vector, latest->m_subset_idx.vlen, "latest"); /* create new index vector */ SGVector new_active_subset=SGVector(subset.vlen); @@ -65,7 +89,10 @@ void CSubsetStack::add_subset(SGVector subset) /* using the latest current subset, transform all indices by the latest * added subset (dynamic programming greets you) */ for (index_t i=0; im_subset_idx[subset.vector[i]]; + { + new_active_subset.vector[i]= + latest->m_subset_idx.vector[subset.vector[i]]; + } /* replace active subset */ m_active_subset=new CSubset(new_active_subset);