stress.py 6.26 KB
Newer Older
Martin Reinecke's avatar
Martin Reinecke committed
1
2
3
import numpy as np
import pypocketfft

Martin Reinecke's avatar
Martin Reinecke committed
4

Martin Reinecke's avatar
Martin Reinecke committed
5
6
def _l2error(a, b, axes):
    return np.sqrt(np.sum(np.abs(a-b)**2)/np.sum(np.abs(a)**2))/np.log2(np.max([2,np.prod(np.take(a.shape,axes))]))
Martin Reinecke's avatar
Martin Reinecke committed
7

Martin Reinecke's avatar
Martin Reinecke committed
8

Martin Reinecke's avatar
Martin Reinecke committed
9
def fftn(a, axes=None, inorm=0, out=None, nthreads=1):
Martin Reinecke's avatar
Martin Reinecke committed
10
    return pypocketfft.c2c(a, axes=axes, forward=True, inorm=inorm,
Martin Reinecke's avatar
Martin Reinecke committed
11
                           out=out, nthreads=nthreads)
Martin Reinecke's avatar
Martin Reinecke committed
12

Martin Reinecke's avatar
Martin Reinecke committed
13

Martin Reinecke's avatar
Martin Reinecke committed
14
def ifftn(a, axes=None, inorm=0, out=None, nthreads=1):
Martin Reinecke's avatar
Martin Reinecke committed
15
    return pypocketfft.c2c(a, axes=axes, forward=False, inorm=inorm,
Martin Reinecke's avatar
Martin Reinecke committed
16
                           out=out, nthreads=nthreads)
Martin Reinecke's avatar
Martin Reinecke committed
17

Martin Reinecke's avatar
Martin Reinecke committed
18

Martin Reinecke's avatar
Martin Reinecke committed
19
20
21
22
def rfftn(a, axes=None, inorm=0, nthreads=1):
    return pypocketfft.r2c(a, axes=axes, forward=True, inorm=inorm,
                           nthreads=nthreads)

Martin Reinecke's avatar
Martin Reinecke committed
23

Martin Reinecke's avatar
Martin Reinecke committed
24
def irfftn(a, axes=None, lastsize=0, inorm=0, nthreads=1):
Martin Reinecke's avatar
Martin Reinecke committed
25
    return pypocketfft.c2r(a, axes=axes, lastsize=lastsize, forward=False,
Martin Reinecke's avatar
Martin Reinecke committed
26
27
                           inorm=inorm, nthreads=nthreads)

Martin Reinecke's avatar
Martin Reinecke committed
28

29
nthreads = 0
Martin Reinecke's avatar
Martin Reinecke committed
30
31
32


def update_err(err, name, value):
Martin Reinecke's avatar
Martin Reinecke committed
33
34
35
36
37
38
    if name in err and err[name] >= value:
        return err
    err[name] = value
    for (nm, v) in err.items():
        print("{}: {}".format(nm, v))
    print()
Martin Reinecke's avatar
Martin Reinecke committed
39
40
41
42
    return err


def test(err):
43
    ndim = np.random.randint(1, 5)
Martin Reinecke's avatar
Martin Reinecke committed
44
    axlen = int((2**20)**(1./ndim))
45
    shape = np.random.randint(1, axlen, ndim)
Martin Reinecke's avatar
Martin Reinecke committed
46
47
    axes = np.arange(ndim)
    np.random.shuffle(axes)
Martin Reinecke's avatar
Martin Reinecke committed
48
    nax = np.random.randint(1, ndim+1)
Martin Reinecke's avatar
Martin Reinecke committed
49
50
    axes = axes[:nax]
    lastsize = shape[axes[-1]]
Martin Reinecke's avatar
Martin Reinecke committed
51
    a = np.random.rand(*shape)-0.5 + 1j*np.random.rand(*shape)-0.5j
Peter Bell's avatar
Peter Bell committed
52
    a_32 = a.astype(np.complex64)
Martin Reinecke's avatar
Martin Reinecke committed
53
54
    b = ifftn(fftn(a, axes=axes, nthreads=nthreads), axes=axes, inorm=2,
              nthreads=nthreads)
Martin Reinecke's avatar
Martin Reinecke committed
55
    err = update_err(err, "cmax", _l2error(a, b, axes))
Martin Reinecke's avatar
Martin Reinecke committed
56
57
    b = ifftn(fftn(a.real, axes=axes, nthreads=nthreads), axes=axes, inorm=2,
              nthreads=nthreads)
