GCC Code Coverage Report


Directory: ./
File: src/svd/impls/randomized/rsvd.c
Date: 2025-11-19 04:19:03
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 109 static PetscErrorCode SVDSetUp_Randomized(SVD svd)
30 {
31 109 PetscInt N;
32
33
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
109 PetscFunctionBegin;
34
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
109 SVDCheckStandard(svd);
35
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
109 SVDCheckDefinite(svd);
36
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
109 SVDCheckUnsupported(svd,SVD_FEATURE_THRESHOLD);
37
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
109 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 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
109 PetscCall(MatGetSize(svd->A,NULL,&N));
39
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
109 PetscCall(SVDSetDimensions_Default(svd));
40
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
109 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 10 times.
✓ Branch 1 taken 10 times.
109 if (svd->max_it==PETSC_DETERMINE) svd->max_it = PetscMax(N/svd->ncv,100);
42 109 svd->leftbasis = PETSC_TRUE;
43 109 svd->mpd = svd->ncv;
44
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
109 PetscCall(SVDAllocateSolution(svd,0));
45
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
109 PetscCall(DSSetType(svd->ds,DSSVD));
46
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
109 PetscCall(DSAllocate(svd->ds,svd->ncv));
47
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
109 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 3756 static PetscErrorCode SVDRandomizedResidualNorm(SVD svd,PetscInt i,PetscScalar sigma,PetscReal *res)
52 {
53 3756 PetscReal norm1,norm2;
54 3756 Vec u,v,wu,wv;
55
56
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
3756 PetscFunctionBegin;
57 3756 *res = 1.0;
58
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3756 if (svd->conv!=SVD_CONV_MAXIT) {
59
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3738 wu = svd->swapped? svd->workr[0]: svd->workl[0];
60
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3738 wv = svd->swapped? svd->workl[0]: svd->workr[0];
61
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3738 PetscCall(BVGetColumn(svd->V,i,&v));
62
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3738 PetscCall(BVGetColumn(svd->U,i,&u));
63 /* norm1 = ||A*v-sigma*u||_2 */
64
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3738 PetscCall(MatMult(svd->A,v,wu));
65
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3738 PetscCall(VecAXPY(wu,-sigma,u));
66
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3738 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 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3738 PetscCall(MatMult(svd->AT,u,wv));
69
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3738 PetscCall(VecAXPY(wv,-sigma,v));
70
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3738 PetscCall(VecNorm(wv,NORM_2,&norm2));
71
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3738 PetscCall(BVRestoreColumn(svd->V,i,&v));
72
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3738 PetscCall(BVRestoreColumn(svd->U,i,&u));
73 3738 *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 6744 static PetscErrorCode BlockMatMult(BV V,Mat A,BV Y,Mat AT)
80 {
81
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
6744 PetscFunctionBegin;
82
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
6744 if (!PetscDefined(USE_COMPLEX)) PetscCall(BVMatMult(V,A,Y));
83 else {
84 3066 PetscBool flg=PETSC_FALSE;
85
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
3066 PetscCall(PetscObjectTypeCompare((PetscObject)A,MATHERMITIANTRANSPOSEVIRTUAL,&flg));
86
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
3066 if (flg) PetscCall(BVMatMultHermitianTranspose(V,AT,Y));
87
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2961 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.
3754 PetscFunctionReturn(PETSC_SUCCESS);
90 }
91
92 109 static PetscErrorCode SVDSolve_Randomized(SVD svd)
93 {
94 109 PetscScalar *w;
95 109 PetscReal res=1.0;
96 109 PetscInt i,k=0;
97 109 Mat A,U,V;
98
99
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
109 PetscFunctionBegin;
100 /* Form random matrix, G. Complete the initial basis with random vectors */
101
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
109 PetscCall(BVSetActiveColumns(svd->V,svd->nini,svd->ncv));
102
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
109 PetscCall(BVSetRandomNormal(svd->V));
103
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
109 PetscCall(PetscCalloc1(svd->ncv,&w));
104
105 /* Subspace Iteration */
106 3372 do {
107 3372 svd->its++;
108
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3372 PetscCall(BVSetActiveColumns(svd->V,svd->nconv,svd->ncv));
109
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3372 PetscCall(BVSetActiveColumns(svd->U,svd->nconv,svd->ncv));
110 /* Form AG */
111
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3372 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 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3372 PetscCall(BVOrthogonalize(svd->U,NULL));
114 /* Form B^*= AQ */
115
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3372 PetscCall(BlockMatMult(svd->U,svd->AT,svd->V,svd->A));
116
117
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3372 PetscCall(DSSetDimensions(svd->ds,svd->ncv,svd->nconv,svd->ncv));
118
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3372 PetscCall(DSSVDSetDimensions(svd->ds,svd->ncv));
119
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3372 PetscCall(DSGetMat(svd->ds,DS_MAT_A,&A));
120
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3372 PetscCall(MatZeroEntries(A));
121
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3372 PetscCall(BVOrthogonalize(svd->V,A));
122
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3372 PetscCall(DSRestoreMat(svd->ds,DS_MAT_A,&A));
123
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3372 PetscCall(DSSetState(svd->ds,DS_STATE_RAW));
124
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3372 PetscCall(DSSolve(svd->ds,w,NULL));
125
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3372 PetscCall(DSSort(svd->ds,w,NULL,NULL,NULL,NULL));
126
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3372 PetscCall(DSSynchronize(svd->ds,w,NULL));
127
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3372 PetscCall(DSGetMat(svd->ds,DS_MAT_U,&U));
128
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3372 PetscCall(DSGetMat(svd->ds,DS_MAT_V,&V));
129
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3372 PetscCall(BVMultInPlace(svd->U,V,svd->nconv,svd->ncv));
130
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3372 PetscCall(BVMultInPlace(svd->V,U,svd->nconv,svd->ncv));
131
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3372 PetscCall(DSRestoreMat(svd->ds,DS_MAT_U,&U));
132
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3372 PetscCall(DSRestoreMat(svd->ds,DS_MAT_V,&V));
133 /* Check convergence */
134 3372 k = 0;
135
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 6 times.
3762 for (i=svd->nconv;i<svd->ncv;i++) {
136
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3756 PetscCall(SVDRandomizedResidualNorm(svd,i,w[i],&res));
137 3756 svd->sigma[i] = PetscRealPart(w[i]);
138
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3756 PetscCall((*svd->converged)(svd,svd->sigma[i],res,&svd->errest[i],svd->convergedctx));
139
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3756 if (svd->errest[i] < svd->tol) k++;
140 else break;
141 }
142
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
3372 if (svd->conv == SVD_CONV_MAXIT && svd->its >= svd->max_it) {
143 18 k = svd->nsv;
144
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
198 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 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3372 PetscCall((*svd->stopping)(svd,svd->its,svd->max_it,svd->nconv+k,svd->nsv,&svd->reason,svd->stoppingctx));
147 3372 svd->nconv += k;
148
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3372 PetscCall(SVDMonitor(svd,svd->its,svd->nconv,svd->sigma,svd->errest,svd->ncv));
149
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3372 } while (svd->reason == SVD_CONVERGED_ITERATING);
150
5/8
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
109 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 89 SLEPC_EXTERN PetscErrorCode SVDCreate_Randomized(SVD svd)
176 {
177
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
89 PetscFunctionBegin;
178 89 svd->ops->setup = SVDSetUp_Randomized;
179 89 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.
89 PetscFunctionReturn(PETSC_SUCCESS);
181 }
182