Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <shogun/evaluation/SplittingStrategy.h>
00012 #include <shogun/labels/Labels.h>
00013
00014 using namespace shogun;
00015
00016 CSplittingStrategy::CSplittingStrategy()
00017 {
00018 init();
00019 }
00020
00021 CSplittingStrategy::CSplittingStrategy(CLabels* labels, int32_t num_subsets)
00022 {
00023 init();
00024
00025 m_num_subsets=num_subsets;
00026
00027
00028 if (labels->get_num_labels()<num_subsets)
00029 {
00030 SG_ERROR("Only %d labels for %d subsets!\n", labels->get_num_labels(),
00031 num_subsets);
00032 }
00033
00034 m_labels=labels;
00035 SG_REF(m_labels);
00036
00037 reset_subsets();
00038 }
00039
00040 void CSplittingStrategy::reset_subsets()
00041 {
00042 if (m_subset_indices)
00043 SG_UNREF(m_subset_indices);
00044
00045 m_subset_indices=new CDynamicObjectArray();
00046 SG_REF(m_subset_indices);
00047
00048
00049 for (index_t i=0; i<m_num_subsets; ++i)
00050 m_subset_indices->append_element(new CDynamicArray<index_t> ());
00051
00052 m_is_filled=false;
00053 }
00054
00055 void CSplittingStrategy::init()
00056 {
00057 m_labels=NULL;
00058 m_subset_indices=NULL;
00059 SG_REF(m_subset_indices);
00060 m_is_filled=false;
00061 m_num_subsets=0;
00062
00063 m_parameters->add((CSGObject**)m_labels, "labels", "Labels for subsets");
00064 m_parameters->add((CSGObject**)m_subset_indices, "subset_indices",
00065 "Set of sets of subset indices");
00066 m_parameters->add(&m_is_filled, "is_filled", "Whether ther are index sets");
00067 m_parameters->add(&m_num_subsets, "num_subsets", "Number of index sets");
00068 }
00069
00070 CSplittingStrategy::~CSplittingStrategy()
00071 {
00072 SG_UNREF(m_labels);
00073 SG_UNREF(m_subset_indices);
00074 }
00075
00076 SGVector<index_t> CSplittingStrategy::generate_subset_indices(index_t subset_idx)
00077 {
00078 if (!m_is_filled)
00079 {
00080 SG_ERROR("Call %s::build_subsets() before accessing them! If this error"
00081 " stays, its an implementation error of %s::build_subsets()\n",
00082 get_name(), get_name());
00083 }
00084
00085
00086 CDynamicArray<index_t>* to_copy=(CDynamicArray<index_t>*)
00087 m_subset_indices->get_element_safe(subset_idx);
00088
00089 index_t num_elements=to_copy->get_num_elements();
00090 SGVector<index_t> result(num_elements, true);
00091
00092
00093 memcpy(result.vector, to_copy->get_array(), sizeof(index_t)*num_elements);
00094
00095 SG_UNREF(to_copy);
00096
00097 return result;
00098 }
00099
00100 SGVector<index_t> CSplittingStrategy::generate_subset_inverse(index_t subset_idx)
00101 {
00102 if (!m_is_filled)
00103 {
00104 SG_ERROR("Call %s::build_subsets() before accessing them! If this error"
00105 " stays, its an implementation error of %s::build_subsets()\n",
00106 get_name(), get_name());
00107 }
00108
00109 CDynamicArray<index_t>* to_invert=(CDynamicArray<index_t>*)
00110 m_subset_indices->get_element_safe(subset_idx);
00111
00112 SGVector<index_t> result(
00113 m_labels->get_num_labels()-to_invert->get_num_elements(), true);
00114
00115 index_t index=0;
00116 for (index_t i=0; i<m_labels->get_num_labels(); ++i)
00117 {
00118
00119 if (to_invert->find_element(i)==-1)
00120 result.vector[index++]=i;
00121 }
00122
00123 SG_UNREF(to_invert);
00124
00125 return result;
00126 }
00127
00128 index_t CSplittingStrategy::get_num_subsets() const
00129 {
00130 return m_subset_indices->get_num_elements();
00131 }