Page MenuHomec4science

fft_sampler.py
No OneTemporary

File Metadata

Created
Fri, May 24, 16:27

fft_sampler.py

# Copyright (C) 2018 by the RROMPy authors
#
# This file is part of RROMPy.
#
# RROMPy is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# RROMPy is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with RROMPy. If not, see <http://www.gnu.org/licenses/>.
#
import numpy as np
from .generic_shape_sampler import GenericShapeSampler
from rrompy.utilities.base.types import paramList
from rrompy.utilities.numerical import lowDiscrepancy, kroneckerer
__all__ = ['FFTSampler']
class FFTSampler(GenericShapeSampler):
"""Generator of FFT-type sample points on scaled roots of unity."""
def generatePoints(self, n:int, reorder : bool = True) -> paramList:
"""Array of sample points."""
n1d = int(np.ceil(n ** (1. / self.npar)))
nleft, nright = 1, n1d ** self.npar
xmat = np.empty((nright, self.npar), dtype = np.complex)
limsE = self.mapParameterList(self.lims)
for d in range(self.npar):
nright //= n1d
a, b = limsE(d)
c, r = (a + b) / 2., (a - b) / 2.
unitpts = np.exp(1.j * np.linspace(0, 2 * np.pi, n1d + 1)[:-1])
unitpts = (np.real(unitpts)
+ 1.j * self.axisRatios[d] * np.imag(unitpts))
xd = c + r * unitpts
if n1d > 1 and reorder:
fejerOrdering = [n1d - 1] + lowDiscrepancy(n1d - 1)
xd = xd[fejerOrdering]
xmat[:, d] = kroneckerer(xd, nleft, nright)
nleft *= n1d
return self.mapParameterList(xmat, "B")

Event Timeline