Source code for tidy3d.plugins.autograd.invdes.filters
from functools import partial
from typing import Callable, Tuple, Union
import numpy as np
from numpy.typing import NDArray
from ..functions import convolve
from ..types import KernelType, PaddingType
from ..utilities import make_kernel
[docs]
def make_filter(
filter_type: KernelType,
size: Union[int, Tuple[int, ...]],
*,
normalize: bool = True,
padding: PaddingType = "reflect",
) -> Callable:
"""Create a filter function based on the specified kernel type and size.
Parameters
----------
filter_type : KernelType
The type of kernel to create (`circular` or `conic`).
size : Union[int, Tuple[int, ...]]
The size of the kernel in pixels for each dimension. Can be a scalar or a tuple.
normalize : bool, optional
Whether to normalize the kernel so that it sums to 1. Default is True.
padding : PadMode, optional
The padding mode to use. Default is "reflect".
Returns
-------
function
A function that applies the created filter to an input array.
"""
_kernel = {}
def _filter(array: NDArray) -> NDArray:
original_shape = array.shape
squeezed_array = np.squeeze(array)
if squeezed_array.ndim not in _kernel:
if np.isscalar(size):
kernel_size = (size,) * squeezed_array.ndim
else:
kernel_size = size
_kernel[squeezed_array.ndim] = make_kernel(
kernel_type=filter_type, size=kernel_size, normalize=normalize
)
convolved_array = convolve(squeezed_array, _kernel[squeezed_array.ndim], padding=padding)
return np.reshape(convolved_array, original_shape)
return _filter
make_conic_filter = partial(make_filter, filter_type="conic")
make_conic_filter.__doc__ = """make_filter() with a default filter_type value of `conic`.
See Also
--------
make_filter : Function to create a filter based on the specified kernel type and size.
"""
make_circular_filter = partial(make_filter, filter_type="circular")
make_circular_filter.__doc__ = """make_filter() with a default filter_type value of `circular`.
See Also
--------
make_filter : Function to create a filter based on the specified kernel type and size.
"""