File size: 24,686 Bytes
be903e2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
// Tencent is pleased to support the open source community by making ncnn available.
//
// Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.
//
// Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
// in compliance with the License. You may obtain a copy of the License at
//
// https://opensource.org/licenses/BSD-3-Clause
//
// Unless required by applicable law or agreed to in writing, software distributed
// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.

#include "pass_level2.h"

namespace pnnx {

class F_local_response_norm : public GraphRewriterPass
{
public:
    const char* match_pattern_graph() const
    {
        return R"PNNXIR(7767517
35 34
pnnx.Input              input       0 1 input
prim::Constant          op_0        0 1 k value=%k
prim::Constant          op_1        0 1 alpha value=%alpha
prim::Constant          op_2        0 1 24 value=None
prim::Constant          op_3        0 1 23 value=True
prim::Constant          op_4        0 1 22 value=False
prim::Constant          op_5        0 1 7 value=1
prim::Constant          op_6        0 1 10 value=0
prim::Constant          op_7        0 1 size value=%size
prim::Constant          op_8        0 1 beta value=%beta
aten::mul               op_9        2 1 input input 6
aten::unsqueeze         op_10       2 1 6 7 input.1
prim::Constant          op_11       0 1 52 value=0
prim::Constant          op_12       0 1 53 value=*
prim::Constant          op_13       0 1 54 value=*
prim::ListConstruct     op_14       4 1 10 52 53 54 11
prim::Constant          op_15       0 1 55 value=%padzero
aten::constant_pad_nd   op_16       3 1 input.1 11 55 div.1
prim::Constant          op_17       0 1 56 value=1
prim::ListConstruct     op_18       2 1 size 56 16
prim::Constant          op_19       0 1 57 value=1
prim::Constant          op_20       0 1 58 value=1
prim::ListConstruct     op_21       2 1 57 58 17
prim::Constant          op_22       0 1 59 value=0
prim::Constant          op_23       0 1 60 value=0
prim::ListConstruct     op_24       2 1 59 60 18
aten::avg_pool2d        op_25       7 1 div.1 16 17 18 22 23 24 25
prim::Constant          op_26       0 1 61 value=1
aten::squeeze           op_27       2 1 25 61 div0.1
aten::mul               op_28       2 1 div0.1 alpha 30
prim::Constant          op_29       0 1 62 value=1
aten::add               op_30       3 1 30 k 62 33
aten::pow               op_31       2 1 33 beta div1.1
aten::div               op_32       2 1 input div1.1 out
pnnx.Output             output      1 0 out
)PNNXIR";
    }

    const char* type_str() const
    {
        return "F.local_response_norm";
    }

    bool match(const std::map<std::string, Parameter>& captured_params) const
    {
        if (captured_params.at("padzero").type == 2)
            return captured_params.at("padzero").i == 0;

        if (captured_params.at("padzero").type == 3)
            return captured_params.at("padzero").f == 0.f;

        return false;
    }

    void write(Operator* op, const std::map<std::string, Parameter>& captured_params) const
    {
        op->params["size"] = captured_params.at("size");
        op->params["alpha"] = captured_params.at("alpha");
        op->params["beta"] = captured_params.at("beta");
        op->params["k"] = captured_params.at("k");
    }
};

REGISTER_GLOBAL_PNNX_GRAPH_REWRITER_PASS(F_local_response_norm, 8)

