aboutsummaryrefslogtreecommitdiff
path: root/test/FullyConnected.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/FullyConnected.cpp')
-rw-r--r--test/FullyConnected.cpp112
1 files changed, 112 insertions, 0 deletions
diff --git a/test/FullyConnected.cpp b/test/FullyConnected.cpp
index 8550c8d9..a68a5870 100644
--- a/test/FullyConnected.cpp
+++ b/test/FullyConnected.cpp
@@ -264,4 +264,116 @@ BOOST_AUTO_TEST_CASE(TestFullyConnected4dInputReshape)
BOOST_TEST(outdata[7] == 8);
}
+BOOST_AUTO_TEST_CASE(TestFullyConnectedWeightsAsInput)
+{
+ auto driver = std::make_unique<ArmnnDriver>(DriverOptions(armnn::Compute::CpuRef));
+
+ V1_0::ErrorStatus error;
+ std::vector<bool> sup;
+
+ ArmnnDriver::getSupportedOperations_cb cb = [&](V1_0::ErrorStatus status, const std::vector<bool>& supported)
+ {
+ error = status;
+ sup = supported;
+ };
+
+ HalPolicy::Model model = {};
+
+ // operands
+ int32_t actValue = 0;
+ float weightValue[] = {1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1}; //identity
+ float biasValue[] = {0, 0, 0, 0, 0, 0, 0, 0};
+
+ // fully connected operation
+ AddInputOperand<HalPolicy>(model, hidl_vec<uint32_t>{1, 1, 1, 8});
+ AddInputOperand<HalPolicy>(model, hidl_vec<uint32_t>{8, 8});
+ AddInputOperand<HalPolicy>(model, hidl_vec<uint32_t>{8});
+ AddIntOperand<HalPolicy>(model, actValue);
+ AddOutputOperand<HalPolicy>(model, hidl_vec<uint32_t>{1, 8});
+
+ model.operations.resize(1);
+
+ model.operations[0].type = HalPolicy::OperationType::FULLY_CONNECTED;
+ model.operations[0].inputs = hidl_vec<uint32_t>{0,1,2,3};
+ model.operations[0].outputs = hidl_vec<uint32_t>{4};
+
+ // make the prepared model
+ android::sp<V1_0::IPreparedModel> preparedModel = PrepareModel(model, *driver);
+
+ // construct the request for input
+ V1_0::DataLocation inloc = {};
+ inloc.poolIndex = 0;
+ inloc.offset = 0;
+ inloc.length = 8 * sizeof(float);
+ RequestArgument input = {};
+ input.location = inloc;
+ input.dimensions = hidl_vec<uint32_t>{1, 1, 1, 8};
+
+ // construct the request for weights as input
+ V1_0::DataLocation wloc = {};
+ wloc.poolIndex = 1;
+ wloc.offset = 0;
+ wloc.length = 64 * sizeof(float);
+ RequestArgument weights = {};
+ weights.location = wloc;
+ weights.dimensions = hidl_vec<uint32_t>{8, 8};
+
+ // construct the request for bias as input
+ V1_0::DataLocation bloc = {};
+ bloc.poolIndex = 2;
+ bloc.offset = 0;
+ bloc.length = 8 * sizeof(float);
+ RequestArgument bias = {};
+ bias.location = bloc;
+ bias.dimensions = hidl_vec<uint32_t>{8};
+
+ V1_0::DataLocation outloc = {};
+ outloc.poolIndex = 3;
+ outloc.offset = 0;
+ outloc.length = 8 * sizeof(float);
+ RequestArgument output = {};
+ output.location = outloc;
+ output.dimensions = hidl_vec<uint32_t>{1, 8};
+
+ V1_0::Request request = {};
+ request.inputs = hidl_vec<RequestArgument>{input, weights, bias};
+ request.outputs = hidl_vec<RequestArgument>{output};
+
+ // set the input data
+ float indata[] = {1,2,3,4,5,6,7,8};
+ AddPoolAndSetData(8, request, indata);
+
+ // set the weights data
+ AddPoolAndSetData(64, request, weightValue);
+ // set the bias data
+ AddPoolAndSetData(8, request, biasValue);
+
+ // add memory for the output
+ android::sp<IMemory> outMemory = AddPoolAndGetData<float>(8, request);
+ float* outdata = static_cast<float*>(static_cast<void*>(outMemory->getPointer()));
+
+ // run the execution
+ if (preparedModel != nullptr)
+ {
+ Execute(preparedModel, request);
+ }
+
+ // check the result
+ BOOST_TEST(outdata[0] == 1);
+ BOOST_TEST(outdata[1] == 2);
+ BOOST_TEST(outdata[2] == 3);
+ BOOST_TEST(outdata[3] == 4);
+ BOOST_TEST(outdata[4] == 5);
+ BOOST_TEST(outdata[5] == 6);
+ BOOST_TEST(outdata[6] == 7);
+ BOOST_TEST(outdata[7] == 8);
+}
+
BOOST_AUTO_TEST_SUITE_END()