1297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung#
2297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung# Copyright (C) 2017 The Android Open Source Project
3297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung#
4297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung# Licensed under the Apache License, Version 2.0 (the "License");
5297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung# you may not use this file except in compliance with the License.
6297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung# You may obtain a copy of the License at
7297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung#
8297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung#      http://www.apache.org/licenses/LICENSE-2.0
9297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung#
10297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung# Unless required by applicable law or agreed to in writing, software
11297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung# distributed under the License is distributed on an "AS IS" BASIS,
12297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung# See the License for the specific language governing permissions and
14297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung# limitations under the License.
15297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung#
16297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung
17297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sungmodel = Model()
18297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sungi1 = Input("op1", "TENSOR_FLOAT32", "{1, 3, 3, 2}")
19297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sungf1 = Input("op2", "TENSOR_FLOAT32", "{1, 2, 2, 4}")
20297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sungb1 = Input("op3", "TENSOR_FLOAT32", "{4}")
21297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sungpad0 = Int32Scalar("pad0", 0)
22297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sungact = Int32Scalar("act", 0)
23297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sungstride = Int32Scalar("stride", 1)
24297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sungcm = Int32Scalar("channelMultiplier", 2)
25297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sungoutput = Output("op4", "TENSOR_FLOAT32", "{1, 2, 2, 4}")
26297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung
27297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sungmodel = model.Operation("DEPTHWISE_CONV_2D",
28297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung                        i1, f1, b1,
29297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung                        pad0, pad0, pad0, pad0,
30297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung                        stride, stride,
31297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung                        cm, act).To(output)
32297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung
33297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung# Example 1. Input in operand 0,
34297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sunginput0 = {i1: # input 0
35297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung          [10, 21, 10, 22, 10, 23,
36297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung           10, 24, 10, 25, 10, 26,
37297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung           10, 27, 10, 28, 10, 29],
38297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung          f1:
39297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung          [.25, 0, .2,  0,
40297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung           .25, 0,  0, .3,
41297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung           .25, 0,  0,  0,
42297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung           .25, .1, 0,  0],
43297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung          b1:
44297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung          [1, 2, 3, 4]}
45297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung# (i1 (conv) f1) + b1
46297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung# filter usage:
47297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung#   in_ch1 * f_1  --> output_d1
48297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung#   in_ch1 * f_2  --> output_d2
49297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung#   in_ch2 * f_3  --> output_d3
50297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung#   in_ch3 * f_4  --> output_d4
51297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sungoutput0 = {output: # output 0
52297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung           [11, 3, 7.2, 10.6,
53297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung            11, 3, 7.4, 10.9,
54297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung            11, 3, 7.8, 11.5,
55297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung            11, 3, 8.0, 11.8]}
56297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung
57297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) Sung# Instantiate an example
58297c580a2d2da2839d936437bf4e3a4c64034950I-Jui (Ray) SungExample((input0, output0))
59