class F_local_response_norm_1 : public GraphRewriterPass
{
public:
    const char* match_pattern_graph() const
    {
        return R"PNNXIR(7767517
65 64
pnnx.Input              input       0 1 input
prim::Constant          op_0        0 1 k value=%k
prim::Constant          op_1        0 1 alpha value=%alpha
prim::Constant          op_2        0 1 66 value=None
prim::Constant          op_3        0 1 65 value=True
prim::Constant          op_4        0 1 64 value=False
prim::Constant          op_5        0 1 7 value=1
prim::Constant          op_6        0 1 10 value=0
prim::Constant          op_7        0 1 29 value=2
prim::Constant          op_8        0 1 39 value=3
prim::Constant          op_9        0 1 49 value=-1
prim::Constant          op_10       0 1 size value=%size
prim::Constant          op_11       0 1 beta value=%beta
aten::mul               op_12       2 1 input input 6
aten::unsqueeze         op_13       2 1 6 7 div.1
aten::size              op_14       2 1 input 10 11
prim::NumToTensor       op_15       1 1 11 12
aten::Int               op_16       1 1 12 15
aten::Int               op_17       1 1 12 18
prim::Constant          op_18       0 1 101 value=1
aten::size              op_19       2 1 input 101 20
prim::NumToTensor       op_20       1 1 20 21
aten::Int               op_21       1 1 21 24
aten::Int               op_22       1 1 21 27
aten::size              op_23       2 1 input 29 30
prim::NumToTensor       op_24       1 1 30 31
aten::Int               op_25       1 1 31 34
aten::Int               op_26       1 1 31 37
aten::size              op_27       2 1 input 39 40
prim::NumToTensor       op_28       1 1 40 41
aten::Int               op_29       1 1 41 44
prim::Constant          op_30       0 1 102 value=1
prim::ListConstruct     op_31       5 1 18 102 27 37 49 50
aten::view              op_32       2 1 div.1 50 input.1
prim::Constant          op_33       0 1 103 value=0
prim::Constant          op_34       0 1 104 value=0
prim::Constant          op_35       0 1 105 value=0
prim::Constant          op_36       0 1 106 value=0
prim::Constant          op_37       0 1 107 value=*
prim::Constant          op_38       0 1 108 value=*
prim::ListConstruct     op_39       6 1 103 104 105 106 107 108 53
prim::Constant          op_40       0 1 109 value=%padzero
aten::constant_pad_nd   op_41       3 1 input.1 53 109 div0.1
prim::Constant          op_42       0 1 110 value=1
prim::Constant          op_43       0 1 111 value=1
prim::ListConstruct     op_44       3 1 size 110 111 58
prim::Constant          op_45       0 1 112 value=1
prim::Constant          op_46       0 1 113 value=1
prim::Constant          op_47       0 1 114 value=1
prim::ListConstruct     op_48       3 1 112 113 114 59
prim::Constant          op_49       0 1 115 value=0
prim::Constant          op_50       0 1 116 value=0
prim::Constant          op_51       0 1 117 value=0
prim::ListConstruct     op_52       3 1 115 116 117 60
aten::avg_pool3d        op_53       7 1 div0.1 58 59 60 64 65 66 67
prim::Constant          op_54       0 1 118 value=1
aten::squeeze           op_55       2 1 67 118 div1.1
prim::ListConstruct     op_56       4 1 15 24 34 44 75
aten::view              op_57       2 1 div1.1 75 div2.1
aten::mul               op_58       2 1 div2.1 alpha 79
prim::Constant          op_59       0 1 119 value=1
aten::add               op_60       3 1 79 k 119 82
aten::pow               op_61       2 1 82 beta div3.1
aten::div               op_62       2 1 input div3.1 out
pnnx.Output             output      1 0 out
)PNNXIR";
    }

    const char* type_str() const
    {
        return "F.local_response_norm";
    }

    bool match(const std::map<std::string, Parameter>& captured_params) const
    {
        if (captured_params.at("padzero").type == 2)
            return captured_params.at("padzero").i == 0;

        if (captured_params.at("padzero").type == 3)
            return captured_params.at("padzero").f == 0.f;

        return false;
    }

    void write(Operator* op, const std::map<std::string, Parameter>& captured_params) const
    {
        op->params["size"] = captured_params.at("size");
        op->params["alpha"] = captured_params.at("alpha");
        op->params["beta"] = captured_params.at("beta");
        op->params["k"] = captured_params.at("k");
    }
};

REGISTER_GLOBAL_PNNX_GRAPH_REWRITER_PASS(F_local_response_norm_1, 8)

