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 "ConcatRowsVariable.h"
00044
#include "SubMatVariable.h"
00045
00046
namespace PLearn {
00047
using namespace std;
00048
00049
00050
00053
PLEARN_IMPLEMENT_OBJECT(ConcatRowsVariable,
00054
"Concatenation of the rows of several variables",
00055
"NO HELP");
00056
00057 ConcatRowsVariable::ConcatRowsVariable(
const VarArray& vararray)
00058 :
inherited(vararray.nonNull(), vararray.sumOfLengths(), vararray.maxWidth())
00059 {
00060
build_();
00061 }
00062
00063
void
00064 ConcatRowsVariable::build()
00065 {
00066 inherited::build();
00067
build_();
00068 }
00069
00070
void
00071 ConcatRowsVariable::build_()
00072 {
00073
00074
if (varray->
length()) {
00075
int w = varray[0]->width();
00076
for (
int i = 1; i < varray.size(); i++)
00077
if (w != varray[i]->width())
00078
PLERROR(
"ConcatRowsVariable: all non-null variables must have the same width");
00079 }
00080 }
00081
00082
00083 void ConcatRowsVariable::recomputeSize(
int& l,
int& w)
const
00084
{
00085
if (varray) {
00086 l = varray.
sumOfLengths();
00087 w = varray.
maxWidth();
00088 }
else
00089 l = w = 0;
00090 }
00091
00092
00093 void ConcatRowsVariable::fprop()
00094 {
00095
int k=0;
00096
for (
int n=0; n<varray.
size(); n++) {
00097
Var vn = varray[n];
00098
for (
int i=0; i<vn->nelems(); i++,
k++)
00099 valuedata[
k] = vn->valuedata[i];
00100 }
00101 }
00102
00103
00104 void ConcatRowsVariable::bprop()
00105 {
00106
int k=0;
00107
for (
int n=0; n<varray.
size(); n++) {
00108
Var vn = varray[n];
00109
for (
int i=0; i<vn->nelems(); i++,
k++)
00110 vn->gradientdata[i] += gradientdata[
k];
00111 }
00112 }
00113
00114
00115 void ConcatRowsVariable::symbolicBprop()
00116 {
00117
int k=0;
00118
for (
int n=0; n<varray.
size(); n++) {
00119
Var vn = varray[n];
00120 vn->accg(
new SubMatVariable(g,
k, 0, vn->
length(),
width()));
00121
k += vn->
length();
00122 }
00123 }
00124
00125
00126 void ConcatRowsVariable::rfprop()
00127 {
00128
if (rValue.
length()==0)
resizeRValue();
00129
int k=0;
00130
for (
int n=0; n<varray.
size(); n++) {
00131
Var vn = varray[n];
00132
for (
int i=0; i<vn->nelems(); i++,
k++)
00133 rvaluedata[
k] = vn->rvaluedata[i];
00134 }
00135 }
00136
00137 }
00138
00139