ndwt 0.1.0

High-performance discrete and lifting wavelet transforms for 1-D and N-D signals, with SIMD acceleration, adjoint operations, and 8 boundary conditions.
Documentation
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
584
585
586
587
588
589
590
591
592
593
594
595
pub use crate::bior::*;
use ndwt_macros::implement_dwt_biorthogonal;

implement_dwt_biorthogonal! {
    Bior1_3,
    [
        -8.838834764831844055010554526310612991060449221105925457354248e-2,
        8.838834764831844055010554526310612991060449221105925457354248e-2,
        7.071067811865475244008443621048490392848359376884740365883399e-1,
        7.071067811865475244008443621048490392848359376884740365883399e-1,
        8.838834764831844055010554526310612991060449221105925457354248e-2,
        -8.838834764831844055010554526310612991060449221105925457354248e-2
    ],
    [
        0.0, 0.0,
        -7.071067811865475244008443621048490392848359376884740365883399e-1,
        7.071067811865475244008443621048490392848359376884740365883399e-1,
        0.0, 0.0
    ]
}

implement_dwt_biorthogonal! {
    Bior1_5,
    [
        1.657281518405970760314478973683239935823834228957361023253922e-2,
        -1.657281518405970760314478973683239935823834228957361023253922e-2,
        -1.215339780164378557563951247367709286270811767902064750386209e-1,
        1.215339780164378557563951247367709286270811767902064750386209e-1,
        7.071067811865475244008443621048490392848359376884740365883399e-1,
        7.071067811865475244008443621048490392848359376884740365883399e-1,
        1.215339780164378557563951247367709286270811767902064750386209e-1,
        -1.215339780164378557563951247367709286270811767902064750386209e-1,
        -1.657281518405970760314478973683239935823834228957361023253922e-2,
        1.657281518405970760314478973683239935823834228957361023253922e-2
    ],
    [
        0.0, 0.0, 0.0, 0.0,
        -7.071067811865475244008443621048490392848359376884740365883399e-1,
        7.071067811865475244008443621048490392848359376884740365883399e-1,
        0.0, 0.0, 0.0, 0.0
    ]
}

implement_dwt_biorthogonal! {
    Bior2_2,
    [
        0.0,
        -1.767766952966368811002110905262122598212089844221185091470850e-1,
        3.535533905932737622004221810524245196424179688442370182941699e-1,
        1.060660171779821286601266543157273558927253906532711054882510,
        3.535533905932737622004221810524245196424179688442370182941699e-1,
        -1.767766952966368811002110905262122598212089844221185091470850e-1,
    ],
    [
        0.0,
        3.535533905932737622004221810524245196424179688442370182941699e-1,
        -7.071067811865475244008443621048490392848359376884740365883399e-1,
        3.535533905932737622004221810524245196424179688442370182941699e-1,
        0.0, 0.0
    ]
}

implement_dwt_biorthogonal! {
    Bior2_4,
    [
        0.0,
        3.314563036811941520628957947366479871647668457914722046507843e-2,
        -6.629126073623883041257915894732959743295336915829444093015686e-2,
        -1.767766952966368811002110905262122598212089844221185091470850e-1,
        4.198446513295125926130013399997541170753713380025314592243268e-1,
        9.943689110435824561886873842099439614943005373744166139523529e-1,
        4.198446513295125926130013399997541170753713380025314592243268e-1,
        -1.767766952966368811002110905262122598212089844221185091470850e-1,
        -6.629126073623883041257915894732959743295336915829444093015686e-2,
        3.314563036811941520628957947366479871647668457914722046507843e-2
    ],
    [
        0.0, 0.0, 0.0,
        3.535533905932737622004221810524245196424179688442370182941699e-1,
        -7.071067811865475244008443621048490392848359376884740365883399e-1,
        3.535533905932737622004221810524245196424179688442370182941699e-1,
        0.0, 0.0, 0.0, 0.0
    ]
}