class F_local_response_norm_2 : public GraphRewriterPass
{
public:
    const char* match_pattern_graph() const
    {
        return R"PNNXIR(7767517
69 68
pnnx.Input              input       0 1 input
prim::Constant          op_0        0 1 k value=%k
prim::Constant          op_1        0 1 alpha value=%alpha
prim::Constant          op_2        0 1 73 value=None
prim::Constant          op_3        0 1 72 value=True
prim::Constant          op_4        0 1 71 value=False
prim::Constant          op_5        0 1 7 value=1
prim::Constant          op_6        0 1 10 value=0
prim::Constant          op_7        0 1 29 value=2
prim::Constant          op_8        0 1 39 value=3
prim::Constant          op_9        0 1 46 value=4
prim::Constant          op_10       0 1 56 value=-1
prim::Constant          op_11       0 1 size value=%size
prim::Constant          op_12       0 1 beta value=%beta
aten::mul               op_13       2 1 input input 6
aten::unsqueeze         op_14       2 1 6 7 div.1
aten::size              op_15       2 1 input 10 11
prim::NumToTensor       op_16       1 1 11 12
aten::Int               op_17       1 1 12 15
aten::Int               op_18       1 1 12 18
prim::Constant          op_19       0 1 109 value=1
aten::size              op_20       2 1 input 109 20
prim::NumToTensor       op_21       1 1 20 21
aten::Int               op_22       1 1 21 24
aten::Int               op_23       1 1 21 27
aten::size              op_24       2 1 input 29 30
prim::NumToTensor       op_25       1 1 30 31
aten::Int               op_26       1 1 31 34
aten::Int               op_27       1 1 31 37
aten::size              op_28       2 1 input 39 40
prim::NumToTensor       op_29       1 1 40 41
aten::Int               op_30       1 1 41 44
aten::size              op_31       2 1 input 46 47
prim::NumToTensor       op_32       1 1 47 48
aten::Int               op_33       1 1 48 51
prim::Constant          op_34       0 1 110 value=1
prim::ListConstruct     op_35       5 1 18 110 27 37 56 57
aten::view              op_36       2 1 div.1 57 input.1
prim::Constant          op_37       0 1 111 value=0
prim::Constant          op_38       0 1 112 value=0
prim::Constant          op_39       0 1 113 value=0
prim::Constant          op_40       0 1 114 value=0
prim::Constant          op_41       0 1 115 value=*
prim::Constant          op_42       0 1 116 value=*
prim::ListConstruct     op_43       6 1 111 112 113 114 115 116 60
prim::Constant          op_44       0 1 117 value=%padzero
aten::constant_pad_nd   op_45       3 1 input.1 60 117 div0.1
prim::Constant          op_46       0 1 118 value=1
prim::Constant          op_47       0 1 119 value=1
prim::ListConstruct     op_48       3 1 size 118 119 65
prim::Constant          op_49       0 1 120 value=1
prim::Constant          op_50       0 1 121 value=1
prim::Constant          op_51       0 1 122 value=1
prim::ListConstruct     op_52       3 1 120 121 122 66
prim::Constant          op_53       0 1 123 value=0
prim::Constant          op_54       0 1 124 value=0
prim::Constant          op_55       0 1 125 value=0
prim::ListConstruct     op_56       3 1 123 124 125 67
aten::avg_pool3d        op_57       7 1 div0.1 65 66 67 71 72 73 74
prim::Constant          op_58       0 1 126 value=1
aten::squeeze           op_59       2 1 74 126 div1.1
prim::ListConstruct     op_60       5 1 15 24 34 44 51 83
aten::view              op_61       2 1 div1.1 83 div2.1
aten::mul               op_62       2 1 div2.1 alpha 87
prim::Constant          op_63       0 1 127 value=1
aten::add               op_64       3 1 87 k 127 90
aten::pow               op_65       2 1 90 beta div3.1
aten::div               op_66       2 1 input div3.1 out
pnnx.Output             output      1 0 out
)PNNXIR";
    }

    const char* type_str() const
    {
        return "F.local_response_norm";
    }

    bool match(const std::map<std::string, Parameter>& captured_params) const
    {
        if (captured_params.at("padzero").type == 2)
            return captured_params.at("padzero").i == 0;

        if (captured_params.at("padzero").type == 3)
            return captured_params.at("padzero").f == 0.f;

        return false;
    }

    void write(Operator* op, const std::map<std::string, Parameter>& captured_params) const
    {
        op->params["size"] = captured_params.at("size");
        op->params["alpha"] = captured_params.at("alpha");
        op->params["beta"] = captured_params.at("beta");
        op->params["k"] = captured_params.at("k");
    }
};

