af07f88300d686682c8344afc997efda23a572bf
[platform/upstream/dldt.git] / inference-engine / src / vpu / graph_transformer / src / stages / scale.cpp
1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
3 //
4
5 #include <vpu/frontend/frontend.hpp>
6
7 #include <vector>
8 #include <memory>
9 #include <set>
10 #include <string>
11
12 #include <vpu/sw/post_op_stage.hpp>
13
14 namespace vpu {
15
16 namespace {
17
18 class ScaleStage final : public PostOpStage {
19 private:
20     StagePtr cloneImpl() const override {
21         return std::make_shared<ScaleStage>(*this);
22     }
23
24     void propagateScaleFactorsImpl(
25             const SmallVector<float>& inputScales,
26             ScalePropagationStep step,
27             StageDataInfo<float>& scaleInfo) override {
28         auto inputScale = inputScales[0];
29
30         scaleInfo.setInput(inputEdge(1), step == ScalePropagationStep::Propagate ? 1.0f : inputScale);
31         if (numInputs() == 3) {
32             scaleInfo.setInput(inputEdge(2), inputScale);
33         }
34         scaleInfo.setOutput(outputEdge(0), inputScale);
35     }
36
37     void serializeParamsImpl(BlobSerializer&) const override {
38     }
39 };
40
41 }  // namespace
42
43 Stage StageBuilder::addScaleStage(
44         const Model::Ptr& model,
45         const std::string& name,
46         const ie::CNNLayerPtr& layer,
47         const Data& input,
48         const Data& scales,
49         const Data& output) {
50     return model->addNewStage<ScaleStage>(
51         name,
52         StageType::Scale,
53         layer,
54         {input, scales},
55         {output});
56 }
57
58 void FrontEnd::parseScale(
59         const Model::Ptr& model,
60         const ie::CNNLayerPtr& _layer,
61         const DataVector& inputs,
62         const DataVector& outputs) {
63     IE_ASSERT(inputs.size() == 1);
64     IE_ASSERT(outputs.size() == 1);
65
66     auto layer = std::dynamic_pointer_cast<ie::ScaleShiftLayer>(_layer);
67     IE_ASSERT(layer != nullptr);
68
69     if (layer->_broadcast != 0) {
70         VPU_THROW_EXCEPTION <<
71             "Layer " << layer->name << " doesn't support broadcast param";
72     }
73
74     auto input = inputs[0];
75     auto output = outputs[0];
76
77     Data scales, biases;
78     std::tie(scales, biases) = getWeightsAndBiases(model, layer);
79
80     if (biases->usage() == DataUsage::Fake) {
81         model->addNewStage<ScaleStage>(
82             layer->name,
83             StageType::Scale,
84             layer,
85             {input, scales},
86             {output});
87     } else {
88         model->addNewStage<ScaleStage>(
89             layer->name,
90             StageType::ScaleShift,
91             layer,
92             {input, scales, biases},
93             {output});
94     }
95 }
96
97 }  // namespace vpu