00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
#include "ExtendedVariable.h"
00044 
#include "SubMatVariable.h"
00045 
00046 
namespace PLearn {
00047 
using namespace std;
00048 
00049 
00050 
00053 
PLEARN_IMPLEMENT_OBJECT(ExtendedVariable,
00054                         
"Variable that extends the input variable by appending rows at "
00055                         
"its top and bottom and columns at its left and right.",
00056                         
"NO HELP");
00057 
00058 ExtendedVariable::ExtendedVariable(
Variable* input, 
int the_top_extent, 
int the_bottom_extent,
00059                                    
int the_left_extent, 
int the_right_extent, 
real the_fill_value)
00060   : 
inherited(input, input->length()+the_top_extent+the_bottom_extent, input->width()+the_left_extent+the_right_extent),
00061     top_extent(the_top_extent), bottom_extent(the_bottom_extent), 
00062     left_extent(the_left_extent), right_extent(the_right_extent),
00063     fill_value(the_fill_value)
00064 {
00065     
build_();
00066 }
00067 
00068 
void
00069 ExtendedVariable::build()
00070 {
00071     inherited::build();
00072     
build_();
00073 }
00074 
00075 
void
00076 ExtendedVariable::build_()
00077 {
00078     
if(
top_extent<0 || 
bottom_extent<0 || 
left_extent<0 || 
right_extent<0)
00079         
PLERROR(
"In ExtendedVariable: given extents must be >=0");
00080     
for(
int k=0; 
k<
nelems(); 
k++)
00081         valuedata[
k] = 
fill_value;
00082 }
00083 
00084 
void
00085 ExtendedVariable::declareOptions(
OptionList &ol)
00086 {
00087     
declareOption(ol, 
"top_extent", &ExtendedVariable::top_extent, OptionBase::buildoption, 
"");
00088     
declareOption(ol, 
"bottom_extent", &ExtendedVariable::bottom_extent, OptionBase::buildoption, 
"");
00089     
declareOption(ol, 
"left_extent", &ExtendedVariable::left_extent, OptionBase::buildoption, 
"");
00090     
declareOption(ol, 
"right_extent", &ExtendedVariable::right_extent, OptionBase::buildoption, 
"");
00091     
declareOption(ol, 
"fill_value", &ExtendedVariable::fill_value, OptionBase::buildoption, 
"");
00092     inherited::declareOptions(ol);
00093 }
00094 
00095 void ExtendedVariable::recomputeSize(
int& l, 
int& w)
 const
00096 
{
00097     
if (input) {
00098         l = input->
length() + 
top_extent + 
bottom_extent;
00099         w = input->
width() + 
left_extent + 
right_extent;
00100     } 
else
00101         l = w = 0;
00102 }
00103 
00104 void ExtendedVariable::fprop()
00105 {
00106   
if(
width()==input->
width()) 
00107     {
00108       
real* data = valuedata+
top_extent*
width();
00109       
for(
int k=0; 
k<input->nelems(); 
k++)
00110         data[
k] = input->valuedata[
k];
00111     }
00112   
else 
00113     {
00114       
real* rowdata=valuedata+
top_extent*
width()+
left_extent;
00115       
int inputk=0;
00116       
for(
int i=0; i<input->
length(); i++)
00117         {
00118           
for(
int j=0; j<input->
width(); j++)
00119             rowdata[j] = input->valuedata[inputk++];
00120           rowdata += 
width();
00121         }
00122     }
00123 }
00124 
00125 
00126 void ExtendedVariable::bprop()
00127 {
00128   
if(
width()==input->
width()) 
00129     {
00130       
real* data = gradientdata+
top_extent*
width();
00131       
for(
int k=0; 
k<input->nelems(); 
k++)
00132         input->gradientdata[
k] += data[
k];
00133     }
00134   
else 
00135     {
00136       
real* rowdata = gradientdata+
top_extent*
width()+
left_extent;
00137       
int inputk = 0;
00138       
for(
int i=0; i<input->
length(); i++)
00139         {
00140           
for(
int j=0; j<input->
width(); j++)
00141             input->gradientdata[inputk++] += rowdata[j]; 
00142           rowdata += 
width();
00143         }
00144     }
00145 }
00146 
00147 
00148 void ExtendedVariable::symbolicBprop()
00149 {
00150   input->accg(
new SubMatVariable(g,
top_extent,
left_extent,input->
length(),input->
width()));
00151 }
00152 
00153 
00154 void ExtendedVariable::rfprop()
00155 {
00156   
if (rValue.
length()==0) 
resizeRValue();
00157   
if(
width()==input->
width()) 
00158     {
00159       
real* data = rvaluedata+
top_extent*
width();
00160       
for(
int k=0; 
k<input->nelems(); 
k++)
00161         data[
k] = input->rvaluedata[
k];
00162     }
00163   
else 
00164     {
00165       
real* rowdata=rvaluedata+
top_extent*
width()+
left_extent;
00166       
int inputk=0;
00167       
for(
int i=0; i<input->
length(); i++)
00168         {
00169           
for(
int j=0; j<input->
width(); j++)
00170             rowdata[j] = input->rvaluedata[inputk++];
00171           rowdata += 
width();
00172         }
00173     }
00174 }
00175 
00176 } 
00177 
00178