SHOGUN
v2.0.0
|
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 //# define DEBUG 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 // here we need two matrices. Store it in one: 2N x N 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 // segment contribution 00070 value += m_segment_mask->element(pos)*m_segment_loss.element(cur_id, seg_type, 0); 00071 last_id = cur_id; 00072 } 00073 //length contribution (nucleotide loss) 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