1#ifndef TMVA_SOFIE_ROPERATOR_LSTM
2#define TMVA_SOFIE_ROPERATOR_LSTM
104 if (std::is_same<T, float>::value) {
107 throw std::runtime_error(
108 "TMVA SOFIE Encountered unsupported type parsing a LSTM operator");
150 std::vector<std::vector<size_t>>
173 std::vector<std::string>
GetBlasRoutines()
override {
return { std::string(
"Gemm"), std::string(
"Axpy") }; }
188 if (fAttrLayout == 0) {
209 if (!model.CheckIfTensorAlreadyExist(fNX)) {
210 throw std::runtime_error(
"TMVA SOFIE LSTM Op input tensor " + fNX +
" is not found in model.");
212 fShapeX = model.GetTensorShape(fNX);
213 if (fShapeX.size() != 3) {
214 throw std::runtime_error(
"TMVA SOFIE LSTM Op input tensor " + fNX +
" is not of 3 dimensions.");
216 if (!model.CheckIfTensorAlreadyExist(fNW)) {
217 throw std::runtime_error(
"TMVA SOFIE LSTM Op input tensor " + fNW +
" is not found in model.");
219 fShapeW = model.GetTensorShape(fNW);
220 if (fShapeW.size() != 3) {
221 throw std::runtime_error(
"TMVA SOFIE LSTM Op input tensor " + fNW +
" is not of 3 dimensions.");
223 if (!model.CheckIfTensorAlreadyExist(fNR)) {
224 throw std::runtime_error(
"TMVA SOFIE LSTM Op input tensor " + fNR +
" is not found in model.");
226 fShapeR = model.GetTensorShape(fNR);
227 if (fShapeR.size() != 3) {
228 throw std::runtime_error(
"TMVA SOFIE LSTM Op input tensor " + fNR +
" is not of 3 dimensions.");
231 if (!model.CheckIfTensorAlreadyExist(fNB)) {
232 throw std::runtime_error(
"TMVA SOFIE LSTM op input tensor " + fNB +
" is not found in model.");
234 fShapeB = model.GetTensorShape(fNB);
235 if (fShapeB.size() != 2 && fShapeB.size() != 5) {
236 throw std::runtime_error(
"TMVA SOFIE LSTM op input tensor " + fNB +
" is not of 2 or 5 dimensions.");
238 if (fShapeB.size() == 2) {
242 size_t seq_length = (fAttrLayout == 0) ? fShapeX[0] : fShapeX[1];
243 size_t batch_size = (fAttrLayout == 0) ? fShapeX[1] : fShapeX[0];
244 if (fType ==
"float") {
248 std::vector<float>
sum(fAttrHiddenSize);
251 for (
size_t h = 0;
h < fAttrHiddenSize;
h++) {
267 fShapeB = model.GetTensorShape(fNB);
271 if (!fNSequence_lens.empty()) {
272 if (!model.CheckIfTensorAlreadyExist(fNSequence_lens)) {
273 throw std::runtime_error(
"TMVA SOFIE LSTM Op input tensor " + fNSequence_lens +
"is not found in model.");
275 fShapeSequence_lens = model.GetTensorShape(fNSequence_lens);
276 if (fShapeSequence_lens.size() != 1) {
277 throw std::runtime_error(
"TMVA SOFIE LSTM Op input tensor " + fNSequence_lens +
" is not of 1 dimension.");
280 if (!fNInitial_h.empty()) {
281 if (!model.CheckIfTensorAlreadyExist(fNInitial_h)) {
282 throw std::runtime_error(
"TMVA SOFIE LSTM Op input tensor " + fNInitial_h +
" is not found in model.");
284 fShapeInitial_h = model.GetTensorShape(fNInitial_h);
285 if (fShapeInitial_h.size() != 3) {
286 throw std::runtime_error(
"TMVA SOFIE LSTM Op input tensor " + fNInitial_h +
" is not of 3 dimensions.");
289 if (!fNInitial_c.empty()) {
290 if (!model.CheckIfTensorAlreadyExist(fNInitial_c)) {
291 throw std::runtime_error(
"TMVA SOFIE LSTM Op input tensor " + fNInitial_c +
" is not found in model.");
293 fShapeInitial_c = model.GetTensorShape(fNInitial_c);
294 if (fShapeInitial_c.size() != 3) {
295 throw std::runtime_error(
"TMVA SOFIE LSTM Op input tensor " + fNInitial_c +
" is not of 3 dimensions.");
299 if (!model.CheckIfTensorAlreadyExist(fNP)) {
300 throw std::runtime_error(
"TMVA SOFIE LSTM op input tensor " + fNP +
" is not found in model.");
302 fShapeP = model.GetTensorShape(fNP);
303 if (fShapeP.size() != 2 && fShapeP.size() != 4) {
304 throw std::runtime_error(
"TMVA SOFIE LSTM op input tensor " + fNP +
" is not of 2 or 4 dimensions.");
306 if (fShapeP.size() == 2) {
310 size_t batch_size = (fAttrLayout == 0) ? fShapeX[1] : fShapeX[0];
311 if (fType ==
"float") {
325 std::shared_ptr<void>
new_p_ptr(
new_p, std::default_delete<
float[]>());
327 fShapeP = model.GetTensorShape(fNP);
332 fShapeY = ShapeInference({fShapeX, fShapeW})[0];
333 if (!model.CheckIfTensorAlreadyExist(fNY)) {
334 model.AddIntermediateTensor(fNY, model.GetTensorType(fNX), fShapeY);
337 if (!fNY_h.empty()) {
338 fShapeY_h = ShapeInference({fShapeX, fShapeW})[1];
339 if (!model.CheckIfTensorAlreadyExist(fNY_h)) {
340 model.AddIntermediateTensor(fNY_h, model.GetTensorType(fNX), fShapeY_h);
343 if (!fNY_c.empty()) {
344 fShapeY_c = ShapeInference({fShapeX, fShapeW})[2];
345 if (!model.CheckIfTensorAlreadyExist(fNY_c)) {
346 model.AddIntermediateTensor(fNY_c, model.GetTensorType(fNX), fShapeY_c);
354 throw std::runtime_error(
"TMVA SOFIE - Activation function " +
activation +
" not implemented");
357 if (fAttrDirection !=
"forward" && fAttrDirection !=
"backward" && fAttrDirection !=
"bidirectional") {
358 throw std::runtime_error(
"TMVA SOFIE - Invalid LSTM direction fAttrDirection = " + fAttrDirection);
360 if (4 * fAttrHiddenSize != fShapeW[1]) {
361 throw std::runtime_error(
"TMVA SOFIE - fAttrHiddenSize must be equal to " + std::to_string(fShapeW[1] / 4));
363 if (fAttrInputForget > 1) {
364 throw std::runtime_error(
"TMVA SOFIE - fAttrInputForget = " + std::to_string(fAttrInputForget) +
367 if (fAttrLayout > 1) {
368 throw std::runtime_error(
"TMVA SOFIE - Layout fAttrLayout = " + std::to_string(fAttrLayout) +
369 " must be 0 (timewise) or 1 (batchwise)");
371 if (fAttrActivations.empty()) {
372 if (fAttrDirection ==
"bidirectional") {
373 fAttrActivations = {
"Sigmoid",
"Tanh",
"Tanh",
"Sigmoid",
"Tanh",
"Tanh"};
375 fAttrActivations = {
"Sigmoid",
"Tanh",
"Tanh"};
385 std::stringstream out;
388 size_t seq_length = (fAttrLayout == 0) ? fShapeX[0] : fShapeX[1];
389 size_t batch_size = (fAttrLayout == 0) ? fShapeX[1] : fShapeX[0];
390 size_t input_size = fShapeX[2];
397 std::vector<Block>
blocks;
403 if (fAttrLayout != 0) {
413 if (fAttrInputForget == 0)
420 if (fAttrInputForget == 0)
428 if (fAttrLayout != 0 || fNY.empty()) {
439 out <<
"std::vector<" << fType <<
"> fVec_" <<
opName <<
"_buffer = std::vector<" << fType <<
">(" <<
total_size
445 out << fType <<
"* fVec_" <<
opName <<
"_" <<
b.name <<
" = fVec_" <<
opName <<
"_buffer.data() + " <<
offset
459 std::stringstream out;
461 size_t seq_length = (fAttrLayout == 0) ? fShapeX[0] : fShapeX[1];
462 size_t batch_size = (fAttrLayout == 0) ? fShapeX[1] : fShapeX[0];
463 size_t input_size = fShapeX[2];
467 if (fAttrLayout == 0) {
468 out <<
SP << fType <<
" const *" <<
OpName <<
"_input = tensor_" << fNX <<
";\n";
470 out <<
SP << fType <<
" * " <<
OpName <<
"_input = this->fVec_" <<
OpName <<
"_input;\n";
472 out <<
SP <<
"for(size_t seq = 0; seq < " <<
seq_length <<
"; seq++) {\n";
473 out <<
SP <<
SP <<
"for(size_t batch = 0; batch < " <<
batch_size <<
"; batch++) {\n";
474 out <<
SP <<
SP <<
SP <<
"for(size_t i = 0; i < " << input_size <<
"; i++) {\n";
476 <<
" + i] = " <<
"tensor_" << fNX <<
"[batch * " <<
seq_length * input_size <<
" + seq * " << input_size
478 out <<
SP <<
SP <<
SP <<
"}\n";
479 out <<
SP <<
SP <<
"}\n";
484 if (!fNInitial_h.empty()) {
485 if (fAttrLayout == 0) {
486 out <<
SP << fType <<
" const*" <<
OpName <<
"_initial_hidden_state = " <<
" tensor_" << fNInitial_h <<
";\n";
488 out <<
SP << fType <<
" const* " <<
OpName <<
"_initial_hidden_state = this->fVec_" <<
OpName
489 <<
"_initial_hidden_state;\n";
492 out <<
SP <<
"for(size_t batch = 0; batch < " <<
batch_size <<
"; batch++) {\n";
493 out <<
SP <<
SP <<
"for(size_t h = 0; h < " << fAttrHiddenSize <<
"; h++) {\n";
495 <<
" + batch * " << fAttrHiddenSize <<
" + h] = tensor_" << fNInitial_h <<
"[batch * "
497 out <<
SP <<
SP <<
"}\n";
504 if (!fNInitial_c.empty()) {
505 if (fAttrLayout == 0) {
506 out <<
SP << fType <<
" const*" <<
OpName <<
"_initial_cell_state = " <<
" tensor_" << fNInitial_c <<
";\n";
508 out <<
SP << fType <<
" const* " <<
OpName <<
"_initial_cell_state = this->fVec_" <<
OpName
509 <<
"_initial_cell_state;\n";
512 out <<
SP <<
"for(size_t batch = 0; batch < " <<
batch_size <<
"; batch++) {\n";
513 out <<
SP <<
SP <<
"for(size_t h = 0; h < " << fAttrHiddenSize <<
"; h++) {\n";
515 <<
" + batch * " << fAttrHiddenSize <<
" + h] = tensor_" << fNInitial_c <<
"[batch * "
517 out <<
SP <<
SP <<
"}\n";
524 out <<
SP << fType <<
" * " <<
OpName <<
"_ff_input_gate = this->fVec_" <<
OpName <<
"_ff_input_gate;\n";
525 out <<
SP << fType <<
" * " <<
OpName <<
"_ff_output_gate = this->fVec_" <<
OpName <<
"_ff_output_gate;\n";
526 out <<
SP << fType <<
" * " <<
OpName <<
"_ff_cell_gate = this->fVec_" <<
OpName <<
"_ff_cell_gate;\n";
527 if (fAttrInputForget == 0) {
528 out <<
SP << fType <<
" * " <<
OpName <<
"_ff_forget_gate = this->fVec_" <<
OpName <<
"_ff_forget_gate;\n";
531 out <<
SP << fType <<
" * " <<
OpName <<
"_input_gate = this->fVec_" <<
OpName <<
"_input_gate;\n";
532 out <<
SP << fType <<
" * " <<
OpName <<
"_output_gate = this->fVec_" <<
OpName <<
"_output_gate;\n";
533 out <<
SP << fType <<
" * " <<
OpName <<
"_cell_gate = this->fVec_" <<
OpName <<
"_cell_gate;\n";
534 if (fAttrInputForget == 0) {
535 out <<
SP << fType <<
" * " <<
OpName <<
"_forget_gate = this->fVec_" <<
OpName <<
"_forget_gate;\n";
538 out <<
SP << fType <<
" * " <<
OpName <<
"_cell_state = this->fVec_" <<
OpName <<
"_cell_state;\n";
539 out <<
SP << fType <<
" * " <<
OpName <<
"_new_cell_state = this->fVec_" <<
OpName <<
"_new_cell_state;\n";
542 if (fAttrLayout == 0 && !fNY.empty()) {
543 out <<
SP << fType <<
" *" <<
OpName <<
"_hidden_state = tensor_" << fNY <<
";\n";
545 out <<
SP << fType <<
" * " <<
OpName <<
"_hidden_state = this->fVec_" <<
OpName <<
"_hidden_state;\n";
548 out <<
SP <<
"char " <<
OpName <<
"_transA = 'N';\n";
549 out <<
SP <<
"char " <<
OpName <<
"_transB = 'T';\n";
551 out <<
SP <<
"int " <<
OpName <<
"_n = " << fAttrHiddenSize <<
";\n";
552 out <<
SP <<
"int " <<
OpName <<
"_k = " << input_size <<
";\n";
553 if (fType ==
"float") {
554 out <<
SP << fType <<
" " <<
OpName <<
"_alpha = 1.;\n";
555 out <<
SP << fType <<
" " <<
OpName <<
"_beta = 0.;\n";
559 out <<
SP <<
"int " <<
OpName <<
"_incx = 1;\n";
560 out <<
SP <<
"int " <<
OpName <<
"_incy = 1;\n";
564 std::stringstream
ss;
566 <<
"_m, &" <<
OpName <<
"_k, &" <<
OpName <<
"_alpha, tensor_" << fNW;
578 if (fType ==
"float") {
582 size_t wo_offset = fAttrHiddenSize * input_size;
585 size_t wc_offset = 3 * fAttrHiddenSize * input_size;
589 if (fType ==
"float") {
591 out <<
SP <<
emit_sgemm(
"ff_input_gate", 4 * fAttrHiddenSize * input_size);
593 size_t wo_offset = 4 * fAttrHiddenSize * input_size + 1 * fAttrHiddenSize * input_size;
596 size_t wc_offset = 4 * fAttrHiddenSize * input_size + 3 * fAttrHiddenSize * input_size;
600 if (fAttrInputForget == 0) {
603 if (fType ==
"float") {
604 size_t wf_offset = 2 * fAttrHiddenSize * input_size;
608 if (fType ==
"float") {
609 size_t wf_offset = 4 * fAttrHiddenSize * input_size + 2 * fAttrHiddenSize * input_size;
618 if (fType ==
"float") {
620 out <<
SP <<
"BLAS::saxpy_(&" <<
OpName <<
"_bias_size, &" <<
OpName <<
"_alpha, tensor_" << fNB <<
", &"
624 out <<
SP <<
"BLAS::saxpy_(&" <<
OpName <<
"_bias_size, &" <<
OpName <<
"_alpha, tensor_" << fNB <<
" + "
629 out <<
SP <<
"BLAS::saxpy_(&" <<
OpName <<
"_bias_size, &" <<
OpName <<
"_alpha, tensor_" << fNB <<
" + "
634 if (fType ==
"float") {
637 out <<
SP <<
"BLAS::saxpy_(&" <<
OpName <<
"_bias_size, &" <<
OpName <<
"_alpha, tensor_" << fNB <<
" + "
643 out <<
SP <<
"BLAS::saxpy_(&" <<
OpName <<
"_bias_size, &" <<
OpName <<
"_alpha, tensor_" << fNB <<
" + "
649 out <<
SP <<
"BLAS::saxpy_(&" <<
OpName <<
"_bias_size, &" <<
OpName <<
"_alpha, tensor_" << fNB <<
" + "
654 if (fAttrInputForget == 0) {
657 if (fType ==
"float") {
659 out <<
SP <<
"BLAS::saxpy_(&" <<
OpName <<
"_bias_size, &" <<
OpName <<
"_alpha, tensor_" << fNB
664 if (fType ==
"float") {
667 out <<
SP <<
"BLAS::saxpy_(&" <<
OpName <<
"_bias_size, &" <<
OpName <<
"_alpha, tensor_" << fNB
677 out <<
SP <<
"for (size_t seq = 0; seq < " <<
seq_length <<
"; seq++) {\n";
678 out <<
SP <<
SP <<
"size_t ff_offset = seq * " <<
batch_size * fAttrHiddenSize <<
";\n";
686 out <<
SP <<
SP <<
"std::copy(" <<
OpName <<
"_ff_input_gate + ff_offset, " <<
OpName
687 <<
"_ff_input_gate + ff_offset + " <<
ff_seq_size <<
", " <<
OpName <<
"_input_gate + gate_offset);\n";
688 out <<
SP <<
SP <<
"std::copy(" <<
OpName <<
"_ff_output_gate + ff_offset, " <<
OpName
689 <<
"_ff_output_gate + ff_offset + " <<
ff_seq_size <<
", " <<
OpName <<
"_output_gate + gate_offset);\n";
690 out <<
SP <<
SP <<
"std::copy(" <<
OpName <<
"_ff_cell_gate + ff_offset, " <<
OpName
691 <<
"_ff_cell_gate + ff_offset + " <<
ff_seq_size <<
", " <<
OpName <<
"_cell_gate + gate_offset);\n";
692 if (fAttrInputForget == 0) {
693 out <<
SP <<
SP <<
"std::copy(" <<
OpName <<
"_ff_forget_gate + ff_offset, " <<
OpName
694 <<
"_ff_forget_gate + ff_offset + " <<
ff_seq_size <<
", " <<
OpName <<
"_forget_gate + gate_offset);\n";
698 out <<
SP <<
"for (size_t seq = 0; seq < " <<
seq_length <<
"; seq++) {\n";
699 if (fAttrDirection ==
"backward" ||
direction == 1) {
700 out <<
SP <<
SP <<
"size_t index = " <<
seq_length - 1 <<
" - seq;\n";
702 out <<
SP <<
SP <<
"size_t index = seq;\n";
713 out <<
SP <<
SP <<
"if (seq == 0) {\n";
714 if (!fNInitial_h.empty()) {
716 if (fType ==
"float") {
718 <<
"_n, &m2, &" <<
OpName <<
"_n, &" <<
OpName <<
"_alpha, tensor_" << fNR <<
", &" <<
OpName
719 <<
"_n, " <<
OpName <<
"_initial_hidden_state, &" <<
OpName <<
"_n, &" <<
OpName <<
"_alpha, "
720 <<
OpName <<
"_input_gate + offset, &" <<
OpName <<
"_n);\n";
721 size_t ro_offset = fAttrHiddenSize * fAttrHiddenSize;
725 <<
"_alpha, " <<
OpName <<
"_output_gate + offset, &" <<
OpName <<
"_n);\n";
726 size_t rc_offset = 3 * fAttrHiddenSize * fAttrHiddenSize;
730 <<
"_alpha, " <<
OpName <<
"_cell_gate + offset, &" <<
OpName <<
"_n);\n";
731 if (fAttrInputForget == 0) {
732 size_t rf_offset = 2 * fAttrHiddenSize * fAttrHiddenSize;
733 out <<
SP <<
SP <<
SP <<
"BLAS::sgemm_(&" <<
OpName <<
"_transB, &" <<
OpName <<
"_transA, &"
734 <<
OpName <<
"_n, &m2, &" <<
OpName <<
"_n, &" <<
OpName <<
"_alpha, tensor_" << fNR <<
" + "
736 <<
"_n, &" <<
OpName <<
"_alpha, " <<
OpName <<
"_forget_gate + offset, &" <<
OpName <<
"_n);\n";
740 if (fType ==
"float") {
741 size_t ri_offset = 4 * fAttrHiddenSize * fAttrHiddenSize;
745 <<
"_alpha, " <<
OpName <<
"_input_gate + offset, &" <<
OpName <<
"_n);\n";
746 size_t ro_offset = 4 * fAttrHiddenSize * fAttrHiddenSize + 1 * fAttrHiddenSize * fAttrHiddenSize;
750 <<
"_alpha, " <<
OpName <<
"_output_gate + offset, &" <<
OpName <<
"_n);\n";
751 size_t rc_offset = 4 * fAttrHiddenSize * fAttrHiddenSize + 3 * fAttrHiddenSize * fAttrHiddenSize;
755 <<
"_alpha, " <<
OpName <<
"_cell_gate + offset, &" <<
OpName <<
"_n);\n";
756 if (fAttrInputForget == 0) {
757 size_t rf_offset = 4 * fAttrHiddenSize * fAttrHiddenSize + 2 * fAttrHiddenSize * fAttrHiddenSize;
758 out <<
SP <<
SP <<
SP <<
"BLAS::sgemm_(&" <<
OpName <<
"_transB, &" <<
OpName <<
"_transA, &"
759 <<
OpName <<
"_n, &m2, &" <<
OpName <<
"_n, &" <<
OpName <<
"_alpha, tensor_" << fNR <<
" + "
761 <<
"_n, &" <<
OpName <<
"_alpha, " <<
OpName <<
"_forget_gate + offset, &" <<
OpName <<
"_n);\n";
766 out <<
SP <<
SP <<
"} else {\n";
769 if (fAttrDirection ==
"backward") {
770 out <<
SP <<
SP <<
SP <<
"size_t previous_offset = (index + 1) * "
773 out <<
SP <<
SP <<
SP <<
"size_t previous_offset = (seq - 1) * "
776 if (fType ==
"float") {
778 <<
"_n, &m2, &" <<
OpName <<
"_n, &" <<
OpName <<
"_alpha, tensor_" << fNR <<
", &" <<
OpName <<
"_n, "
780 <<
"_input_gate + offset, &" <<
OpName <<
"_n);\n";
781 size_t ro_offset = 1 * fAttrHiddenSize * fAttrHiddenSize;
784 <<
", &" <<
OpName <<
"_n, " <<
OpName <<
"_hidden_state + previous_offset, &" <<
OpName <<
"_n, &"
785 <<
OpName <<
"_alpha, " <<
OpName <<
"_output_gate + offset, &" <<
OpName <<
"_n);\n";
786 size_t rc_offset = 3 * fAttrHiddenSize * fAttrHiddenSize;
789 <<
", &" <<
OpName <<
"_n, " <<
OpName <<
"_hidden_state + previous_offset, &" <<
OpName <<
"_n, &"
791 if (fAttrInputForget == 0) {
792 size_t rf_offset = 2 * fAttrHiddenSize * fAttrHiddenSize;
795 <<
", &" <<
OpName <<
"_n, " <<
OpName <<
"_hidden_state + previous_offset, &" <<
OpName <<
"_n, &"
796 <<
OpName <<
"_alpha, " <<
OpName <<
"_forget_gate + offset, &" <<
OpName <<
"_n);\n";
800 out <<
SP <<
SP <<
SP <<
"size_t previous_offset = (index + 1) * "
802 if (fType ==
"float") {
803 size_t ri_offset = 4 * fAttrHiddenSize * fAttrHiddenSize;
806 <<
", &" <<
OpName <<
"_n, " <<
OpName <<
"_hidden_state + previous_offset, &" <<
OpName <<
"_n, &"
808 size_t ro_offset = 4 * fAttrHiddenSize * fAttrHiddenSize + fAttrHiddenSize * fAttrHiddenSize;
811 <<
", &" <<
OpName <<
"_n, " <<
OpName <<
"_hidden_state + previous_offset, &" <<
OpName <<
"_n, &"
812 <<
OpName <<
"_alpha, " <<
OpName <<
"_output_gate + offset, &" <<
OpName <<
"_n);\n";
813 size_t rc_offset = 4 * fAttrHiddenSize * fAttrHiddenSize + 3 * fAttrHiddenSize * fAttrHiddenSize;
816 <<
", &" <<
OpName <<
"_n, " <<
OpName <<
"_hidden_state + previous_offset, &" <<
OpName <<
"_n, &"
818 if (fAttrInputForget == 0) {
819 size_t rf_offset = 4 * fAttrHiddenSize * fAttrHiddenSize + 2 * fAttrHiddenSize * fAttrHiddenSize;
822 <<
", &" <<
OpName <<
"_n, " <<
OpName <<
"_hidden_state + previous_offset, &" <<
OpName <<
"_n, &"
823 <<
OpName <<
"_alpha, " <<
OpName <<
"_forget_gate + offset, &" <<
OpName <<
"_n);\n";
827 out <<
SP <<
SP <<
"}\n";
830 if (fAttrClip > .0) {
831 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
832 if (fType ==
"float") {
833 out <<
SP <<
SP <<
SP <<
"float x = (" <<
OpName <<
"_cell_gate[i] > " << -fAttrClip <<
") ? " <<
OpName
834 <<
"_cell_gate[i] : " << -fAttrClip <<
";\n";
836 out <<
SP <<
SP <<
SP <<
OpName <<
"_cell_gate[i] = (x < " << fAttrClip <<
") ? x : " << fAttrClip <<
";\n";
837 out <<
SP <<
SP <<
"}\n";
840 if (fAttrActivations[
direction * 3 + 1] ==
"Relu") {
841 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
842 out <<
SP <<
SP <<
SP <<
"if (" <<
OpName <<
"_cell_gate[i] < 0.)\n";
844 out <<
SP <<
SP <<
"}\n";
845 }
else if (fAttrActivations[
direction * 3 + 1] ==
"Tanh") {
846 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
847 if (fType ==
"float") {
848 out <<
SP <<
SP <<
SP <<
"float ex = exp(-2 * " <<
OpName <<
"_cell_gate[i]);\n";
850 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_cell_gate[i] = (1. - ex) / (1. + ex);\n";
851 out <<
SP <<
SP <<
"}\n";
852 }
else if (fAttrActivations[
direction * 3 + 1] ==
"Sigmoid") {
853 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
854 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_cell_gate[i] = 1. / (1. + exp(-" <<
OpName <<
"_cell_gate[i]));\n";
855 out <<
SP <<
SP <<
"}\n";
856 }
else if (fAttrActivations[
direction * 3 + 1] ==
"Affine") {
857 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
858 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_cell_gate[i] = " << fAttrActivationAlpha[
direction * 3 + 1] <<
" * "
859 <<
OpName <<
"_cell_gate[i] + " << fAttrActivationBeta[
direction * 3 + 1] <<
";\n";
860 out <<
SP <<
SP <<
"}\n";
861 }
else if (fAttrActivations[
direction * 3 + 1] ==
"ScaledTanh") {
862 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
863 if (fType ==
"float") {
864 out <<
SP <<
SP <<
SP <<
"float ex = exp(-2 * " << fAttrActivationBeta[
direction * 3 + 1] <<
" * " <<
OpName
865 <<
"_cell_gate[i]);\n";
868 <<
" * (1. - ex) / (1. + ex);\n";
869 out <<
SP <<
SP <<
"}\n";
870 }
else if (fAttrActivations[
direction * 3 + 1] ==
"HardSigmoid") {
871 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
872 if (fType ==
"float") {
874 <<
"_cell_gate[i] + " << fAttrActivationBeta[
direction * 3 + 1] <<
";\n";
875 out <<
SP <<
SP <<
SP <<
"float b = (a > 0.) ? a : 0.;\n";
877 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_cell_gate[i] = (b < 1.) ? b : 1.;\n";
878 out <<
SP <<
SP <<
"}\n";
879 }
else if (fAttrActivations[
direction * 3 + 1] ==
"LeakyRelu") {
880 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
881 out <<
SP <<
SP <<
SP <<
"if (" <<
OpName <<
"_cell_gate[i] < 0.)\n";
882 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_cell_gate[i] = " << fAttrActivationAlpha[
direction * 3 + 1] <<
" * "
883 <<
OpName <<
"_cell_gate[i];\n";
884 out <<
SP <<
SP <<
"}\n";
885 }
else if (fAttrActivations[
direction * 3 + 1] ==
"ThresholdRelu") {
886 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
887 out <<
SP <<
SP <<
SP <<
"if (" <<
OpName <<
"_cell_gate[i] < " << fAttrActivationAlpha[
direction * 3 + 1]
890 out <<
SP <<
SP <<
"}";
891 }
else if (fAttrActivations[
direction * 3 + 1] ==
"Elu") {
892 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
893 out <<
SP <<
SP <<
SP <<
"if (" <<
OpName <<
"_cell_gate[i] < 0.)\n";
895 <<
" * exp(" <<
OpName <<
"_cell_gate[i] - 1.);\n";
896 out <<
SP <<
SP <<
"}\n";
897 }
else if (fAttrActivations[
direction * 3 + 1] ==
"Softsign") {
898 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
900 <<
"_cell_gate[i]));\n";
901 out <<
SP <<
SP <<
"}\n";
903 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
904 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_cell_gate[i] = log(1. + exp(" <<
OpName <<
"_cell_gate[i]));\n";
905 out <<
SP <<
SP <<
"}\n";
911 out <<
SP <<
SP <<
"if (seq == 0) {\n";
912 if (!fNInitial_c.empty()) {
914 out <<
SP <<
SP <<
SP <<
"for (size_t i = 0; i < " <<
size <<
"; i++) {\n";
915 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_input_gate[i + offset] += tensor_" << fNP <<
"[i] * "
916 <<
OpName <<
"_initial_cell_state[i];\n";
917 out <<
SP <<
SP <<
SP <<
"}\n";
918 if (fAttrInputForget == 0) {
920 out <<
SP <<
SP <<
SP <<
"for (size_t i = 0; i < " <<
size <<
"; i++) {\n";
921 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_forget_gate[i + offset] += tensor_" << fNP <<
"[i + "
923 out <<
SP <<
SP <<
SP <<
"}\n";
928 out <<
SP <<
SP <<
SP <<
"for (size_t i = 0; i < " <<
size <<
"; i++) {\n";
929 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_input_gate[i + offset] += tensor_" << fNP <<
"[i + "
931 out <<
SP <<
SP <<
SP <<
"}\n";
932 if (fAttrInputForget == 0) {
934 out <<
SP <<
SP <<
SP <<
"for (size_t i = 0; i < " <<
size <<
"; i++) {\n";
935 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_forget_gate[i + offset] += tensor_" << fNP <<
"[i + "
937 out <<
SP <<
SP <<
SP <<
"}\n";
941 out <<
SP <<
SP <<
"} else {\n";
943 if (fAttrDirection ==
"backward") {
944 out <<
SP <<
SP <<
SP <<
"size_t c_offset = (index + 1) * "
947 out <<
SP <<
SP <<
SP <<
"size_t c_offset = (seq - 1) * "
950 out <<
SP <<
SP <<
SP <<
"for (size_t i = 0; i < " <<
size <<
"; i++) {\n";
951 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_input_gate[i + offset] += tensor_" << fNP <<
"[i] * " <<
OpName
952 <<
"_cell_state[i + c_offset];\n";
953 out <<
SP <<
SP <<
SP <<
"}\n";
954 if (fAttrInputForget == 0) {
956 out <<
SP <<
SP <<
SP <<
"for (size_t i = 0; i < " <<
size <<
"; i++) {\n";
957 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_forget_gate[i + offset] += tensor_" << fNP <<
"[i + "
959 out <<
SP <<
SP <<
SP <<
"}\n";
964 <<
" + " <<
batch_size * fAttrHiddenSize <<
";\n";
965 out <<
SP <<
SP <<
SP <<
"for (size_t i = 0; i < " <<
size <<
"; i++) {\n";
967 <<
"] * " <<
OpName <<
"_cell_state[i + c_offset];\n";
968 out <<
SP <<
SP <<
SP <<
"}\n";
969 if (fAttrInputForget == 0) {
971 out <<
SP <<
SP <<
SP <<
"for (size_t i = 0; i < " <<
size <<
"; i++) {\n";
972 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_forget_gate[i + offset] += tensor_" << fNP <<
"[i + "
974 out <<
SP <<
SP <<
SP <<
"}\n";
977 out <<
SP <<
SP <<
"}\n";
981 if (fAttrClip > .0) {
982 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
983 if (fType ==
"float") {
984 out <<
SP <<
SP <<
SP <<
"float x = (" <<
OpName <<
"_input_gate[i] > " << -fAttrClip <<
") ? " <<
OpName
985 <<
"_input_gate[i] : " << -fAttrClip <<
";\n";
987 out <<
SP <<
SP <<
SP <<
OpName <<
"_input_gate[i] = (x < " << fAttrClip <<
") ? x : " << fAttrClip <<
";\n";
988 out <<
SP <<
SP <<
"}\n";
991 if (fAttrActivations[
direction * 3] ==
"Relu") {
992 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
993 out <<
SP <<
SP <<
SP <<
"if (" <<
OpName <<
"_input_gate[i] < 0.)\n";
994 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_input_gate[i] = 0.;\n";
995 out <<
SP <<
SP <<
"}\n";
996 }
else if (fAttrActivations[
direction * 3] ==
"Tanh") {
997 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
998 if (fType ==
"float") {
999 out <<
SP <<
SP <<
SP <<
"float ex = exp(-2 * " <<
OpName <<
"_input_gate[i]);\n";
1001 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_input_gate[i] = (1. - ex) / (1. + ex);\n";
1002 out <<
SP <<
SP <<
"}\n";
1003 }
else if (fAttrActivations[
direction * 3] ==
"Sigmoid") {
1004 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1006 <<
"_input_gate[i]));\n";
1007 out <<
SP <<
SP <<
"}\n";
1008 }
else if (fAttrActivations[
direction * 3] ==
"Affine") {
1009 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1011 <<
OpName <<
"_input_gate[i] + " << fAttrActivationBeta[
direction * 3] <<
";\n";
1012 out <<
SP <<
SP <<
"}\n";
1013 }
else if (fAttrActivations[
direction * 3] ==
"ScaledTanh") {
1014 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1015 if (fType ==
"float") {
1016 out <<
SP <<
SP <<
SP <<
"float ex = exp(-2 * " << fAttrActivationBeta[
direction * 3] <<
" * " <<
OpName
1017 <<
"_input_gate[i]);\n";
1020 <<
" * (1. - ex) / (1. + ex);\n";
1021 out <<
SP <<
SP <<
"}\n";
1022 }
else if (fAttrActivations[
direction * 3] ==
"HardSigmoid") {
1023 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1024 if (fType ==
"float") {
1026 <<
"_input_gate[i] + " << fAttrActivationBeta[
direction * 3] <<
";\n";
1027 out <<
SP <<
SP <<
SP <<
"float b = (a > 0.) ? a : 0.;\n";
1029 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_input_gate[i] = (b < 1.) ? b : 1.;\n";
1030 out <<
SP <<
SP <<
"}\n";
1031 }
else if (fAttrActivations[
direction * 3] ==
"LeakyRelu") {
1032 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1033 out <<
SP <<
SP <<
SP <<
"if (" <<
OpName <<
"_input_gate[i] < 0.)\n";
1035 <<
OpName <<
"_input_gate[i];\n";
1036 out <<
SP <<
SP <<
"}\n";
1037 }
else if (fAttrActivations[
direction * 3] ==
"ThresholdRelu") {
1038 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1039 out <<
SP <<
SP <<
SP <<
"if (" <<
OpName <<
"_input_gate[i] < " << fAttrActivationAlpha[
direction * 3]
1041 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_input_gate[i] = 0.;\n";
1042 out <<
SP <<
SP <<
"}";
1043 }
else if (fAttrActivations[
direction * 3] ==
"Elu") {
1044 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1045 out <<
SP <<
SP <<
SP <<
"if (" <<
OpName <<
"_input_gate[i] < 0.)\n";
1047 <<
" * exp(" <<
OpName <<
"_input_gate[i] - 1.);\n";
1048 out <<
SP <<
SP <<
"}\n";
1049 }
else if (fAttrActivations[
direction * 3] ==
"Softsign") {
1050 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1051 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_input_gate[i] = " <<
OpName <<
"_input_gate[i] / (1. + abs("
1052 <<
OpName <<
"_input_gate[i]));\n";
1053 out <<
SP <<
SP <<
"}\n";
1055 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1056 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_input_gate[i] = log(1. + exp(" <<
OpName <<
"_input_gate[i]));\n";
1057 out <<
SP <<
SP <<
"}\n";
1060 if (fAttrInputForget == 0) {
1062 if (fAttrClip > .0) {
1063 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1064 if (fType ==
"float") {
1065 out <<
SP <<
SP <<
SP <<
"float x = (" <<
OpName <<
"_forget_gate[i] > " << -fAttrClip <<
") ? "
1066 <<
OpName <<
"_forget_gate[i] : " << -fAttrClip <<
";\n";
1068 out <<
SP <<
SP <<
SP <<
OpName <<
"_forget_gate[i] = (x < " << fAttrClip <<
") ? x : " << fAttrClip
1070 out <<
SP <<
SP <<
"}\n";
1073 if (fAttrActivations[
direction * 3] ==
"Relu") {
1074 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1075 out <<
SP <<
SP <<
SP <<
"if (" <<
OpName <<
"_forget_gate[i] < 0.)\n";
1076 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_forget_gate[i] = 0.;\n";
1077 out <<
SP <<
SP <<
"}\n";
1078 }
else if (fAttrActivations[
direction * 3] ==
"Tanh") {
1079 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1080 if (fType ==
"float") {
1081 out <<
SP <<
SP <<
SP <<
"float ex = exp(-2 * " <<
OpName <<
"_forget_gate[i]);\n";
1083 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_forget_gate[i] = (1. - ex) / (1. + ex);\n";
1084 out <<
SP <<
SP <<
"}\n";
1085 }
else if (fAttrActivations[
direction * 3] ==
"Sigmoid") {
1086 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1088 <<
"_forget_gate[i]));\n";
1089 out <<
SP <<
SP <<
"}\n";
1090 }
else if (fAttrActivations[
direction * 3] ==
"Affine") {
1091 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1093 <<
" * " <<
OpName <<
"_forget_gate[i] + " << fAttrActivationBeta[
direction * 3] <<
";\n";
1094 out <<
SP <<
SP <<
"}\n";
1095 }
else if (fAttrActivations[
direction * 3] ==
"ScaledTanh") {
1096 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1097 if (fType ==
"float") {
1098 out <<
SP <<
SP <<
SP <<
"float ex = exp(-2 * " << fAttrActivationBeta[
direction * 3] <<
" * " <<
OpName
1099 <<
"_forget_gate[i]);\n";
1102 <<
" * (1. - ex) / (1. + ex);\n";
1103 out <<
SP <<
SP <<
"}\n";
1104 }
else if (fAttrActivations[
direction * 3] ==
"HardSigmoid") {
1105 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1106 if (fType ==
"float") {
1108 <<
"_forget_gate[i] + " << fAttrActivationBeta[
direction * 3] <<
";\n";
1109 out <<
SP <<
SP <<
SP <<
"float b = (a > 0.) ? a : 0.;\n";
1111 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_forget_gate[i] = (b < 1.) ? b : 1.;\n";
1112 out <<
SP <<
SP <<
"}\n";
1113 }
else if (fAttrActivations[
direction * 3] ==
"LeakyRelu") {
1114 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1115 out <<
SP <<
SP <<
SP <<
"if (" <<
OpName <<
"_forget_gate[i] < 0.)\n";
1117 <<
" * " <<
OpName <<
"_forget_gate[i];\n";
1118 out <<
SP <<
SP <<
"}\n";
1119 }
else if (fAttrActivations[
direction * 3] ==
"ThresholdRelu") {
1120 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1121 out <<
SP <<
SP <<
SP <<
"if (" <<
OpName <<
"_forget_gate[i] < " << fAttrActivationAlpha[
direction * 3]
1123 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_forget_gate[i] = 0.;\n";
1124 out <<
SP <<
SP <<
"}";
1125 }
else if (fAttrActivations[
direction * 3] ==
"Elu") {
1126 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1127 out <<
SP <<
SP <<
SP <<
"if (" <<
OpName <<
"_forget_gate[i] < 0.)\n";
1129 <<
" * exp(" <<
OpName <<
"_forget_gate[i] - 1.);\n";
1130 out <<
SP <<
SP <<
"}\n";
1131 }
else if (fAttrActivations[
direction * 3] ==
"Softsign") {
1132 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1133 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_forget_gate[i] = " <<
OpName <<
"_forget_gate[i] / (1. + abs("
1134 <<
OpName <<
"_forget_gate[i]));\n";
1135 out <<
SP <<
SP <<
"}\n";
1137 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1139 <<
"_forget_gate[i]));\n";
1140 out <<
SP <<
SP <<
"}\n";
1145 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1147 <<
"_cell_gate[i];\n";
1148 out <<
SP <<
SP <<
"}\n";
1150 if (fAttrInputForget == 0) {
1151 out <<
SP <<
SP <<
"if (seq == 0) {\n";
1152 if (!fNInitial_c.empty()) {
1154 out <<
SP <<
SP <<
SP <<
"for (size_t i = 0; i < " <<
size <<
"; i++) {\n";
1156 <<
"_forget_gate[i + offset] * " <<
OpName <<
"_initial_cell_state[i];\n";
1157 out <<
SP <<
SP <<
SP <<
"}\n";
1159 out <<
SP <<
SP <<
"} else {\n";
1162 if (fAttrDirection ==
"backward") {
1163 out <<
SP <<
SP <<
SP <<
"size_t previous_offset = (index + 1) * "
1166 out <<
SP <<
SP <<
SP <<
"size_t previous_offset = (seq - 1) * "
1170 out <<
SP <<
SP <<
SP <<
"size_t previous_offset = (index + 1) * "
1173 out <<
SP <<
SP <<
SP <<
"for (size_t i = 0; i < " <<
size <<
"; i++) {\n";
1175 <<
"_forget_gate[i + offset] * " <<
OpName <<
"_cell_state[i + previous_offset];\n";
1176 out <<
SP <<
SP <<
SP <<
"}\n";
1177 out <<
SP <<
SP <<
"}\n";
1184 out <<
SP <<
SP <<
SP <<
"for (size_t i = 0; i < " <<
size <<
"; i++) {\n";
1185 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_output_gate[i + offset] += tensor_" << fNP <<
"[i + " <<
p_offset
1186 <<
"] * " <<
OpName <<
"_cell_state[i + offset];\n";
1187 out <<
SP <<
SP <<
SP <<
"}\n";
1190 out <<
SP <<
SP <<
SP <<
"for (size_t i = 0; i < " <<
size <<
"; i++) {\n";
1191 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_output_gate[i + offset] += tensor_" << fNP <<
"[i + " <<
p_offset
1192 <<
"] * " <<
OpName <<
"_cell_state[i + offset];\n";
1193 out <<
SP <<
SP <<
SP <<
"}\n";
1198 if (fAttrClip > .0) {
1199 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1200 if (fType ==
"float") {
1201 out <<
SP <<
SP <<
SP <<
"float x = (" <<
OpName <<
"_output_gate[i] > " << -fAttrClip <<
") ? " <<
OpName
1202 <<
"_output_gate[i] : " << -fAttrClip <<
";\n";
1204 out <<
SP <<
SP <<
SP <<
OpName <<
"_output_gate[i] = (x < " << fAttrClip <<
") ? x : " << fAttrClip <<
";\n";
1205 out <<
SP <<
SP <<
"}\n";
1208 if (fAttrActivations[
direction * 3] ==
"Relu") {
1209 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1210 out <<
SP <<
SP <<
SP <<
"if (" <<
OpName <<
"_output_gate[i] < 0.)\n";
1211 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_output_gate[i] = 0.;\n";
1212 out <<
SP <<
SP <<
"}\n";
1213 }
else if (fAttrActivations[
direction * 3] ==
"Tanh") {
1214 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1215 if (fType ==
"float") {
1216 out <<
SP <<
SP <<
SP <<
"float ex = exp(-2 * " <<
OpName <<
"_output_gate[i]);\n";
1218 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_output_gate[i] = (1. - ex) / (1. + ex);\n";
1219 out <<
SP <<
SP <<
"}\n";
1220 }
else if (fAttrActivations[
direction * 3] ==
"Sigmoid") {
1221 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1223 <<
"_output_gate[i]));\n";
1224 out <<
SP <<
SP <<
"}\n";
1225 }
else if (fAttrActivations[
direction * 3] ==
"Affine") {
1226 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1228 <<
OpName <<
"_output_gate[i] + " << fAttrActivationBeta[
direction * 3] <<
";\n";
1229 out <<
SP <<
SP <<
"}\n";
1230 }
else if (fAttrActivations[
direction * 3] ==
"ScaledTanh") {
1231 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1232 if (fType ==
"float") {
1233 out <<
SP <<
SP <<
SP <<
"float ex = exp(-2 * " << fAttrActivationBeta[
direction * 3] <<
" * " <<
OpName
1234 <<
"_output_gate[i]);\n";
1237 <<
" * (1. - ex) / (1. + ex);\n";
1238 out <<
SP <<
SP <<
"}\n";
1239 }
else if (fAttrActivations[
direction * 3] ==
"HardSigmoid") {
1240 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1241 if (fType ==
"float") {
1243 <<
"_output_gate[i] + " << fAttrActivationBeta[
direction * 3] <<
";\n";
1244 out <<
SP <<
SP <<
SP <<
"float b = (a > 0.) ? a : 0.;\n";
1246 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_output_gate[i] = (b < 1.) ? b : 1.;\n";
1247 out <<
SP <<
SP <<
"}\n";
1248 }
else if (fAttrActivations[
direction * 3] ==
"LeakyRelu") {
1249 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1250 out <<
SP <<
SP <<
SP <<
"if (" <<
OpName <<
"_output_gate[i] < 0.)\n";
1252 <<
OpName <<
"_output_gate[i];\n";
1253 out <<
SP <<
SP <<
"}\n";
1254 }
else if (fAttrActivations[
direction * 3] ==
"ThresholdRelu") {
1255 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1256 out <<
SP <<
SP <<
SP <<
"if (" <<
OpName <<
"_output_gate[i] < " << fAttrActivationAlpha[
direction * 3]
1258 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_output_gate[i] = 0.;\n";
1259 out <<
SP <<
SP <<
"}";
1260 }
else if (fAttrActivations[
direction * 3] ==
"Elu") {
1261 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1262 out <<
SP <<
SP <<
SP <<
"if (" <<
OpName <<
"_output_gate[i] < 0.)\n";
1264 <<
" * exp(" <<
OpName <<
"_output_gate[i] - 1.);\n";
1265 out <<
SP <<
SP <<
"}\n";
1266 }
else if (fAttrActivations[
direction * 3] ==
"Softsign") {
1267 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1268 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_output_gate[i] = " <<
OpName <<
"_output_gate[i] / (1. + abs("
1269 <<
OpName <<
"_output_gate[i]));\n";
1270 out <<
SP <<
SP <<
"}\n";
1272 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1273 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_output_gate[i] = log(1. + exp(" <<
OpName <<
"_output_gate[i]));\n";
1274 out <<
SP <<
SP <<
"}\n";
1278 out <<
SP <<
SP <<
"std::copy(" <<
OpName <<
"_cell_state + offset, " <<
OpName <<
"_cell_state + offset + "
1279 <<
size <<
", " <<
OpName <<
"_new_cell_state + offset);\n";
1281 if (fAttrClip > .0) {
1282 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1283 if (fType ==
"float") {
1284 out <<
SP <<
SP <<
SP <<
"float x = (" <<
OpName <<
"_new_cell_state[i] > " << -fAttrClip <<
") ? "
1285 <<
OpName <<
"_new_cell_state[i] : " << -fAttrClip <<
";\n";
1287 out <<
SP <<
SP <<
SP <<
OpName <<
"_new_cell_state[i] = (x < " << fAttrClip <<
") ? x : " << fAttrClip
1289 out <<
SP <<
SP <<
"}\n";
1292 if (fAttrActivations[
direction * 3 + 2] ==
"Relu") {
1293 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1294 out <<
SP <<
SP <<
SP <<
"if (" <<
OpName <<
"_new_cell_state[i] < 0.)\n";
1295 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_new_cell_state[i] = 0.;\n";
1296 out <<
SP <<
SP <<
"}\n";
1297 }
else if (fAttrActivations[
direction * 3 + 2] ==
"Tanh") {
1298 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1299 if (fType ==
"float") {
1300 out <<
SP <<
SP <<
SP <<
"float ex = exp(-2 * " <<
OpName <<
"_new_cell_state[i]);\n";
1302 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_new_cell_state[i] = (1. - ex) / (1. + ex);\n";
1303 out <<
SP <<
SP <<
"}\n";
1304 }
else if (fAttrActivations[
direction * 3 + 2] ==
"Sigmoid") {
1305 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1307 <<
"_new_cell_state[i]));\n";
1308 out <<
SP <<
SP <<
"}\n";
1309 }
else if (fAttrActivations[
direction * 3 + 2] ==
"Affine") {
1310 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1312 <<
" * " <<
OpName <<
"_new_cell_state[i] + " << fAttrActivationBeta[
direction * 3 + 2] <<
";\n";
1313 out <<
SP <<
SP <<
"}\n";
1314 }
else if (fAttrActivations[
direction * 3 + 2] ==
"ScaledTanh") {
1315 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1316 if (fType ==
"float") {
1317 out <<
SP <<
SP <<
SP <<
"float ex = exp(-2 * " << fAttrActivationBeta[
direction * 3 + 2] <<
" * " <<
OpName
1318 <<
"_new_cell_state[i]);\n";
1321 <<
" * (1. - ex) / (1. + ex);\n";
1322 out <<
SP <<
SP <<
"}\n";
1323 }
else if (fAttrActivations[
direction * 3 + 2] ==
"HardSigmoid") {
1324 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1325 if (fType ==
"float") {
1327 <<
"_new_cell_state[i] + " << fAttrActivationBeta[
direction * 3 + 2] <<
";\n";
1328 out <<
SP <<
SP <<
SP <<
"float b = (a > 0.) ? a : 0.;\n";
1330 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_new_cell_state[i] = (b < 1.) ? b : 1.;\n";
1331 out <<
SP <<
SP <<
"}\n";
1332 }
else if (fAttrActivations[
direction * 3 + 2] ==
"LeakyRelu") {
1333 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1334 out <<
SP <<
SP <<
SP <<
"if (" <<
OpName <<
"_new_cell_state[i] < 0.)\n";
1336 <<
" * " <<
OpName <<
"_new_cell_state[i];\n";
1337 out <<
SP <<
SP <<
"}\n";
1338 }
else if (fAttrActivations[
direction * 3 + 2] ==
"ThresholdRelu") {
1339 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1340 out <<
SP <<
SP <<
SP <<
"if (" <<
OpName <<
"_new_cell_state[i] < " << fAttrActivationAlpha[
direction * 3 + 2]
1342 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_new_cell_state[i] = 0.;\n";
1343 out <<
SP <<
SP <<
"}";
1344 }
else if (fAttrActivations[
direction * 3 + 2] ==
"Elu") {
1345 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1346 out <<
SP <<
SP <<
SP <<
"if (" <<
OpName <<
"_new_cell_state[i] < 0.)\n";
1348 <<
" * exp(" <<
OpName <<
"_new_cell_state[i] - 1.);\n";
1349 out <<
SP <<
SP <<
"}\n";
1350 }
else if (fAttrActivations[
direction * 3 + 2] ==
"Softsign") {
1351 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1352 out <<
SP <<
SP <<
SP <<
SP <<
OpName <<
"_new_cell_state[i] = " <<
OpName <<
"_new_cell_state[i] / (1. + abs("
1353 <<
OpName <<
"_new_cell_state[i]));\n";
1354 out <<
SP <<
SP <<
"}\n";
1356 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1358 <<
"_new_cell_state[i]));\n";
1359 out <<
SP <<
SP <<
"}\n";
1363 out <<
SP <<
SP <<
"for (size_t i = offset; i < offset + " <<
size <<
"; i++) {\n";
1365 <<
"_new_cell_state[i];\n";
1366 out <<
SP <<
SP <<
"}\n";
1371 if (!fNSequence_lens.empty()) {
1372 out <<
SP <<
"for (size_t seq = 0; seq < " <<
seq_length <<
"; seq++) {\n";
1373 out <<
SP <<
SP <<
"for (size_t batch = 0; batch < " <<
batch_size <<
"; batch++) {\n";
1374 out <<
SP <<
SP <<
SP <<
"if (seq >= tensor_" << fNSequence_lens <<
"[batch]) {\n";
1376 out <<
SP <<
SP <<
SP <<
SP <<
SP <<
"for (size_t h = 0; h < " << fAttrHiddenSize <<
"; h++) {\n";
1377 out <<
SP <<
SP <<
SP <<
SP <<
SP <<
SP <<
"size_t idx = seq * "
1379 <<
" + batch * " << fAttrHiddenSize <<
" + h;\n";
1384 out <<
SP <<
SP <<
SP <<
"}\n";
1385 out <<
SP <<
SP <<
"}\n";
1390 if (fAttrLayout == 0) {
1391 if (!fNY_h.empty()) {
1393 if (fNSequence_lens.empty()) {
1395 if (fAttrDirection ==
"backward") {
1397 <<
", tensor_" << fNY_h <<
");\n";
1401 <<
"_hidden_state + " <<
offset <<
" + " <<
y_h_size <<
", tensor_" << fNY_h <<
");\n";
1405 <<
"_hidden_state + " << 2 *
y_h_size <<
", tensor_" << fNY_h <<
" + " <<
y_h_size <<
");\n";
1408 if (fAttrDirection ==
"backward") {
1409 out <<
SP <<
"for (size_t batch = 0; batch < " <<
batch_size <<
"; batch++) {\n";
1410 out <<
SP <<
SP <<
"size_t offset = batch * " << fAttrHiddenSize <<
";\n";
1411 out <<
SP <<
SP <<
"std::copy(" <<
OpName <<
"_hidden_state + offset, " <<
OpName
1412 <<
"_hidden_state + offset + " << fAttrHiddenSize <<
", tensor_" << fNY_h <<
" + offset);\n";
1415 out <<
SP <<
"for (size_t batch = 0; batch < " <<
batch_size <<
"; batch++) {\n";
1416 out <<
SP <<
SP <<
"size_t seq = " <<
"tensor_" << fNSequence_lens <<
"[batch] - 1;\n";
1418 <<
" + batch * " << fAttrHiddenSize <<
";\n";
1419 out <<
SP <<
SP <<
"size_t y_h_offset = batch * " << fAttrHiddenSize <<
";\n";
1420 out <<
SP <<
SP <<
"std::copy(" <<
OpName <<
"_hidden_state + offset, " <<
OpName
1421 <<
"_hidden_state + offset + " << fAttrHiddenSize <<
", tensor_" << fNY_h <<
" + y_h_offset);\n";
1425 out <<
SP <<
"for (size_t batch = 0; batch < " <<
batch_size <<
"; batch++) {\n";
1426 out <<
SP <<
SP <<
"size_t offset = " <<
batch_size * fAttrHiddenSize <<
" + batch * " << fAttrHiddenSize
1428 out <<
SP <<
SP <<
"size_t y_h_offset = " <<
batch_size * fAttrHiddenSize <<
" + batch * "
1429 << fAttrHiddenSize <<
";\n";
1430 out <<
SP <<
SP <<
"std::copy(" <<
OpName <<
"_hidden_state + offset, " <<
OpName
1431 <<
"_hidden_state + offset + " << fAttrHiddenSize <<
", tensor_" << fNY_h <<
" + y_h_offset);\n";
1436 if (!fNY_c.empty()) {
1438 if (fNSequence_lens.empty()) {
1440 if (fAttrDirection ==
"backward") {
1442 <<
", tensor_" << fNY_c <<
");\n";
1445 out <<
SP <<
"std::copy(" <<
OpName <<
"_cell_state + " <<
offset <<
", " <<
OpName <<
"_cell_state + "
1446 <<
offset <<
" + " <<
y_h_size <<
", tensor_" << fNY_c <<
");\n";
1449 out <<
SP <<
"std::copy(" <<
OpName <<
"_cell_state + " <<
y_h_size <<
", " <<
OpName <<
"_cell_state + "
1453 if (fAttrDirection ==
"backward") {
1454 out <<
SP <<
"for (size_t batch = 0; batch < " <<
batch_size <<
"; batch++) {\n";
1455 out <<
SP <<
SP <<
"size_t offset = batch * " << fAttrHiddenSize <<
";\n";
1456 out <<
SP <<
SP <<
"std::copy(" <<
OpName <<
"_cell_state + offset, " <<
OpName
1457 <<
"_cell_state + offset + " << fAttrHiddenSize <<
", tensor_" << fNY_c <<
" + offset);\n";
1460 out <<
SP <<
"for (size_t batch = 0; batch < " <<
batch_size <<
"; batch++) {\n";
1461 out <<
SP <<
SP <<
"size_t seq = " <<
"tensor_" << fNSequence_lens <<
"[batch] - 1;\n";
1463 <<
" + batch * " << fAttrHiddenSize <<
";\n";
1464 out <<
SP <<
SP <<
"size_t y_h_offset = batch * " << fAttrHiddenSize <<
";\n";
1465 out <<
SP <<
SP <<
"std::copy(" <<
OpName <<
"_cell_state + offset, " <<
OpName
1466 <<
"_cell_state + offset + " << fAttrHiddenSize <<
", tensor_" << fNY_c <<
" + y_h_offset);\n";
1470 out <<
SP <<
"for (size_t batch = 0; batch < " <<
batch_size <<
"; batch++) {\n";
1471 out <<
SP <<
SP <<
"size_t offset = " <<
batch_size * fAttrHiddenSize <<
" + batch * " << fAttrHiddenSize
1473 out <<
SP <<
SP <<
"size_t y_h_offset = " <<
batch_size * fAttrHiddenSize <<
" + batch * "
1474 << fAttrHiddenSize <<
";\n";
1475 out <<
SP <<
SP <<
"std::copy(" <<
OpName <<
"_cell_state + offset, " <<
OpName
1476 <<
"_cell_state + offset + " << fAttrHiddenSize <<
", tensor_" << fNY_c <<
" + y_h_offset);\n";
1485 out <<
SP <<
"for (size_t seq = 0; seq < " <<
seq_length <<
"; seq++) {\n";
1486 out <<
SP <<
SP <<
"for (size_t batch = 0; batch < " <<
batch_size <<
"; batch++) {\n";
1491 out <<
SP <<
SP <<
SP <<
"std::copy(" <<
OpName <<
"_hidden_state + offset, " <<
OpName
1492 <<
"_hidden_state + offset + " << fAttrHiddenSize <<
", tensor_" << fNY <<
" + y_offset);\n";
1493 out <<
SP <<
SP <<
"}\n";
1497 if (!fNY_h.empty()) {
1499 if (fAttrDirection ==
"backward") {
1500 out <<
SP <<
"for (size_t batch = 0; batch < " <<
batch_size <<
"; batch++) {\n";
1501 out <<
SP <<
SP <<
"size_t offset = batch * " << fAttrHiddenSize <<
";\n";
1502 out <<
SP <<
SP <<
"size_t y_h_offset = batch * " <<
num_directions * fAttrHiddenSize <<
";\n";
1503 out <<
SP <<
SP <<
"std::copy(" <<
OpName <<
"_hidden_state + offset, " <<
OpName
1504 <<
"_hidden_state + offset + " << fAttrHiddenSize <<
", tensor_" << fNY_h <<
" + y_h_offset);\n";
1507 out <<
SP <<
"for (size_t batch = 0; batch < " <<
batch_size <<
"; batch++) {\n";
1508 if (fNSequence_lens.empty()) {
1511 out <<
SP <<
SP <<
"size_t seq = " <<
"tensor_" << fNSequence_lens <<
"[batch] - 1;\n";
1514 <<
" + batch * " << fAttrHiddenSize <<
";\n";
1515 out <<
SP <<
SP <<
"size_t y_h_offset = batch * " <<
num_directions * fAttrHiddenSize <<
";\n";
1516 out <<
SP <<
SP <<
"std::copy(" <<
OpName <<
"_hidden_state + offset, " <<
OpName
1517 <<
"_hidden_state + offset + " << fAttrHiddenSize <<
", tensor_" << fNY_h <<
" + y_h_offset);\n";
1521 out <<
SP <<
"for (size_t batch = 0; batch < " <<
batch_size <<
"; batch++) {\n";
1522 out <<
SP <<
SP <<
"size_t offset = " <<
batch_size * fAttrHiddenSize <<
" + batch * " << fAttrHiddenSize
1524 out <<
SP <<
SP <<
"size_t y_h_offset = batch * " <<
num_directions * fAttrHiddenSize <<
" + "
1525 << fAttrHiddenSize <<
";\n";
1526 out <<
SP <<
SP <<
"std::copy(" <<
OpName <<
"_hidden_state + offset, " <<
OpName
1527 <<
"_hidden_state + offset + " << fAttrHiddenSize <<
", tensor_" << fNY_h <<
" + y_h_offset);\n";
1532 if (!fNY_c.empty()) {
1534 if (fAttrDirection ==
"backward") {
1535 out <<
SP <<
"for (size_t batch = 0; batch < " <<
batch_size <<
"; batch++) {\n";
1536 out <<
SP <<
SP <<
"size_t offset = batch * " << fAttrHiddenSize <<
";\n";
1537 out <<
SP <<
SP <<
"size_t y_h_offset = batch * " <<
num_directions * fAttrHiddenSize <<
";\n";
1538 out <<
SP <<
SP <<
"std::copy(" <<
OpName <<
"_cell_state + offset, " <<
OpName <<
"_cell_state + offset + "
1539 << fAttrHiddenSize <<
", tensor_" << fNY_c <<
" + y_h_offset);\n";
1542 out <<
SP <<
"for (size_t batch = 0; batch < " <<
batch_size <<
"; batch++) {\n";
1543 if (fNSequence_lens.empty()) {
1546 out <<
SP <<
SP <<
"size_t seq = " <<
"tensor_" << fNSequence_lens <<
"[batch] - 1;\n";
1549 <<
" + batch * " << fAttrHiddenSize <<
";\n";
1550 out <<
SP <<
SP <<
"size_t y_h_offset = batch * " <<
num_directions * fAttrHiddenSize <<
";\n";
1551 out <<
SP <<
SP <<
"std::copy(" <<
OpName <<
"_cell_state + offset, " <<
OpName <<
"_cell_state + offset + "
1552 << fAttrHiddenSize <<
", tensor_" << fNY_c <<
" + y_h_offset);\n";
1556 out <<
SP <<
"for (size_t batch = 0; batch < " <<
batch_size <<
"; batch++) {\n";
1557 out <<
SP <<
SP <<
"size_t offset = " <<
batch_size * fAttrHiddenSize <<
" + batch * " << fAttrHiddenSize
1559 out <<
SP <<
SP <<
"size_t y_h_offset = batch * " <<
num_directions * fAttrHiddenSize <<
" + "
1560 << fAttrHiddenSize <<
";\n";
1561 out <<
SP <<
SP <<
"std::copy(" <<
OpName <<
"_cell_state + offset, " <<
OpName <<
"_cell_state + offset + "
1562 << fAttrHiddenSize <<
", tensor_" << fNY_c <<
" + y_h_offset);\n";
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void input
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h offset
const_iterator begin() const
const_iterator end() const
Long Short-Term Memory operator.
std::string GenerateSessionMembersCode(std::string opName) override
Generate the code for the Session internal data vectors.
std::vector< size_t > fShapeR
Shape of the recurrence.
std::vector< size_t > fShapeInitial_c
Shape of the initial value of the cell states.
std::string fNP
Name of peepholes.
std::string fNY_c
Name of the last sequence of the cell states.
std::string fNX
Name of the input.
ROperator_LSTM(std::vector< float > activation_alpha, std::vector< float > activation_beta, std::vector< std::string > activations, float clip, std::string direction, size_t hidden_size, size_t input_forget, size_t layout, std::string nameX, std::string nameW, std::string nameR, std::string nameB, std::string nameSequence_lens, std::string nameInitial_h, std::string nameInitial_c, std::string nameP, std::string nameY, std::string nameY_h, std::string nameY_c)
Constructor of ROperator_LSTM from the attributes.
std::string fNR
Name of the recurrence.
std::vector< size_t > fShapeY_h
Shape of the last sequence of the output.
std::vector< float > fAttrActivationAlpha
Sacling values used by some activation functions.
std::vector< size_t > fShapeInitial_h
Shape of the initial value of the hidden states.
size_t fAttrLayout
Data layout.
std::vector< std::vector< size_t > > ShapeInference(std::vector< std::vector< size_t > > input) override
Infers the shape of the output tensors.
size_t fAttrHiddenSize
Number of the hidden layers.
std::vector< std::string > GetBlasRoutines() override
Returns the blas routines needed to compile the generated code.
std::string fNInitial_c
Name of the initial value of the cell states.
std::vector< size_t > fShapeB
Shape of the bias.
std::string fNW
Name of the weights.
float fAttrClip
Clip threshold.
std::vector< size_t > fShapeY
Shape of the output.
std::vector< size_t > fShapeP
Shape of the peepholes.
std::string fType
Type of the tensors.
std::string fAttrDirection
Direction of processing.
std::vector< float > fAttrActivationBeta
Scaling values used by some activation functions.
std::vector< size_t > fShapeX
Shape of the input.
std::vector< size_t > fShapeW
Shape of the weights.
std::vector< ETensorType > TypeInference(std::vector< ETensorType > input) override
Infers the type of the output tensors.
std::string fNSequence_lens
Name of length of the sequences.
std::string fNY_h
Name of the last sequence of the output.
std::string fNY
Name of the output.
void Initialize(RModel &) override
Initialize the model.
std::vector< std::string > fAttrActivations
Activation functions.
size_t fAttrInputForget
Forget gate.
std::string Generate(std::string OpName) override
Generate the inference code.
std::vector< size_t > fShapeSequence_lens
Shape of the length of the sequences.
std::vector< size_t > fShapeY_c
Shape of the last sequence of the cell states.
std::string fNInitial_h
Name of the initial value of the hidden states.
std::string fNB
Name of the bias.
ROperator_LSTM()
Default constructor of ROperator_LSTM.
std::vector< std::string_view > fInputTensorNames
std::vector< std::string_view > fOutputTensorNames
static uint64_t sum(uint64_t i)