Skip to content
Snippets Groups Projects
Select Git revision
  • 47631be1c32c55f3c24c01570da16e1a09e7af20
  • master default protected
  • Binary
  • add-version-information
  • os-path-join
  • develop-GA
  • timeFstatmap
  • add-higher-spindown-components
  • develop-DK
  • adds-header-to-grid-search
  • v1.3
  • v1.2
  • v1.1.2
  • v1.1.0
  • v1.0.1
15 results

tests.py

Blame
  • Forked from Gregory Ashton / PyFstat
    Source project has a limited visibility.
    user_search.cpp 5.65 KiB
    /*-------------------------------------------------------------------------------------*/
    /*           example of a user search for the periodic function f(x)=sin(2x)           */
    /*-------------------------------------------------------------------------------------*/
    #include "nomad.hpp"
    using namespace std;
    using namespace NOMAD;
    
    const double PI = 3.141592654;
    
    /*------------------------------------------------*/
    /*               The problem                      */
    /*------------------------------------------------*/
    /*       n=1, m=1                                 */
    /*       the periodic function f(x)=sin(2x)       */
    /*------------------------------------------------*/
    class My_Evaluator : public Evaluator {
    
    public:
    
      // ctor:
      My_Evaluator  ( const Parameters & p ) :
        Evaluator ( p ) {}
    
      // dtor:
      ~My_Evaluator ( void ) {}
    
      // evaluation of a point:
      bool eval_x ( Eval_Point          & x          ,
    		const NOMAD::Double & h_max      ,
    		bool                & count_eval   ) const {
        x.set_bb_output ( 0 , sin ( 2*x[0].value() ) );
        count_eval = true;
        return true;
      }
    };
    
    /*------------------------------------------------*/
    /*                   user search                  */
    /*------------------------------------------------*/
    class My_Search : public Search {
    
    public:
    
      // ctor:
      My_Search ( Parameters & p )
        : Search ( p , USER_SEARCH ) {}
    
      // dtor:
      ~My_Search ( void ) {}
    
      // the search:
      void search (  Mads              & mads           ,
    		 int               & nb_search_pts  ,
    		 bool              & stop           ,
    		 stop_type         & stop_reason    ,
    		 success_type      & success        ,
    		 bool              & count_search   ,
    		 const Eval_Point *& new_feas_inc   ,
    		 const Eval_Point *& new_infeas_inc   );
    };
    
    /*-------------------*/
    /*  the user search  */
    /*-------------------*/
    void My_Search::search ( Mads              & mads           ,
    			 int               & nb_search_pts  ,
    			 bool              & stop           ,
    			 stop_type         & stop_reason    ,
    			 success_type      & success        ,
    			bool              & count_search   ,
    			 const Eval_Point *& new_feas_inc   ,
    			 const Eval_Point *& new_infeas_inc   ) {
    
      nb_search_pts = 0;
      success       = UNSUCCESSFUL;
      count_search  = false;
    
      // current feasible incumbent:
      const Eval_Point * feas_inc = mads.get_best_feasible();
    
      if ( !feas_inc )
        return;
    
      // xk:
      double xk = (*feas_inc)[0].value();
      if ( xk < 0 )
        return;
    
      // get a signature:
      Signature * signature = feas_inc->get_signature();
      if ( !signature )
        return;
    
      // count the search:
      count_search  = true;
    
      // construct the search point (tk = qk.xk - 1):
      Eval_Point * tk = new Eval_Point;
      tk->set ( 1 , 1 );
      tk->set_signature  ( signature );
    
      (*tk)[0] = static_cast<int>(ceil(1.0/xk)) * xk - 1.0;
        
        
        // Projection maybe needed
        //    const NOMAD::Display & out= _p.out();
        //    NOMAD::dd_type display_degree = out.get_search_dd();
        //  if ( display_degree == NOMAD::FULL_DISPLAY )
        //  {
        //		out << "candidate";
        //        out << " (before projection)";
        //		out << ": ( " << *tk << " )" << std::endl;
        //  }
        //
        //  // Project to the mesh
        //  tk->project_to_mesh(*feas_inc,signature->get_mesh()->get_delta(),signature->get_lb(),signature->get_ub() );
        //
        //    if ( display_degree == NOMAD::FULL_DISPLAY )
        //    {
        //		out << "candidate";
        //        out << " (after projection)";
        //		out << ": ( " << *tk << " )" << std::endl;
        //    }
        
        
    
      // Evaluator_Control:
      Evaluator_Control & ev_control = mads.get_evaluator_control();
    
      // add the new point to the ordered list of search trial points:
      ev_control.add_eval_point ( tk                       ,
    			      _p.out().get_search_dd() ,
    			      false                    ,
    			      Double()                 ,
    			      Double()                  ,
    				  Double()                 ,
    				  Double()                 );
    
      nb_search_pts = 1;
    
      // evaluation:
      new_feas_inc = new_infeas_inc = NULL;
      ev_control.eval_list_of_points ( _type                   ,
    				   mads.get_true_barrier() ,
    				   mads.get_sgte_barrier() ,
    				   mads.get_pareto_front() ,
    				   stop                    ,
    				   stop_reason             ,
    				   new_feas_inc            ,
    				   new_infeas_inc          ,
    				   success                   );
    }
    
    /*------------------------------------------*/
    /*            NOMAD main function           */
    /*------------------------------------------*/
    int main ( int argc , char ** argv ) {
    
      // NOMAD initializations:
      begin ( argc , argv );
    
      // display:
      Display out ( std::cout );
      out.precision ( DISPLAY_PRECISION_STD );
    
      //  parameters creation:
      Parameters p ( out );
    
      p.set_DIMENSION (1);             // number of variables
    
      vector<bb_output_type> bbot (1); // definition of
      bbot[0] = OBJ;                   // output types
      p.set_BB_OUTPUT_TYPE ( bbot );
    
      p.set_X0 ( Point ( 1 , PI-3.0 ) );  // starting point
    
      p.set_LOWER_BOUND ( Point ( 1 , -PI/2.0 ) );
      p.set_UPPER_BOUND ( Point ( 1 ,  PI/2.0 ) );
    
      p.set_SPECULATIVE_SEARCH ( false );
    
      p.set_INITIAL_MESH_SIZE        ( 1.0 );
      p.set_MESH_UPDATE_BASIS        ( 2.0 );
      p.set_MESH_COARSENING_EXPONENT ( 0   );
    
      p.set_DISPLAY_DEGREE ( "0300" ); // display only the search step
    
      p.set_DISPLAY_STATS ( "bbe sol obj" );
    
      p.set_MAX_BB_EVAL ( 10 );
    
      // parameters validation:
      p.check();
    
      // custom evaluator creation:
      My_Evaluator ev ( p );
    
      // algorithm creation:
      Mads mads ( p , &ev );
    
      // user search:
      My_Search my_search  ( p );
      mads.set_user_search ( &my_search );
    
      // algorithm execution:
      mads.run();
    
      Slave::stop_slaves ( out );
      end();
    
      return EXIT_SUCCESS;
    }