Commit cd59bfe4 authored by Nick Korovaiko's avatar Nick Korovaiko Committed by Scott Cyphers

Enable reverse_sequence for Interpreter (#977)

* use reference kernel for reverse_sequence for int

* move tests

* resolve CI errors

* TEST to NGRAPH_TEST
parent 2bd23b27
......@@ -110,6 +110,7 @@
#include "ngraph/op/replace_slice.hpp"
#include "ngraph/op/reshape.hpp"
#include "ngraph/op/reverse.hpp"
#include "ngraph/op/reverse_sequence.hpp"
#include "ngraph/op/select.hpp"
#include "ngraph/op/select_and_scatter.hpp"
#include "ngraph/op/sign.hpp"
......
......@@ -15,6 +15,8 @@ backwards_power
backwards_relu
backwards_replace_slice
backwards_reverse_3d_02
backwards_reverse_sequence_n4d2c3h2w2
backwards_reverse_sequence_n3_c2_h3
backwards_select
backwards_select_nested
backwards_sign
......@@ -111,6 +113,9 @@ replace_slice_3d_strided_different_strides
replace_slice_matrix
replace_slice_scalar
replace_slice_vector
reverse_sequence_n4d2c3h2w2
reverse_sequence_n4c3h2w2
reverse_sequence_n2c3h4w2
scalar_constant_float32
scalar_constant_int64
select_and_scatter_3d_without_overlap
......
......@@ -45,6 +45,7 @@
#include "ngraph/op/reshape.hpp"
#include "ngraph/op/result.hpp"
#include "ngraph/op/reverse.hpp"
#include "ngraph/op/reverse_sequence.hpp"
#include "ngraph/op/slice.hpp"
#include "ngraph/op/softmax.hpp"
#include "ngraph/op/sum.hpp"
......@@ -98,6 +99,7 @@
#include "ngraph/runtime/reference/reshape.hpp"
#include "ngraph/runtime/reference/result.hpp"
#include "ngraph/runtime/reference/reverse.hpp"
#include "ngraph/runtime/reference/reverse_sequence.hpp"
#include "ngraph/runtime/reference/select.hpp"
#include "ngraph/runtime/reference/select_and_scatter.hpp"
#include "ngraph/runtime/reference/sign.hpp"
......@@ -792,6 +794,24 @@ private:
out[0]->get_shape(),
reverse->get_reversed_axes());
}
else if (node_op == "ReverseSequence")
{
op::ReverseSequence* reverse = dynamic_cast<op::ReverseSequence*>(&node);
if (args[1]->get_element_type() == element::i32)
{
reference::reverse_sequence<T, int>(args[0]->get_data_ptr<T>(),
out[0]->get_data_ptr<T>(),
args[0]->get_shape(),
reverse->get_batch_axis(),
reverse->get_sequence_axis(),
args[1]->get_data_ptr<int>());
}
else
{
throw ngraph_error("only int32 indices are supported");
}
}
else if (node_op == "Select")
{
reference::select<T>(args[0]->get_data_ptr<char>(),
......
......@@ -1516,3 +1516,92 @@ NGRAPH_TEST(${BACKEND_NAME}, backwards_maxpool_n2c1h5w5_kh3kw3_sh2sw2)
backend->call(df, {output}, {input, ep});
ASSERT_TRUE(read_vector<float>(output) == expected);
}
NGRAPH_TEST(${BACKEND_NAME}, backwards_reverse_sequence_n3_c2_h3)
{
auto backend = runtime::Backend::create("${BACKEND_NAME}");
Shape shape{3, 2, 3};
auto A = make_shared<op::Parameter>(element::i32, shape);
Shape seq_len_shape{2};
auto B = make_shared<op::Parameter>(element::i32, seq_len_shape);
size_t batch_axis = 1;
size_t sequence_axis = 0;
auto rs = std::make_shared<op::ReverseSequence>(A, B, batch_axis, sequence_axis);
auto f = make_shared<Function>(rs, op::ParameterVector{A, B});
shared_ptr<runtime::TensorView> a = backend->create_tensor(element::i32, shape);
shared_ptr<runtime::TensorView> b = backend->create_tensor(element::i32, seq_len_shape);
shared_ptr<runtime::TensorView> c = backend->create_tensor(element::i32, shape);
shared_ptr<runtime::TensorView> da = backend->create_tensor(element::i32, shape);
shared_ptr<runtime::TensorView> db = backend->create_tensor(element::i32, seq_len_shape);
//input values don't matter
vector<int> va(shape_size(shape), 0);
vector<int> vc{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18};
vector<int> expected{13, 14, 15, 16, 17, 18, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6};
copy_data(c, vc);
copy_data(a, va);
std::vector<int> seq_lenghts{3, 3};
copy_data(b, seq_lenghts);
auto C = make_shared<op::Parameter>(element::i32, shape);
auto df = autodiff::backprop_function(f);
backend->call(df, {da, db}, {a, b, c});
ASSERT_EQ(read_vector<int>(da), expected);
}
NGRAPH_TEST(${BACKEND_NAME}, backwards_reverse_sequence_n4d2c3h2w2)
{
auto backend = runtime::Backend::create("${BACKEND_NAME}");
Shape shape{4, 2, 3, 2, 2};
auto A = make_shared<op::Parameter>(element::i32, shape);
Shape seq_len_shape{4};
auto B = make_shared<op::Parameter>(element::i32, seq_len_shape);
size_t batch_axis = 0;
size_t sequence_axis = 2;
auto rs = std::make_shared<op::ReverseSequence>(A, B, batch_axis, sequence_axis);
auto f = make_shared<Function>(rs, op::ParameterVector{A, B});
shared_ptr<runtime::TensorView> a = backend->create_tensor(element::i32, shape);
shared_ptr<runtime::TensorView> b = backend->create_tensor(element::i32, seq_len_shape);
shared_ptr<runtime::TensorView> c = backend->create_tensor(element::i32, shape);
shared_ptr<runtime::TensorView> da = backend->create_tensor(element::i32, shape);
shared_ptr<runtime::TensorView> db = backend->create_tensor(element::i32, seq_len_shape);
//input values don't matter
vector<int> va(shape_size(shape), 0);
std::vector<int> vc{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95};
std::vector<int> expected{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 28, 29, 30, 31, 24, 25, 26, 27,
32, 33, 34, 35, 40, 41, 42, 43, 36, 37, 38, 39, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
64, 65, 66, 67, 68, 69, 70, 71, 76, 77, 78, 79, 72, 73, 74, 75,
80, 81, 82, 83, 88, 89, 90, 91, 84, 85, 86, 87, 92, 93, 94, 95};
copy_data(c, vc);
copy_data(a, va);
std::vector<int> seq_lenghts{1, 2, 1, 2};
copy_data(b, seq_lenghts);
auto C = make_shared<op::Parameter>(element::i32, shape);
auto df = autodiff::backprop_function(f);
backend->call(df, {da, db}, {a, b, c});
ASSERT_EQ(read_vector<int>(da), expected);
}
......@@ -8113,3 +8113,127 @@ NGRAPH_TEST(${BACKEND_NAME}, batchnorm_fprop_globalstats_b2c2w2h1)
ASSERT_TRUE(
ngraph::test::all_close(expected_result, read_vector<float>(bn_output), 1e-3f, 1e-4f));
}
NGRAPH_TEST(${BACKEND_NAME}, reverse_sequence_n2c3h4w2)
{
Shape shape{2, 3, 4, 2};
Shape seq_len_shape{4};
auto A = make_shared<op::Parameter>(element::i32, shape);
auto B = make_shared<op::Parameter>(element::i32, seq_len_shape);
size_t batch_axis = 2;
size_t sequence_axis = 1;
auto rs = std::make_shared<op::ReverseSequence>(A, B, batch_axis, sequence_axis);
auto f = make_shared<Function>(rs, op::ParameterVector{A, B});
auto backend = runtime::Backend::create("${BACKEND_NAME}");
// Create some tensors for input/output
shared_ptr<runtime::TensorView> a = backend->create_tensor(element::i32, shape);
shared_ptr<runtime::TensorView> b = backend->create_tensor(element::i32, seq_len_shape);
shared_ptr<runtime::TensorView> result = backend->create_tensor(element::i32, shape);
std::vector<int> input{
0, 0, 3, 0, 6, 0, 9, 0, 1, 0, 4, 0, 7, 0, 10, 0, 2, 0, 5, 0, 8, 0, 11, 0,
12, 0, 15, 0, 18, 0, 21, 0, 13, 0, 16, 0, 19, 0, 22, 0, 14, 0, 17, 0, 20, 0, 23, 0,
};
std::vector<int> seq_lenghts{1, 2, 1, 2};
copy_data(b, seq_lenghts);
std::vector<int> expected{
0, 0, 4, 0, 6, 0, 10, 0, 1, 0, 3, 0, 7, 0, 9, 0, 2, 0, 5, 0, 8, 0, 11, 0,
12, 0, 16, 0, 18, 0, 22, 0, 13, 0, 15, 0, 19, 0, 21, 0, 14, 0, 17, 0, 20, 0, 23, 0};
copy_data(a, input);
backend->call(f, {result}, {a, b});
EXPECT_EQ(read_vector<int>(result), expected);
}
NGRAPH_TEST(${BACKEND_NAME}, reverse_sequence_n4c3h2w2)
{
Shape shape{4, 3, 2, 2};
auto A = make_shared<op::Parameter>(element::i32, shape);
Shape seq_len_shape{4};
auto B = make_shared<op::Parameter>(element::i32, seq_len_shape);
size_t batch_axis = 0;
size_t sequence_axis = 1;
auto rs = std::make_shared<op::ReverseSequence>(A, B, batch_axis, sequence_axis);
auto f = make_shared<Function>(rs, op::ParameterVector{A, B});
auto backend = runtime::Backend::create("${BACKEND_NAME}");
// Create some tensors for input/output
shared_ptr<runtime::TensorView> a = backend->create_tensor(element::i32, shape);
shared_ptr<runtime::TensorView> b = backend->create_tensor(element::i32, seq_len_shape);
shared_ptr<runtime::TensorView> result = backend->create_tensor(element::i32, shape);
std::vector<int> seq_lenghts{1, 2, 3, 3};
copy_data(b, seq_lenghts);
std::vector<int> input{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47};
std::vector<int> expected{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 16, 17, 18, 19,
12, 13, 14, 15, 20, 21, 22, 23, 32, 33, 34, 35, 28, 29, 30, 31,
24, 25, 26, 27, 44, 45, 46, 47, 40, 41, 42, 43, 36, 37, 38, 39};
copy_data(a, input);
backend->call(f, {result}, {a, b});
EXPECT_EQ(read_vector<int>(result), expected);
}
NGRAPH_TEST(${BACKEND_NAME}, reverse_sequence_n4d2c3h2w2)
{
Shape shape{4, 2, 3, 2, 2};
auto A = make_shared<op::Parameter>(element::i32, shape);
Shape seq_len_shape{4};
auto B = make_shared<op::Parameter>(element::i32, seq_len_shape);
size_t batch_axis = 0;
size_t sequence_axis = 2;
auto rs = std::make_shared<op::ReverseSequence>(A, B, batch_axis, sequence_axis);
auto f = make_shared<Function>(rs, op::ParameterVector{A, B});
auto backend = runtime::Backend::create("${BACKEND_NAME}");
// Create some tensors for input/output
shared_ptr<runtime::TensorView> a = backend->create_tensor(element::i32, shape);
shared_ptr<runtime::TensorView> b = backend->create_tensor(element::i32, seq_len_shape);
shared_ptr<runtime::TensorView> result = backend->create_tensor(element::i32, shape);
std::vector<int> input{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95};
std::vector<int> expected{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 28, 29, 30, 31, 24, 25, 26, 27,
32, 33, 34, 35, 40, 41, 42, 43, 36, 37, 38, 39, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
64, 65, 66, 67, 68, 69, 70, 71, 76, 77, 78, 79, 72, 73, 74, 75,
80, 81, 82, 83, 88, 89, 90, 91, 84, 85, 86, 87, 92, 93, 94, 95};
copy_data(a, input);
std::vector<int> seq_lenghts{1, 2, 1, 2};
copy_data(b, seq_lenghts);
backend->call(f, {result}, {a, b});
EXPECT_EQ(read_vector<int>(result), expected);
}
......@@ -29,7 +29,6 @@
#include "ngraph/op/batch_norm.hpp"
#include "ngraph/op/get_output_element.hpp"
#include "ngraph/op/parameter.hpp"
#include "ngraph/op/reverse_sequence.hpp"
#include "ngraph/pass/manager.hpp"
#include "ngraph/pass/visualize_tree.hpp"
#include "ngraph/serializer.hpp"
......@@ -61,216 +60,3 @@ TEST(cpu_test, unhandled_op)
auto backend = runtime::Backend::create("CPU");
ASSERT_THROW(backend->compile(f), ngraph_error);
}
TEST(cpu_test, reverse_sequence_n2c3h4w2)
{
Shape shape{2, 3, 4, 2};
Shape seq_len_shape{4};
auto A = make_shared<op::Parameter>(element::i32, shape);
auto B = make_shared<op::Parameter>(element::i32, seq_len_shape);
size_t batch_axis = 2;
size_t sequence_axis = 1;
auto rs = std::make_shared<op::ReverseSequence>(A, B, batch_axis, sequence_axis);
auto f = make_shared<Function>(rs, op::ParameterVector{A, B});
auto backend = runtime::Backend::create("CPU");
// Create some tensors for input/output
shared_ptr<runtime::TensorView> a = backend->create_tensor(element::i32, shape);
shared_ptr<runtime::TensorView> b = backend->create_tensor(element::i32, seq_len_shape);
shared_ptr<runtime::TensorView> result = backend->create_tensor(element::i32, shape);
std::vector<int> input{
0, 0, 3, 0, 6, 0, 9, 0, 1, 0, 4, 0, 7, 0, 10, 0, 2, 0, 5, 0, 8, 0, 11, 0,
12, 0, 15, 0, 18, 0, 21, 0, 13, 0, 16, 0, 19, 0, 22, 0, 14, 0, 17, 0, 20, 0, 23, 0,
};
std::vector<int> seq_lenghts{1, 2, 1, 2};
copy_data(b, seq_lenghts);
std::vector<int> expected{
0, 0, 4, 0, 6, 0, 10, 0, 1, 0, 3, 0, 7, 0, 9, 0, 2, 0, 5, 0, 8, 0, 11, 0,
12, 0, 16, 0, 18, 0, 22, 0, 13, 0, 15, 0, 19, 0, 21, 0, 14, 0, 17, 0, 20, 0, 23, 0};
copy_data(a, input);
backend->call(f, {result}, {a, b});
EXPECT_EQ(read_vector<int>(result), expected);
}
TEST(cpu_test, reverse_sequence_n4c3h2w2)
{
Shape shape{4, 3, 2, 2};
auto A = make_shared<op::Parameter>(element::i32, shape);
Shape seq_len_shape{4};
auto B = make_shared<op::Parameter>(element::i32, seq_len_shape);
size_t batch_axis = 0;
size_t sequence_axis = 1;
auto rs = std::make_shared<op::ReverseSequence>(A, B, batch_axis, sequence_axis);
auto f = make_shared<Function>(rs, op::ParameterVector{A, B});
auto backend = runtime::Backend::create("CPU");
// Create some tensors for input/output
shared_ptr<runtime::TensorView> a = backend->create_tensor(element::i32, shape);
shared_ptr<runtime::TensorView> b = backend->create_tensor(element::i32, seq_len_shape);
shared_ptr<runtime::TensorView> result = backend->create_tensor(element::i32, shape);
std::vector<int> seq_lenghts{1, 2, 3, 3};
copy_data(b, seq_lenghts);
std::vector<int> input{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47};
std::vector<int> expected{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 16, 17, 18, 19,
12, 13, 14, 15, 20, 21, 22, 23, 32, 33, 34, 35, 28, 29, 30, 31,
24, 25, 26, 27, 44, 45, 46, 47, 40, 41, 42, 43, 36, 37, 38, 39};
copy_data(a, input);
backend->call(f, {result}, {a, b});
EXPECT_EQ(read_vector<int>(result), expected);
}
TEST(cpu_test, reverse_sequence_n4d2c3h2w2)
{
Shape shape{4, 2, 3, 2, 2};
auto A = make_shared<op::Parameter>(element::i32, shape);
Shape seq_len_shape{4};
auto B = make_shared<op::Parameter>(element::i32, seq_len_shape);
size_t batch_axis = 0;
size_t sequence_axis = 2;
auto rs = std::make_shared<op::ReverseSequence>(A, B, batch_axis, sequence_axis);
auto f = make_shared<Function>(rs, op::ParameterVector{A, B});
auto backend = runtime::Backend::create("CPU");
// Create some tensors for input/output
shared_ptr<runtime::TensorView> a = backend->create_tensor(element::i32, shape);
shared_ptr<runtime::TensorView> b = backend->create_tensor(element::i32, seq_len_shape);
shared_ptr<runtime::TensorView> result = backend->create_tensor(element::i32, shape);
std::vector<int> input{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95};
std::vector<int> expected{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 28, 29, 30, 31, 24, 25, 26, 27,
32, 33, 34, 35, 40, 41, 42, 43, 36, 37, 38, 39, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
64, 65, 66, 67, 68, 69, 70, 71, 76, 77, 78, 79, 72, 73, 74, 75,
80, 81, 82, 83, 88, 89, 90, 91, 84, 85, 86, 87, 92, 93, 94, 95};
copy_data(a, input);
std::vector<int> seq_lenghts{1, 2, 1, 2};
copy_data(b, seq_lenghts);
backend->call(f, {result}, {a, b});
EXPECT_EQ(read_vector<int>(result), expected);
}
TEST(cpu_test, backwards_reverse_sequence_n3_c2_h3)
{
Shape shape{3, 2, 3};
auto backend = runtime::Backend::create("CPU");
auto A = make_shared<op::Parameter>(element::i32, shape);
Shape seq_len_shape{2};
auto B = make_shared<op::Parameter>(element::i32, seq_len_shape);
size_t batch_axis = 1;
size_t sequence_axis = 0;
auto rs = std::make_shared<op::ReverseSequence>(A, B, batch_axis, sequence_axis);
auto f = make_shared<Function>(rs, op::ParameterVector{A, B});
shared_ptr<runtime::TensorView> a = backend->create_tensor(element::i32, shape);
shared_ptr<runtime::TensorView> b = backend->create_tensor(element::i32, seq_len_shape);
shared_ptr<runtime::TensorView> c = backend->create_tensor(element::i32, shape);
shared_ptr<runtime::TensorView> da = backend->create_tensor(element::i32, shape);
shared_ptr<runtime::TensorView> db = backend->create_tensor(element::i32, seq_len_shape);
//input values don't matter
vector<int> va(shape_size(shape), 0);
vector<int> vc{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18};
vector<int> expected{13, 14, 15, 16, 17, 18, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6};
copy_data(c, vc);
copy_data(a, va);
std::vector<int> seq_lenghts{3, 3};
copy_data(b, seq_lenghts);
auto C = make_shared<op::Parameter>(element::i32, shape);
auto df = autodiff::backprop_function(f);
backend->call(df, {da, db}, {a, b, c});
ASSERT_EQ(read_vector<int>(da), expected);
}
TEST(cpu_test, backwards_reverse_sequence_n4d2c3h2w2)
{
Shape shape{4, 2, 3, 2, 2};
auto backend = runtime::Backend::create("CPU");
auto A = make_shared<op::Parameter>(element::i32, shape);
Shape seq_len_shape{4};
auto B = make_shared<op::Parameter>(element::i32, seq_len_shape);
size_t batch_axis = 0;
size_t sequence_axis = 2;
auto rs = std::make_shared<op::ReverseSequence>(A, B, batch_axis, sequence_axis);
auto f = make_shared<Function>(rs, op::ParameterVector{A, B});
shared_ptr<runtime::TensorView> a = backend->create_tensor(element::i32, shape);
shared_ptr<runtime::TensorView> b = backend->create_tensor(element::i32, seq_len_shape);
shared_ptr<runtime::TensorView> c = backend->create_tensor(element::i32, shape);
shared_ptr<runtime::TensorView> da = backend->create_tensor(element::i32, shape);
shared_ptr<runtime::TensorView> db = backend->create_tensor(element::i32, seq_len_shape);
//input values don't matter
vector<int> va(shape_size(shape), 0);
std::vector<int> vc{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95};
std::vector<int> expected{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 28, 29, 30, 31, 24, 25, 26, 27,
32, 33, 34, 35, 40, 41, 42, 43, 36, 37, 38, 39, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
64, 65, 66, 67, 68, 69, 70, 71, 76, 77, 78, 79, 72, 73, 74, 75,
80, 81, 82, 83, 88, 89, 90, 91, 84, 85, 86, 87, 92, 93, 94, 95};
copy_data(c, vc);
copy_data(a, va);
std::vector<int> seq_lenghts{1, 2, 1, 2};
copy_data(b, seq_lenghts);
auto C = make_shared<op::Parameter>(element::i32, shape);
auto df = autodiff::backprop_function(f);
backend->call(df, {da, db}, {a, b, c});
ASSERT_EQ(read_vector<int>(da), expected);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment