Go to the documentation of this file.00001 #include <stdio.h>
00002 #include <string.h>
00003
00004 #include <shogun/mathematics/Math.h>
00005 #include <shogun/lib/config.h>
00006 #include <shogun/io/SGIO.h>
00007 #include <shogun/structure/SegmentLoss.h>
00008 #include <shogun/base/SGObject.h>
00009
00010
00011 using namespace shogun;
00012
00013 CSegmentLoss::CSegmentLoss()
00014 :CSGObject(),
00015 m_segment_loss_matrix(1,1),
00016 m_segment_loss(1,1,2),
00017 m_segment_ids(NULL),
00018 m_segment_mask(NULL),
00019 m_num_segment_types(0)
00020 {
00021 }
00022 CSegmentLoss::~CSegmentLoss()
00023 {
00024 }
00025
00026 void CSegmentLoss::set_segment_loss(float64_t* segment_loss, int32_t m, int32_t n)
00027 {
00028
00029 if (2*m!=n)
00030 SG_ERROR( "segment_loss should be 2 x quadratic matrix: %i!=%i\n", 2*m, n) ;
00031
00032 m_num_segment_types = m;
00033
00034 m_segment_loss.set_array(segment_loss, m, n/2, 2, true, true) ;
00035 }
00036
00037 void CSegmentLoss::set_segment_ids(CDynamicArray<int32_t>* segment_ids)
00038 {
00039 m_segment_ids = segment_ids;
00040 }
00041
00042 void CSegmentLoss::set_segment_mask(CDynamicArray<float64_t>* segment_mask)
00043 {
00044 m_segment_mask = segment_mask;
00045 }
00046
00047 void CSegmentLoss::compute_loss(int32_t* all_pos, int32_t len)
00048 {
00049 #ifdef DEBUG
00050 SG_PRINT("compute loss: len: %i, m_num_segment_types: %i\n", len, m_num_segment_types);
00051 SG_PRINT("m_segment_mask->element(0):%f \n", m_segment_mask->element(0));
00052 SG_PRINT("m_segment_ids->element(0):%i \n", m_segment_ids->element(0));
00053 #endif
00054 ASSERT(m_segment_ids->get_dim1()==len);
00055 ASSERT(m_segment_mask->get_dim1()==len);
00056
00057 m_segment_loss_matrix.resize_array(m_num_segment_types,len);
00058
00059 for (int seg_type=0; seg_type<m_num_segment_types; seg_type++)
00060 {
00061 float32_t value = 0;
00062 int32_t last_id = -1;
00063 int32_t last_pos = all_pos[len-1];
00064 for (int pos=len-1;pos>=0; pos--)
00065 {
00066 int32_t cur_id = m_segment_ids->element(pos);
00067 if (cur_id!=last_id)
00068 {
00069
00070 value += m_segment_mask->element(pos)*m_segment_loss.element(cur_id, seg_type, 0);
00071 last_id = cur_id;
00072 }
00073
00074 value += m_segment_mask->element(pos)*m_segment_loss.element(cur_id, seg_type, 1)*(last_pos-all_pos[pos]);
00075 last_pos = all_pos[pos];
00076 m_segment_loss_matrix.element(seg_type, pos)=value;
00077 }
00078 }
00079 #ifdef DEBUG
00080 m_segment_loss_matrix.display_array();
00081 #endif
00082 }
00083