simple_linear_operators.py 4.12 KB
 Martin Reinecke committed Jul 25, 2018 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ``````# This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program 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 General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Copyright(C) 2013-2018 Max-Planck-Society # # NIFTy is being developed at the Max-Planck-Institut fuer Astrophysik # and financially supported by the Studienstiftung des deutschen Volkes. from __future__ import absolute_import, division, print_function from ..compat import * from ..domain_tuple import DomainTuple from ..domains.unstructured_domain import UnstructuredDomain `````` Martin Reinecke committed Aug 03, 2018 24 ``````from ..field import Field `````` Philipp Arras committed Aug 14, 2018 25 ``````from ..multi_domain import MultiDomain `````` Martin Reinecke committed Aug 05, 2018 26 ``````from ..multi_field import MultiField `````` Martin Reinecke committed Sep 18, 2018 27 ``````from ..sugar import full `````` Philipp Arras committed Aug 14, 2018 28 29 ``````from .endomorphic_operator import EndomorphicOperator from .linear_operator import LinearOperator `````` Martin Reinecke committed Jul 25, 2018 30 31 32 33 34 `````` class VdotOperator(LinearOperator): def __init__(self, field): self._field = field `````` Martin Reinecke committed Aug 08, 2018 35 `````` self._domain = field.domain `````` Martin Reinecke committed Aug 03, 2018 36 `````` self._target = DomainTuple.scalar_domain() `````` Martin Reinecke committed Aug 10, 2018 37 `````` self._capability = self.TIMES | self.ADJOINT_TIMES `````` Martin Reinecke committed Jul 25, 2018 38 39 `````` def apply(self, x, mode): `````` Martin Reinecke committed Aug 09, 2018 40 `````` self._check_mode(mode) `````` Martin Reinecke committed Jul 25, 2018 41 `````` if mode == self.TIMES: `````` Martin Reinecke committed Aug 09, 2018 42 `````` return Field.scalar(self._field.vdot(x)) `````` Martin Reinecke committed Jul 25, 2018 43 `````` return self._field*x.local_data[()] `````` Martin Reinecke committed Aug 03, 2018 44 45 `````` `````` Martin Reinecke committed Aug 05, 2018 46 47 ``````class ConjugationOperator(EndomorphicOperator): def __init__(self, domain): `````` Martin Reinecke committed Sep 10, 2018 48 `````` self._domain = DomainTuple.make(domain) `````` Martin Reinecke committed Aug 10, 2018 49 `````` self._capability = self._all_ops `````` Martin Reinecke committed Aug 05, 2018 50 51 52 53 54 55 56 57 `````` def apply(self, x, mode): self._check_input(x, mode) return x.conjugate() class Realizer(EndomorphicOperator): def __init__(self, domain): `````` Martin Reinecke committed Sep 10, 2018 58 `````` self._domain = DomainTuple.make(domain) `````` Martin Reinecke committed Aug 10, 2018 59 `````` self._capability = self.TIMES | self.ADJOINT_TIMES `````` Martin Reinecke committed Aug 05, 2018 60 61 62 63 `````` def apply(self, x, mode): self._check_input(x, mode) return x.real `````` Martin Reinecke committed Aug 05, 2018 64 65 66 `````` class FieldAdapter(LinearOperator): `````` Martin Reinecke committed Aug 10, 2018 67 68 69 70 `````` def __init__(self, dom, name): self._target = dom[name] self._domain = MultiDomain.make({name: self._target}) self._capability = self.TIMES | self.ADJOINT_TIMES `````` Martin Reinecke committed Aug 05, 2018 71 72 73 74 75 `````` def apply(self, x, mode): self._check_input(x, mode) if mode == self.TIMES: `````` Martin Reinecke committed Aug 10, 2018 76 77 `````` return x.values()[0] return MultiField(self._domain, (x,)) `````` Martin Reinecke committed Aug 05, 2018 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 `````` class GeometryRemover(LinearOperator): """Operator which transforms between a structured and an unstructured domain. Parameters ---------- domain: Domain, tuple of Domain, or DomainTuple: the full input domain of the operator. Notes ----- The operator will convert every sub-domain of its input domain to an UnstructuredDomain with the same shape. No weighting by volume factors is carried out. """ def __init__(self, domain): self._domain = DomainTuple.make(domain) target_list = [UnstructuredDomain(dom.shape) for dom in self._domain] self._target = DomainTuple.make(target_list) `````` Martin Reinecke committed Aug 10, 2018 100 `````` self._capability = self.TIMES | self.ADJOINT_TIMES `````` Martin Reinecke committed Aug 05, 2018 101 102 103 `````` def apply(self, x, mode): self._check_input(x, mode) `````` Martin Reinecke committed Aug 08, 2018 104 `````` return x.cast_domain(self._tgt(mode)) `````` Martin Reinecke committed Aug 05, 2018 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 `````` class NullOperator(LinearOperator): """Operator corresponding to a matrix of all zeros. Parameters ---------- domain : DomainTuple or MultiDomain input domain target : DomainTuple or MultiDomain output domain """ def __init__(self, domain, target): from ..sugar import makeDomain self._domain = makeDomain(domain) self._target = makeDomain(target) `````` Martin Reinecke committed Aug 10, 2018 122 `````` self._capability = self.TIMES | self.ADJOINT_TIMES `````` Martin Reinecke committed Aug 05, 2018 123 124 125 126 `````` @staticmethod def _nullfield(dom): if isinstance(dom, DomainTuple): `````` Martin Reinecke committed Aug 09, 2018 127 `````` return Field(dom, 0) `````` Martin Reinecke committed Aug 05, 2018 128 129 130 131 132 `````` else: return MultiField.full(dom, 0) def apply(self, x, mode): self._check_input(x, mode) `````` Martin Reinecke committed Aug 08, 2018 133 `` return self._nullfield(self._tgt(mode))``