smoothness_operator.py 1.98 KB
Newer Older
Martin Reinecke's avatar
Martin Reinecke committed
1
2
from .endomorphic_operator import EndomorphicOperator
from .laplace_operator import LaplaceOperator
Martin Reinecke's avatar
Martin Reinecke committed
3
from .. import Field
4
5
6


class SmoothnessOperator(EndomorphicOperator):
7
8
    """An operator measuring the smoothness on an irregular grid with respect
    to some scale.
Jakob Knollmueller's avatar
Jakob Knollmueller committed
9

10
11
12
13
14
15
16
17
    This operator applies the irregular LaplaceOperator and its adjoint to some
    Field over a PowerSpace which corresponds to its smoothness and weights the
    result with a scale parameter sigma. It is used in the smoothness prior
    terms of the CriticalPowerEnergy. For this purpose we use free boundary
    conditions in the LaplaceOperator, having no curvature at both ends. In
    addition the first entry is ignored as well, corresponding to the overall
    mean of the map. The mean is therefore not considered in the smoothness
    prior.
Jakob Knollmueller's avatar
Jakob Knollmueller committed
18
19
20
21


    Parameters
    ----------
22
    strength: float,
Jakob Knollmueller's avatar
Jakob Knollmueller committed
23
24
25
26
27
        Specifies the strength of the SmoothnessOperator
    logarithmic : boolean,
        Whether smoothness is calculated on a logarithmic scale or linear scale
        default : True
    """
28

29
30
31
32
    def __init__(self, domain, strength=1., logarithmic=True, space=None):
        super(SmoothnessOperator, self).__init__()
        self._laplace = LaplaceOperator(domain,
                                        logarithmic=logarithmic, space=space)
33

34
        if strength <= 0:
35
            raise ValueError("ERROR: invalid sigma.")
36
        self._strength = strength
37
38
39

    @property
    def domain(self):
40
        return self._laplace._domain
41
42
43
44
45
46
47
48
49

    @property
    def unitary(self):
        return False

    @property
    def self_adjoint(self):
        return False

50
    def _times(self, x):
51
        if self._strength != 0:
52
            result = self._laplace.adjoint_times(self._laplace(x))
53
54
            result *= self._strength**2
        else:
55
            result = Field.zeros_like(x)
56
        return result
57

58
59
60
61
    @property
    def logarithmic(self):
        return self._laplace.logarithmic

62
    @property
63
64
    def strength(self):
        return self._strength