implement_dwt_biorthogonal! {
    Bior2_6,
    [
        0.0,
        -6.905339660024878167976995723680166399265975953989004263558007e-3,
        1.381067932004975633595399144736033279853195190797800852711601e-2,
        4.695630968816917154224357092102513151500863648712522899219444e-2,
        -1.077232986963880994204411332894105958285492248822284665115049e-1,
        -1.698713556366120029322340948025320934219430084681295048835270e-1,
        4.474660099696121052849093228944747826724352418184874762785588e-1,
        9.667475524034829435167794013152232958972366335584605968981209e-1,
        4.474660099696121052849093228944747826724352418184874762785588e-1,
        -1.698713556366120029322340948025320934219430084681295048835270e-1,
        -1.077232986963880994204411332894105958285492248822284665115049e-1,
        4.695630968816917154224357092102513151500863648712522899219444e-2,
        1.381067932004975633595399144736033279853195190797800852711601e-2,
        -6.905339660024878167976995723680166399265975953989004263558007e-3
    ],
    [
        0.0, 0.0, 0.0, 0.0, 0.0,
        3.535533905932737622004221810524245196424179688442370182941699e-1,
        -7.071067811865475244008443621048490392848359376884740365883399e-1,
        3.535533905932737622004221810524245196424179688442370182941699e-1,
        0.0, 0.0, 0.0, 0.0, 0.0, 0.0
    ]
}

implement_dwt_biorthogonal! {
    Bior2_8,
    [
        0.0,
        1.510543050630442099244967814555036399839432239935094682653314e-3,
        -3.021086101260884198489935629110072799678864479870189365306628e-3,
        -1.294751186254664656495686698190031199862370491372938299417126e-2,
        2.891610982635417732840366959291069679692627430732895535364915e-2,
        5.299848189069093993922344217924527711436636544686560772280770e-2,
        -1.349130736077360572068505539514012510256590052010601707992646e-1,
        -1.638291834340902345352542235443119478225852795083891261529137e-1,
        4.625714404759165262773590010400251466708295642178384231050920e-1,
        9.516421218971785225243297231696729318988423111591096500715878e-1,
        4.625714404759165262773590010400251466708295642178384231050920e-1,
        -1.638291834340902345352542235443119478225852795083891261529137e-1,
        -1.349130736077360572068505539514012510256590052010601707992646e-1,
        5.299848189069093993922344217924527711436636544686560772280770e-2,
        2.891610982635417732840366959291069679692627430732895535364915e-2,
        -1.294751186254664656495686698190031199862370491372938299417126e-2,
        -3.021086101260884198489935629110072799678864479870189365306628e-3,
        1.510543050630442099244967814555036399839432239935094682653314e-3
    ],
    [
        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
        3.535533905932737622004221810524245196424179688442370182941699e-1,
        -7.071067811865475244008443621048490392848359376884740365883399e-1,
        3.535533905932737622004221810524245196424179688442370182941699e-1,
        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
    ]
}

implement_dwt_biorthogonal! {
    Bior3_1,
    [
        -3.535533905932737622004221810524245196424179688442370182941699e-1,
        1.060660171779821286601266543157273558927253906532711054882510,
        1.060660171779821286601266543157273558927253906532711054882510,
        -3.535533905932737622004221810524245196424179688442370182941699e-1
    ],
    [
        -1.767766952966368811002110905262122598212089844221185091470850e-1,
        5.303300858899106433006332715786367794636269532663555274412549e-1,
        -5.303300858899106433006332715786367794636269532663555274412549e-1,
        1.767766952966368811002110905262122598212089844221185091470850e-1,
    ]
}

implement_dwt_biorthogonal! {
    Bior3_3,
    [
        6.629126073623883041257915894732959743295336915829444093015686e-2,
        -1.988737822087164912377374768419887922988601074748833227904706e-1,
        -1.546796083845572709626847042104357273435578613693536955036993e-1,
        9.943689110435824561886873842099439614943005373744166139523529e-1,
        9.943689110435824561886873842099439614943005373744166139523529e-1,
        -1.546796083845572709626847042104357273435578613693536955036993e-1,
        -1.988737822087164912377374768419887922988601074748833227904706e-1,
        6.629126073623883041257915894732959743295336915829444093015686e-2
    ],
    [
        0.0, 0.0,
        -1.767766952966368811002110905262122598212089844221185091470850e-1,
        5.303300858899106433006332715786367794636269532663555274412549e-1,
        -5.303300858899106433006332715786367794636269532663555274412549e-1,
        1.767766952966368811002110905262122598212089844221185091470850e-1,
        0.0, 0.0,
    ]
}

