Skip to content
Snippets Groups Projects
Select Git revision
  • 6f7429e1ae79e23eae9c81db40feed6578054d13
  • master default protected
2 results

bb.c

Blame
  • user avatar
    Miroslav Shaltev authored
    6f7429e1
    History
    bb.c 4.30 KiB
    // black-box code using the AMPL interface library
    // (written by D. Orban and lightly modified for NOMAD by S. Le Digabel)
    
    // before compilation: define MODEL_NAME
    
    // debug by defining DISPLAY
    
    
    #include <stdio.h>
    #include <stdlib.h>
    #include "asl.h"
    #include "nlp.h"
    #include "getstub.h"
    
    // Defines
    #define CHR (char*)
    
    #define MODEL_NAME "./model/optrisk"
    
    // #define DISPLAY  // to see more outputs
    
    // Global variables
    ASL *asl;
    fint showgrad = (fint)0;  // A command-line option (integer)
    fint showname = (fint)0;  // A command-line option (integer)
    
    keyword keywds[] = {  // MUST appear in alphabetical order!
      KW(CHR"showgrad", L_val, &showgrad, CHR"Evaluate gradient"),
      KW(CHR"showname", L_val, &showname, CHR"Display objective name")
    };
    
    Option_Info Oinfo = {
      CHR"miniampl", CHR"Mini AMPL Example",
      CHR"miniampl_options", keywds, nkeywds, 0,
      CHR"0.1", 0, 0, 0, 0, 0, 20091021
    };
    
    
    int main ( int argc, char **argv ) {
    
      FILE * nl;
      char * stub;
      FILE * point_file;
      char * point_file_name;
      int    point_file_name_size;
      fint   nerror = (fint)0;
      int    n_badvals = 0;
      int    n_con_tmp = 0;
      int    i;
      real   f;
      real * R;
    
      if( argc < 2 ) {
        fprintf ( stderr , "Usage: %s x.txt\n" , argv[0] );
        return 1;
      }
    
      // get the point file name:
      point_file_name_size = strlen(argv[1]) + 1;
      point_file_name      = (char*)Malloc(point_file_name_size * sizeof(char));
      strcpy ( point_file_name , argv[1] );
      strcpy ( argv[1] , MODEL_NAME );
    
      // Read objectives and first derivative information.
      if( !(asl = ASL_alloc(ASL_read_fg)) ) exit(1);
      stub = getstub(&argv, &Oinfo);
      nl   = jac0dim(stub, (fint)strlen(stub));
    
      // Get command-line options.
      if (getopts(argv, &Oinfo)) exit(1);
    
      // Check command-line options.
      if( showgrad < 0 || showgrad > 1 ) {
        Printf("Invalid value for showgrad: %d\n", showgrad);
        n_badvals++;
      }
      if( showname < 0 || showname > 1 ) {
        Printf("Invalid value for showgrad: %d\n", showgrad);
        n_badvals++;
      }
    
      if(n_badvals) {
        Printf("Found %d errors in command-line options.\n", n_badvals);
        exit(1);
      }
    
      // Allocate memory for problem data.
      // The variables below must have precisely THESE names.
      X0    = (real*)Malloc(n_var * sizeof(real));  // Initial guess
      pi0   = (real*)Malloc(n_con * sizeof(real));  // Initial multipliers
      LUv   = (real*)Malloc(n_var * sizeof(real));  // Lower bounds on variables
      Uvx   = (real*)Malloc(n_var * sizeof(real));  // Upper bounds on variables
      LUrhs = (real*)Malloc(n_con * sizeof(real));  // Lower bounds on constraints
      Urhsx = (real*)Malloc(n_con * sizeof(real));  // Upper bounds on constraints
      R     = (real*)Malloc(n_con * sizeof(real));  // constraints
    
      want_xpi0 = 3;
    
      // Read in ASL structure - trap read errors
      if( fg_read(nl, 0) ) {
        fprintf(stderr, "Error fg-reading nl file\n");
        goto bailout;
      }
    
    #ifdef DISPLAY
    
      n_con_tmp = 0;
      for ( i = 0 ; i < n_con ; ++i ) {
        if ( LUrhs[i] > -Infinity )
          ++n_con_tmp;
        if ( Urhsx[i] < Infinity )
          ++n_con_tmp;
      }
    
      printf ( "n_obj=%i\nn_var=%i\nn_con=%i\nx0=[" , n_obj , n_var , n_con_tmp );
      for ( i = 0 ; i < n_var ; ++i )
        printf ( "%g " , X0[i] );
      printf ( "]\n" );
    #endif
    
      // read x:
      if ((point_file = fopen(point_file_name,"r")) == NULL) {
        fprintf(stderr, "Cannot open file %s.\n",point_file_name);
        goto bailout;
      }
    
      for ( i = 0 ; i < n_var ; ++i )
        fscanf ( point_file , "%lf" , &X0[i] );
    
      fclose(point_file);
      free ( point_file_name );
    
    
    #ifdef DISPLAY
      printf ( "x =[" );
      for ( i = 0 ; i < n_var ; ++i )
        printf ( "%g " , X0[i] );
      printf ( "]\n" );
    #endif
    
      // objective functions:
      for ( i = 0 ; i < n_obj ; ++i ) {
        f = objval ( i , X0 , &nerror ); 
    
        if ( nerror ) {
          fprintf(stderr, "Error while evaluating objective.\n");
          goto bailout;
        }
    
    #ifdef DISPLAY
        Printf("f%i(x) = %21.15e\n", i , f );
    #else
        Printf("%21.15e\n", f );
    #endif
      }
    
      // constraints:
      conval ( X0 , R , &nerror );
    
      for ( i = 0 ; i < n_con ; ++i ) {
    
    #ifdef DISPLAY
        printf ("%g <= %g <= %g\n" ,  LUrhs[i] , R[i] , Urhsx[i] );
    #else
        if ( LUrhs[i] > -Infinity )
          Printf("%21.15e\n", LUrhs[i]-R[i] );
        if ( Urhsx[i] < Infinity )
          Printf("%21.15e\n", R[i]-Urhsx[i] );
    #endif
      }
    
     bailout:
      // Free data structure. DO NOT use free() on X0, pi0, etc.
      ASL_free((ASL**)(&asl));
    
      return 0;
    }