d77e89db1adfc7cba7bf34d32ae79c3d79378e4c
[platform/core/ml/nnfw.git] / compiler / luci / pass / include / luci / CircleOptimizer.h
1 /*
2  * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *    http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #ifndef __LUCI_CIRCLE_OPTIMIZER_H__
18 #define __LUCI_CIRCLE_OPTIMIZER_H__
19
20 #include <loco.h>
21
22 #include <luci/IR/Module.h>
23
24 #include <string>
25 #include <vector>
26
27 namespace luci
28 {
29
30 class CircleOptimizer final
31 {
32 public:
33   struct Options
34   {
35     enum Algorithm
36     {
37       FuseAddWithFullyConnected,
38       FuseAddWithTConv,
39       FuseBatchNormWithConv,
40       FuseBatchNormWithDwConv,
41       FuseBatchNormWithTConv,
42       FuseBCQ,
43       FuseInstanceNorm,
44       FuseMeanWithMean,
45       FuseTransposeWithMean,
46       ResolveCustomOpAdd,
47       ResolveCustomOpBatchMatMul,
48       ResolveCustomOpMatMul,
49       ResolveCustomOpMaxPoolWithArgmax,
50       ResolveCustomOpSplitV,
51       FoldAddV2,
52       FoldCast,
53       FoldDensify,
54       FoldDepthwiseConv2D,
55       FoldFullyConnected,
56       FoldDequantize,
57       FoldGather,
58       FoldSparseToDense,
59       ForwardReshapeToUnaryOp,
60       ForwardTransposeOp,
61       SparsifyTensorPass,
62       FusePreActivationBatchNorm,
63       MakeBatchNormGammaPositive,
64       FuseActivationFunction,
65       FusePRelu,
66       ShuffleWeightTo16x1Float32,
67       RemoveRedundantTranspose,
68       ReplaceMulAddWithDepthwiseConv,
69       ReplaceNonConstFCWithBatchMatMul,
70       ReplaceSubWithAdd,
71       SubstitutePackToReshape,
72       SubstitutePadV2ToPad,
73       SubstituteSplitVToSplit,
74       SubstituteSqueezeToReshape,
75       ExpandBroadcastConst,
76       ConvertNCHWToNHWC,
77       RemoveUnnecessarySlice,
78       RemoveUnnecessaryStridedSlice,
79       RemoveUnnecessarySplit,
80       RemoveUnnecessaryReshape,
81       TransformMinMaxToRelu6Pass,
82       TransformMinReluToRelu6Pass,
83       SubstituteStridedSliceToReshape,
84       SubstituteTransposeToReshape,
85       RemoveRedundantQuantize,
86       RemoveRedundantReshape,
87       RemoveFakeQuant,
88       RemoveQuantDequantSeq,
89       RemoveDuplicateConst,
90       UnrollUnidirSeqLSTM,
91     };
92
93     enum AlgorithmParameters
94     {
95       // sparsify
96       Sparsify_tensor_name,
97       Sparsify_traversal_order,
98       Sparsify_format,
99       Sparsify_block_size,
100       Sparsify_block_map,
101
102       // convert NCHW to NHWC
103       NCHW_to_NHWC_input_shape,
104       NCHW_to_NHWC_output_shape,
105     };
106
107     virtual ~Options() = default;
108
109     virtual void enable(Algorithm) = 0;
110     virtual bool query(Algorithm) = 0;
111     virtual void param(AlgorithmParameters, const std::string &) = 0;
112     virtual const std::string param(AlgorithmParameters) const = 0;
113   };
114
115 public:
116   // TODO maybe caller can provide Options as ctor parameters
117   Options *options(void);
118
119 public:
120   void optimize(luci::Module *) const;
121
122   void optimize(loco::Graph *) const;
123
124   void sparsify(loco::Graph *) const;
125
126 private:
127   std::unique_ptr<Options> _options;
128 };
129
130 } // namespace luci
131
132 #endif // __LUCI_CIRCLE_OPTIMIZER_H__