in src/nv-wavenet/nv_wavenet_reference.cpp [297:333]
void nvWavenetReference::run(int num_samples, int batch_size, int* yOut) {
Matrix zeroMatrixR(m_R,batch_size,false);
for (int row=0; row<m_R; row++) {
for (int col=0; col<batch_size; col++) {
zeroMatrixR.set(row,col,0.f);
}
}
Matrix zeroMatrixS(m_S,batch_size,false);
for (int row=0; row<m_S; row++) {
for (int col=0; col<batch_size; col++) {
zeroMatrixS.set(row,col,0.f);
}
}
for (int sample=0; sample<num_samples; sample++) {
nvWavenetEmbed(m_yInPrev, m_yInCur, *m_embeddingsPrev, *m_embeddingsCur, *m_Xt[sample][0]);
int dilation = 1;
for (int l=0; l<m_numLayers; l++) {
Matrix* Xtmd = (sample < dilation) ? &zeroMatrixR : m_Xt[sample-dilation][l];
dilation *=2;
if (dilation > m_maxDilation) dilation = 1;
Matrix* skipIn = (l==0) ? &zeroMatrixS : m_skipOut[l-1];
nvWavenetLayer(m_R, batch_size, *m_Wprev[l], *m_Wcur[l], *m_Bh[l], *m_Lh[sample][l], *m_Wres[l], *m_Bres[l], *m_Wskip[l], *m_Bskip[l], *Xtmd, *m_Xt[sample][l], *m_Xt[sample][l+1], *skipIn, *m_skipOut[l], l==m_numLayers-1, sample);
}
nvWavenetFinal(*m_Wzs, *m_Bzs, *m_Wza, *m_Bza, *m_Wzi, *m_Bzi,
*m_skipOut[m_numLayers-1], *m_Xt[sample][0], *m_LhFinal[sample], *m_Zs, *m_Za, *m_P, sample, *m_Skip2);
std::vector<int> yOut_sample(batch_size);
nvWavenetSelect(sample, *m_P, *m_outputSelectors, yOut_sample);
for (int b=0; b<batch_size; b++) {
m_yInPrev[b] = m_yInCur[b];
m_yInCur[b] = yOut_sample[b];
yOut[b*num_samples + sample] = yOut_sample[b];
}
}
m_lastSample = num_samples-1;
}