def cholesky(self, X: BlockArray): # TODO (hme): Implement scalable version. # Note: # A = Q, R # A.T @ A = R.T @ R # A.T @ A = L @ L.T # => R == L.T block_shape = X.block_shape assert len(X.shape) == 2 assert X.shape[0] == X.shape[1] single_block = X.shape[0] == X.block_shape[0] and X.shape[ 1] == X.block_shape[1] if single_block: result = X.copy() else: result = X.reshape(block_shape=X.shape) result.blocks[0, 0].oid = self._system.cholesky(result.blocks[0, 0].oid, syskwargs={ "grid_entry": (0, 0), "grid_shape": (1, 1) }) if not single_block: result = result.reshape(block_shape=block_shape) return result
def inv(app: ArrayApplication, X: BlockArray): # TODO (hme): Implement scalable version. block_shape = X.block_shape assert len(X.shape) == 2 assert X.shape[0] == X.shape[1] single_block = X.shape[0] == X.block_shape[0] and X.shape[1] == X.block_shape[1] if single_block: result = X.copy() else: result = X.reshape(block_shape=X.shape) result.blocks[0, 0].oid = app.cm.inv(result.blocks[0, 0].oid, syskwargs={ "grid_entry": (0, 0), "grid_shape": (1, 1) }) if not single_block: result = result.reshape(block_shape=block_shape) return result
def _inv(self, remote_func, kwargs, X: BlockArray): # TODO (hme): Implement scalable version. block_shape = X.block_shape assert len(X.shape) == 2 assert X.shape[0] == X.shape[1] single_block = X.shape[0] == X.block_shape[0] and X.shape[ 1] == X.block_shape[1] if single_block: result = X.copy() else: result = X.reshape(block_shape=X.shape) result.blocks[0, 0].oid = remote_func(result.blocks[0, 0].oid, **kwargs, syskwargs={ "grid_entry": (0, 0), "grid_shape": (1, 1) }) if not single_block: result = result.reshape(block_shape=block_shape) return result
def inv_sym_psd(self, X: BlockArray): # Assumes X is symmetric PSD. # TODO (hme): Implement scalable version. assert len(X.shape) == 2 assert X.shape[0] == X.shape[1] single_block = X.shape[0] == X.block_shape[0] and X.shape[ 1] == X.block_shape[1] if single_block: result = X.copy() else: result = X.reshape(block_shape=X.shape) result.blocks[0, 0].oid = self._system.inv_sym_psd(result.blocks[0, 0].oid, syskwargs={ "grid_entry": (0, 0), "grid_shape": (1, 1) }) if not single_block: result = result.reshape(block_shape=X.block_shape) return result
def copy(a: BlockArray, order="K", subok=False): assert order == "K" and not subok, "Only default args supported." return a.copy()