Martin Reinecke's avatar
Martin Reinecke committed
58
    err = update_err(err, "cmax", _l2error(a.real, b, axes))
Martin Reinecke's avatar
Martin Reinecke committed
59
60
    b = fftn(ifftn(a.real, axes=axes, nthreads=nthreads), axes=axes, inorm=2,
             nthreads=nthreads)
Martin Reinecke's avatar
Martin Reinecke committed
61
    err = update_err(err, "cmax", _l2error(a.real, b, axes))
Martin Reinecke's avatar
Martin Reinecke committed
62
63
    b = ifftn(fftn(a.astype(np.complex64), axes=axes, nthreads=nthreads),
              axes=axes, inorm=2, nthreads=nthreads)
Martin Reinecke's avatar
Martin Reinecke committed
64
    err = update_err(err, "cmaxf", _l2error(a.astype(np.complex64), b, axes))
Martin Reinecke's avatar
Martin Reinecke committed
65
66
67
    b = irfftn(rfftn(a.real, axes=axes, nthreads=nthreads), axes=axes, inorm=2,
               lastsize=lastsize, nthreads=nthreads)
    err = update_err(err, "rmax", _l2error(a.real, b, axes))
Martin Reinecke's avatar
Martin Reinecke committed
68
69
    b = irfftn(rfftn(a.real.astype(np.float32), axes=axes, nthreads=nthreads),
               axes=axes, inorm=2, lastsize=lastsize, nthreads=nthreads)
Martin Reinecke's avatar
Martin Reinecke committed
70
    err = update_err(err, "rmaxf", _l2error(a.real.astype(np.float32), b, axes))
Martin Reinecke's avatar
Martin Reinecke committed
71
72
73
    b = pypocketfft.separable_hartley(
        pypocketfft.separable_hartley(a.real, axes=axes, nthreads=nthreads),
        axes=axes, inorm=2, nthreads=nthreads)
Martin Reinecke's avatar
Martin Reinecke committed
74
    err = update_err(err, "hmax", _l2error(a.real, b, axes))
Martin Reinecke's avatar
Martin Reinecke committed
75
76
77
    b = pypocketfft.genuine_hartley(
        pypocketfft.genuine_hartley(a.real, axes=axes, nthreads=nthreads),
        axes=axes, inorm=2, nthreads=nthreads)
Martin Reinecke's avatar
Martin Reinecke committed
78
    err = update_err(err, "hmax", _l2error(a.real, b, axes))
Martin Reinecke's avatar
Martin Reinecke committed
79
80
81
82
    b = pypocketfft.separable_hartley(
            pypocketfft.separable_hartley(
                a.real.astype(np.float32), axes=axes, nthreads=nthreads),
            axes=axes, inorm=2, nthreads=nthreads)
Martin Reinecke's avatar
Martin Reinecke committed
83
    err = update_err(err, "hmaxf", _l2error(a.real.astype(np.float32), b, axes))
Martin Reinecke's avatar
Martin Reinecke committed
84
85
86
87
    b = pypocketfft.genuine_hartley(
            pypocketfft.genuine_hartley(a.real.astype(np.float32), axes=axes,
                                        nthreads=nthreads),
            axes=axes, inorm=2, nthreads=nthreads)
Martin Reinecke's avatar
Martin Reinecke committed
88
    err = update_err(err, "hmaxf", _l2error(a.real.astype(np.float32), b, axes))
Peter Bell's avatar
Peter Bell committed
89
90
91
92
    if all(a.shape[i] > 1 for i in axes):
        b = pypocketfft.dct(
            pypocketfft.dct(a.real, axes=axes, nthreads=nthreads, type=1),
            axes=axes, type=1, nthreads=nthreads, inorm=2)
Martin Reinecke's avatar
Martin Reinecke committed
93
        err = update_err(err, "c1max", _l2error(a.real, b, axes))
Peter Bell's avatar
Peter Bell committed
94
95
96
        b = pypocketfft.dct(
            pypocketfft.dct(a_32.real, axes=axes, nthreads=nthreads, type=1),
            axes=axes, type=1, nthreads=nthreads, inorm=2)
Martin Reinecke's avatar
Martin Reinecke committed
97
        err = update_err(err, "c1maxf", _l2error(a_32.real, b, axes))
