Pivoted Cholesky
まだ誰も着手していません。
評価
調査の方向性
Start by reading the existing ndarray_linalg::cholesky entry points, especially factorizec and CholeskyFactorized, then compare their behavior with LAPACK's dpstrf example. Define how the factor, pivot, and rank should be returned and how a truncated factor could initialize CholeskyFactorized; done means the pivoted PSD case and the reduced-system reuse path are specified and tested.
索引モデルが issue の本文から書いたものです。
説明
Currently, Cholesky will fail on PSD but not PD matrices, because it calls ?pptrf.
use ndarray::{array, Array, Axis};
use ndarray_linalg::cholesky::*;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let x1 = array![1., 2., 3., 4., 7.];
let x2 = array![-1., 2., 3., 5., 8.];
let x3 = array![1., -2., 3., 6., 9.];
let x4 = &x1 * 1. + &x2 * 2. - &x3 * 3.;
let xs = [x1, x2, x3, x4];
let xs = xs
.iter()
.map(|x| x.view().insert_axis(Axis(1)))
.collect::<Vec<_>>();
let X = ndarray::stack(Axis(1), &xs)?;
println!("{:?}", X);
let XTX = X.t().dot(&X);
println!("{:?}", XTX);
let chol = XTX.factorizec(UPLO::Lower)?; // Error: Lapack { return_code: 4 }
Ok(())
}
However, if we allow pivoting, then we can return a cholesky factor U, pivot matrix P such that P U^T U P^T = A for an input matrix A that's merely PSD (this also returns the rank r).
It would be nice if ndarray-linalg could also provide this pivoted version, e.g., as shown here in python:
from scipy.linalg.lapack import dpstrf
import numpy as np
xt = np.array([
[1, 2, 3, 4, 7],
[-1, 2, 3, 5, 8],
[1, -2, 3, 6, 9]]).astype(float)
x = np.insert(xt, len(xt), xt[0] + 2 * xt[1] - 3 * xt[2], axis=0).T
xtx = x.T.dot(x)
U, P, rank, info = dpstrf(xtx)
assert info > 0
assert rank == 3
P -= 1
U = np.triu(U)
invP = np.empty_like(P)
invP[P] = np.arange(len(P), dtype=int)
print(np.linalg.norm(U.T.dot(U)[np.ix_(invP, invP)] - xtx, ord='fro')) # row indexing inverts permutations
# 3.552713678800501e-14
An interesting design question would be what the interface should be. Clearly this routine should return the factor, pivot, and rank in some form. But it'd be nice if I could take my pivoted Cholesky output, truncate U to its leading principal minor of order r, and initialize a CholeskyFactorized struct directly, so that I can just re-use existing methods for solving the reduced subsystem.
- 主要言語
- Rust
- スター
- 452
- フォーク
- 95
- PR マージ指標
- 30日以内にマージされた PR はありません
コントリビューションガイド
このリポジトリのコントリビューションガイドは索引されていません
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
rust-ndarray/ndarray-linalg のほかの issue
-
Thin SVD オープン
難易度 5/5 1週間以上 初心者へのやさしさ 38/100
rust-ndarray/ndarray-linalg#414 ·
-
難易度 5/5 1週間以上 初心者へのやさしさ 30/100
rust-ndarray/ndarray-linalg#413 · コメント 1 件 ·
-
難易度 5/5 1週間以上 初心者へのやさしさ 25/100
rust-ndarray/ndarray-linalg#404 ·
-
難易度 4/5 3〜5日 初心者へのやさしさ 35/100
rust-ndarray/ndarray-linalg#402 · コメント 1 件 ·
-
難易度 4/5 3〜5日 初心者へのやさしさ 35/100
rust-ndarray/ndarray-linalg#401 · リアクション 2 件 ·
rust-ndarray/ndarray-linalg の issue をすべて見る
似ている issue
-
bug github_actions
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
registrystack/registry-stack#1393 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
longbridge/gpui-kit#3223 ·
-
bug engine
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
rocky-data/rocky#2181 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
oasisprotocol/oasis-sdk#2523 ·
-
[indexer] [QA] Add a focused test for the new NonRetryableError / assertSocketAlive() behavior. オープンbot:ai-assisted component:indexer QA-roadmap status:untriaged
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
midnightntwrk/midnight-indexer#1557 ·