[ADOL-C] manual hessian parallelization

Hujo Waldemar w.hujo at tu-braunschweig.de
Wed Jun 30 07:56:18 EDT 2010

Dear all.

I want to compute the hessian matrix in parallel, where each step 
should give
just one component of the hessian matrix. That is, if my hessian 
matrix is a
6x6 matrix I want to get only one number from the entire matrix.
The background of this is, that I want to compute the hessian matrix 
different computers and assemble the matrix afterwards.

Up to know I can compute an entire row with the following code, which 
is just
taken from the original adol-c source code. In this code a loop is 
used to get
every row of the matrix. I could split up the loop and compute the 

However, as I said, I want to compute just one element of the matrix. 
I stuck
with the "fos_forward" and the "hos_reverse" functions, where I 
suppose the
rows to be computed.

I cannot figure out how to split up this step. Has anybody a hint for 

Thanks in advance.

// Parallel Hessian evaluation
   cout << "Parallel Hessian " << endl;

   double *p_argument = xp;
   double** p_hess = new double*[n];
   for(i=0; i<n; i++)
   p_hess[i] = new double[n];
   for(int i=0; i<n; ++i){
   for(int j=0; j<i+1; ++j){
   p_hess[i][j] = 0.0 ;
   short tag = 1;

   double lagrange = 1.0;

   int rc= 3;
   double *tangent = myalloc1(n);
   double *result = myalloc1(n);
   for(i=0;i<n;i++) tangent[i] = 0;
   for(i=0;i<n;i++) {
   tangent[i] = 1;
   int m=1;
   int degree = 1;
   int keep = degree+1;
   double **X, *y, *y_tangent;

   X = myalloc2(n,2);
   y = myalloc1(m);
   y_tangent = myalloc1(m);

   rc = fos_forward(tag, m, n, keep, p_argument, tangent, y, 

   if(rc < 0){
   cout << "parallel hessian error 1" << endl;

   MINDEC(rc, hos_reverse(tag, m, n, degree, &lagrange, X));

   for(int k = 0; k < n; ++k){
   result[k] = X[k][1];
   // print the row
   cout << "r " << result[k] << endl;
   cout << endl;

   if( rc < 0) {
   free((char *)tangent);
   free((char *) result);
   cout << "parallel hessian error 2" << endl;
   p_hess[i][j] = result[j];
   tangent[i] = 0;

   free((char *)tangent);
   free((char *) result);


More information about the ADOL-C mailing list