Peter Bell's avatar
Peter Bell committed
98
99
100
    b = pypocketfft.dct(
        pypocketfft.dct(a.real, axes=axes, nthreads=nthreads, type=2),
        axes=axes, type=3, nthreads=nthreads, inorm=2)
Martin Reinecke's avatar
Martin Reinecke committed
101
    err = update_err(err, "c23max", _l2error(a.real, b, axes))
Peter Bell's avatar
Peter Bell committed
102
103
104
    b = pypocketfft.dct(
        pypocketfft.dct(a_32.real, axes=axes, nthreads=nthreads, type=2),
        axes=axes, type=3, nthreads=nthreads, inorm=2)
Martin Reinecke's avatar
Martin Reinecke committed
105
    err = update_err(err, "c23maxf", _l2error(a_32.real, b, axes))
Peter Bell's avatar
Peter Bell committed
106
107
108
    b = pypocketfft.dct(
        pypocketfft.dct(a.real, axes=axes, nthreads=nthreads, type=4),
        axes=axes, type=4, nthreads=nthreads, inorm=2)
Martin Reinecke's avatar
Martin Reinecke committed
109
    err = update_err(err, "c4max", _l2error(a.real, b, axes))
Peter Bell's avatar
Peter Bell committed
110
111
112
    b = pypocketfft.dct(
        pypocketfft.dct(a_32.real, axes=axes, nthreads=nthreads, type=4),
        axes=axes, type=4, nthreads=nthreads, inorm=2)
Martin Reinecke's avatar
Martin Reinecke committed
113
    err = update_err(err, "c4maxf", _l2error(a_32.real, b, axes))
Martin Reinecke's avatar
Martin Reinecke committed
114
115
116
117
    b = pypocketfft.dst(
        pypocketfft.dst(a.real, axes=axes, nthreads=nthreads, type=1),
        axes=axes, type=1, nthreads=nthreads, inorm=2)
    err = update_err(err, "s1max", _l2error(a.real, b, axes))
Peter Bell's avatar
Peter Bell committed
118
119
120
    b = pypocketfft.dst(
        pypocketfft.dst(a_32.real, axes=axes, nthreads=nthreads, type=1),
        axes=axes, type=1, nthreads=nthreads, inorm=2)
Martin Reinecke's avatar
Martin Reinecke committed
121
    err = update_err(err, "s1maxf", _l2error(a_32.real, b, axes))
Peter Bell's avatar
Peter Bell committed
122
123
124
    b = pypocketfft.dst(
        pypocketfft.dst(a.real, axes=axes, nthreads=nthreads, type=2),
        axes=axes, type=3, nthreads=nthreads, inorm=2)
Martin Reinecke's avatar
Martin Reinecke committed
125
    err = update_err(err, "s23max", _l2error(a.real, b, axes))
Peter Bell's avatar
Peter Bell committed
126
127
128
    b = pypocketfft.dst(
        pypocketfft.dst(a_32.real, axes=axes, nthreads=nthreads, type=2),
        axes=axes, type=3, nthreads=nthreads, inorm=2)
Martin Reinecke's avatar
Martin Reinecke committed
129
    err = update_err(err, "s23maxf", _l2error(a_32.real, b, axes))
Peter Bell's avatar
Peter Bell committed
130
131
132
    b = pypocketfft.dst(
        pypocketfft.dst(a.real, axes=axes, nthreads=nthreads, type=4),
        axes=axes, type=4, nthreads=nthreads, inorm=2)
Martin Reinecke's avatar
Martin Reinecke committed
133
    err = update_err(err, "s4max", _l2error(a.real, b, axes))
Peter Bell's avatar
Peter Bell committed
134
135
136
    b = pypocketfft.dst(
        pypocketfft.dst(a_32.real, axes=axes, nthreads=nthreads, type=4),
        axes=axes, type=4, nthreads=nthreads, inorm=2)
Martin Reinecke's avatar
Martin Reinecke committed
137
    err = update_err(err, "s4maxf", _l2error(a_32.real, b, axes))
Martin Reinecke's avatar
Martin Reinecke committed
138

Martin Reinecke's avatar
Martin Reinecke committed
139

Martin Reinecke's avatar
Martin Reinecke committed
140
err = dict()
Martin Reinecke's avatar
Martin Reinecke committed
141
while True:
Martin Reinecke's avatar
Martin Reinecke committed
142
    test(err)