REGISTER_GLOBAL_PNNX_GRAPH_REWRITER_PASS(F_local_response_norm_2, 8)

class F_local_response_norm_3 : public GraphRewriterPass
{
public:
    const char* match_pattern_graph() const
    {
        return R"PNNXIR(7767517
36 35
pnnx.Input              input       0 1 input
prim::Constant          op_0        0 1 k value=%k
prim::Constant          op_1        0 1 alpha value=%alpha
prim::Constant          op_2        0 1 24 value=None
prim::Constant          op_3        0 1 23 value=True
prim::Constant          op_4        0 1 22 value=False
prim::Constant          op_5        0 1 7 value=1
prim::Constant          op_6        0 1 10 value=0
prim::Constant          op_7        0 1 size value=%size
prim::Constant          op_8        0 1 beta value=%beta
aten::mul               op_9        2 1 input input 6
aten::unsqueeze         op_10       2 1 6 7 input.1
prim::Constant          op_11       0 1 52 value=0
prim::Constant          op_12       0 1 53 value=*
prim::Constant          op_13       0 1 54 value=*
prim::ListConstruct     op_14       4 1 10 52 53 54 11
prim::Constant          op_15       0 1 12 value=constant
prim::Constant          op_16       0 1 55 value=%padzero
aten::pad               op_17       4 1 input.1 11 12 55 div.1
prim::Constant          op_18       0 1 56 value=1
prim::ListConstruct     op_19       2 1 size 56 16
prim::Constant          op_20       0 1 57 value=1
prim::Constant          op_21       0 1 58 value=1
prim::ListConstruct     op_22       2 1 57 58 17
prim::Constant          op_23       0 1 59 value=0
prim::Constant          op_24       0 1 60 value=0
prim::ListConstruct     op_25       2 1 59 60 18
aten::avg_pool2d        op_26       7 1 div.1 16 17 18 22 23 24 25
prim::Constant          op_27       0 1 61 value=1
aten::squeeze           op_28       2 1 25 61 div0.1
aten::mul               op_29       2 1 div0.1 alpha 30
prim::Constant          op_30       0 1 62 value=1
aten::add               op_31       3 1 30 k 62 33
aten::pow               op_32       2 1 33 beta div1.1
aten::div               op_33       2 1 input div1.1 out
pnnx.Output             output      1 0 out
)PNNXIR";
    }

    const char* type_str() const
    {
        return "F.local_response_norm";
    }

    bool match(const std::map<std::string, Parameter>& captured_params) const
    {
        if (captured_params.at("padzero").type == 2)
            return captured_params.at("padzero").i == 0;

        if (captured_params.at("padzero").type == 3)
            return captured_params.at("padzero").f == 0.f;

        return false;
    }

    void write(Operator* op, const std::map<std::string, Parameter>& captured_params) const
    {
        op->params["size"] = captured_params.at("size");
        op->params["alpha"] = captured_params.at("alpha");
        op->params["beta"] = captured_params.at("beta");
        op->params["k"] = captured_params.at("k");
    }
};

REGISTER_GLOBAL_PNNX_GRAPH_REWRITER_PASS(F_local_response_norm_3, 8)

