def apply_inverse(self, V, ind=None, mu=None, least_squares=False): assert V in self.range assert V.check_ind(ind) assert not self.functional and not self.vector if V.dim == 0: if self.source.dim == 0 and least_squares: return ListVectorArray( [NumpyVector(np.zeros(0), copy=False) for _ in range(V.len_ind(ind))], subtype=self.source.subtype ) else: raise InversionError options = ( self.solver_options.get("inverse") if self.solver_options else "least_squares" if least_squares else None ) if options and not least_squares: solver_type = options if isinstance(options, str) else options["type"] if solver_type.startswith("least_squares"): self.logger.warn('Least squares solver selected but "least_squares == False"') if ind is None: vectors = V._list elif isinstance(ind, Number): vectors = [V._list[ind]] else: vectors = (V._list[i] for i in ind) try: return ListVectorArray( [ NumpyVector( _apply_inverse(self._matrix, v._array.reshape((1, -1)), options=options).ravel(), copy=False ) for v in vectors ], subtype=self.source.subtype, ) except InversionError as e: if least_squares and options: solver_type = options if isinstance(options, str) else options["type"] if not solver_type.startswith("least_squares"): msg = ( str(e) + "\nNote: linear solver was selected for solving least squares problem (maybe not invertible?)" ) raise InversionError(msg) raise e
def apply_inverse(self, V, ind=None, mu=None, least_squares=False): assert V in self.range assert V.check_ind(ind) assert not self.functional and not self.vector if V.dim == 0: if self.source.dim == 0 and least_squares: return ListVectorArray([NumpyVector(np.zeros(0), copy=False) for _ in range(V.len_ind(ind))], subtype=self.source.subtype) else: raise InversionError options = (self.solver_options.get('inverse') if self.solver_options else 'least_squares' if least_squares else None) if options and not least_squares: solver_type = options if isinstance(options, str) else options['type'] if solver_type.startswith('least_squares'): self.logger.warn('Least squares solver selected but "least_squares == False"') if ind is None: vectors = V._list elif isinstance(ind, Number): vectors = [V._list[ind]] else: vectors = (V._list[i] for i in ind) try: return ListVectorArray([NumpyVector(_apply_inverse(self._matrix, v._array.reshape((1, -1)), options=options).ravel(), copy=False) for v in vectors], subtype=self.source.subtype) except InversionError as e: if least_squares and options: solver_type = options if isinstance(options, str) else options['type'] if not solver_type.startswith('least_squares'): msg = str(e) \ + '\nNote: linear solver was selected for solving least squares problem (maybe not invertible?)' raise InversionError(msg) raise e
def apply_inverse(self, U, ind=None, mu=None, options=None): assert U in self.range assert U.check_ind(ind) assert not self.functional and not self.vector if U.dim == 0: if (self.source.dim == 0 or isinstance(options, str) and options.startswith('least_squares') or isinstance(options, dict) and options['type'].startswith('least_squares')): return ListVectorArray([NumpyVector(np.zeros(0), copy=False) for _ in range(U.len_ind(ind))], subtype=self.source.subtype) else: raise InversionError if ind is None: vectors = U._list elif isinstance(ind, Number): vectors = [U._list[ind]] else: vectors = (U._list[i] for i in ind) return ListVectorArray([NumpyVector(_apply_inverse(self._matrix, v._array, options=options), copy=False) for v in vectors], subtype=self.source.subtype)