Lines Matching refs:gn

7   TAO_BRGN *gn;  in GNHessianProd()  local
10 PetscCall(MatShellGetContext(H, &gn)); in GNHessianProd()
11 PetscCall(MatMult(gn->subsolver->ls_jac, in, gn->r_work)); in GNHessianProd()
12 PetscCall(MatMultTranspose(gn->subsolver->ls_jac, gn->r_work, out)); in GNHessianProd()
13 switch (gn->reg_type) { in GNHessianProd()
15 PetscCall(MatMult(gn->Hreg, in, gn->x_work)); in GNHessianProd()
16 PetscCall(VecAXPY(out, gn->lambda, gn->x_work)); in GNHessianProd()
19 PetscCall(VecAXPY(out, gn->lambda, in)); in GNHessianProd()
22 PetscCall(VecAXPY(out, gn->lambda, in)); in GNHessianProd()
26 if (gn->D) { in GNHessianProd()
27 PetscCall(MatMult(gn->D, in, gn->y)); /* y = D*in */ in GNHessianProd()
29 PetscCall(VecCopy(in, gn->y)); in GNHessianProd()
31 …PetscCall(VecPointwiseMult(gn->y_work, gn->diag, gn->y)); /* y_work = diag.*(D*in), where diag = e… in GNHessianProd()
32 if (gn->D) { in GNHessianProd()
33 PetscCall(MatMultTranspose(gn->D, gn->y_work, gn->x_work)); /* x_work = D'*(diag.*(D*in)) */ in GNHessianProd()
35 PetscCall(VecCopy(gn->y_work, gn->x_work)); in GNHessianProd()
37 PetscCall(VecAXPY(out, gn->lambda, gn->x_work)); in GNHessianProd()
40 PetscCall(VecPointwiseMult(gn->x_work, gn->damping, in)); in GNHessianProd()
41 PetscCall(VecAXPY(out, 1, gn->x_work)); in GNHessianProd()
46 static PetscErrorCode ComputeDamping(TAO_BRGN *gn) in ComputeDamping() argument
54 PetscCall(VecGetArray(gn->damping, &damping_ary)); in ComputeDamping()
55 PetscCall(VecGetArrayRead(gn->diag, &diag_ary)); in ComputeDamping()
56 PetscCall(VecGetLocalSize(gn->damping, &n)); in ComputeDamping()
58 PetscCall(VecScale(gn->damping, gn->lambda)); in ComputeDamping()
59 PetscCall(VecRestoreArray(gn->damping, &damping_ary)); in ComputeDamping()
60 PetscCall(VecRestoreArrayRead(gn->diag, &diag_ary)); in ComputeDamping()
89 TAO_BRGN *gn = (TAO_BRGN *)tao->data; in TaoBRGNGetDampingVector_BRGN() local
92 …PetscCheck(gn->reg_type == TAOBRGN_REGULARIZATION_LM, PetscObjectComm((PetscObject)tao), PETSC_ERR… in TaoBRGNGetDampingVector_BRGN()
93 *d = gn->damping; in TaoBRGNGetDampingVector_BRGN()
99 TAO_BRGN *gn = (TAO_BRGN *)ptr; in GNObjectiveGradientEval() local
114 switch (gn->reg_type) { in GNObjectiveGradientEval()
116 PetscCall((*gn->regularizerobjandgrad)(tao, X, &f_reg, gn->x_work, gn->reg_obj_ctx)); in GNObjectiveGradientEval()
117 *fcn += gn->lambda * f_reg; in GNObjectiveGradientEval()
118 PetscCall(VecAXPY(G, gn->lambda, gn->x_work)); in GNObjectiveGradientEval()
123 *fcn += gn->lambda * 0.5 * f_reg; in GNObjectiveGradientEval()
125 PetscCall(VecAXPY(G, gn->lambda, X)); in GNObjectiveGradientEval()
129 PetscCall(VecAXPBYPCZ(gn->x_work, 1.0, -1.0, 0.0, X, gn->x_old)); in GNObjectiveGradientEval()
130 PetscCall(VecDot(gn->x_work, gn->x_work, &f_reg)); in GNObjectiveGradientEval()
131 *fcn += gn->lambda * 0.5 * f_reg; in GNObjectiveGradientEval()
133 PetscCall(VecAXPBYPCZ(G, gn->lambda, -gn->lambda, 1.0, X, gn->x_old)); in GNObjectiveGradientEval()
137 if (gn->D) { in GNObjectiveGradientEval()
138 PetscCall(MatMult(gn->D, X, gn->y)); /* y = D*x */ in GNObjectiveGradientEval()
140 PetscCall(VecCopy(X, gn->y)); in GNObjectiveGradientEval()
142 PetscCall(VecPointwiseMult(gn->y_work, gn->y, gn->y)); in GNObjectiveGradientEval()
143 PetscCall(VecShift(gn->y_work, gn->epsilon * gn->epsilon)); in GNObjectiveGradientEval()
144 PetscCall(VecSqrtAbs(gn->y_work)); /* gn->y_work = sqrt(y.^2+epsilon^2) */ in GNObjectiveGradientEval()
145 PetscCall(VecSum(gn->y_work, &yESum)); in GNObjectiveGradientEval()
146 PetscCall(VecGetSize(gn->y, &K)); in GNObjectiveGradientEval()
147 *fcn += gn->lambda * (yESum - K * gn->epsilon); in GNObjectiveGradientEval()
149 …PetscCall(VecPointwiseDivide(gn->y_work, gn->y, gn->y_work)); /* reuse y_work = y./sqrt(y.^2+epsil… in GNObjectiveGradientEval()
150 if (gn->D) { in GNObjectiveGradientEval()
151 PetscCall(MatMultTranspose(gn->D, gn->y_work, gn->x_work)); in GNObjectiveGradientEval()
153 PetscCall(VecCopy(gn->y_work, gn->x_work)); in GNObjectiveGradientEval()
155 PetscCall(VecAXPY(G, gn->lambda, gn->x_work)); in GNObjectiveGradientEval()
167 TAO_BRGN *gn = (TAO_BRGN *)ptr; in GNComputeHessian() local
173 …if (gn->mat_explicit) PetscCall(MatTransposeMatMult(tao->ls_jac, tao->ls_jac, MAT_REUSE_MATRIX, PE… in GNComputeHessian()
175 switch (gn->reg_type) { in GNComputeHessian()
177 PetscCall((*gn->regularizerhessian)(tao, X, gn->Hreg, gn->reg_hess_ctx)); in GNComputeHessian()
178 if (gn->mat_explicit) PetscCall(MatAXPY(gn->H, 1.0, gn->Hreg, DIFFERENT_NONZERO_PATTERN)); in GNComputeHessian()
181 if (gn->mat_explicit) PetscCall(MatShift(gn->H, gn->lambda)); in GNComputeHessian()
184 if (gn->mat_explicit) PetscCall(MatShift(gn->H, gn->lambda)); in GNComputeHessian()
188 if (gn->D) { in GNComputeHessian()
189 PetscCall(MatMult(gn->D, X, gn->y)); /* y = D*x */ in GNComputeHessian()
191 PetscCall(VecCopy(X, gn->y)); in GNComputeHessian()
193 PetscCall(VecPointwiseMult(gn->y_work, gn->y, gn->y)); in GNComputeHessian()
194 PetscCall(VecShift(gn->y_work, gn->epsilon * gn->epsilon)); in GNComputeHessian()
195 PetscCall(VecCopy(gn->y_work, gn->diag)); /* gn->diag = y.^2+epsilon^2 */ in GNComputeHessian()
196 …PetscCall(VecSqrtAbs(gn->y_work)); /* gn->y_work = sqrt(y.^2+epsilon^2) … in GNComputeHessian()
197 …PetscCall(VecPointwiseMult(gn->diag, gn->y_work, gn->diag)); /* gn->diag = sqrt(y.^2+epsilon^2).^3… in GNComputeHessian()
198 PetscCall(VecReciprocal(gn->diag)); in GNComputeHessian()
199 PetscCall(VecScale(gn->diag, gn->epsilon * gn->epsilon)); in GNComputeHessian()
200 if (gn->mat_explicit) PetscCall(MatDiagonalSet(gn->H, gn->diag, ADD_VALUES)); in GNComputeHessian()
204 PetscCall(MatGetSize(gn->parent->ls_jac, NULL, &n)); in GNComputeHessian()
206 PetscCall(MatGetColumnNorms(gn->parent->ls_jac, NORM_2, cnorms)); in GNComputeHessian()
207 PetscCall(MatGetOwnershipRangeColumn(gn->parent->ls_jac, &cstart, &cend)); in GNComputeHessian()
208 PetscCall(VecGetArray(gn->diag, &diag_ary)); in GNComputeHessian()
210 PetscCall(VecRestoreArray(gn->diag, &diag_ary)); in GNComputeHessian()
212 PetscCall(ComputeDamping(gn)); in GNComputeHessian()
213 if (gn->mat_explicit) PetscCall(MatDiagonalSet(gn->H, gn->damping, ADD_VALUES)); in GNComputeHessian()
223 TAO_BRGN *gn = (TAO_BRGN *)ctx; in GNHookFunction() local
227 gn->parent->nfuncs = tao->nfuncs; in GNHookFunction()
228 gn->parent->ngrads = tao->ngrads; in GNHookFunction()
229 gn->parent->nfuncgrads = tao->nfuncgrads; in GNHookFunction()
230 gn->parent->nhess = tao->nhess; in GNHookFunction()
231 gn->parent->niter = tao->niter; in GNHookFunction()
232 gn->parent->ksp_its = tao->ksp_its; in GNHookFunction()
233 gn->parent->ksp_tot_its = tao->ksp_tot_its; in GNHookFunction()
234 gn->parent->fc = tao->fc; in GNHookFunction()
235 PetscCall(TaoGetConvergedReason(tao, &gn->parent->reason)); in GNHookFunction()
238 PetscCall(VecSet(gn->x_old, 0.0)); in GNHookFunction()
240 PetscCall(VecCopy(tao->solution, gn->x_old)); in GNHookFunction()
241 PetscCall(VecCopy(tao->solution, gn->parent->solution)); in GNHookFunction()
244 PetscCall(VecCopy(tao->gradient, gn->parent->gradient)); in GNHookFunction()
247 if (gn->reg_type == TAOBRGN_REGULARIZATION_LM) { in GNHookFunction()
249 if (gn->fc_old > tao->fc) { in GNHookFunction()
250 gn->lambda = gn->lambda * gn->downhill_lambda_change; in GNHookFunction()
253 gn->lambda = gn->lambda * gn->uphill_lambda_change; in GNHookFunction()
256 gn->fc_old = tao->fc; in GNHookFunction()
260 …if (gn->parent->ops->update) PetscCall((*gn->parent->ops->update)(gn->parent, gn->parent->niter, g… in GNHookFunction()
266 TAO_BRGN *gn = (TAO_BRGN *)tao->data; in TaoBRGNGetRegularizationType_BRGN() local
269 *type = gn->reg_type; in TaoBRGNGetRegularizationType_BRGN()
299 TAO_BRGN *gn = (TAO_BRGN *)tao->data; in TaoBRGNSetRegularizationType_BRGN() local
302 gn->reg_type = type; in TaoBRGNSetRegularizationType_BRGN()
330 TAO_BRGN *gn = (TAO_BRGN *)tao->data; in TaoSolve_BRGN() local
333 PetscCall(TaoSolve(gn->subsolver)); in TaoSolve_BRGN()
335 tao->nfuncs = gn->subsolver->nfuncs; in TaoSolve_BRGN()
336 tao->ngrads = gn->subsolver->ngrads; in TaoSolve_BRGN()
337 tao->nfuncgrads = gn->subsolver->nfuncgrads; in TaoSolve_BRGN()
338 tao->nhess = gn->subsolver->nhess; in TaoSolve_BRGN()
339 tao->niter = gn->subsolver->niter; in TaoSolve_BRGN()
340 tao->ksp_its = gn->subsolver->ksp_its; in TaoSolve_BRGN()
341 tao->ksp_tot_its = gn->subsolver->ksp_tot_its; in TaoSolve_BRGN()
342 PetscCall(TaoGetConvergedReason(gn->subsolver, &tao->reason)); in TaoSolve_BRGN()
344 PetscCall(VecCopy(gn->subsolver->solution, tao->solution)); in TaoSolve_BRGN()
345 PetscCall(VecCopy(gn->subsolver->gradient, tao->gradient)); in TaoSolve_BRGN()
351 TAO_BRGN *gn = (TAO_BRGN *)tao->data; in TaoSetFromOptions_BRGN() local
356 … construction to be an explicit matrix rather than MATSHELL", "", gn->mat_explicit, &gn->mat_expli… in TaoSetFromOptions_BRGN()
357 …o_brgn_regularizer_weight", "regularizer weight (default 1e-4)", "", gn->lambda, &gn->lambda, NULL… in TaoSetFromOptions_BRGN()
358 …r: ||x||_1 = sum(sqrt(x.^2+epsilon^2)-epsilon) (default 1e-6)", "", gn->epsilon, &gn->epsilon, NUL… in TaoSetFromOptions_BRGN()
359 … "Factor to decrease trust region by on downhill steps", "", gn->downhill_lambda_change, &gn->down… in TaoSetFromOptions_BRGN()
360 …e", "Factor to increase trust region by on uphill steps", "", gn->uphill_lambda_change, &gn->uphil… in TaoSetFromOptions_BRGN()
361 …larization type", "", TaoBRGNRegularizationTypes, (PetscEnum)gn->reg_type, (PetscEnum *)&gn->reg_t… in TaoSetFromOptions_BRGN()
364 if (gn->reg_type == TAOBRGN_REGULARIZATION_LM) { in TaoSetFromOptions_BRGN()
365 PetscCall(TaoGetLineSearch(gn->subsolver, &ls)); in TaoSetFromOptions_BRGN()
368 PetscCall(TaoSetFromOptions(gn->subsolver)); in TaoSetFromOptions_BRGN()
374 TAO_BRGN *gn = (TAO_BRGN *)tao->data; in TaoView_BRGN() local
381 PetscCall(PetscViewerASCIIPrintf(viewer, "Regularizer weight: %g\n", (double)gn->lambda)); in TaoView_BRGN()
382 …erASCIIPrintf(viewer, "BRGN Regularization Type: %s\n", TaoBRGNRegularizationTypes[gn->reg_type])); in TaoView_BRGN()
383 switch (gn->reg_type) { in TaoView_BRGN()
385 PetscCall(PetscViewerASCIIPrintf(viewer, "L1 smooth epsilon: %g\n", (double)gn->epsilon)); in TaoView_BRGN()
388 …SCIIPrintf(viewer, "Downhill trust region decrease factor:: %g\n", (double)gn->downhill_lambda_cha… in TaoView_BRGN()
389 …rASCIIPrintf(viewer, "Uphill trust region increase factor:: %g\n", (double)gn->uphill_lambda_chang… in TaoView_BRGN()
400 PetscCall(TaoView(gn->subsolver, viewer)); in TaoView_BRGN()
407 TAO_BRGN *gn = (TAO_BRGN *)tao->data; in TaoSetUp_BRGN() local
413 PetscCall(PetscObjectTypeCompare((PetscObject)gn->subsolver, TAOBNLS, &is_bnls)); in TaoSetUp_BRGN()
414 PetscCall(PetscObjectTypeCompare((PetscObject)gn->subsolver, TAOBNTR, &is_bntr)); in TaoSetUp_BRGN()
415 PetscCall(PetscObjectTypeCompare((PetscObject)gn->subsolver, TAOBNTL, &is_bntl)); in TaoSetUp_BRGN()
418 if (!gn->x_work) PetscCall(VecDuplicate(tao->solution, &gn->x_work)); in TaoSetUp_BRGN()
419 if (!gn->r_work) PetscCall(VecDuplicate(tao->ls_res, &gn->r_work)); in TaoSetUp_BRGN()
420 if (!gn->x_old) { in TaoSetUp_BRGN()
421 PetscCall(VecDuplicate(tao->solution, &gn->x_old)); in TaoSetUp_BRGN()
422 PetscCall(VecSet(gn->x_old, 0.0)); in TaoSetUp_BRGN()
425 if (TAOBRGN_REGULARIZATION_L1DICT == gn->reg_type) { in TaoSetUp_BRGN()
426 if (!gn->y) { in TaoSetUp_BRGN()
427 if (gn->D) { in TaoSetUp_BRGN()
428 …PetscCall(MatGetSize(gn->D, &K, &N)); /* Shell matrices still must have sizes defined. K = N for i… in TaoSetUp_BRGN()
429 PetscCall(MatCreateVecs(gn->D, NULL, &gn->y)); in TaoSetUp_BRGN()
431 …PetscCall(VecDuplicate(tao->solution, &gn->y)); /* If user does not setup dict matrix, use identit… in TaoSetUp_BRGN()
433 PetscCall(VecSet(gn->y, 0.0)); in TaoSetUp_BRGN()
435 if (!gn->y_work) PetscCall(VecDuplicate(gn->y, &gn->y_work)); in TaoSetUp_BRGN()
436 if (!gn->diag) { in TaoSetUp_BRGN()
437 PetscCall(VecDuplicate(gn->y, &gn->diag)); in TaoSetUp_BRGN()
438 PetscCall(VecSet(gn->diag, 0.0)); in TaoSetUp_BRGN()
441 if (TAOBRGN_REGULARIZATION_LM == gn->reg_type) { in TaoSetUp_BRGN()
442 if (!gn->diag) PetscCall(MatCreateVecs(tao->ls_jac, &gn->diag, NULL)); in TaoSetUp_BRGN()
443 if (!gn->damping) PetscCall(MatCreateVecs(tao->ls_jac, &gn->damping, NULL)); in TaoSetUp_BRGN()
448 if (gn->mat_explicit) { in TaoSetUp_BRGN()
450 …scCall(MatTransposeMatMult(tao->ls_jac, tao->ls_jac, MAT_INITIAL_MATRIX, PETSC_DETERMINE, &gn->H)); in TaoSetUp_BRGN()
454 PetscCall(MatCreate(PetscObjectComm((PetscObject)tao), &gn->H)); in TaoSetUp_BRGN()
455 PetscCall(MatSetSizes(gn->H, n, n, N, N)); in TaoSetUp_BRGN()
456 PetscCall(MatSetType(gn->H, MATSHELL)); in TaoSetUp_BRGN()
457 PetscCall(MatSetOption(gn->H, MAT_SYMMETRIC, PETSC_TRUE)); in TaoSetUp_BRGN()
458 PetscCall(MatShellSetOperation(gn->H, MATOP_MULT, (PetscErrorCodeFn *)GNHessianProd)); in TaoSetUp_BRGN()
459 PetscCall(MatShellSetContext(gn->H, gn)); in TaoSetUp_BRGN()
461 PetscCall(MatSetUp(gn->H)); in TaoSetUp_BRGN()
463 PetscCall(TaoSetUpdate(gn->subsolver, GNHookFunction, gn)); in TaoSetUp_BRGN()
464 PetscCall(TaoSetSolution(gn->subsolver, tao->solution)); in TaoSetUp_BRGN()
465 if (tao->bounded) PetscCall(TaoSetVariableBounds(gn->subsolver, tao->XL, tao->XU)); in TaoSetUp_BRGN()
466 …PetscCall(TaoSetResidualRoutine(gn->subsolver, tao->ls_res, tao->ops->computeresidual, tao->user_l… in TaoSetUp_BRGN()
467 …PetscCall(TaoSetJacobianResidualRoutine(gn->subsolver, tao->ls_jac, tao->ls_jac, tao->ops->compute… in TaoSetUp_BRGN()
468 PetscCall(TaoSetObjectiveAndGradient(gn->subsolver, NULL, GNObjectiveGradientEval, gn)); in TaoSetUp_BRGN()
469 PetscCall(TaoSetHessian(gn->subsolver, gn->H, gn->H, GNComputeHessian, gn)); in TaoSetUp_BRGN()
471 PetscCall(TaoSetTolerances(gn->subsolver, tao->gatol, tao->grtol, tao->gttol)); in TaoSetUp_BRGN()
472 PetscCall(TaoSetMaximumIterations(gn->subsolver, tao->max_it)); in TaoSetUp_BRGN()
473 PetscCall(TaoSetMaximumFunctionEvaluations(gn->subsolver, tao->max_funcs)); in TaoSetUp_BRGN()
474 PetscCall(TaoSetUp(gn->subsolver)); in TaoSetUp_BRGN()
481 TAO_BRGN *gn = (TAO_BRGN *)tao->data; in TaoDestroy_BRGN() local
486 PetscCall(VecDestroy(&gn->x_work)); in TaoDestroy_BRGN()
487 PetscCall(VecDestroy(&gn->r_work)); in TaoDestroy_BRGN()
488 PetscCall(VecDestroy(&gn->x_old)); in TaoDestroy_BRGN()
489 PetscCall(VecDestroy(&gn->diag)); in TaoDestroy_BRGN()
490 PetscCall(VecDestroy(&gn->y)); in TaoDestroy_BRGN()
491 PetscCall(VecDestroy(&gn->y_work)); in TaoDestroy_BRGN()
493 PetscCall(VecDestroy(&gn->damping)); in TaoDestroy_BRGN()
494 PetscCall(VecDestroy(&gn->diag)); in TaoDestroy_BRGN()
495 PetscCall(MatDestroy(&gn->H)); in TaoDestroy_BRGN()
496 PetscCall(MatDestroy(&gn->D)); in TaoDestroy_BRGN()
497 PetscCall(MatDestroy(&gn->Hreg)); in TaoDestroy_BRGN()
498 PetscCall(TaoDestroy(&gn->subsolver)); in TaoDestroy_BRGN()
499 gn->parent = NULL; in TaoDestroy_BRGN()
536 TAO_BRGN *gn = (TAO_BRGN *)tao->data; in TaoBRGNGetSubsolver_BRGN() local
539 *subsolver = gn->subsolver; in TaoBRGNGetSubsolver_BRGN()
567 TAO_BRGN *gn = (TAO_BRGN *)tao->data; in TaoBRGNSetRegularizerWeight_BRGN() local
570 gn->lambda = lambda; in TaoBRGNSetRegularizerWeight_BRGN()
598 TAO_BRGN *gn = (TAO_BRGN *)tao->data; in TaoBRGNSetL1SmoothEpsilon_BRGN() local
601 gn->epsilon = epsilon; in TaoBRGNSetL1SmoothEpsilon_BRGN()
626 TAO_BRGN *gn = (TAO_BRGN *)tao->data; in TaoBRGNSetDictionaryMatrix_BRGN() local
634 PetscCall(MatDestroy(&gn->D)); in TaoBRGNSetDictionaryMatrix_BRGN()
635 gn->D = dict; in TaoBRGNSetDictionaryMatrix_BRGN()
669 TAO_BRGN *gn = (TAO_BRGN *)tao->data; in TaoBRGNSetRegularizerObjectiveAndGradientRoutine_BRGN() local
672 if (ctx) gn->reg_obj_ctx = ctx; in TaoBRGNSetRegularizerObjectiveAndGradientRoutine_BRGN()
673 if (func) gn->regularizerobjandgrad = func; in TaoBRGNSetRegularizerObjectiveAndGradientRoutine_BRGN()
707 TAO_BRGN *gn = (TAO_BRGN *)tao->data; in TaoBRGNSetRegularizerHessianRoutine_BRGN() local
714 if (ctx) gn->reg_hess_ctx = ctx; in TaoBRGNSetRegularizerHessianRoutine_BRGN()
715 if (func) gn->regularizerhessian = func; in TaoBRGNSetRegularizerHessianRoutine_BRGN()
718 PetscCall(MatDestroy(&gn->Hreg)); in TaoBRGNSetRegularizerHessianRoutine_BRGN()
719 gn->Hreg = Hreg; in TaoBRGNSetRegularizerHessianRoutine_BRGN()
747 TAO_BRGN *gn; in TaoCreate_BRGN() local
750 PetscCall(PetscNew(&gn)); in TaoCreate_BRGN()
760 tao->data = gn; in TaoCreate_BRGN()
761 gn->reg_type = TAOBRGN_REGULARIZATION_L2PROX; in TaoCreate_BRGN()
762 gn->lambda = 1e-4; in TaoCreate_BRGN()
763 gn->epsilon = 1e-6; in TaoCreate_BRGN()
764 gn->downhill_lambda_change = 1. / 5.; in TaoCreate_BRGN()
765 gn->uphill_lambda_change = 1.5; in TaoCreate_BRGN()
766 gn->parent = tao; in TaoCreate_BRGN()
768 PetscCall(TaoCreate(PetscObjectComm((PetscObject)tao), &gn->subsolver)); in TaoCreate_BRGN()
769 PetscCall(TaoSetType(gn->subsolver, TAOBNLS)); in TaoCreate_BRGN()
770 PetscCall(TaoSetOptionsPrefix(gn->subsolver, "tao_brgn_subsolver_")); in TaoCreate_BRGN()