class F_local_response_norm_4 : public GraphRewriterPass
{
public:
    const char* match_pattern_graph() const
    {
        return R"PNNXIR(7767517
66 65
pnnx.Input              input       0 1 input
prim::Constant          op_0        0 1 k value=%k
prim::Constant          op_1        0 1 alpha value=%alpha
prim::Constant          op_2        0 1 66 value=None
prim::Constant          op_3        0 1 65 value=True
prim::Constant          op_4        0 1 64 value=False
prim::Constant          op_5        0 1 7 value=1
prim::Constant          op_6        0 1 10 value=0
prim::Constant          op_7        0 1 29 value=2
prim::Constant          op_8        0 1 39 value=3
prim::Constant          op_9        0 1 49 value=-1
prim::Constant          op_10       0 1 size value=%size
prim::Constant          op_11       0 1 beta value=%beta
aten::mul               op_12       2 1 input input 6
aten::unsqueeze         op_13       2 1 6 7 div.1
aten::size              op_14       2 1 input 10 11
prim::NumToTensor       op_15       1 1 11 12
aten::Int               op_16       1 1 12 15
aten::Int               op_17       1 1 12 18
prim::Constant          op_18       0 1 101 value=1
aten::size              op_19       2 1 input 101 20
prim::NumToTensor       op_20       1 1 20 21
aten::Int               op_21       1 1 21 24
aten::Int               op_22       1 1 21 27
aten::size              op_23       2 1 input 29 30
prim::NumToTensor       op_24       1 1 30 31
aten::Int               op_25       1 1 31 34
aten::Int               op_26       1 1 31 37
aten::size              op_27       2 1 input 39 40
prim::NumToTensor       op_28       1 1 40 41
aten::Int               op_29       1 1 41 44
prim::Constant          op_30       0 1 102 value=1
prim::ListConstruct     op_31       5 1 18 102 27 37 49 50
aten::view              op_32       2 1 div.1 50 input.1
prim::Constant          op_33       0 1 103 value=0
prim::Constant          op_34       0 1 104 value=0
prim::Constant          op_35       0 1 105 value=0
prim::Constant          op_36       0 1 106 value=0
prim::Constant          op_37       0 1 107 value=*
prim::Constant          op_38       0 1 108 value=*
prim::ListConstruct     op_39       6 1 103 104 105 106 107 108 53
prim::Constant          op_40       0 1 54 value=constant
prim::Constant          op_41       0 1 109 value=%padzero
aten::pad               op_42       4 1 input.1 53 54 109 div0.1
prim::Constant          op_43       0 1 110 value=1
prim::Constant          op_44       0 1 111 value=1
prim::ListConstruct     op_45       3 1 size 110 111 58
prim::Constant          op_46       0 1 112 value=1
prim::Constant          op_47       0 1 113 value=1
prim::Constant          op_48       0 1 114 value=1
prim::ListConstruct     op_49       3 1 112 113 114 59
prim::Constant          op_50       0 1 115 value=0
prim::Constant          op_51       0 1 116 value=0
prim::Constant          op_52       0 1 117 value=0
prim::ListConstruct     op_53       3 1 115 116 117 60
aten::avg_pool3d        op_54       7 1 div0.1 58 59 60 64 65 66 67
prim::Constant          op_55       0 1 118 value=1
aten::squeeze           op_56       2 1 67 118 div1.1
prim::ListConstruct     op_57       4 1 15 24 34 44 75
aten::view              op_58       2 1 div1.1 75 div2.1
aten::mul               op_59       2 1 div2.1 alpha 79
prim::Constant          op_60       0 1 119 value=1
aten::add               op_61       3 1 79 k 119 82
aten::pow               op_62       2 1 82 beta div3.1
aten::div               op_63       2 1 input div3.1 out
pnnx.Output             output      1 0 out
)PNNXIR";
    }

    const char* type_str() const
    {
        return "F.local_response_norm";
    }

    bool match(const std::map<std::string, Parameter>& captured_params) const
    {
        if (captured_params.at("padzero").type == 2)
            return captured_params.at("padzero").i == 0;

        if (captured_params.at("padzero").type == 3)
            return captured_params.at("padzero").f == 0.f;

        return false;
    }

    void write(Operator* op, const std::map<std::string, Parameter>& captured_params) const
    {
        op->params["size"] = captured_params.at("size");
        op->params["alpha"] = captured_params.at("alpha");
        op->params["beta"] = captured_params.at("beta");
        op->params["k"] = captured_params.at("k");
    }
};

REGISTER_GLOBAL_PNNX_GRAPH_REWRITER_PASS(F_local_response_norm_4, 8)

