Lines Matching defs:lqn

37   Mat_DQN  *lqn  = (Mat_DQN *)lmvm->ctx;
44 PetscCall(SymBroydenRescaleView(lqn->rescale, pv));
45 if (isascii) PetscCall(PetscViewerASCIIPrintf(pv, "Counts: S x : %" PetscInt_FMT ", S^T x : %" PetscInt_FMT ", Y x : %" PetscInt_FMT ", Y^T x: %" PetscInt_FMT "\n", lqn->S_count, lqn->St_count, lqn->Y_count, lqn->Yt_count));
52 Mat_DQN *lqn = (Mat_DQN *)lmvm->ctx;
55 PetscCall(MatDestroy(&lqn->HY));
56 PetscCall(MatDestroy(&lqn->BS));
57 PetscCall(MatDestroy(&lqn->StY_triu));
58 PetscCall(MatDestroy(&lqn->YtS_triu));
59 PetscCall(VecDestroy(&lqn->StFprev));
60 PetscCall(VecDestroy(&lqn->Fprev_ref));
61 lqn->Fprev_state = 0;
62 PetscCall(MatDestroy(&lqn->YtS_triu_strict));
63 PetscCall(MatDestroy(&lqn->StY_triu_strict));
64 PetscCall(MatDestroy(&lqn->StBS));
65 PetscCall(MatDestroy(&lqn->YtHY));
66 PetscCall(MatDestroy(&lqn->J));
67 PetscCall(MatDestroy(&lqn->temp_mat));
68 PetscCall(VecDestroy(&lqn->diag_vec));
69 PetscCall(VecDestroy(&lqn->diag_vec_recycle_order));
70 PetscCall(VecDestroy(&lqn->inv_diag_vec));
71 PetscCall(VecDestroy(&lqn->column_work));
72 PetscCall(VecDestroy(&lqn->column_work2));
73 PetscCall(VecDestroy(&lqn->rwork1));
74 PetscCall(VecDestroy(&lqn->rwork2));
75 PetscCall(VecDestroy(&lqn->rwork3));
76 PetscCall(VecDestroy(&lqn->rwork2_local));
77 PetscCall(VecDestroy(&lqn->rwork3_local));
78 PetscCall(VecDestroy(&lqn->cyclic_work_vec));
79 PetscCall(VecDestroyVecs(lmvm->m, &lqn->PQ));
80 PetscCall(PetscFree(lqn->stp));
81 PetscCall(PetscFree(lqn->yts));
82 PetscCall(PetscFree(lqn->ytq));
83 lqn->allocated = PETSC_FALSE;
90 Mat_DQN *lqn = (Mat_DQN *)lmvm->ctx;
93 lqn->watchdog = 0;
94 lqn->needPQ = PETSC_TRUE;
95 lqn->num_updates = 0;
96 lqn->num_mult_updates = 0;
99 if (lqn->BS) PetscCall(MatZeroEntries(lqn->BS));
100 if (lqn->HY) PetscCall(MatZeroEntries(lqn->HY));
101 if (lqn->StY_triu) { /* Set to identity by default so it is invertible */
102 PetscCall(MatZeroEntries(lqn->StY_triu));
103 PetscCall(MatShift(lqn->StY_triu, 1.0));
105 if (lqn->YtS_triu) {
106 PetscCall(MatZeroEntries(lqn->YtS_triu));
107 PetscCall(MatShift(lqn->YtS_triu, 1.0));
109 if (lqn->YtS_triu_strict) PetscCall(MatZeroEntries(lqn->YtS_triu_strict));
110 if (lqn->StY_triu_strict) PetscCall(MatZeroEntries(lqn->StY_triu_strict));
111 if (lqn->StBS) {
112 PetscCall(MatZeroEntries(lqn->StBS));
113 PetscCall(MatShift(lqn->StBS, 1.0));
115 if (lqn->YtHY) {
116 PetscCall(MatZeroEntries(lqn->YtHY));
117 PetscCall(MatShift(lqn->YtHY, 1.0));
119 if (lqn->Fprev_ref) PetscCall(VecDestroy(&lqn->Fprev_ref));
120 lqn->Fprev_state = 0;
121 if (lqn->StFprev) PetscCall(VecZeroEntries(lqn->StFprev));
129 Mat_DQN *lqn = (Mat_DQN *)lmvm->ctx;
132 PetscCall(SymBroydenRescaleReset(B, lqn->rescale, mode));
140 Mat_DQN *lqn = (Mat_DQN *)lmvm->ctx;
143 if (!lqn->allocated) {
167 PetscCall(MatCreateDenseFromVecType(comm, vec_type, m, m, M, M, -1, NULL, &lqn->StY_triu));
168 PetscCall(MatCreateDenseFromVecType(comm, vec_type, m, m, M, M, -1, NULL, &lqn->YtS_triu));
169 PetscCall(MatCreateVecs(lqn->StY_triu, &lqn->diag_vec, &lqn->rwork1));
170 PetscCall(MatCreateVecs(lqn->StY_triu, &lqn->rwork2, &lqn->rwork3));
172 PetscCall(MatCreateDenseFromVecType(comm, vec_type, m, m, M, M, -1, NULL, &lqn->YtS_triu));
173 PetscCall(MatDuplicate(Sfull, MAT_SHARE_NONZERO_PATTERN, &lqn->HY));
174 PetscCall(MatCreateVecs(lqn->YtS_triu, &lqn->diag_vec, &lqn->rwork1));
175 PetscCall(MatCreateVecs(lqn->YtS_triu, &lqn->rwork2, &lqn->rwork3));
177 PetscCall(MatCreateDenseFromVecType(comm, vec_type, m, m, M, M, -1, NULL, &lqn->StY_triu));
178 PetscCall(MatDuplicate(Sfull, MAT_SHARE_NONZERO_PATTERN, &lqn->BS));
179 PetscCall(MatCreateVecs(lqn->StY_triu, &lqn->diag_vec, &lqn->rwork1));
180 PetscCall(MatCreateVecs(lqn->StY_triu, &lqn->rwork2, &lqn->rwork3));
185 if (lqn->StY_triu) {
186 PetscCall(MatZeroEntries(lqn->StY_triu));
187 PetscCall(MatShift(lqn->StY_triu, 1.0));
189 if (lqn->YtS_triu) {
190 PetscCall(MatZeroEntries(lqn->YtS_triu));
191 PetscCall(MatShift(lqn->YtS_triu, 1.0));
193 if (lqn->use_recursive && (is_dbfgs || is_ddfp)) {
194 PetscCall(VecDuplicateVecs(lmvm->Xprev, lmvm->m, &lqn->PQ));
195 PetscCall(VecDuplicate(lmvm->Xprev, &lqn->column_work2));
196 PetscCall(PetscMalloc1(lmvm->m, &lqn->yts));
198 PetscCall(PetscMalloc1(lmvm->m, &lqn->stp));
200 PetscCall(PetscMalloc1(lmvm->m, &lqn->ytq));
203 PetscCall(VecDuplicate(lqn->rwork2, &lqn->cyclic_work_vec));
204 PetscCall(VecZeroEntries(lqn->rwork1));
205 PetscCall(VecZeroEntries(lqn->rwork2));
206 PetscCall(VecZeroEntries(lqn->rwork3));
207 PetscCall(VecZeroEntries(lqn->diag_vec));
209 PetscCall(VecDuplicate(lmvm->Xprev, &lqn->column_work));
210 lqn->allocated = PETSC_TRUE;
218 Mat_DQN *lqn = (Mat_DQN *)lmvm->ctx;
222 PetscCall(SymBroydenRescaleInitializeJ0(B, lqn->rescale));
230 Mat_DQN *lqn = (Mat_DQN *)lmvm->ctx;
240 PetscCall(PetscOptionsEnum("-mat_lqn_type", "Implementation options for L-QN", "MatLMVMDenseType", MatLMVMDenseTypes, (PetscEnum)lqn->strategy, (PetscEnum *)&lqn->strategy, NULL));
242 PetscCall(PetscOptionsBool("-mat_lbfgs_recursive", "Use recursive formulation for MatMult_LMVMDBFGS, instead of Cholesky", "", lqn->use_recursive, &lqn->use_recursive, NULL));
243 PetscCall(PetscOptionsEnum("-mat_lbfgs_type", "Implementation options for L-BFGS", "MatLMVMDenseType", MatLMVMDenseTypes, (PetscEnum)lqn->strategy, (PetscEnum *)&lqn->strategy, NULL));
245 PetscCall(PetscOptionsBool("-mat_ldfp_recursive", "Use recursive formulation for MatSolve_LMVMDDFP, instead of Cholesky", "", lqn->use_recursive, &lqn->use_recursive, NULL));
246 PetscCall(PetscOptionsEnum("-mat_ldfp_type", "Implementation options for L-DFP", "MatLMVMDenseType", MatLMVMDenseTypes, (PetscEnum)lqn->strategy, (PetscEnum *)&lqn->strategy, NULL));
250 PetscCall(SymBroydenRescaleSetFromOptions(B, lqn->rescale, PetscOptionsObject));
258 Mat_DQN *lqn = (Mat_DQN *)lmvm->ctx;
261 PetscCall(SymBroydenRescaleDestroy(&lqn->rescale));
263 PetscCall(PetscFree(lqn->workscalar));
273 Mat_DQN *lqn = (Mat_DQN *)lmvm->ctx;
317 lqn->num_updates++;
318 lqn->watchdog = 0;
319 lqn->needPQ = PETSC_TRUE;
321 if (h_old == m && lqn->strategy == MAT_LMVM_DENSE_REORDER) {
323 PetscCall(MatMove_LR3(B, lqn->StY_triu, m - 1));
324 PetscCall(MatMove_LR3(B, lqn->YtS_triu, m - 1));
326 PetscCall(MatMove_LR3(B, lqn->StY_triu, m - 1));
328 PetscCall(MatMove_LR3(B, lqn->YtS_triu, m - 1));
334 if (lqn->use_recursive && (is_dbfgs || is_ddfp)) lqn->yts[idx] = PetscRealPart(curvature);
343 StYidx = (lqn->strategy == MAT_LMVM_DENSE_REORDER) ? history_index(m, lqn->num_updates, k) : idx;
344 if (!lqn->StFprev) PetscCall(VecDuplicate(lqn->rwork1, &lqn->StFprev));
345 PetscCall(VecGetLocalSize(lqn->StFprev, &local_n));
346 PetscCall(VecGetArrayAndMemType(lqn->StFprev, &StFprev, &memtype));
356 PetscCall(VecRestoreArrayAndMemType(lqn->StFprev, &StFprev));
361 PetscCall(MatDenseGetColumnVecWrite(lqn->StY_triu, StYidx, &this_sy_col));
362 PetscCall(VecAXPBY(this_sy_col, -1.0, 0.0, lqn->StFprev));
365 PetscCall(MatMultHermitianTransposeColumnRange(Sfull, F, lqn->StFprev, 0, h_new));
366 lqn->St_count++;
369 PetscCall(VecAXPY(this_sy_col, 1.0, lqn->StFprev));
371 if (lqn->strategy == MAT_LMVM_DENSE_REORDER) PetscCall(VecRecycleOrderToHistoryOrder(B, this_sy_col, lqn->num_updates, lqn->cyclic_work_vec));
372 PetscCall(MatDenseRestoreColumnVecWrite(lqn->StY_triu, StYidx, &this_sy_col));
379 YtSidx = (lqn->strategy == MAT_LMVM_DENSE_REORDER) ? history_index(m, lqn->num_updates, k) : idx;
384 PetscCall(MatDenseGetColumnVecWrite(lqn->YtS_triu, YtSidx, &this_ys_col));
386 lqn->Yt_count++;
388 if (lqn->strategy == MAT_LMVM_DENSE_REORDER) PetscCall(VecRecycleOrderToHistoryOrder(B, this_ys_col, lqn->num_updates, lqn->cyclic_work_vec));
389 PetscCall(MatDenseRestoreColumnVecWrite(lqn->YtS_triu, YtSidx, &this_ys_col));
394 PetscCall(MatGetDiagonal(lqn->StY_triu, lqn->diag_vec));
396 PetscCall(MatGetDiagonal(lqn->YtS_triu, lqn->diag_vec));
401 if (lqn->strategy == MAT_LMVM_DENSE_REORDER) {
402 if (!lqn->diag_vec_recycle_order) PetscCall(VecDuplicate(lqn->diag_vec, &lqn->diag_vec_recycle_order));
403 PetscCall(VecCopy(lqn->diag_vec, lqn->diag_vec_recycle_order));
404 PetscCall(VecHistoryOrderToRecycleOrder(B, lqn->diag_vec_recycle_order, lqn->num_updates, lqn->cyclic_work_vec));
406 if (!lqn->diag_vec_recycle_order) {
407 PetscCall(PetscObjectReference((PetscObject)lqn->diag_vec));
408 lqn->diag_vec_recycle_order = lqn->diag_vec;
412 PetscCall(SymBroydenRescaleUpdate(B, lqn->rescale));
416 ++lqn->watchdog;
422 if (!lqn->StFprev) PetscCall(VecDuplicate(lqn->rwork1, &lqn->StFprev));
423 PetscCall(MatMultHermitianTransposeColumnRange(Sfull, F, lqn->StFprev, 0, h));
424 lqn->St_count++;
428 if (lqn->watchdog > lqn->max_seq_rejects) PetscCall(MatLMVMReset(B, PETSC_FALSE));
434 PetscCall(VecDestroy(&lqn->Fprev_ref));
435 lqn->Fprev_ref = F;
436 PetscCall(PetscObjectStateGet((PetscObject)F, &lqn->Fprev_state));
536 Mat_DQN *lqn = (Mat_DQN *)lmvm->ctx;
539 PetscCall(SymBroydenRescaleSetDelta(B, lqn->rescale, PetscAbsReal(PetscRealPart(delta))));
552 Mat_DQN *lqn;
575 PetscCall(PetscNew(&lqn));
576 lmvm->ctx = (void *)lqn;
577 lqn->allocated = PETSC_FALSE;
578 lqn->use_recursive = PETSC_FALSE;
579 lqn->needPQ = PETSC_FALSE;
580 lqn->watchdog = 0;
581 lqn->max_seq_rejects = lmvm->m / 2;
582 lqn->strategy = MAT_LMVM_DENSE_INPLACE;
584 PetscCall(SymBroydenRescaleCreate(&lqn->rescale));
1520 Mat_DQN *lqn = (Mat_DQN *)lmvm->ctx;
1524 lqn->strategy = type;