1 static char help[] = "TAO/Pounders Matlab Testing on the More'-Wild Benchmark Problems\n\ 2 The interface calls:\n\ 3 TestingInitialize.m to initialize the problem set\n\ 4 ProblemInitialize.m to initialize each instance\n\ 5 ProblemFinalize.m to store the performance data for the instance solved\n\ 6 TestingFinalize.m to store the entire set of performance data\n\ 7 \n\ 8 TestingPlot.m is called outside of TAO/Pounders to produce a performance profile\n\ 9 of the results compared to the Matlab fminsearch algorithm.\n"; 10 11 #include <petsctao.h> 12 #include <petscmatlab.h> 13 14 typedef struct { 15 PetscMatlabEngine mengine; 16 17 double delta; /* Initial trust region radius */ 18 19 int n; /* Number of inputs */ 20 int m; /* Number of outputs */ 21 int nfmax; /* Maximum function evaluations */ 22 int npmax; /* Maximum interpolation points */ 23 } AppCtx; 24 25 static PetscErrorCode EvaluateResidual(Tao tao, Vec X, Vec F, void *ptr) 26 { 27 AppCtx *user = (AppCtx *)ptr; 28 PetscErrorCode ierr; 29 30 PetscFunctionBegin; 31 ierr = PetscObjectSetName((PetscObject)X,"X");CHKERRQ(ierr); 32 ierr = PetscMatlabEnginePut(user->mengine,(PetscObject)X);CHKERRQ(ierr); 33 ierr = PetscMatlabEngineEvaluate(user->mengine,"F = func(X);");CHKERRQ(ierr); 34 ierr = PetscObjectSetName((PetscObject)F,"F");CHKERRQ(ierr); 35 ierr = PetscMatlabEngineGet(user->mengine,(PetscObject)F);CHKERRQ(ierr); 36 PetscFunctionReturn(0); 37 } 38 39 static PetscErrorCode EvaluateJacobian(Tao tao, Vec X, Mat J, Mat JPre, void *ptr) 40 { 41 AppCtx *user = (AppCtx *)ptr; 42 PetscErrorCode ierr; 43 44 PetscFunctionBegin; 45 ierr = PetscObjectSetName((PetscObject)X,"X");CHKERRQ(ierr); 46 ierr = PetscMatlabEnginePut(user->mengine,(PetscObject)X);CHKERRQ(ierr); 47 ierr = PetscMatlabEngineEvaluate(user->mengine,"J = jac(X);");CHKERRQ(ierr); 48 ierr = PetscObjectSetName((PetscObject)J,"J");CHKERRQ(ierr); 49 ierr = PetscMatlabEngineGet(user->mengine,(PetscObject)J);CHKERRQ(ierr); 50 PetscFunctionReturn(0); 51 } 52 53 static PetscErrorCode TaoPounders(AppCtx *user) 54 { 55 PetscErrorCode ierr; 56 Tao tao; 57 Vec X, F; 58 Mat J; 59 char buf[1024]; 60 61 PetscFunctionBegin; 62 63 /* Set the values for the algorithm options we want to use */ 64 sprintf(buf,"%d",user->npmax); 65 ierr = PetscOptionsSetValue(NULL,"-tao_pounders_npmax",buf);CHKERRQ(ierr); 66 sprintf(buf,"%5.4e",user->delta); 67 ierr = PetscOptionsSetValue(NULL,"-tao_pounders_delta",buf);CHKERRQ(ierr); 68 69 /* Create the TAO objects and set the type */ 70 ierr = TaoCreate(PETSC_COMM_SELF,&tao);CHKERRQ(ierr); 71 72 /* Create starting point and initialize */ 73 ierr = VecCreateSeq(PETSC_COMM_SELF,user->n,&X);CHKERRQ(ierr); 74 ierr = PetscObjectSetName((PetscObject)X,"X0");CHKERRQ(ierr); 75 ierr = PetscMatlabEngineGet(user->mengine,(PetscObject)X);CHKERRQ(ierr); 76 ierr = TaoSetInitialVector(tao,X);CHKERRQ(ierr); 77 78 /* Create residuals vector and set residual function */ 79 ierr = VecCreateSeq(PETSC_COMM_SELF,user->m,&F);CHKERRQ(ierr); 80 ierr = PetscObjectSetName((PetscObject)F,"F");CHKERRQ(ierr); 81 ierr = TaoSetResidualRoutine(tao,F,EvaluateResidual,(void*)user);CHKERRQ(ierr); 82 83 /* Create Jacobian matrix and set residual Jacobian routine */ 84 ierr = MatCreateSeqAIJ(PETSC_COMM_WORLD,user->m,user->n,user->n,NULL,&J);CHKERRQ(ierr); 85 ierr = PetscObjectSetName((PetscObject)J,"J");CHKERRQ(ierr); 86 ierr = TaoSetJacobianResidualRoutine(tao,J,J,EvaluateJacobian,(void*)user);CHKERRQ(ierr); 87 88 /* Solve the problem */ 89 ierr = TaoSetType(tao,TAOPOUNDERS);CHKERRQ(ierr); 90 ierr = TaoSetMaximumFunctionEvaluations(tao,user->nfmax);CHKERRQ(ierr); 91 ierr = TaoSetFromOptions(tao);CHKERRQ(ierr); 92 ierr = TaoSolve(tao);CHKERRQ(ierr); 93 94 /* Finish the problem */ 95 ierr = MatDestroy(&J);CHKERRQ(ierr); 96 ierr = VecDestroy(&X);CHKERRQ(ierr); 97 ierr = VecDestroy(&F);CHKERRQ(ierr); 98 ierr = TaoDestroy(&tao);CHKERRQ(ierr); 99 PetscFunctionReturn(0); 100 } 101 102 int main(int argc, char **argv) 103 { 104 AppCtx user; 105 PetscErrorCode ierr; 106 PetscScalar tmp; 107 PetscInt prob_id = 0; 108 PetscBool flg, testall = PETSC_FALSE; 109 int i, i0, imax; 110 111 ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; 112 ierr = PetscOptionsGetBool(NULL,NULL,"-test_all",&testall,NULL);CHKERRQ(ierr); 113 ierr = PetscOptionsGetInt(NULL,NULL,"-prob_id",&prob_id,&flg);CHKERRQ(ierr); 114 if (!testall) { 115 if (!flg) { 116 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_NULL, "Problem number must be specified with -prob_id"); 117 } else if ((prob_id < 1) || (prob_id > 53)) { 118 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Problem number must be between 1 and 53!"); 119 } else { 120 ierr = PetscPrintf(PETSC_COMM_SELF,"Running problem %d\n",prob_id);CHKERRQ(ierr); 121 } 122 } else { 123 ierr = PetscPrintf(PETSC_COMM_SELF,"Running all problems\n");CHKERRQ(ierr); 124 } 125 126 ierr = PetscMatlabEngineCreate(PETSC_COMM_SELF,NULL,&user.mengine);CHKERRQ(ierr); 127 ierr = PetscMatlabEngineEvaluate(user.mengine,"TestingInitialize");CHKERRQ(ierr); 128 129 if (testall) { 130 i0 = 1; 131 imax = 53; 132 } else { 133 i0 = (int)prob_id; 134 imax = (int)prob_id; 135 } 136 137 for (i = i0; i <= imax; ++i) { 138 ierr = PetscPrintf(PETSC_COMM_SELF,"%d\n",i);CHKERRQ(ierr); 139 ierr = PetscMatlabEngineEvaluate(user.mengine,"np = %d; ProblemInitialize",i);CHKERRQ(ierr); 140 ierr = PetscMatlabEngineGetArray(user.mengine,1,1,&tmp,"n");CHKERRQ(ierr); 141 user.n = (int)tmp; 142 ierr = PetscMatlabEngineGetArray(user.mengine,1,1,&tmp,"m");CHKERRQ(ierr); 143 user.m = (int)tmp; 144 ierr = PetscMatlabEngineGetArray(user.mengine,1,1,&tmp,"nfmax");CHKERRQ(ierr); 145 user.nfmax = (int)tmp; 146 ierr = PetscMatlabEngineGetArray(user.mengine,1,1,&tmp,"npmax");CHKERRQ(ierr); 147 user.npmax = (int)tmp; 148 ierr = PetscMatlabEngineGetArray(user.mengine,1,1,&tmp,"delta");CHKERRQ(ierr); 149 user.delta = (double)tmp; 150 151 /* Ignore return code for now -- do not stop testing on inf or nan errors */ 152 ierr = TaoPounders(&user);CHKERRQ(ierr); 153 154 ierr = PetscMatlabEngineEvaluate(user.mengine,"ProblemFinalize");CHKERRQ(ierr); 155 } 156 157 ierr = PetscMatlabEngineEvaluate(user.mengine,"TestingFinalize");CHKERRQ(ierr); 158 ierr = PetscMatlabEngineDestroy(&user.mengine);CHKERRQ(ierr); 159 ierr = PetscFinalize(); 160 return ierr; 161 } 162 163 /*TEST 164 165 build: 166 requires: matlab_engine 167 168 test: 169 localrunfiles: more_wild_probs TestingInitialize.m TestingFinalize.m ProblemInitialize.m ProblemFinalize.m 170 args: -tao_smonitor -prob_id 5 171 172 TEST*/ 173