xref: /petsc/src/tao/leastsquares/tutorials/matlab/matlab_ls_test.c (revision 7d5fd1e4d9337468ad3f05b65b7facdcd2dfd2a4)
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