implement_dwt_biorthogonal! {
    Bior3_5,
    [
        -1.381067932004975633595399144736033279853195190797800852711601e-2,
        4.143203796014926900786197434208099839559585572393402558134804e-2,
        5.248058141618907407662516749996926463442141725031643240304085e-2,
        -2.679271788089652729175074340787904562915198670147733654260507e-1,
        -7.181553246425873294696075552627373055236614992148564434100327e-2,
        9.667475524034829435167794013152232958972366335584605968981209e-1,
        9.667475524034829435167794013152232958972366335584605968981209e-1,
        -7.181553246425873294696075552627373055236614992148564434100327e-2,
        -2.679271788089652729175074340787904562915198670147733654260507e-1,
        5.248058141618907407662516749996926463442141725031643240304085e-2,
        4.143203796014926900786197434208099839559585572393402558134804e-2,
        -1.381067932004975633595399144736033279853195190797800852711601e-2
    ],
    [
        0.0, 0.0, 0.0, 0.0,
        -1.767766952966368811002110905262122598212089844221185091470850e-1,
        5.303300858899106433006332715786367794636269532663555274412549e-1,
        -5.303300858899106433006332715786367794636269532663555274412549e-1,
        1.767766952966368811002110905262122598212089844221185091470850e-1,
        0.0, 0.0, 0.0, 0.0,
    ]
}

implement_dwt_biorthogonal! {
    Bior3_7,
    [
        3.021086101260884198489935629110072799678864479870189365306628e-3,
        -9.063258303782652595469806887330218399036593439610568095919884e-3,
        -1.683176542131064053444392707647040559821081638784819789242264e-2,
        7.466398507401899519125126626229179919206336500250610859972095e-2,
        3.133297870736288468719561809619875503666936589122510684589445e-2,
        -3.011591259228349991008967259990012570879873762933454484444236e-1,
        -2.649924094534546996961172108962263855718318272343280386140385e-2,
        9.516421218971785225243297231696729318988423111591096500715878e-1,
        9.516421218971785225243297231696729318988423111591096500715878e-1,
        -2.649924094534546996961172108962263855718318272343280386140385e-2,
        -3.011591259228349991008967259990012570879873762933454484444236e-1,
        3.133297870736288468719561809619875503666936589122510684589445e-2,
        7.466398507401899519125126626229179919206336500250610859972095e-2,
        -1.683176542131064053444392707647040559821081638784819789242264e-2,
        -9.063258303782652595469806887330218399036593439610568095919884e-3,
        3.021086101260884198489935629110072799678864479870189365306628e-3
    ],
    [
        0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
        -1.767766952966368811002110905262122598212089844221185091470850e-1,
        5.303300858899106433006332715786367794636269532663555274412549e-1,
        -5.303300858899106433006332715786367794636269532663555274412549e-1,
        1.767766952966368811002110905262122598212089844221185091470850e-1,
        0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    ]
}

implement_dwt_biorthogonal! {
    Bior3_9,
    [
        -6.797443727836989446602355165497663799277445079707926071939913e-4,
        2.039233118351096833980706549649299139783233523912377821581974e-3,
        5.060319219611981032470642178759371939462098003782567186888602e-3,
        -2.061891264110553465469381066867624685780825007511404241821774e-2,
        -1.411278793017584475580298501027134007849983835596502746364668e-2,
        9.913478249423215719901974485808338886946216728945464245870463e-2,
        1.230013626941931423670902363280529639869251966804291384446270e-2,
        -3.201919683607785695513833204623947157259642225165276414458553e-1,
        2.050022711569885706118170605467549399782086611340485640743783e-3,
        9.421257006782067372990864259379762025798538880475185535708719e-1,
        9.421257006782067372990864259379762025798538880475185535708719e-1,
        2.050022711569885706118170605467549399782086611340485640743783e-3,
        -3.201919683607785695513833204623947157259642225165276414458553e-1,
        1.230013626941931423670902363280529639869251966804291384446270e-2,
        9.913478249423215719901974485808338886946216728945464245870463e-2,
        -1.411278793017584475580298501027134007849983835596502746364668e-2,
        -2.061891264110553465469381066867624685780825007511404241821774e-2,
        5.060319219611981032470642178759371939462098003782567186888602e-3,
        2.039233118351096833980706549649299139783233523912377821581974e-3,
        -6.797443727836989446602355165497663799277445079707926071939913e-4
    ],
    [
        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
        -1.767766952966368811002110905262122598212089844221185091470850e-1,
        5.303300858899106433006332715786367794636269532663555274412549e-1,
        -5.303300858899106433006332715786367794636269532663555274412549e-1,
        1.767766952966368811002110905262122598212089844221185091470850e-1,
        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    ]
}

