Changeset 22829


Ignore:
Timestamp:
06/06/18 12:03:23 (7 years ago)
Author:
erobo
Message:

CHG: allowing AD M1QN3 to remember the 'best' paramters

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/cores/controladm1qn3_core.cpp

    r22801 r22829  
    3030        int          N;
    3131        int*         i;
     32        IssmPDouble* X_best;
     33        IssmPDouble* G_best;
     34        IssmPDouble* J_best;
    3235} m1qn3_struct;
    3336
     
    7780        }
    7881
    79         IssmPDouble  *Jlist        = input_struct->Jlist;
     82        IssmPDoubleJlist        = input_struct->Jlist;
    8083        int           JlistM       = input_struct->M;
    8184        int           JlistN       = input_struct->N;
    82         int          *Jlisti       = input_struct->i;
     85        int*          Jlisti       = input_struct->i;
     86        IssmPDouble*  J_best       = input_struct->J_best;
     87        IssmPDouble*  X_best                    = input_struct->X_best;
     88        IssmPDouble*  G_best                    = input_struct->G_best;
    8389        int           intn         = (int)*n;
    8490
     
    292298        Jlist[(*Jlisti)*JlistN+num_responses] = reCast<IssmPDouble>(J);
    293299
     300       
     301        if(*J_best<0 || J<*J_best){
     302                *J_best = reCast<IssmPDouble>(J);
     303                for(int i=0;i<intn;i++){
     304                        X_best[i] = reCast<IssmPDouble>(X[i]);
     305                        G_best[i] = reCast<IssmPDouble>(G[i]);
     306                }
     307        }
     308
     309/*
     310        IssmDouble* test = xNew<IssmDouble>(intn);
     311        femmodel->parameters->FindParam(&test,NULL,InversionXBestEnum);
     312        for(int i=0;i<10;i++)_printf_("X "<<test[i]<<"\n");
     313        xDelete<IssmDouble>(intn);
     314*/
    294315        if(*indic==0){
    295316                /*dry run, no gradient required*/
     
    413434        long      ndz = 4*n+m*(2*n+1);
    414435        double*   dz  = xNew<double>(ndz);
    415 
     436        IssmDouble J_best = -10.;
    416437        if(VerboseControl())_printf0_("   Computing initial solution\n");
    417438        _printf0_("\n");
     
    426447        mystruct.Jlist    = xNewZeroInit<IssmPDouble>(mystruct.M*mystruct.N);
    427448        mystruct.i        = xNewZeroInit<int>(1);
     449        mystruct.J_best   = xNewZeroInit<IssmPDouble>(1);
     450        mystruct.X_best = xNewZeroInit<IssmPDouble>(intn);
     451        mystruct.G_best   = xNewZeroInit<IssmPDouble>(intn);
    428452        /*Initialize Gradient and cost function of M1QN3*/
    429453        indic = 4; /*gradient required*/
     
    465489                N_add +=N[c];
    466490        }
    467                
     491       
     492        IssmDouble* aX_best = NULL;
     493        IssmDouble* aG_best = NULL;
     494
     495        femmodel->parameters->FindParam(&aX_best,NULL,InversionXBestEnum);
     496        femmodel->parameters->FindParam(&aG_best,NULL,InversionGBestEnum);
     497       
    468498        /*Set X as our new control*/
    469499        IssmDouble* aX=xNew<IssmDouble>(intn);
     500        IssmDouble* aG=xNew<IssmDouble>(intn);
     501        double* X_best = xNew<double>(intn);
     502        double* G_best = xNew<double>(intn);
     503
    470504        for(int i=0;i<intn;i++) {
    471505                aX[i] = reCast<IssmDouble>(X[i]);
    472                 }
     506                aG[i] = reCast<IssmDouble>(G[i]);
     507                X_best[i] = reCast<double>(aX_best[i]);
     508                G_best[i] = reCast<double>(aG_best[i]);
     509                }
     510
     511        ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,aG);
    473512        SetControlInputsFromVectorx(femmodel,aX);
     513       
    474514        xDelete(aX);
    475515
    476         /*Set final gradient in inputs*/
    477         IssmDouble* aG=xNew<IssmDouble>(intn);
    478         for(int i=0;i<intn;i++) {
    479                 aG[i] = reCast<IssmDouble>(G[i]);
    480         }
    481         ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,aG);
    482516
    483517        if (solution_type == TransientSolutionEnum){
     
    493527                        GenericExternalResult<IssmPDouble*>* X_output = new GenericExternalResult<IssmPDouble*>(femmodel->results->Size()+1,control_enum[i],&X[offset],N[i],numberofvertices,1,0.);
    494528
     529                        GenericExternalResult<IssmPDouble*>* Gbest_output = new GenericExternalResult<IssmPDouble*>(femmodel->results->Size()+1,Outputdefinition90Enum+i,&G_best[offset],N[i],numberofvertices,1,0.);
     530                        GenericExternalResult<IssmPDouble*>* Xbest_output = new GenericExternalResult<IssmPDouble*>(femmodel->results->Size()+1,Outputdefinition80Enum+i,&X_best[offset],N[i],numberofvertices,1,0.);
     531
    495532                        /*transpose for consistency with MATLAB's formating*/
    496533                        G_output->Transpose();
    497534                        X_output->Transpose();
     535                        Gbest_output->Transpose();
     536                        Xbest_output->Transpose();
    498537
    499538                        /*Add to results*/
    500539                        femmodel->results->AddObject(G_output);
    501540                        femmodel->results->AddObject(X_output);
    502 
     541                        femmodel->results->AddObject(Gbest_output);
     542                        femmodel->results->AddObject(Xbest_output);
     543                       
    503544                        offset += N[i]*numberofvertices;
    504545                }
     
    524565        xDelete<double>(G);
    525566        xDelete<double>(X);
     567        xDelete<double>(X_best);
     568        xDelete<double>(G_best);
    526569        xDelete<double>(dz);
    527570        xDelete<double>(XU);
Note: See TracChangeset for help on using the changeset viewer.