/******************************************************************************* * Copyright (c) 2015-2018 Skymind, Inc. * * This program and the accompanying materials are made available under the * terms of the Apache License, Version 2.0 which is available at * https://www.apache.org/licenses/LICENSE-2.0. * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. * * SPDX-License-Identifier: Apache-2.0 ******************************************************************************/ // // Created by raver on 8/4/2018. // #include "testlayers.h" #include #include #include #include using namespace nd4j; class DeclarableOpsTests15 : public testing::Test { public: DeclarableOpsTests15() { printf("\n"); fflush(stdout); } }; TEST_F(DeclarableOpsTests15, Test_NormalizeMoments_1) { auto d = NDArrayFactory::create('c', {10, 10}); auto w = NDArrayFactory::create(10); auto x = NDArrayFactory::create('c', {10}); auto y = NDArrayFactory::create('c', {10}); auto z0 = NDArrayFactory::create('c', {10}); auto z1 = NDArrayFactory::create('c', {10}); nd4j::ops::normalize_moments op; auto result = op.execute({&w, &x, &y}, {&z0, &z1}, {1e-4}, {}, {}); ASSERT_EQ(Status::OK(), result); } TEST_F(DeclarableOpsTests15, Test_Add_1) { auto x = NDArrayFactory::create('c', {5}, {1, 1, 1, 1, 1}); auto y = NDArrayFactory::create('c', {5}, {1, 1, 1, 1, 1}); auto e = NDArrayFactory::create('c', {5}, {2, 2, 2, 2, 2}); nd4j::ops::add op; auto result = op.execute({&x, &y}, {&x}, {}, {}, {}); ASSERT_EQ(Status::OK(), result); ASSERT_EQ(e, x); } TEST_F(DeclarableOpsTests15, Test_Half_assign_1) { auto x = NDArrayFactory::create('c', {2, 5}); int y = 1; x.assign(y); ASSERT_EQ(10, x.sumNumber().e(0)); } TEST_F(DeclarableOpsTests15, test_avgpooling_edge_1) { int inOutH = 35; int inOutW = 35; int inOutC = 192; auto x = NDArrayFactory::create('c', {1, inOutH, inOutW, inOutC}); x.linspace(1.0); nd4j::ops::avgpool2d op; auto result = op.execute({&x}, {}, {3,3, 1,1, 0,0, 1,1, 1, 0, 1}); ASSERT_EQ(Status::OK(), result->status()); auto z = result->at(0); int totalPadHeight = (inOutH - 1) * 1 + 3 - inOutH; int padTop = totalPadHeight / 2; int padBottom = totalPadHeight - totalPadHeight / 2; int k = 3; auto m = NDArrayFactory::create('c', {1, inOutH, inOutW, inOutC}); auto c = NDArrayFactory::create('c', {1, inOutH, inOutW, inOutC}); for (int h = 0; h < inOutH; h++) { for (int w = 0; w < inOutW; w++) { int hFrom = h - padTop; int wFrom = w - padBottom; int hTo = hFrom + k; int wTo = wFrom + k; hFrom = nd4j::math::nd4j_max(0, hFrom); wFrom = nd4j::math::nd4j_max(0, wFrom); hTo = nd4j::math::nd4j_min(inOutH, hTo); wTo = nd4j::math::nd4j_min(inOutW, wTo); int idxOut[4]; int idxIn[4]; for (int ch = 0; ch < inOutC; ch++) { idxOut[1] = h; idxOut[2] = w; idxOut[3] = ch; idxIn[3] = ch; for (int kh = hFrom; kh < hTo; kh++) { for (int kw = wFrom; kw < wTo; kw++) { idxIn[1] = kh; idxIn[2] = kw; auto inVal = x.e(0, kh, kw, ch); m.p(0, h, w, ch, inVal + m.e(0, h, w, ch)); c.p(0, h, w, ch, 1 + c.e(0, h, w, ch)); } } } } } m /= c; ASSERT_EQ(m, *z); delete result; } TEST_F(DeclarableOpsTests15, Test_standarize_1) { auto x = NDArrayFactory::create('c', {5}, {1, 1, 1, 1, 1}); auto e = NDArrayFactory::create('c', {5}, {0, 0, 0, 0, 0}); nd4j::ops::standardize op; auto result = op.execute({&x}, {&x}, {}, {0}, {}); ASSERT_EQ(Status::OK(), result); ASSERT_EQ(e, x); } TEST_F(DeclarableOpsTests15, Test_standarize_bp_1) { auto x = NDArrayFactory::create('c', {5}, {1., 1., 1., 1., 1.}); auto eps = NDArrayFactory::create('c', {5}, {0., 0., 0., 0., 0.}); nd4j::ops::standardize_bp op; auto result = op.execute({&x, &eps}, {}, {0}, {}); ASSERT_EQ(Status::OK(), result->status()); delete result; } TEST_F(DeclarableOpsTests15, test_matmul_bp_1) { auto a = NDArrayFactory::create('c', {1, 3}); auto b = NDArrayFactory::create('c', {1, 4}); auto gI = NDArrayFactory::create('c', {3, 4}); auto gA = NDArrayFactory::create('c', {1, 3}); auto gB = NDArrayFactory::create('c', {1, 4}); nd4j::ops::matmul_bp op; auto status = op.execute({&a, &b, &gI}, {&gA, &gB}, {}, {1, 0, 0}, {}); ASSERT_EQ(Status::OK(), status); } TEST_F(DeclarableOpsTests15, test_non_decreasing_1) { auto x = NDArrayFactory::create(1.0); auto z = NDArrayFactory::create(false); auto e = NDArrayFactory::create(true); nd4j::ops::is_non_decreasing op; Context ctx(1); ctx.setInputArray(0, &x); ctx.setOutputArray(0, &z); auto status = op.execute(&ctx); ASSERT_EQ(Status::OK(), status); ASSERT_EQ(e, z); } TEST_F(DeclarableOpsTests15, Test_layer_norm_1) { auto x = NDArrayFactory::create('c', {1, 5}, {1., 2., 3., 4., 5.}); auto g = NDArrayFactory::create('c', {1, 5}, {1., 2., 3., 4., 5.}); auto b = NDArrayFactory::create('c', {1, 5}, {1., 2., 3., 4., 5.}); nd4j::ops::layer_norm op; auto result = op.execute({&x, &g, &b}, {}, {0}, {}); ASSERT_EQ(Status::OK(), result->status()); delete result; } TEST_F(DeclarableOpsTests15, Test_layer_norm_bp_1) { auto x = NDArrayFactory::create('c', {1, 5}, {1., 2., 3., 4., 5.}); auto g = NDArrayFactory::create('c', {1, 5}, {1., 2., 3., 4., 5.}); auto b = NDArrayFactory::create('c', {1, 5}, {1., 2., 3., 4., 5.}); auto eps = NDArrayFactory::create('c', {1, 5}, {0., 0., 0., 0., 0.}); nd4j::ops::layer_norm_bp op; auto result = op.execute({&x, &g, &b, &eps}, {}, {0}, {}); ASSERT_EQ(Status::OK(), result->status()); delete result; }