implement_dwt_biorthogonal! {
    Bior4_2,
    [
        0.0,
        1.325825214724776608251583178946591948659067383165888818603137e-1,
        -5.303300858899106433006332715786367794636269532663555274412549e-1,
        2.209708691207961013752638631577653247765112305276481364338562e-1,
        1.767766952966368811002110905262122598212089844221185091470850,
        2.209708691207961013752638631577653247765112305276481364338562e-1,
        -5.303300858899106433006332715786367794636269532663555274412549e-1,
        1.325825214724776608251583178946591948659067383165888818603137e-1
    ],
    [
        0.0,
        8.838834764831844055010554526310612991060449221105925457354248e-2,
        -3.535533905932737622004221810524245196424179688442370182941699e-1,
        5.303300858899106433006332715786367794636269532663555274412549e-1,
        -3.535533905932737622004221810524245196424179688442370182941699e-1,
        8.838834764831844055010554526310612991060449221105925457354248e-2,
        0.0, 0.0,
    ]
}

implement_dwt_biorthogonal! {
    Bior4_4,
    [
        0.0,
        -2.762135864009951267190798289472066559706390381595601705423203e-2,
        1.104854345603980506876319315788826623882556152638240682169281e-1,
        -5.524271728019902534381596578944133119412780763191203410846405e-3,
        -5.303300858899106433006332715786367794636269532663555274412549e-1,
        3.866990209613931774067117605260893183588946534233842387592484e-1,
        1.546796083845572709626847042104357273435578613693536955036993,
        3.866990209613931774067117605260893183588946534233842387592484e-1,
        -5.303300858899106433006332715786367794636269532663555274412549e-1,
        -5.524271728019902534381596578944133119412780763191203410846405e-3,
        1.104854345603980506876319315788826623882556152638240682169281e-1,
        -2.762135864009951267190798289472066559706390381595601705423203e-2
    ],
    [
        0.0, 0.0, 0.0,
        8.838834764831844055010554526310612991060449221105925457354248e-2,
        -3.535533905932737622004221810524245196424179688442370182941699e-1,
        5.303300858899106433006332715786367794636269532663555274412549e-1,
        -3.535533905932737622004221810524245196424179688442370182941699e-1,
        8.838834764831844055010554526310612991060449221105925457354248e-2,
        0.0, 0.0, 0.0, 0.0
    ]
}

implement_dwt_biorthogonal! {
    Bior4_6,
    [
        0.0,
        6.042172202521768396979871258220145599357728959740378730613256e-3,
        -2.416868881008707358791948503288058239743091583896151492245302e-2,
        -9.494842032534207480968369120060228798990716936734880862392259e-3,
        1.588228121805721978634709016446438271831174469417470980618342e-1,
        -9.615685476584642848907966545224631710977871515929688437004524e-2,
        -5.061613970798235697127137865457561970661960374273940125188019e-1,
        4.531629151891326297734903443665109199518296719805284047959942e-1,
        1.450121328605224415275169101972834943845854950337690895347181,
        4.531629151891326297734903443665109199518296719805284047959942e-1,
        -5.061613970798235697127137865457561970661960374273940125188019e-1
        ,-9.615685476584642848907966545224631710977871515929688437004524e-2,
        1.588228121805721978634709016446438271831174469417470980618342e-1,
        -9.494842032534207480968369120060228798990716936734880862392259e-3,
        -2.416868881008707358791948503288058239743091583896151492245302e-2,
        6.042172202521768396979871258220145599357728959740378730613256e-3
    ],
    [
        0.0, 0.0, 0.0, 0.0, 0.0,
        8.838834764831844055010554526310612991060449221105925457354248e-2,
        -3.535533905932737622004221810524245196424179688442370182941699e-1,
        5.303300858899106433006332715786367794636269532663555274412549e-1,
        -3.535533905932737622004221810524245196424179688442370182941699e-1,
        8.838834764831844055010554526310612991060449221105925457354248e-2,
        0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    ]
}

