SegmentLoss.cpp

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/lib/Array.h>
00009 #include <shogun/lib/Array2.h>
00010 #include <shogun/lib/Array3.h>
00011 #include <shogun/base/SGObject.h> 
00012 //# define DEBUG
00013 
00014 using namespace shogun;
00015 
00016 CSegmentLoss::CSegmentLoss()
00017     :CSGObject(),
00018     m_segment_loss_matrix(1,1),
00019     m_segment_loss(1,1,2),
00020     m_segment_ids(NULL),
00021     m_segment_mask(NULL),
00022     m_num_segment_types(0)
00023 {
00024 }
00025 CSegmentLoss::~CSegmentLoss()
00026 {
00027 }
00028 
00029 void CSegmentLoss::set_segment_loss(float64_t* segment_loss, int32_t m, int32_t n)
00030 {
00031     // here we need two matrices. Store it in one: 2N x N
00032     if (2*m!=n)
00033         SG_ERROR( "segment_loss should be 2 x quadratic matrix: %i!=%i\n", 2*m, n) ;
00034 
00035     m_num_segment_types = m;
00036 
00037     m_segment_loss.set_array(segment_loss, m, n/2, 2, true, true) ;
00038 }
00039 
00040 void CSegmentLoss::set_segment_ids(CArray<int32_t>* segment_ids)
00041 {
00042     m_segment_ids = segment_ids;
00043 }
00044 
00045 void CSegmentLoss::set_segment_mask(CArray<float64_t>* segment_mask)
00046 {
00047     m_segment_mask = segment_mask;
00048 }
00049 
00050 void CSegmentLoss::compute_loss(int32_t* all_pos, int32_t len)
00051 {
00052 #ifdef DEBUG
00053     SG_PRINT("compute loss: len: %i, m_num_segment_types: %i\n", len, m_num_segment_types);
00054     SG_PRINT("m_segment_mask->element(0):%f \n", m_segment_mask->element(0));
00055     SG_PRINT("m_segment_ids->element(0):%i \n", m_segment_ids->element(0));
00056 #endif
00057     ASSERT(m_segment_ids->get_dim1()==len);
00058     ASSERT(m_segment_mask->get_dim1()==len);
00059 
00060     m_segment_loss_matrix.resize_array(m_num_segment_types,len);
00061 
00062     for (int seg_type=0; seg_type<m_num_segment_types; seg_type++)
00063     {
00064         float32_t value = 0;
00065         int32_t last_id = -1;
00066         int32_t last_pos = all_pos[len-1];
00067         for (int pos=len-1;pos>=0; pos--)
00068         {
00069             int32_t cur_id = m_segment_ids->element(pos);
00070             if (cur_id!=last_id)
00071             {
00072                 // segment contribution
00073                 value += m_segment_mask->element(pos)*m_segment_loss.element(cur_id, seg_type, 0);
00074                 last_id = cur_id;
00075             }
00076             //length contribution (nucleotide loss)
00077             value += m_segment_mask->element(pos)*m_segment_loss.element(cur_id, seg_type, 1)*(last_pos-all_pos[pos]);
00078             last_pos = all_pos[pos];
00079             m_segment_loss_matrix.element(seg_type, pos)=value;
00080         }
00081     }
00082 #ifdef DEBUG 
00083     m_segment_loss_matrix.display_array();  
00084 #endif
00085 }
00086 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

SHOGUN Machine Learning Toolbox - Documentation