GDSVD is a package for computing SVD via gradient descent.
--

Example usage:

1. Install via `pip install gdsvd`
2. Import:
    ```
    from gdsvd.svd import gd_svd
    ```

3. Memmap input data, recommended for large datasets
    ```
    U_true = np.memmap("datasets/ranklogn-exp-500_U.bin", dtype=np.float64, mode='r', shape=(500, 6))
    S_true = np.memmap("datasets/ranklogn-exp-500_S.bin", dtype=np.float64, mode='r', shape=(6,))
    Vt_true = np.memmap("datasets/ranklogn-exp-500_Vt.bin", dtype=np.float64, mode='r', shape=(6, 500))
    M = np.memmap("datasets/ranklogn-exp-500_M.bin", dtype=np.float64, mode='r', shape=(500, 500))
    ```
4.  Ensure that the arrays are contiguous
    ```
    U_true = np.ascontiguousarray(U_true)
    S_true = np.ascontiguousarray(S_true)
    Vt_true = np.ascontiguousarray(Vt_true)
    M = np.ascontiguousarray(M)
    ```
5. To run the method normally:
    ```
    U,S,Vt = gd_svd(M)
    ```
6. To run the method with convergence tracking written to conv_out.txt:
   ```
    U,S,Vt = gd_svd(M, record_conv = 'conv_out.txt', U_true = U_true, S_true = S_true, Vt_true = Vt_true)
    ```

---
`gdsvd` is implemented as Algorithm 4 in the reference paper. 

Included in the package are `gdsvd3` (Algorithm 3) and `power-method` (Algorithm 5), which is the GD method with alternate stopping and the power method, respectively.


Reference:
[k-SVD via gradient descent](https://arxiv.org/abs/2502.00320)