implement_dwt_biorthogonal! {
    Bior5_5,
    [
        1.208434440504353679395974251644029119871545791948075746122651e-2,
        -6.042172202521768396979871258220145599357728959740378730613256e-2,
        4.143203796014926900786197434208099839559585572393402558134804e-2,
        2.762135864009951267190798289472066559706390381595601705423203e-1,
        -4.685272959326879836972391598516992901901964684781539392824107e-1,
        -5.437954982269591557281884132398131039421956063766340857551930e-1,
        1.450121328605224415275169101972834943845854950337690895347181,
        1.450121328605224415275169101972834943845854950337690895347181,
        -5.437954982269591557281884132398131039421956063766340857551930e-1,
        -4.685272959326879836972391598516992901901964684781539392824107e-1,
        2.762135864009951267190798289472066559706390381595601705423203e-1,
        4.143203796014926900786197434208099839559585572393402558134804e-2,
        -6.042172202521768396979871258220145599357728959740378730613256e-2,
        1.208434440504353679395974251644029119871545791948075746122651e-2
    ],
    [
        0.0, 0.0, 0.0, 0.0,
        -4.419417382415922027505277263155306495530224610552962728677124e-2,
        2.209708691207961013752638631577653247765112305276481364338562e-1,
        -4.419417382415922027505277263155306495530224610552962728677124e-1,
        4.419417382415922027505277263155306495530224610552962728677124e-1,
        -2.209708691207961013752638631577653247765112305276481364338562e-1,
        4.419417382415922027505277263155306495530224610552962728677124e-2,
        0.0, 0.0, 0.0, 0.0,
    ]
}

implement_dwt_biorthogonal! {
    Bior6_8,
    [
        0.0,
        1.246198016770114731877098447007905029867531597946453113188984e-3,
        -7.477188100620688391262590682047430179205189587678718679133904e-3,
        7.024025185431555761489100337680919259253359915698190274337910e-3,
        4.508971006131869666246228926446783653520705236206257627720142e-2,
        -1.046428698324238764251951453533001465988766684215036841408083e-1,
        -8.428830222517866913786920405217103111104031898837828329205492e-2,
        4.499260372234959681322511276210358419521737457520960590474514e-1,
        -5.338690724656733933617214818870228647432507659427748921263284e-2,
        -1.134040195260804406008159586777193577179453754131272333001975,
        4.536160781043217624032638347108774308717815016525089332007902e-1,
        2.268080390521608812016319173554387154358907508262544666003951,
        4.536160781043217624032638347108774308717815016525089332007902e-1,
        -1.134040195260804406008159586777193577179453754131272333001975,
        -5.338690724656733933617214818870228647432507659427748921263284e-2,
        4.499260372234959681322511276210358419521737457520960590474514e-1,
        -8.428830222517866913786920405217103111104031898837828329205492e-2,
        -1.046428698324238764251951453533001465988766684215036841408083e-1,
        4.508971006131869666246228926446783653520705236206257627720142e-2,
        7.024025185431555761489100337680919259253359915698190274337910e-3,
        -7.477188100620688391262590682047430179205189587678718679133904e-3,
        1.246198016770114731877098447007905029867531597946453113188984e-3
    ],
    [
        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
        2.209708691207961013752638631577653247765112305276481364338562e-2,
        -1.325825214724776608251583178946591948659067383165888818603137e-1,
        3.314563036811941520628957947366479871647668457914722046507843e-1,
        -4.419417382415922027505277263155306495530224610552962728677124e-1,
        3.314563036811941520628957947366479871647668457914722046507843e-1,
        -1.325825214724776608251583178946591948659067383165888818603137e-1,
        2.209708691207961013752638631577653247765112305276481364338562e-2,
        0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
    ]
}