class F_local_response_norm_5 : public GraphRewriterPass
{
public:
    const char* match_pattern_graph() const
    {
        return R"PNNXIR(7767517
70 69
pnnx.Input              input       0 1 input
prim::Constant          op_0        0 1 k value=%k
prim::Constant          op_1        0 1 alpha value=%alpha
prim::Constant          op_2        0 1 73 value=None
prim::Constant          op_3        0 1 72 value=True
prim::Constant          op_4        0 1 71 value=False
prim::Constant          op_5        0 1 7 value=1
prim::Constant          op_6        0 1 10 value=0
prim::Constant          op_7        0 1 29 value=2
prim::Constant          op_8        0 1 39 value=3
prim::Constant          op_9        0 1 46 value=4
prim::Constant          op_10       0 1 56 value=-1
prim::Constant          op_11       0 1 size value=%size
prim::Constant          op_12       0 1 beta value=%beta
aten::mul               op_13       2 1 input input 6
aten::unsqueeze         op_14       2 1 6 7 div.1
aten::size              op_15       2 1 input 10 11
prim::NumToTensor       op_16       1 1 11 12
aten::Int               op_17       1 1 12 15
aten::Int               op_18       1 1 12 18
prim::Constant          op_19       0 1 109 value=1
aten::size              op_20       2 1 input 109 20
prim::NumToTensor       op_21       1 1 20 21
aten::Int               op_22       1 1 21 24
aten::Int               op_23       1 1 21 27
aten::size              op_24       2 1 input 29 30
prim::NumToTensor       op_25       1 1 30 31
aten::Int               op_26       1 1 31 34
aten::Int               op_27       1 1 31 37
aten::size              op_28       2 1 input 39 40
prim::NumToTensor       op_29       1 1 40 41
aten::Int               op_30       1 1 41 44
aten::size              op_31       2 1 input 46 47
prim::NumToTensor       op_32       1 1 47 48
aten::Int               op_33       1 1 48 51
prim::Constant          op_34       0 1 110 value=1
prim::ListConstruct     op_35       5 1 18 110 27 37 56 57
aten::view              op_36       2 1 div.1 57 input.1
prim::Constant          op_37       0 1 111 value=0
prim::Constant          op_38       0 1 112 value=0
prim::Constant          op_39       0 1 113 value=0
prim::Constant          op_40       0 1 114 value=0
prim::Constant          op_41       0 1 115 value=*
prim::Constant          op_42       0 1 116 value=*
prim::ListConstruct     op_43       6 1 111 112 113 114 115 116 60
prim::Constant          op_44       0 1 61 value=constant
prim::Constant          op_45       0 1 117 value=%padzero
aten::pad               op_46       4 1 input.1 60 61 117 div0.1
prim::Constant          op_47       0 1 118 value=1
prim::Constant          op_48       0 1 119 value=1
prim::ListConstruct     op_49       3 1 size 118 119 65
prim::Constant          op_50       0 1 120 value=1
prim::Constant          op_51       0 1 121 value=1
prim::Constant          op_52       0 1 122 value=1
prim::ListConstruct     op_53       3 1 120 121 122 66
prim::Constant          op_54       0 1 123 value=0
prim::Constant          op_55       0 1 124 value=0
prim::Constant          op_56       0 1 125 value=0
prim::ListConstruct     op_57       3 1 123 124 125 67
aten::avg_pool3d        op_58       7 1 div0.1 65 66 67 71 72 73 74
prim::Constant          op_59       0 1 126 value=1
aten::squeeze           op_60       2 1 74 126 div1.1
prim::ListConstruct     op_61       5 1 15 24 34 44 51 83
aten::view              op_62       2 1 div1.1 83 div2.1
aten::mul               op_63       2 1 div2.1 alpha 87
prim::Constant          op_64       0 1 127 value=1
aten::add               op_65       3 1 87 k 127 90
aten::pow               op_66       2 1 90 beta div3.1
aten::div               op_67       2 1 input div3.1 out
pnnx.Output             output      1 0 out
)PNNXIR";
    }

    const char* type_str() const
    {
        return "F.local_response_norm";
    }

    bool match(const std::map<std::string, Parameter>& captured_params) const
    {
        if (captured_params.at("padzero").type == 2)
            return captured_params.at("padzero").i == 0;

        if (captured_params.at("padzero").type == 3)
            return captured_params.at("padzero").f == 0.f;

        return false;
    }

    void write(Operator* op, const std::map<std::string, Parameter>& captured_params) const
    {
        op->params["size"] = captured_params.at("size");
        op->params["alpha"] = captured_params.at("alpha");
        op->params["beta"] = captured_params.at("beta");
        op->params["k"] = captured_params.at("k");
    }
};

REGISTER_GLOBAL_PNNX_GRAPH_REWRITER_PASS(F_local_response_norm_5, 8)

} // namespace pnnx