Path: blob/master/modules/gapi/test/internal/gapi_int_island_tests.cpp
16339 views
// This file is part of OpenCV project.1// It is subject to the license terms in the LICENSE file found in the top-level directory2// of this distribution and at http://opencv.org/license.html.3//4// Copyright (C) 2018 Intel Corporation567#include "test_precomp.hpp"89#include "compiler/gmodel.hpp"10#include "compiler/gcompiled_priv.hpp"1112namespace opencv_test13{1415////////////////////////////////////////////////////////////////////////////////16// Tests on a plain graph17//18// (in) -> Blur1 -> (tmp0) -> Blur2 -> (tmp1) -> Blur3 -> (tmp2) -> Blur4 -> (out)19//20namespace21{22struct PlainIslandsFixture23{24cv::GMat in;25cv::GMat tmp[3];26cv::GMat out;2728PlainIslandsFixture()29{30tmp[0] = cv::gapi::boxFilter(in, -1, cv::Size(3,3));31tmp[1] = cv::gapi::boxFilter(tmp[0], -1, cv::Size(3,3));32tmp[2] = cv::gapi::boxFilter(tmp[1], -1, cv::Size(3,3));33out = cv::gapi::boxFilter(tmp[2], -1, cv::Size(3,3));34}35};3637struct Islands: public ::testing::Test, public PlainIslandsFixture {};3839using GIntArray = GArray<int>;4041G_TYPED_KERNEL(CreateMatWithDiag, <GMat(GIntArray)>, "test.array.create_mat_with_diag")42{43static GMatDesc outMeta(const GArrayDesc&) { return cv::GMatDesc{CV_32S, 1,{3, 3}}; }44};4546GAPI_OCV_KERNEL(CreateMatWithDiagImpl, CreateMatWithDiag)47{48static void run(const std::vector<int> &in, cv::Mat& out)49{50auto size = static_cast<int>(in.size());51out = Mat::zeros(size, size, CV_32SC1);52for(int i = 0; i < out.rows; i++)53{54auto* row = out.ptr<int>(i);55row[i] = in[i];56}57}58};5960G_TYPED_KERNEL(Mat2Array, <GIntArray(GMat)>, "test.array.mat2array")61{62static GArrayDesc outMeta(const GMatDesc&) { return empty_array_desc(); }63};6465GAPI_OCV_KERNEL(Mat2ArrayImpl, Mat2Array)66{67static void run(const cv::Mat& in, std::vector<int> &out)68{69GAPI_Assert(in.depth() == CV_32S && in.isContinuous());70out.reserve(in.cols * in.rows);71out.assign((int*)in.datastart, (int*)in.dataend);72}73};74}7576TEST_F(Islands, SmokeTest)77{78// (in) -> Blur1 -> (tmp0) -> Blur2 -> (tmp1) -> Blur3 -> (tmp2) -> Blur4 -> (out)79// : "test" :80// :<------------------------->:81cv::gapi::island("test", cv::GIn(tmp[0]), cv::GOut(tmp[2]));82auto cc = cv::GComputation(in, out).compile(cv::GMatDesc{CV_8U,1,{640,480}});8384const auto &gm = cc.priv().model();85const auto tmp0_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[0]);86const auto tmp1_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[1]);87const auto tmp2_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[2]);8889// tmp1 and tmp3 is not a part of any island90EXPECT_FALSE(gm.metadata(tmp0_nh).contains<cv::gimpl::Island>());91EXPECT_FALSE(gm.metadata(tmp2_nh).contains<cv::gimpl::Island>());9293// tmp2 is part of "test" island94EXPECT_TRUE(gm.metadata(tmp1_nh).contains<cv::gimpl::Island>());95EXPECT_EQ("test", gm.metadata(tmp1_nh).get<cv::gimpl::Island>().island);96}9798TEST_F(Islands, TwoIslands)99{100// (in) -> Blur1 -> (tmp0) -> Blur2 -> (tmp1) -> Blur3 -> (tmp2) -> Blur4 -> (out)101// : "test1" : : "test2" :102// :<---------------------------->: :<--------------------------------->103EXPECT_NO_THROW(cv::gapi::island("test1", cv::GIn(in), cv::GOut(tmp[1])));104EXPECT_NO_THROW(cv::gapi::island("test2", cv::GIn(tmp[1]), cv::GOut(out)));105106auto cc = cv::GComputation(in, out).compile(cv::GMatDesc{CV_8U,1,{640,480}});107const auto &gm = cc.priv().model();108const auto in_nh = cv::gimpl::GModel::dataNodeOf(gm, in);109const auto tmp0_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[0]);110const auto tmp1_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[1]);111const auto tmp2_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[2]);112const auto out_nh = cv::gimpl::GModel::dataNodeOf(gm, out);113114// Only tmp0 and tmp2 should be listed in islands.115EXPECT_TRUE (gm.metadata(tmp0_nh).contains<cv::gimpl::Island>());116EXPECT_TRUE (gm.metadata(tmp2_nh).contains<cv::gimpl::Island>());117EXPECT_FALSE(gm.metadata(in_nh) .contains<cv::gimpl::Island>());118EXPECT_FALSE(gm.metadata(tmp1_nh).contains<cv::gimpl::Island>());119EXPECT_FALSE(gm.metadata(out_nh) .contains<cv::gimpl::Island>());120121EXPECT_EQ("test1", gm.metadata(tmp0_nh).get<cv::gimpl::Island>().island);122EXPECT_EQ("test2", gm.metadata(tmp2_nh).get<cv::gimpl::Island>().island);123}124125// FIXME: Disabled since currently merge procedure merges two into one126// succesfully127TEST_F(Islands, DISABLED_Two_Islands_With_Same_Name_Should_Fail)128{129// (in) -> Blur1 -> (tmp0) -> Blur2 -> (tmp1) -> Blur3 -> (tmp2) -> Blur4 -> (out)130// : "test1" : : "test1" :131// :<---------------------------->: :<--------------------------------->132133EXPECT_NO_THROW(cv::gapi::island("test1", cv::GIn(in), cv::GOut(tmp[1])));134EXPECT_NO_THROW(cv::gapi::island("test1", cv::GIn(tmp[1]), cv::GOut(out)));135136EXPECT_ANY_THROW(cv::GComputation(in, out).compile(cv::GMatDesc{CV_8U,1,{640,480}}));137}138139140// (in) -> Blur1 -> (tmp0) -> Blur2 -> (tmp1) -> Blur3 -> (tmp2) -> Blur4 -> (out)141// : "test1": : :142// :<----------------:----------->: :143// : :144// : "test2" :145// :<------------------------->:146TEST_F(Islands, OverlappingIslands1)147{148EXPECT_NO_THROW (cv::gapi::island("test1", cv::GIn(in), cv::GOut(tmp[1])));149EXPECT_ANY_THROW(cv::gapi::island("test2", cv::GIn(tmp[0]), cv::GOut(tmp[2])));150}151152TEST_F(Islands, OverlappingIslands2)153{154EXPECT_NO_THROW (cv::gapi::island("test2", cv::GIn(tmp[0]), cv::GOut(tmp[2])));155EXPECT_ANY_THROW(cv::gapi::island("test1", cv::GIn(in), cv::GOut(tmp[1])));156}157158////////////////////////////////////////////////////////////////////////////////159// Tests on a complex graph160//161// (in0) -> Not -> (tmp0) --> Add ---------> (tmp2) --> AddC -------> (out0)162// ^ ^163// (in1) -> Blur -> (tmp1) ----'--> Sum ----> (scl0) ----'164// :165// `------------> Median -> (tmp3) --> Blur -------> (out1)166//167namespace168{169struct ComplexIslandsFixture170{171cv::GMat in[2];172cv::GMat tmp[4];173cv::GScalar scl;174cv::GMat out[2];175176ComplexIslandsFixture()177{178tmp[0] = cv::gapi::bitwise_not(in[0]);179tmp[1] = cv::gapi::boxFilter(in[1], -1, cv::Size(3,3));180tmp[2] = tmp[0] + tmp[1]; // FIXME: handle tmp[2] = tmp[0]+tmp[2] typo181scl = cv::gapi::sum(tmp[1]);182tmp[3] = cv::gapi::medianBlur(tmp[1], 3);183out[0] = tmp[2] + scl;184out[1] = cv::gapi::boxFilter(tmp[3], -1, cv::Size(3,3));185}186};187188struct ComplexIslands: public ::testing::Test, public ComplexIslandsFixture {};189} // namespace190191TEST_F(ComplexIslands, SmokeTest)192{193// isl0 #internal1194// ........................... ........195// (in0) -> Not -> (tmp0) --> Add ---------> (tmp2) --> AddC -------> (out0)196// :............ ........^...: :.^....:197// ... : :198// (in1) -> Blur -> (tmp1) ----'--> Sum ----> (scl0) ----'199// : isl1200// : ..............................201// `------------> Median -> (tmp3) --> Blur -------> (out1)202// :............................:203204cv::gapi::island("isl0", cv::GIn(in[0], tmp[1]), cv::GOut(tmp[2]));205cv::gapi::island("isl1", cv::GIn(tmp[1]), cv::GOut(out[1]));206auto cc = cv::GComputation(cv::GIn(in[0], in[1]), cv::GOut(out[0], out[1]))207.compile(cv::GMatDesc{CV_8U,1,{640,480}},208cv::GMatDesc{CV_8U,1,{640,480}});209const auto &gm = cc.priv().model();210const auto in0_nh = cv::gimpl::GModel::dataNodeOf(gm, in[0]);211const auto in1_nh = cv::gimpl::GModel::dataNodeOf(gm, in[1]);212const auto tmp0_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[0]);213const auto tmp1_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[1]);214const auto tmp2_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[2]);215const auto tmp3_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[3]);216const auto scl_nh = cv::gimpl::GModel::dataNodeOf(gm, scl);217const auto out0_nh = cv::gimpl::GModel::dataNodeOf(gm, out[0]);218const auto out1_nh = cv::gimpl::GModel::dataNodeOf(gm, out[1]);219220// tmp0, tmp3 are in islands, others are not221EXPECT_TRUE(gm.metadata(tmp0_nh) .contains<cv::gimpl::Island>()); // isl0222EXPECT_TRUE(gm.metadata(tmp3_nh) .contains<cv::gimpl::Island>()); // isl1223EXPECT_FALSE(gm.metadata(in0_nh) .contains<cv::gimpl::Island>()); // (input is never fused)224EXPECT_FALSE(gm.metadata(in1_nh) .contains<cv::gimpl::Island>()); // (input is never fused)225EXPECT_TRUE (gm.metadata(tmp1_nh).contains<cv::gimpl::Island>()); // <internal island>226EXPECT_FALSE(gm.metadata(tmp2_nh).contains<cv::gimpl::Island>()); // #not fused as cycle-causing#227EXPECT_FALSE(gm.metadata(scl_nh) .contains<cv::gimpl::Island>()); // #not fused as cycle-causing#228EXPECT_FALSE(gm.metadata(out0_nh).contains<cv::gimpl::Island>()); // (output is never fused)229EXPECT_FALSE(gm.metadata(out1_nh).contains<cv::gimpl::Island>()); // (output is never fused)230231EXPECT_EQ("isl0", gm.metadata(tmp0_nh).get<cv::gimpl::Island>().island);232EXPECT_EQ("isl1", gm.metadata(tmp3_nh).get<cv::gimpl::Island>().island);233234EXPECT_NE("isl0", gm.metadata(tmp1_nh).get<cv::gimpl::Island>().island);235EXPECT_NE("isl1", gm.metadata(tmp1_nh).get<cv::gimpl::Island>().island);236237// FIXME: Add a test with same graph for Fusion and check GIslandModel238}239240TEST_F(ComplexIslands, DistinictIslandsWithSameName)241{242// isl0243// ...........................244// (in0) -> Not -> (tmp0) --> Add ---------> (tmp2) --> AddC -------> (out0)245// :............ ........^...: ^246// ... : :247// (in1) -> Blur -> (tmp1) ----'--> Sum ----> (scl0) ----'248// : isl0249// : ..............................250// `------------> Median -> (tmp3) --> Blur -------> (out1)251// :............................:252253cv::gapi::island("isl0", cv::GIn(in[0], tmp[1]), cv::GOut(tmp[2]));254cv::gapi::island("isl0", cv::GIn(tmp[1]), cv::GOut(out[1]));255256auto cc = cv::GComputation(cv::GIn(in[0], in[1]), cv::GOut(out[0], out[1]));257258EXPECT_ANY_THROW(cc.compile(cv::GMatDesc{CV_8U,1,{640,480}},259cv::GMatDesc{CV_8U,1,{640,480}}));260}261262TEST_F(ComplexIslands, FullGraph)263{264cv::gapi::island("isl0", cv::GIn(in[0], in[1]), cv::GOut(out[0], out[1]));265auto cc = cv::GComputation(cv::GIn(in[0], in[1]), cv::GOut(out[0], out[1]))266.compile(cv::GMatDesc{CV_8U,1,{640,480}},267cv::GMatDesc{CV_8U,1,{640,480}});268const auto &gm = cc.priv().model();269std::vector<ade::NodeHandle> handles_inside = {270cv::gimpl::GModel::dataNodeOf(gm, tmp[0]),271cv::gimpl::GModel::dataNodeOf(gm, tmp[1]),272cv::gimpl::GModel::dataNodeOf(gm, tmp[2]),273cv::gimpl::GModel::dataNodeOf(gm, tmp[3]),274cv::gimpl::GModel::dataNodeOf(gm, scl),275};276std::vector<ade::NodeHandle> handles_outside = {277cv::gimpl::GModel::dataNodeOf(gm, in[0]),278cv::gimpl::GModel::dataNodeOf(gm, in[1]),279cv::gimpl::GModel::dataNodeOf(gm, out[0]),280cv::gimpl::GModel::dataNodeOf(gm, out[1]),281};282283for (auto nh_inside : handles_inside)284{285EXPECT_EQ("isl0", gm.metadata(nh_inside).get<cv::gimpl::Island>().island);286}287for (auto nh_outside : handles_outside)288{289EXPECT_FALSE(gm.metadata(nh_outside).contains<cv::gimpl::Island>());290}291}292293TEST_F(ComplexIslands, ViaScalar)294{295//296// .........................................#internal0.297// (in0) -> Not -> (tmp0) --> Add ---------> (tmp2) --> AddC -------> (out0)298// :....................^.........................^...:299// : :300// .....................:.........(isl0). :301// (in1) -> Blur -> (tmp1) ----'--> Sum ----> (scl0) ----'302// :..........:.........................:303// :304// : ..................#internal1.305// `------------> Median -> (tmp3) --> Blur -------> (out1)306// :...........................:307308cv::gapi::island("isl0", cv::GIn(in[1]), cv::GOut(scl));309auto cc = cv::GComputation(cv::GIn(in[0], in[1]), cv::GOut(out[0], out[1]))310.compile(cv::GMatDesc{CV_8U,1,{640,480}},311cv::GMatDesc{CV_8U,1,{640,480}});312const auto &gm = cc.priv().model();313314const auto tmp0_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[0]);315const auto tmp1_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[1]);316const auto tmp2_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[2]);317const auto tmp3_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[3]);318319EXPECT_NE("isl0", gm.metadata(tmp0_nh).get<cv::gimpl::Island>().island); // <internal>320EXPECT_EQ("isl0", gm.metadata(tmp1_nh).get<cv::gimpl::Island>().island); // isl0321EXPECT_NE("isl0", gm.metadata(tmp2_nh).get<cv::gimpl::Island>().island); // <internal>322EXPECT_NE("isl0", gm.metadata(tmp3_nh).get<cv::gimpl::Island>().island); // <internal>323324std::vector<ade::NodeHandle> handles_outside = {325cv::gimpl::GModel::dataNodeOf(gm, in[0]),326cv::gimpl::GModel::dataNodeOf(gm, in[1]),327cv::gimpl::GModel::dataNodeOf(gm, scl),328cv::gimpl::GModel::dataNodeOf(gm, out[0]),329cv::gimpl::GModel::dataNodeOf(gm, out[1]),330};331for (auto nh_outside : handles_outside)332{333EXPECT_FALSE(gm.metadata(nh_outside).contains<cv::gimpl::Island>());334}335}336337TEST_F(ComplexIslands, BorderDataIsland)338{339// .................................(isl0)..340// : :341// (in0) -> Not -> (tmp0) --> Add ---------> (tmp2) --> AddC -------> (out0)342// : ^ : ^343// : : : :344// (in1) -> Blur -> (tmp1) ----'--> Sum ----> (scl0) ----'345// :...........:...........................:346// : : :347// : : :.........................................(isl1)..348// : `------------> Median -> (tmp3) --> Blur -------> (out1)349// : :350// :......................................................:351352cv::gapi::island("isl0", cv::GIn(in[0], in[1]), cv::GOut(tmp[2], scl));353cv::gapi::island("isl1", cv::GIn(tmp[1]), cv::GOut(out[1]));354355auto cc = cv::GComputation(cv::GIn(in[0], in[1]), cv::GOut(out[0], out[1]))356.compile(cv::GMatDesc{CV_8U,1,{640,480}},357cv::GMatDesc{CV_8U,1,{640,480}});358const auto &gm = cc.priv().model();359const auto in0_nh = cv::gimpl::GModel::dataNodeOf(gm, in[0]);360const auto in1_nh = cv::gimpl::GModel::dataNodeOf(gm, in[1]);361const auto tmp0_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[0]);362const auto tmp1_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[1]);363const auto tmp2_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[2]);364const auto tmp3_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[3]);365const auto scl_nh = cv::gimpl::GModel::dataNodeOf(gm, scl);366const auto out0_nh = cv::gimpl::GModel::dataNodeOf(gm, out[0]);367const auto out1_nh = cv::gimpl::GModel::dataNodeOf(gm, out[1]);368369// Check handles inside isl0370EXPECT_EQ("isl0", gm.metadata(tmp0_nh).get<cv::gimpl::Island>().island);371EXPECT_EQ("isl0", gm.metadata(tmp1_nh).get<cv::gimpl::Island>().island);372// ^^^ Important - tmp1 is assigned to isl0, not isl1373374// Check handles inside isl1375EXPECT_EQ("isl1", gm.metadata(tmp3_nh).get<cv::gimpl::Island>().island);376377// Check outside handles378EXPECT_FALSE(gm.metadata(in0_nh) .contains<cv::gimpl::Island>());379EXPECT_FALSE(gm.metadata(in1_nh) .contains<cv::gimpl::Island>());380EXPECT_FALSE(gm.metadata(tmp2_nh).contains<cv::gimpl::Island>());381EXPECT_FALSE(gm.metadata(scl_nh) .contains<cv::gimpl::Island>());382EXPECT_FALSE(gm.metadata(out0_nh).contains<cv::gimpl::Island>());383EXPECT_FALSE(gm.metadata(out1_nh).contains<cv::gimpl::Island>());384}385386387TEST_F(ComplexIslands, IncompleteSpec)388{389// isl0390// ...........................391// (in0) -> Not -> (tmp0) --> Add ---------> (tmp2) --> AddC -------> (out0)392// :...........xxx.......^...: ^393// : :394// (in1) -> Blur -> (tmp1) ----'--> Sum ----> (scl0) ----'395// :396// :397// `------------> Median -> (tmp3) --> Blur -------> (out1)398//399400// tmp1 is missing in the below spec401EXPECT_ANY_THROW(cv::gapi::island("isl0", cv::GIn(in[0]), cv::GOut(tmp[2])));402403// empty range404EXPECT_ANY_THROW(cv::gapi::island("isl1", cv::GIn(tmp[2]), cv::GOut(tmp[2])));405}406407TEST_F(ComplexIslands, InputOperationFromDifferentIslands)408{409// isl1410// ........................... ........411// (in0)--> Not -> (tmp0) --> Add :--------> (tmp2)-->: AddC : -------> (out0)412// :......................^..: : ^ :413// isl0 : : : :414// .......................:....................... : :415// (in1) :-> Blur -> (tmp1) ----'--> Sum ----> (scl0) ----- :416// :....................................................:417// isl0 :418// `------------> Median -> (tmp3) --> Blur -------> (out1)419//420421cv::gapi::island("isl0", cv::GIn(in[1], tmp[2]), cv::GOut(out[0]));422cv::gapi::island("isl1", cv::GIn(in[0], tmp[1]), cv::GOut(tmp[2]));423auto cc = cv::GComputation(cv::GIn(in[0], in[1]), cv::GOut(out[0], out[1]))424.compile(cv::GMatDesc{CV_8U,1,{640,480}},425cv::GMatDesc{CV_8U,1,{640,480}});426427const auto &gm = cc.priv().model();428const auto tmp0_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[0]);429const auto tmp1_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[1]);430const auto tmp2_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[2]);431432EXPECT_EQ("isl1", gm.metadata(tmp0_nh).get<cv::gimpl::Island>().island);433EXPECT_EQ("isl0", gm.metadata(tmp1_nh).get<cv::gimpl::Island>().island);434EXPECT_FALSE(gm.metadata(tmp2_nh).contains<cv::gimpl::Island>());435}436437TEST_F(ComplexIslands, NoWayBetweenNodes)438{439// (in0) -> Not -> (tmp0) --> Add ---------> (tmp2) --> AddC -------> (out0)440// ^ ^441// (in1) -> Blur -> (tmp1) ----'--> Sum ----> (scl0) ----'442// :443// `------------> Median -> (tmp3) --> Blur -------> (out1)444445EXPECT_ANY_THROW(cv::gapi::island("isl0", cv::GIn(in[1]), cv::GOut(tmp[0])));446}447448TEST_F(ComplexIslands, IslandsContainUnusedPart)449{450// Unused part of the graph451// x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x452// x x453// x(in0) -> Not -> (tmp0) --> Add ---------> (tmp2)---> AddC ---------> (out0) x454// x ^ ^ x455// x x x x x x x x x x x x x x x | x x | x456// | x | x457// ...... | x | x458// (in1) -> :Blur:----------> (tmp1) x-----> Sum ------> (scl0) x459// ...... : x x x x x x x x x x x x x x x x x x x x x x x x460// isl0461// :462// `------------> Median -> (tmp3) --> Blur -------> (out1)463464cv::gapi::island("isl0", cv::GIn(in[1]), cv::GOut(scl));465auto cc = cv::GComputation(cv::GIn(in[1]), cv::GOut(out[1]))466.compile(cv::GMatDesc{CV_8U,1,{640,480}});467468const auto &gm = cc.priv().model();469const auto tmp1_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[1]);470471//The output 0 is not specified in the graph472//means that there will not be a node scl, so that tmp1 will not assign to the island473// FIXME Check that blur assigned to island using the function producerOf474// After merge islands fusion475EXPECT_FALSE(gm.metadata(tmp1_nh) .contains<cv::gimpl::Island>());476}477478TEST_F(ComplexIslands, FullGraphInTwoIslands)479{480// isl0481// ..................................................482// (in0) -> :Not -> (tmp0) --> Add ---------> (tmp2) --> AddC: -------> (out0)483// ...................^.... ^ :484// ............... | : : :485// (in1) -> :Blur-> (tmp1):----'-->:Sum ----> (scl0) ----' :486// ........ | : ...........................487// isl1 : | :............................................488// : `------------> Median -> (tmp3) --> Blur ------->:(out1)489// ....................................................490491cv::gapi::island("isl0", cv::GIn(in[0], tmp[1]), cv::GOut(out[0]));492cv::gapi::island("isl1", cv::GIn(in[1]), cv::GOut(out[1]));493auto cc = cv::GComputation(cv::GIn(in[0], in[1]), cv::GOut(out[0], out[1]))494.compile(cv::GMatDesc{CV_8U,1,{640,480}},495cv::GMatDesc{CV_8U,1,{640,480}});496497const auto &gm = cc.priv().model();498const auto in0_nh = cv::gimpl::GModel::dataNodeOf(gm, in[0]);499const auto in1_nh = cv::gimpl::GModel::dataNodeOf(gm, in[1]);500const auto tmp0_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[0]);501const auto tmp1_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[1]);502const auto tmp2_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[2]);503const auto tmp3_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[3]);504const auto scl_nh = cv::gimpl::GModel::dataNodeOf(gm, scl);505const auto out0_nh = cv::gimpl::GModel::dataNodeOf(gm, out[0]);506const auto out1_nh = cv::gimpl::GModel::dataNodeOf(gm, out[1]);507508// Check handles inside isl0509EXPECT_EQ("isl0", gm.metadata(tmp0_nh).get<cv::gimpl::Island>().island);510EXPECT_EQ("isl0", gm.metadata(tmp2_nh).get<cv::gimpl::Island>().island);511EXPECT_EQ("isl0", gm.metadata(scl_nh).get<cv::gimpl::Island>().island);512513// Check handles inside isl1514EXPECT_EQ("isl1", gm.metadata(tmp1_nh).get<cv::gimpl::Island>().island);515EXPECT_EQ("isl1", gm.metadata(tmp3_nh).get<cv::gimpl::Island>().island);516517// Check outside handles518EXPECT_FALSE(gm.metadata(in0_nh) .contains<cv::gimpl::Island>());519EXPECT_FALSE(gm.metadata(in1_nh) .contains<cv::gimpl::Island>());520EXPECT_FALSE(gm.metadata(out0_nh).contains<cv::gimpl::Island>());521EXPECT_FALSE(gm.metadata(out1_nh).contains<cv::gimpl::Island>());522}523524TEST_F(ComplexIslands, OnlyOperationsAssignedToIslands)525{526cv::gapi::island("isl0", cv::GIn(in[1]), cv::GOut(tmp[1]));527cv::gapi::island("isl1", cv::GIn(tmp[1]), cv::GOut(scl));528cv::gapi::island("isl2", cv::GIn(scl, tmp[2]), cv::GOut(out[0]));529cv::gapi::island("isl3", cv::GIn(in[0]), cv::GOut(tmp[0]));530cv::gapi::island("isl4", cv::GIn(tmp[0], tmp[1]), cv::GOut(tmp[2]));531cv::gapi::island("isl5", cv::GIn(tmp[1]), cv::GOut(tmp[3]));532cv::gapi::island("isl6", cv::GIn(tmp[3]), cv::GOut(out[1]));533534auto cc = cv::GComputation(cv::GIn(in[0], in[1]), cv::GOut(out[0], out[1]))535.compile(cv::GMatDesc{CV_8U,1,{640,480}},536cv::GMatDesc{CV_8U,1,{640,480}});537538const auto &gm = cc.priv().model();539//FIXME: Check that operation handles are really assigned to isl0..isl6540const auto in0_nh = cv::gimpl::GModel::dataNodeOf(gm, in[0]);541const auto in1_nh = cv::gimpl::GModel::dataNodeOf(gm, in[1]);542const auto tmp0_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[0]);543const auto tmp1_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[1]);544const auto tmp2_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[2]);545const auto tmp3_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp[3]);546const auto scl_nh = cv::gimpl::GModel::dataNodeOf(gm, scl);547const auto out0_nh = cv::gimpl::GModel::dataNodeOf(gm, out[0]);548const auto out1_nh = cv::gimpl::GModel::dataNodeOf(gm, out[1]);549550EXPECT_FALSE(gm.metadata(in0_nh) .contains<cv::gimpl::Island>());551EXPECT_FALSE(gm.metadata(in1_nh) .contains<cv::gimpl::Island>());552EXPECT_FALSE(gm.metadata(tmp0_nh) .contains<cv::gimpl::Island>());553EXPECT_FALSE(gm.metadata(tmp1_nh) .contains<cv::gimpl::Island>());554EXPECT_FALSE(gm.metadata(tmp2_nh) .contains<cv::gimpl::Island>());555EXPECT_FALSE(gm.metadata(tmp3_nh) .contains<cv::gimpl::Island>());556EXPECT_FALSE(gm.metadata(scl_nh) .contains<cv::gimpl::Island>());557EXPECT_FALSE(gm.metadata(out0_nh).contains<cv::gimpl::Island>());558EXPECT_FALSE(gm.metadata(out1_nh).contains<cv::gimpl::Island>());559}560561namespace562{563struct IslandStructureWithGArray564{565GIntArray in, out;566GMat tmp;567568IslandStructureWithGArray()569{570tmp = CreateMatWithDiag::on(in);571out = Mat2Array::on(tmp);572}573};574575struct IslandsWithGArray: public ::testing::Test, public IslandStructureWithGArray {};576} // namespace577578TEST_F(IslandsWithGArray, IslandWithGArrayAsInput)579{580cv::gapi::island("isl0", cv::GIn(in), cv::GOut(tmp));581582const auto pkg = cv::gapi::kernels<CreateMatWithDiagImpl, Mat2ArrayImpl>();583auto cc = cv::GComputation(cv::GIn(in), GOut(out)).compile(cv::empty_array_desc(), cv::compile_args(pkg));584const auto &gm = cc.priv().model();585586const auto in_nh = cv::gimpl::GModel::dataNodeOf(gm, in.strip());587const auto out_nh = cv::gimpl::GModel::dataNodeOf(gm, out.strip());588const auto tmp_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp);589GAPI_Assert(tmp_nh->inNodes().size() == 1);590const auto create_diag_mat_nh = tmp_nh->inNodes().front();591592EXPECT_EQ("isl0", gm.metadata(create_diag_mat_nh).get<cv::gimpl::Island>().island);593EXPECT_FALSE(gm.metadata(in_nh) .contains<cv::gimpl::Island>());594EXPECT_FALSE(gm.metadata(out_nh) .contains<cv::gimpl::Island>());595EXPECT_FALSE(gm.metadata(tmp_nh) .contains<cv::gimpl::Island>());596}597598TEST_F(IslandsWithGArray, IslandWithGArrayAsOutput)599{600cv::gapi::island("isl0", cv::GIn(tmp), cv::GOut(out));601602const auto pkg = cv::gapi::kernels<CreateMatWithDiagImpl, Mat2ArrayImpl>();603auto cc = cv::GComputation(cv::GIn(in), GOut(out)).compile(cv::empty_array_desc(), cv::compile_args(pkg));604const auto &gm = cc.priv().model();605606const auto in_nh = cv::gimpl::GModel::dataNodeOf(gm, in.strip());607const auto out_nh = cv::gimpl::GModel::dataNodeOf(gm, out.strip());608const auto tmp_nh = cv::gimpl::GModel::dataNodeOf(gm, tmp);609GAPI_Assert(tmp_nh->inNodes().size() == 1);610const auto mat2array_nh = out_nh->inNodes().front();611612EXPECT_EQ("isl0", gm.metadata(mat2array_nh).get<cv::gimpl::Island>().island);613EXPECT_FALSE(gm.metadata(in_nh) .contains<cv::gimpl::Island>());614EXPECT_FALSE(gm.metadata(out_nh) .contains<cv::gimpl::Island>());615EXPECT_FALSE(gm.metadata(tmp_nh) .contains<cv::gimpl::Island>());616}617////////////////////////////////////////////////////////////////////////////////618// Wrong input tests on island name619//620namespace621{622struct CheckName : public TestWithParam<std::tuple<bool, const char*> >,623public PlainIslandsFixture624{625void assignIsland(const std::string &s)626{627cv::gapi::island(s, cv::GIn(tmp[0]), cv::GOut(tmp[2]));628};629};630TEST_P(CheckName, Test)631{632bool correct = false;633const char *name = "";634std::tie(correct, name) = GetParam();635if (correct) EXPECT_NO_THROW(assignIsland(name));636else EXPECT_ANY_THROW(assignIsland(name));637}638} // namespace639INSTANTIATE_TEST_CASE_P(IslandName, CheckName,640Values(std::make_tuple(true, "name"),641std::make_tuple(true, " name "),642std::make_tuple(true, " n a m e "),643std::make_tuple(true, " 123 $$ %%"),644std::make_tuple(true, ".: -"),645std::make_tuple(false, ""),646std::make_tuple(false, " "),647std::make_tuple(false, " \t "),648std::make_tuple(false, " \t \t ")));649650// FIXME: add <internal> test on unrollExpr() use for islands651652} // opencv_test653654655