GCC Code Coverage Report


Directory: ./
File: src/svd/impls/randomized/rsvd.c
Date: 2026-02-22 03:58:10
Exec Total Coverage
Lines: 98 98 100.0%
Functions: 5 5 100.0%
Branches: 258 408 63.2%

Line Branch Exec Source
1 /*
2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3 SLEPc - Scalable Library for Eigenvalue Problem Computations
4 Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain
5
6 This file is part of SLEPc.
7 SLEPc is distributed under a 2-clause BSD license (see LICENSE).
8 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
9 */
10 /*
11 SLEPc singular value solver: "randomized"
12
13 Method: RSVD
14
15 Algorithm:
16
17 Randomized singular value decomposition.
18
19 References:
20
21 [1] N. Halko, P.-G. Martinsson, and J. A. Tropp, "Finding
22 structure with randomness: Probabilistic algorithms for
23 constructing approximate matrix decompositions", SIAM Rev.,
24 53(2):217-288, 2011.
25 */
26
27 #include <slepc/private/svdimpl.h> /*I "slepcsvd.h" I*/
28
29 88 static PetscErrorCode SVDSetUp_Randomized(SVD svd)
30 {
31 88 PetscInt N;
32
33
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
88 PetscFunctionBegin;
34
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
88 SVDCheckStandard(svd);
35
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
88 SVDCheckDefinite(svd);
36
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
88 SVDCheckUnsupported(svd,SVD_FEATURE_THRESHOLD);
37
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
88 PetscCheck(svd->which==SVD_LARGEST,PetscObjectComm((PetscObject)svd),PETSC_ERR_SUP,"This solver supports only largest singular values");
38
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
88 PetscCall(MatGetSize(svd->A,NULL,&N));
39
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
88 PetscCall(SVDSetDimensions_Default(svd));
40
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
88 PetscCheck(svd->ncv>=svd->nsv,PetscObjectComm((PetscObject)svd),PETSC_ERR_USER_INPUT,"The value of ncv must not be smaller than nsv");
41
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
88 if (svd->max_it==PETSC_DETERMINE) svd->max_it = PetscMax(N/svd->ncv,100);
42 88 svd->leftbasis = PETSC_TRUE;
43 88 svd->mpd = svd->ncv;
44
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
88 PetscCall(SVDAllocateSolution(svd,0));
45
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
88 PetscCall(DSSetType(svd->ds,DSSVD));
46
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
88 PetscCall(DSAllocate(svd->ds,svd->ncv));
47
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
88 PetscCall(SVDSetWorkVecs(svd,1,1));
48
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
21 PetscFunctionReturn(PETSC_SUCCESS);
49 }
50
51 2983 static PetscErrorCode SVDRandomizedResidualNorm(SVD svd,PetscInt i,PetscScalar sigma,PetscReal *res)
52 {
53 2983 PetscReal norm1,norm2;
54 2983 Vec u,v,wu,wv;
55
56
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2983 PetscFunctionBegin;
57 2983 *res = 1.0;
58
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
2983 if (svd->conv!=SVD_CONV_MAXIT) {
59
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
2968 wu = svd->swapped? svd->workr[0]: svd->workl[0];
60
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
2968 wv = svd->swapped? svd->workl[0]: svd->workr[0];
61
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2968 PetscCall(BVGetColumn(svd->V,i,&v));
62
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2968 PetscCall(BVGetColumn(svd->U,i,&u));
63 /* norm1 = ||A*v-sigma*u||_2 */
64
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2968 PetscCall(MatMult(svd->A,v,wu));
65
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2968 PetscCall(VecAXPY(wu,-sigma,u));
66
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2968 PetscCall(VecNorm(wu,NORM_2,&norm1));
67 /* norm2 = ||A^T*u-sigma*v||_2 */
68
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2968 PetscCall(MatMult(svd->AT,u,wv));
69
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2968 PetscCall(VecAXPY(wv,-sigma,v));
70
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2968 PetscCall(VecNorm(wv,NORM_2,&norm2));
71
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2968 PetscCall(BVRestoreColumn(svd->V,i,&v));
72
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2968 PetscCall(BVRestoreColumn(svd->U,i,&u));
73 2968 *res = SlepcAbs(norm1,norm2);
74 }
75
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
696 PetscFunctionReturn(PETSC_SUCCESS);
76 }
77
78 /* If A is a virtual Hermitian transpose, then BVMatMult will fail if PRODUCT_AhB is not implemented */
79 5336 static PetscErrorCode BlockMatMult(BV V,Mat A,BV Y,Mat AT)
80 {
81
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
5336 PetscFunctionBegin;
82
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
5336 if (!PetscDefined(USE_COMPLEX)) PetscCall(BVMatMult(V,A,Y));
83 else {
84 2406 PetscBool flg=PETSC_FALSE;
85
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2406 PetscCall(PetscObjectTypeCompare((PetscObject)A,MATHERMITIANTRANSPOSEVIRTUAL,&flg));
86
6/8
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
2406 if (flg) PetscCall(BVMatMultHermitianTranspose(V,AT,Y));
87
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2322 else PetscCall(BVMatMult(V,A,Y));
88 }
89
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
3094 PetscFunctionReturn(PETSC_SUCCESS);
90 }
91
92 88 static PetscErrorCode SVDSolve_Randomized(SVD svd)
93 {
94 88 PetscScalar *w;
95 88 PetscReal res=1.0;
96 88 PetscInt i,k=0;
97 88 Mat A,U,V;
98
99
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
88 PetscFunctionBegin;
100 /* Form random matrix, G. Complete the initial basis with random vectors */
101
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
88 PetscCall(BVSetActiveColumns(svd->V,svd->nini,svd->ncv));
102
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
88 PetscCall(BVSetRandomNormal(svd->V));
103
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
88 PetscCall(PetscCalloc1(svd->ncv,&w));
104
105 /* Subspace Iteration */
106 2668 do {
107 2668 svd->its++;
108
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2668 PetscCall(BVSetActiveColumns(svd->V,svd->nconv,svd->ncv));
109
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2668 PetscCall(BVSetActiveColumns(svd->U,svd->nconv,svd->ncv));
110 /* Form AG */
111
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2668 PetscCall(BlockMatMult(svd->V,svd->A,svd->U,svd->AT));
112 /* Orthogonalization Q=qr(AG)*/
113
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2668 PetscCall(BVOrthogonalize(svd->U,NULL));
114 /* Form B^*= AQ */
115
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2668 PetscCall(BlockMatMult(svd->U,svd->AT,svd->V,svd->A));
116
117
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2668 PetscCall(DSSetDimensions(svd->ds,svd->ncv,svd->nconv,svd->ncv));
118
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2668 PetscCall(DSSVDSetDimensions(svd->ds,svd->ncv));
119
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2668 PetscCall(DSGetMat(svd->ds,DS_MAT_A,&A));
120
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2668 PetscCall(MatZeroEntries(A));
121
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2668 PetscCall(BVOrthogonalize(svd->V,A));
122
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2668 PetscCall(DSRestoreMat(svd->ds,DS_MAT_A,&A));
123
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2668 PetscCall(DSSetState(svd->ds,DS_STATE_RAW));
124
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2668 PetscCall(DSSolve(svd->ds,w,NULL));
125
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2668 PetscCall(DSSort(svd->ds,w,NULL,NULL,NULL,NULL));
126
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2668 PetscCall(DSSynchronize(svd->ds,w,NULL));
127
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2668 PetscCall(DSGetMat(svd->ds,DS_MAT_U,&U));
128
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2668 PetscCall(DSGetMat(svd->ds,DS_MAT_V,&V));
129
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2668 PetscCall(BVMultInPlace(svd->U,V,svd->nconv,svd->ncv));
130
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2668 PetscCall(BVMultInPlace(svd->V,U,svd->nconv,svd->ncv));
131
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2668 PetscCall(DSRestoreMat(svd->ds,DS_MAT_U,&U));
132
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2668 PetscCall(DSRestoreMat(svd->ds,DS_MAT_V,&V));
133 /* Check convergence */
134 2668 k = 0;
135
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 6 times.
2989 for (i=svd->nconv;i<svd->ncv;i++) {
136
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2983 PetscCall(SVDRandomizedResidualNorm(svd,i,w[i],&res));
137 2983 svd->sigma[i] = PetscRealPart(w[i]);
138
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2983 PetscCall((*svd->converged)(svd,svd->sigma[i],res,&svd->errest[i],svd->convergedctx));
139
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
2983 if (svd->errest[i] < svd->tol) k++;
140 else break;
141 }
142
3/4
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
2668 if (svd->conv == SVD_CONV_MAXIT && svd->its >= svd->max_it) {
143 15 k = svd->nsv;
144
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
165 for (i=0;i<svd->ncv;i++) svd->sigma[i] = PetscRealPart(w[i]);
145 }
146
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2668 PetscCall((*svd->stopping)(svd,svd->its,svd->max_it,svd->nconv+k,svd->nsv,&svd->reason,svd->stoppingctx));
147 2668 svd->nconv += k;
148
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2668 PetscCall(SVDMonitor(svd,svd->its,svd->nconv,svd->sigma,svd->errest,svd->ncv));
149
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
2668 } while (svd->reason == SVD_CONVERGED_ITERATING);
150
5/8
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
88 PetscCall(PetscFree(w));
151
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
21 PetscFunctionReturn(PETSC_SUCCESS);
152 }
153
154 /*MC
155 SVDRANDOMIZED - SVDRANDOMIZED = "randomized" - A basic randomization-based
156 singular value solver.
157
158 Notes:
159 Only available for standard SVD problems.
160
161 This solver relies on randomization techniques described in {cite:p}`Hal11`.
162 It is different from other solvers in the sense that it assumes that the
163 input matrix has low rank, in which case the computation will be very fast.
164 Otherwise, the solver will proceed iteratively as a subspace iteration
165 solver (which may have slow convergence), until the required accuracy is reached.
166 Alternatively, it is possible to set a limited number of iterations (e.g., 1)
167 and the solver will return approximate bases of the dominant singular spaces.
168 Note that in this latter case, the individual singular vectors are not good
169 approximations, so residuals are expected to be large.
170
171 Level: beginner
172
173 .seealso: [](ch:svd), [](#sec:svdback), `SVD`, `SVDType`, `SVDSetType()`, `SVDSetProblemType()`, `SVDTRLANCZOS`
174 M*/
175 72 SLEPC_EXTERN PetscErrorCode SVDCreate_Randomized(SVD svd)
176 {
177
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
72 PetscFunctionBegin;
178 72 svd->ops->setup = SVDSetUp_Randomized;
179 72 svd->ops->solve = SVDSolve_Randomized;
180
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
72 PetscFunctionReturn(PETSC_SUCCESS);
181 }
182