| 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 |