implement_dwt_biorthogonal! {
    CDF5_3,
    [
        0.0, 0.0,
        3.535533905932737622004221810524245196424179688442370182941699e-1,
        7.071067811865475244008443621048490392848359376884740365883399e-1,
        3.535533905932737622004221810524245196424179688442370182941699e-1,
        0.0
    ],
    [
        1.767766952966368811002110905262122598212089844221185091470850e-1,
        3.535533905932737622004221810524245196424179688442370182941699e-1,
        -1.060660171779821286601266543157273558927253906532711054882510,
        3.535533905932737622004221810524245196424179688442370182941699e-1,
        1.767766952966368811002110905262122598212089844221185091470850e-1,
        0.0,
    ]
}

implement_dwt_biorthogonal! {
    CDF9_7,
    [
        0.0,
        3.782845550699546139308004578411387991006879696152805398076573e-2,
        -2.384946501938000191317159107415538252885608860572550436192528e-2,
        -1.106244044184234088485578200216601547873828728465039700733710e-1,
        3.774028556126537641135937721265799021712740574499625226560952e-1,
        8.526986790094034193117999105799415890394640894584258687735504e-1,
        3.774028556126537641135937721265799021712740574499625226560952e-1,
        -1.106244044184234088485578200216601547873828728465039700733710e-1,
        -2.384946501938000191317159107415538252885608860572550436192528e-2,
        3.782845550699546139308004578411387991006879696152805398076573e-2,
    ],
    [
        0.0,
        -6.453888262893843863693395418895074738174840360533375021161720e-2,
        4.068941760955843672376236311479536485289231499960824584969192e-2,
        4.180922732222122008373561352413752670241663724495707685057871e-1,
        -7.884856164056643978483690883344397689906205676876905282877237e-1,
        4.180922732222122008373561352413752670241663724495707685057871e-1,
        4.068941760955843672376236311479536485289231499960824584969192e-2,
        -6.453888262893843863693395418895074738174840360533375021161720e-2,
        0.0, 0.0,
    ]
}

#[cfg(test)]
mod test {
    use crate::boundarys::BoundaryCondition;
    use crate::tests::{test_approx_adjoint, test_approx_equal};

    use super::*;
    use crate::dwt::{DiscreteTransform, get_outlen};
    use rstest::rstest;

    const RTOL: f64 = 1E-13;
    const ATOL: f64 = 0.0;

    macro_rules! test_wavelet {
        ($test_name:ident, $per_test_name:ident, $adj_test_name:ident, $wvlt:ident) => {
            #[rstest]
            fn $test_name(
                #[values(
                    BoundaryCondition::Zero,
                    BoundaryCondition::Periodic,
                    BoundaryCondition::Constant,
                    BoundaryCondition::Reflect,
                    BoundaryCondition::Symmetric,
                    BoundaryCondition::Antisymmetric,
                    BoundaryCondition::Smooth,
                    BoundaryCondition::Antireflect
                )]
                bc: BoundaryCondition,
                #[values(64, 65)] n: usize,
            ) {
                let x: Vec<f64> = (0..n).map(|i| (i + 1) as f64).collect();
                let mut x2 = vec![0.0; n];

                let nsd = get_outlen($wvlt::WIDTH, n);

                let mut s = vec![0.0; nsd];
                let mut d = vec![0.0; nsd];

                $wvlt::forward(&x, &mut s, &mut d, &bc);
                $wvlt::inverse(&s, &d, &mut x2);

                test_approx_equal(&x2, &x, RTOL, ATOL);
            }

