void CosSimVecMatLayer::backward(const UpdateCallback& callback) { CHECK_EQ(backward_.size(), 1UL) << "Only one forward function needed"; MatrixPtr inV0 = getInputValue(0); MatrixPtr inV1 = getInputValue(1); MatrixPtr inG0 = getInputGrad(0); MatrixPtr inG1 = getInputGrad(1); MatrixPtr outV = getOutputValue(); MatrixPtr outG = getOutputGrad(); size_t batchSize = inV0->getHeight(); CHECK(inV0 && inV1 && inG0 && inG1 && outV && outG); REGISTER_TIMER_INFO("BwCosVMTimer", getName().c_str()); for (size_t i = 0; i < batchSize; i++) { tmpRow0->setData(inV0->rowBuf(i)); tmpRow1->setData(inG0->rowBuf(i)); tmpMtx0->setData(inV1->rowBuf(i)); tmpMtx1->setData(inG1->rowBuf(i)); tmpRow2->setData(outV->rowBuf(i)); tmpRow3->setData(outG->rowBuf(i)); BufferArgs inputs; BufferArgs outputs; inputs.addArg(*tmpRow3); inputs.addArg(*tmpRow2); inputs.addArg(*tmpMtx0); inputs.addArg(*tmpRow0); outputs.addArg(*tmpMtx1, ADD_TO); outputs.addArg(*tmpRow1, ADD_TO); backward_[0]->calc(inputs, outputs); } }
void PowerLayer::forward(PassType passType) { Layer::forward(passType); MatrixPtr inV0 = getInputValue(0); MatrixPtr inV1 = getInputValue(1); size_t batchSize = inV1->getHeight(); size_t dataDim = inV1->getWidth(); CHECK_EQ(getSize(), dataDim); CHECK_EQ(1U, inV0->getWidth()); CHECK_EQ(batchSize, inV0->getHeight()); { REGISTER_TIMER_INFO("FwResetTimer", getName().c_str()); reserveOutput(batchSize, dataDim); } MatrixPtr outV = getOutputValue(); { REGISTER_TIMER_INFO("FwPowerTimer", getName().c_str()); outV->rowPow(0, *inV1, *inV0); } }
void CosSimVecMatLayer::forward(PassType passType) { Layer::forward(passType); CHECK_EQ(forward_.size(), 1UL) << "Only one forward function needed"; MatrixPtr inV0 = getInputValue(0); MatrixPtr inV1 = getInputValue(1); size_t batchSize = inV0->getHeight(); size_t numKeys = getSize(); CHECK_EQ(batchSize, inV1->getHeight()); { REGISTER_TIMER_INFO("FwResetTimer", getName().c_str()); reserveOutput(batchSize, numKeys); } MatrixPtr outV = getOutputValue(); CHECK(outV && inV0 && inV1); REGISTER_TIMER_INFO("FwCosVMTimer", getName().c_str()); for (size_t i = 0; i < batchSize; i++) { tmpRow0->setData(inV0->rowBuf(i)); tmpMtx0->setData(inV1->rowBuf(i)); tmpRow2->setData(outV->rowBuf(i)); BufferArgs inputs; BufferArgs outputs; inputs.addArg(*tmpMtx0); inputs.addArg(*tmpRow0); outputs.addArg(*tmpRow2, ASSIGN_TO); forward_[0]->calc(inputs, outputs); } }
void InterpolationLayer::backward(const UpdateCallback& callback) { MatrixPtr outG = getOutputGrad(); MatrixPtr weightV = getInputValue(0); MatrixPtr inV1 = getInputValue(1); MatrixPtr inV2 = getInputValue(2); MatrixPtr inG0 = getInputGrad(0); MatrixPtr inG1 = getInputGrad(1); MatrixPtr inG2 = getInputGrad(2); size_t batchSize = inV1->getHeight(); size_t dataDim = inV1->getWidth(); REGISTER_TIMER_INFO("BwInterpTimer", getName().c_str()); if (inG0) { Matrix::resizeOrCreate(tmpMatrix, batchSize, dataDim, false, useGpu_); // inG0 += outG .* (inV1 - inV2) tmpMatrix->sub(*inV1, *inV2); inG0->rowDotMul(0, *outG, *tmpMatrix); } if (inG1) { // inG1 += outG * weight inG1->addRowScale(0, *outG, *weightV); } if (inG2) { // inG2 += outG * weightLast inG2->addRowScale(0, *outG, *weightLast_); } }
void CosSimLayer::forward(PassType passType) { Layer::forward(passType); /* malloc memory for the output_ if necessary */ int batchSize = getInputValue(0)->getHeight(); int size = getSize(); CHECK_EQ(forward_.size(), 1UL) << "Only one forward function needed"; { REGISTER_TIMER_INFO("CosFwResetTimer", getName().c_str()); reserveOutput(batchSize, size); } MatrixPtr outV = getOutputValue(); /* activation */ { REGISTER_TIMER_INFO("CosFwAtvTimer", getName().c_str()); MatrixPtr prevOut1 = getInputValue(0); MatrixPtr prevOut2 = getInputValue(1); CHECK(outV && prevOut1 && prevOut2); BufferArgs inputs; BufferArgs outputs; inputs.addArg(*prevOut1); inputs.addArg(*prevOut2); outputs.addArg(*outV, ASSIGN_TO); forward_[0]->calc(inputs, outputs); } }
void InterpolationLayer::forward(PassType passType) { Layer::forward(passType); MatrixPtr weightV = getInputValue(0); MatrixPtr inV1 = getInputValue(1); MatrixPtr inV2 = getInputValue(2); size_t batchSize = inV1->getHeight(); size_t dataDim = inV1->getWidth(); CHECK_EQ(dataDim, getSize()); CHECK_EQ(dataDim, inV2->getWidth()); CHECK_EQ(batchSize, inV1->getHeight()); CHECK_EQ(batchSize, inV2->getHeight()); { REGISTER_TIMER_INFO("FwResetTimer", getName().c_str()); resetOutput(batchSize, dataDim); } MatrixPtr outV = getOutputValue(); Matrix::resizeOrCreate(weightLast_, batchSize, 1, false, useGpu_); weightLast_->one(); weightLast_->sub(*weightV); REGISTER_TIMER_INFO("FwInterpTimer", getName().c_str()); // outV = inV1 * weight + inV2 * weightLast outV->addRowScale(0, *inV1, *weightV); outV->addRowScale(0, *inV2, *weightLast_); }
void PowerLayer::backward(const UpdateCallback& callback) { MatrixPtr inV0 = getInputValue(0); MatrixPtr inV1 = getInputValue(1); MatrixPtr inG0 = getInputGrad(0); MatrixPtr inG1 = getInputGrad(1); MatrixPtr outV = getOutputValue(); MatrixPtr outG = getOutputGrad(); size_t batchSize = inV1->getHeight(); size_t dataDim = inV1->getWidth(); { REGISTER_TIMER_INFO("BwPowerTimer", getName().c_str()); Matrix::resizeOrCreate(tmpMtx, batchSize, dataDim, false, useGpu_); if (inG0) { tmpMtx->log2(*inV1); tmpMtx->dotMul(*tmpMtx, *outV); // inG0 += outG .* (log(inV1) * outV) inG0->rowDotMul(0, *outG, *tmpMtx); } if (inG1) { // tmp = (outV / inV1) * inV0 tmpMtx->dotDiv(*outV, *inV1); tmpMtx->rowScale(0, *tmpMtx, *inV0); inG1->addDotMul(*outG, *tmpMtx, 1, 1); } } }
void MultiplexLayer::forward(PassType passType) { Layer::forward(passType); IVectorPtr copyIds = getInput(0).ids; MatrixPtr inV1 = getInputValue(1); CHECK_EQ(copyIds->getSize(), inV1->getHeight()); for (size_t i = 2; i < inputLayers_.size(); i++) { CHECK_EQ(inV1->getHeight(), getInputValue(i)->getHeight()); CHECK_EQ(inV1->getWidth(), getInputValue(i)->getWidth()); } calculateCopySchedule(copyIds, inputLayers_.size() - 1); { REGISTER_TIMER_INFO("FwResetTimer", getName().c_str()); reserveOutput(inV1->getHeight(), inV1->getWidth()); } MatrixPtr outV = getOutputValue(); { REGISTER_TIMER_INFO("FwLMultplexingTimer", getName().c_str()); AsyncGpuBlock block; for (const CopyInfo& info : copySchedule_) { outV->subMatrix(info.startIdx, info.length, tmpDest_) ->copyFrom(*getInputValue(info.copyIdx + 1) ->subMatrix(info.startIdx, info.length, tmpSrc_)); } } /* activation */ { REGISTER_TIMER_INFO("FwAtvTimer", getName().c_str()); forwardActivation(); } }
void ScaleSubRegionLayer::forward(PassType passType) { Layer::forward(passType); auto in0 = getInput(0); imgH_ = in0.getFrameHeight(); imgW_ = in0.getFrameWidth(); if (imgH_ == 0 || imgW_ == 0) { auto& conf = config_.inputs(0).scale_sub_region_conf(); imgH_ = conf.image_conf().img_size_y(); imgW_ = conf.image_conf().img_size(); } MatrixPtr imgV = in0.value; size_t batchSize = imgV->getHeight(); size_t spatialSize = imgH_ * imgW_; channelsNum_ = imgV->getWidth() / spatialSize; shape_ = TensorShape({batchSize, channelsNum_, imgH_, imgW_}); resetOutput(batchSize, imgV->getWidth()); auto& out = getOutput(); out.setFrameHeight(imgH_); out.setFrameWidth(imgW_); MatrixPtr indicesV = getInputValue(1); indicesShape_ = TensorShape({batchSize, 6}); REGISTER_TIMER_INFO("ScaleSubRegionForward", getName().c_str()); BufferArgs inArgs; BufferArgs outArgs; inArgs.addArg(*imgV, shape_); inArgs.addArg(*indicesV, indicesShape_); outArgs.addArg(*out.value, shape_, ASSIGN_TO); forward_[0]->calc(inArgs, outArgs); }
void Delay::refresh() { yReg = storedValues[0]; for (int i=0; i<delayTime-1; i++) storedValues[ i ] = storedValues[ i + 1 ]; storedValues[ delayTime - 1 ] = getInputValue(0) ; }
void Bai2::dung() { a=getInputValue(QString::fromUtf8("Nhập vào a:")); ui->pushButtonA->setText(QString::number(a)); b=getInputValue(QString::fromUtf8("Nhập vào b:")); ui->pushButtonB->setText(QString::number(b)); int x=thuatToanEuclid(a,b); ui->pushButtonX->setText(QString::number(x)); /* ui->pushButtonA->show(); ui->pushButtonB->show(); ui->pushButtonX->show(); ui->label->show(); ui->label_2->show(); ui->label_3->show();*/ }
void DeConv3DLayer::backward(const UpdateCallback &callback) { backwardActivation(); int batchSize = getOutputGrad()->getHeight(); if (biases_ && biases_->getWGrad()) { bpropBiases(); biases_->getParameterPtr()->incUpdate(callback); } REGISTER_TIMER_INFO("BwdDeConv3D", getName().c_str()); for (size_t i = 0; i < inputLayers_.size(); ++i) { if (weights_[i]->getWGrad() || this->needGradient_) { int M = M_[i]; int N = N_[i]; int K = K_[i]; Matrix::resizeOrCreate(colBuf_, K * groups_[i], N, false, useGpu_); const MatrixPtr &inMat = getInputValue(i); for (int n = 0; n < batchSize; ++n) { colBuf_->vol2Col( getOutputGrad()->getData() + n * getOutputGrad()->getStride(), numFilters_, imgSizeD_[i], imgSizeH_[i], imgSizeW_[i], filterSizeZ_[i], filterSizeY_[i], filterSize_[i], strideZ_[i], strideY_[i], stride_[i], paddingZ_[i], paddingY_[i], padding_[i]); if (weights_[i]->getWGrad()) { real *inData = inMat->getData() + n * inMat->getStride(); for (int g = 0; g < groups_[i]; ++g) { MatrixPtr colBufDataSub = colBuf_->subMatrix(g * K, K); MatrixPtr wGradMatSub = weights_[i]->getWGrad()->subMatrix(g * K, K); MatrixPtr inMatSub = Matrix::create(inData, M, N, false, useGpu_); wGradMatSub->mul( *colBufDataSub, *(inMatSub->getTranspose()), 1.0, 1.0); inData += M * N; } } if (getInputGrad(i)) { real *preGrad = getInputGrad(i)->getData() + n * getInputGrad(i)->getStride(); for (int g = 0; g < groups_[i]; ++g) { MatrixPtr w = weights_[i]->getW()->subMatrix(g * K, K); MatrixPtr outGradMat = colBuf_->subMatrix(g * K, K); MatrixPtr inGradMatSub = Matrix::create(preGrad, M, N, false, useGpu_); inGradMatSub->mul(*(w->getTranspose()), *outGradMat, 1.0, 1.0); preGrad += M * N; } } } weights_[i]->getParameterPtr()->incUpdate(callback); } } }
void HierarchicalSigmoidLayer::backward(const UpdateCallback& callback) { IVectorPtr label = getInput(*getLabelLayer()).ids; preOutput_.grad->one(); preOutput_.grad->softreluDerivative(*preOutput_.value); preOutput_.grad->subByBitCode(numClasses_, *label); if (biases_ && biases_->getWGrad()) { preOutput_.grad->addByBitCodeBackward( numClasses_, *label, *biases_->getWGrad()); /* Increasing the number of gradient */ biases_->getParameterPtr()->incUpdate(callback); } for (size_t i = 0; i < inputLayers_.size() - 1; ++i) { /* Calculate the W-gradient for the current layer */ MatrixPtr input = getInputValue(i); if (weights_[i]->getWGrad()) { preOutput_.grad->mulByBitCodeBackwardWeight( numClasses_, *label, *weights_[i]->getWGrad(), *input); /* Increasing the number of gradient */ weights_[i]->getParameterPtr()->incUpdate(callback); } /* Calculate the input layers error */ MatrixPtr inputGrad = getInputGrad(i); if (inputGrad) { preOutput_.grad->mulByBitCodeBackwardError( numClasses_, *label, *weights_[i]->getW(), *inputGrad); } } }
void backwardOneInput(int layerId, const UpdateCallback& callback) { const MatrixPtr& inputMat = getInputValue(layerId); const MatrixPtr& inputGradMat = getInputGrad(layerId); const MatrixPtr& weightMat = weights_[layerId]->getW(); const MatrixPtr& weightGradMat = weights_[layerId]->getWGrad(); int dim = inputMat->getWidth(); real* sampleGrad = sampleOut_.grad->getData(); if (weightGradMat) { for (size_t i = 0; i < samples_.size(); ++i) { axpy(dim, sampleGrad[i], inputMat->getRowBuf(samples_[i].sampleId), weightGradMat->getRowBuf(samples_[i].labelId)); } weights_[layerId]->incUpdate(callback); } if (inputGradMat) { for (size_t i = 0; i < samples_.size(); ++i) { axpy(dim, sampleGrad[i], weightMat->getRowBuf(samples_[i].labelId), inputGradMat->getRowBuf(samples_[i].sampleId)); } } }
void BlockExpandLayer::forward(PassType passType) { Layer::forward(passType); size_t batchSize = inputLayers_[0]->getOutputValue()->getHeight(); size_t blockNum = getBlockNum(); size_t blockSize = blockH_ * blockW_ * channels_; resetOutput(blockNum * batchSize, blockSize); // calculate output_.value inputShape_ = TensorShape({batchSize, channels_, imgSizeH_, imgSizeW_}); outputShape_ = TensorShape({batchSize, blockNum, blockSize}); BufferArgs inputs; BufferArgs outputs; inputs.addArg(*getInputValue(0), inputShape_); outputs.addArg(*getOutputValue(), outputShape_, ASSIGN_TO); forward_[0]->calc(inputs, outputs); // calculate output_.sequenceStartPositions and output_.cpuSequenceDims Argument& out = getOutput(); ICpuGpuVector::resizeOrCreate( out.sequenceStartPositions, batchSize + 1, false); IVector::resizeOrCreate(out.cpuSequenceDims, 2 * batchSize, false); int* start = out.sequenceStartPositions->getMutableData(false); int* dims = out.cpuSequenceDims->getData(); for (size_t i = 0; i < batchSize; i++) { start[i] = i * blockNum; dims[2 * i] = outputH_; dims[2 * i + 1] = outputW_; } start[batchSize] = batchSize * blockNum; }
void forward(PassType passType) override { Layer::forward(passType); CHECK(!useGpu_) << "GPU is not supported"; if (!prepared_) { if (passType == PASS_GC) { ThreadLocalRandomEngine::get().seed(ThreadLocalRand::getDefaultSeed()); } prepareSamples(); } prepared_ = false; /* malloc memory for the output_ if necessary */ int batchSize = getInputValue(0)->getHeight(); int size = getSize(); resetOutput(batchSize, size); Matrix::resizeOrCreate(sampleOut_.value, 1, samples_.size(), /* trans= */ false, useGpu_); forwardBias(); for (int l = 0; l < numInputs_; ++l) { forwardOneInput(l); } auto status = activation_->forward(sampleOut_); status.check(); forwardCost(); }
void GeomMorpherController::update(osg::NodeVisitor *nv, osg::Drawable *drawable) { osgAnimation::MorphGeometry* morphGeom = static_cast<osgAnimation::MorphGeometry*>(drawable); if (hasInput()) { if (mKeyFrames.size() <= 1) return; float input = getInputValue(nv); int i = 0; for (std::vector<FloatInterpolator>::iterator it = mKeyFrames.begin()+1; it != mKeyFrames.end(); ++it,++i) { float val = 0; if (!(*it).empty()) val = it->interpKey(input); val = std::max(0.f, std::min(1.f, val)); osgAnimation::MorphGeometry::MorphTarget& target = morphGeom->getMorphTarget(i); if (target.getWeight() != val) { target.setWeight(val); morphGeom->dirty(); } } } // morphGeometry::transformSoftwareMethod() done in cull callback i.e. only for visible morph geometries }
void FlipController::apply(osg::StateSet* stateset, osg::NodeVisitor* nv) { if (hasInput() && mDelta != 0) { int curTexture = int(getInputValue(nv) / mDelta) % mTextures.size(); stateset->setTextureAttribute(mTexSlot, mTextures[curTexture]); } }
double getTxFees(std::string txid) { uint256 hash; hash.SetHex(txid); CTransaction tx; uint256 hashBlock = 0; if (!GetTransaction(hash, tx, hashBlock)) return 0.0001; CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION); ssTx << tx; double value = 0; double buffer = 0; for (unsigned int i = 0; i < tx.vout.size(); i++) { const CTxOut& txout = tx.vout[i]; buffer = value + convertCoins(txout.nValue); value = buffer; } double value0 = 0; double buffer0 = 0; double swp=0; for (unsigned int i = 0; i < tx.vin.size(); i++) { uint256 hash0; const CTxIn& vin = tx.vin[i]; hash0.SetHex(vin.prevout.hash.ToString()); CTransaction wtxPrev; uint256 hashBlock0 = 0; if (!GetTransaction(hash0, wtxPrev, hashBlock0)) return 0; CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION); ssTx << wtxPrev; const CScript target = wtxPrev.vout[vin.prevout.n].scriptPubKey; swp =convertCoins(getInputValue(wtxPrev, target)); buffer0 = value0 + convertCoins(getInputValue(wtxPrev, target)); value0 = buffer0; } return value0 - value; }
void ScaleSubRegionLayer::backward(const UpdateCallback& callback) { REGISTER_TIMER_INFO("ScaleSubRegionBackward", getName().c_str()); BufferArgs inArgs; BufferArgs outArgs; inArgs.addArg(*getOutputGrad(), shape_); inArgs.addArg(*getInputValue(1), indicesShape_); outArgs.addArg(*getInputGrad(0), shape_, ADD_TO); backward_[0]->calc(inArgs, outArgs); }
void VisController::operator() (osg::Node* node, osg::NodeVisitor* nv) { if (hasInput()) { bool vis = calculate(getInputValue(nv)); // Leave 0x1 enabled for UpdateVisitor, so we can make ourselves visible again in the future from this update callback node->setNodeMask(vis ? ~0 : 0x1); } traverse(node, nv); }
//------------------------------------------------------------------------------ // isInputValueValid() -- returns true if the input value is valid. //------------------------------------------------------------------------------ bool NumericReadout::isInputValueValid() const { bool ok = true; const double val = getInputValue(); if ( (minValid != base::UNDEFINED_VALUE && val < minValid) || (maxValid != base::UNDEFINED_VALUE && val > maxValid) ) { ok = false; } return ok; }
void ParticleSystemController::operator() (osg::Node* node, osg::NodeVisitor* nv) { if (hasInput()) { osgParticle::ParticleProcessor* emitter = static_cast<osgParticle::ParticleProcessor*>(node); float time = getInputValue(nv); emitter->setEnabled(time >= mEmitStart && time < mEmitStop); } traverse(node, nv); }
void HierarchicalSigmoidLayer::forward(PassType passType) { Layer::forward(passType); /* malloc memory for the output_ if necessary */ int batchSize = getInputValue(0)->getHeight(); int size = getSize(); reserveOutput(batchSize, size); Matrix::resizeOrCreate(preOutput_.value, batchSize, codeLength_, /* trans */ false, useGpu(deviceId_)); Matrix::resizeOrCreate(preOutput_.grad, batchSize, codeLength_, /* trans */ false, useGpu(deviceId_)); IVectorPtr label = getInput(*getLabelLayer()).ids; preOutput_.value->zeroMem(); /* add the bias-vector */ if (biases_.get() != NULL) { preOutput_.value->addByBitCode(numClasses_, *label, *biases_->getW()); } for (size_t i = 0; i < inputLayers_.size() - 1; ++i) { MatrixPtr input = getInputValue(i); preOutput_.value->mulByBitCode( numClasses_, *label, *weights_[i]->getW(), *input); } // keep consistent with the clipping in the following softrelu preOutput_.value->clip(-40.0, 40.0); preOutput_.value->sumByBitCode(numClasses_, *label, *output_.value, -1); // scaleSum preOutput_.value->softrelu(*preOutput_.value); MatrixPtr sum = Matrix::create(batchSize, 1, /* trans= */ false, useGpu(deviceId_)); preOutput_.value->rowSum(*sum); output_.value->add(*sum); }
void MaterialColorController::apply(osg::StateSet *stateset, osg::NodeVisitor *nv) { if (hasInput()) { osg::Vec3f value = mData.interpKey(getInputValue(nv)); osg::Material* mat = static_cast<osg::Material*>(stateset->getAttribute(osg::StateAttribute::MATERIAL)); osg::Vec4f diffuse = mat->getDiffuse(osg::Material::FRONT_AND_BACK); diffuse.set(value.x(), value.y(), value.z(), diffuse.a()); mat->setDiffuse(osg::Material::FRONT_AND_BACK, diffuse); } }
void AlphaController::apply(osg::StateSet *stateset, osg::NodeVisitor *nv) { if (hasInput()) { float value = mData.interpKey(getInputValue(nv)); osg::Material* mat = static_cast<osg::Material*>(stateset->getAttribute(osg::StateAttribute::MATERIAL)); osg::Vec4f diffuse = mat->getDiffuse(osg::Material::FRONT_AND_BACK); diffuse.a() = value; mat->setDiffuse(osg::Material::FRONT_AND_BACK, diffuse); } }
void MovingAverage::refresh() // l'implementazione è un po' inefficiente, si può migliorare con un indice del prossimo elemento da sostituire { yReg = 0; for (int i=0; i<dim-1; i++) { storedValues[i] = storedValues[i+1]; yReg += storedValues[i+1]; } yReg += (storedValues[dim - 1] = getInputValue(0)); yReg /= dim; }
void ExpandLayer::forward(PassType passType) { Layer::forward(passType); // Expand layer should have exactly 2 input, one for data, one for size CHECK_EQ(2U, inputLayers_.size()); // using two input: // * first one for data; // * second one only for sequence info const Argument& shapeInput = getInput(1); const Argument& dataInput = getInput(0); size_t outputBatchSize = shapeInput.getBatchSize(); auto startPositions = type_ ? shapeInput.subSequenceStartPositions : shapeInput.sequenceStartPositions; size_t numSequences = startPositions->getSize() - 1; const int* starts = startPositions->getData(false); CHECK_EQ(starts[numSequences], shapeInput.getBatchSize()); if (type_) { // when trans_type = seq, input[1] must hasSubseq CHECK_EQ(shapeInput.hasSubseq(), 1UL); CHECK_EQ(dataInput.getNumSequences(), shapeInput.getNumSequences()); } else { CHECK_EQ(dataInput.getBatchSize(), shapeInput.getNumSequences()); } // set output sequence info as shape sequence output_.sequenceStartPositions = shapeInput.sequenceStartPositions; if (shapeInput.hasSubseq()) { output_.subSequenceStartPositions = shapeInput.subSequenceStartPositions; } // reserve output: Expand output to batchsize of sequence data. reserveOutput(outputBatchSize, dataInput.value->getWidth()); MatrixPtr inputValue = getInputValue(0); MatrixPtr outputValue = getOutputValue(); ICpuGpuVector::resizeOrCreate(expandStartsPos_, outputBatchSize, false); int* expandStarts = expandStartsPos_->getMutableData(false); for (size_t sequenceId = 0; sequenceId < numSequences; ++sequenceId) { int sequenceLength = starts[sequenceId + 1] - starts[sequenceId]; for (int j = 0; j < sequenceLength; j++) { expandStarts[starts[sequenceId] + j] = sequenceId; } } outputValue->copyByRowIndex(*inputValue, *expandStartsPos_->getVector(useGpu_)); if (biases_.get() != NULL) { outputValue->addBias(*(biases_->getW()), 1); } }
void KeyframeController::operator() (osg::Node* node, osg::NodeVisitor* nv) { if (hasInput()) { osg::MatrixTransform* trans = static_cast<osg::MatrixTransform*>(node); osg::Matrix mat = trans->getMatrix(); float time = getInputValue(nv); NodeUserData* userdata = static_cast<NodeUserData*>(trans->getUserDataContainer()->getUserObject(0)); Nif::Matrix3& rot = userdata->mRotationScale; bool setRot = false; if(!mRotations.empty()) { mat.setRotate(mRotations.interpKey(time)); setRot = true; } else if (!mXRotations.empty() || !mYRotations.empty() || !mZRotations.empty()) { mat.setRotate(getXYZRotation(time)); setRot = true; } else { // no rotation specified, use the previous value from the UserData for (int i=0;i<3;++i) for (int j=0;j<3;++j) mat(j,i) = rot.mValues[i][j]; // NB column/row major difference } if (setRot) // copy the new values back to the UserData for (int i=0;i<3;++i) for (int j=0;j<3;++j) rot.mValues[i][j] = mat(j,i); // NB column/row major difference float& scale = userdata->mScale; if(!mScales.empty()) scale = mScales.interpKey(time); for (int i=0;i<3;++i) for (int j=0;j<3;++j) mat(i,j) *= scale; if(!mTranslations.empty()) mat.setTrans(mTranslations.interpKey(time)); trans->setMatrix(mat); } traverse(node, nv); }
void forwardOneInput(int layerId) { const MatrixPtr& inputMat = getInputValue(layerId); const MatrixPtr& weightMat = weights_[layerId]->getW(); int dim = inputMat->getWidth(); real* sampleOut = sampleOut_.value->getData(); for (size_t i = 0; i < samples_.size(); ++i) { sampleOut[i] += dotProduct(dim, inputMat->getRowBuf(samples_[i].sampleId), weightMat->getRowBuf(samples_[i].labelId)); } }