            #[rstest]
            fn $per_test_name(#[values(64, 65)] n: usize) {
                let x: Vec<f64> = (0..n).map(|i| (i + 1) as f64).collect();
                let mut x2 = vec![0.0; n];
                let nd = n / 2;
                let ns = (n + 1) / 2;

                let mut s = vec![0.0; ns];
                let mut d = vec![0.0; nd];

                $wvlt::forward_per(&x, &mut s, &mut d);
                $wvlt::inverse_per(&s, &d, &mut x2);

                test_approx_equal(&x2, &x, RTOL, ATOL);
            }

            #[rstest]
            fn $adj_test_name(#[values(64, 65)] n: usize) {
                let x: Vec<f64> = (0..n).map(|i| (i + 1) as f64).collect();
                let mut x2 = vec![0.0; n];
                let nd = n / 2;
                let ns = (n + 1) / 2;

                let mut s = vec![0.0; ns];
                let mut d = vec![0.0; nd];

                $wvlt::adjoint_inverse_per(&x, &mut s, &mut d);
                $wvlt::adjoint_forward_per(&s, &d, &mut x2);

                test_approx_equal(&x2, &x, RTOL, ATOL);

                let u = (0..n as isize).map(|i| (i + 1) as f64).collect::<Vec<_>>();
                let v = (0..n as isize).map(|i| (5 - i) as f64).collect::<Vec<_>>();

                test_approx_adjoint(
                    |u, out| {
                        let (s, d) = out.split_at_mut(ns);
                        $wvlt::adjoint_inverse_per(u, s, d);
                    },
                    |v, out| {
                        let (s, d) = v.split_at(ns);
                        $wvlt::inverse_per(s, d, out);
                    },
                    &u,
                    &v,
                    RTOL,
                    ATOL,
                );

                test_approx_adjoint(
                    |u, out| {
                        let (s, d) = out.split_at_mut(ns);
                        $wvlt::forward_per(u, s, d);
                    },
                    |v, out| {
                        let (s, d) = v.split_at(ns);
                        $wvlt::adjoint_forward_per(s, d, out);
                    },
                    &u,
                    &v,
                    RTOL,
                    ATOL,
                );
            }
        };
    }
    test_wavelet!(test_bior1_3, test_bior_1_3_per, test_bior_1_3_adj, Bior1_3);
    test_wavelet!(test_bior1_5, test_bior_1_5_per, test_bior_1_5_adj, Bior1_5);
    test_wavelet!(test_bior2_2, test_bior_2_2_per, test_bior_2_2_adj, Bior2_2);
    test_wavelet!(test_bior2_4, test_bior_2_4_per, test_bior_2_4_adj, Bior2_4);
    test_wavelet!(test_bior2_6, test_bior_2_6_per, test_bior_2_6_adj, Bior2_6);
    test_wavelet!(test_bior2_8, test_bior_2_8_per, test_bior_2_8_adj, Bior2_8);
    test_wavelet!(test_bior3_1, test_bior_3_1_per, test_bior_3_1_adj, Bior3_1);
    test_wavelet!(test_bior3_3, test_bior_3_3_per, test_bior_3_3_adj, Bior3_3);
    test_wavelet!(test_bior3_5, test_bior_3_5_per, test_bior_3_5_adj, Bior3_5);
    test_wavelet!(test_bior3_7, test_bior_3_7_per, test_bior_3_7_adj, Bior3_7);
    test_wavelet!(test_bior3_9, test_bior_3_9_per, test_bior_3_9_adj, Bior3_9);
    test_wavelet!(test_bior4_2, test_bior_4_2_per, test_bior_4_2_adj, Bior4_2);
    test_wavelet!(test_bior4_4, test_bior_4_4_per, test_bior_4_4_adj, Bior4_4);
    test_wavelet!(test_bior4_6, test_bior_4_6_per, test_bior_4_6_adj, Bior4_4);
    test_wavelet!(test_bior5_5, test_bior_5_5_per, test_bior_5_5_adj, Bior5_5);
    test_wavelet!(test_bior6_8, test_bior_6_8_per, test_bior_6_8_adj, Bior6_8);
    test_wavelet!(test_cdf_5_3, test_cdf_5_3_per, test_cdf_5_3_adj, CDF5_3);
    test_wavelet!(test_cdf_9_7, test_cdf_9_7_per, test_cdf_9_7_adj, CDF9_7);
}