Ignore:
Timestamp:
09/03/08 15:37:45 (6 years ago)
Author:
jdsiiro
Message:
  • decentralizing registration of ProblemMngr?() transformations
  • completed ApplicationMngr?() registrations for reformulation applications
  • bugfixes in several reformulation templates that had not been instantiated.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • colin/branches/colin-appresponse-dev/colin/SubspaceApplication.h

    r5534 r5536  
    1919#include <acro_config.h> 
    2020 
     21#include <colin/OptApplication.h> 
    2122#include <colin/TinyXML.h> 
    2223 
     
    2829 
    2930template<typename ProblemT> class SubspaceApplication; 
     31 
    3032 
    3133class SubspaceApplication_helper 
     
    196198   SubspaceApplication() 
    197199   { 
    198       register_initialize(xml_initialize, "FixedDomain"); 
     200      constructor(); 
    199201   } 
    200202 
     
    202204   SubspaceApplication(ApplicationHandle src) 
    203205   {  
    204       register_initialize(xml_initialize, "FixedDomain"); 
    205  
     206      constructor(); 
    206207      // set the base problem that we are wrapping 
    207208      set_base_application(src); 
     
    360361   } 
    361362 
    362 private: // data 
    363    /// 
    364    ApplicationHandle remote_app; 
    365  
    366    /// 
    367    std::map<size_t, bool> fixed_binary; 
    368  
    369    /// 
    370    std::map<size_t, int> fixed_int; 
    371  
    372    /// 
    373    std::map<size_t, double> fixed_real; 
    374363 
    375364private: // methods 
    376365   DEFINE_RESOLVERS(SubspaceApplication<ProblemT>); 
     366 
     367   /// 
     368   void constructor() 
     369   { 
     370      if ( GetOptProblemTrait(ProblemT, gradients) ) 
     371         EXCEPTION_MNGR(std::runtime_error, "SubspaceApplication: " 
     372                        "cannot hande gradients (yet)."); 
     373 
     374      register_initialize(xml_initialize, "FixedDomain"); 
     375   } 
     376 
    377377 
    378378   /// 
     
    434434   } 
    435435 
     436private: // data 
     437   /// 
     438   ApplicationHandle remote_app; 
     439 
     440   /// 
     441   std::map<size_t, bool> fixed_binary; 
     442 
     443   /// 
     444   std::map<size_t, int> fixed_int; 
     445 
     446   /// 
     447   std::map<size_t, double> fixed_real; 
    436448 
    437449}; 
     
    441453template<bool> 
    442454struct SubspaceApplication_helper::MIDomain { 
    443    template<typename SubspaceProblemT> 
     455   template<typename ProblemT> 
    444456   static void  
    445    update_domain_info(SubspaceProblemT &me) 
     457   update_domain_info(ProblemT &me) 
    446458   { 
    447459      size_t num_r = 0; 
     
    463475      utilib::Any problem = me.remote_app.application()->get_problem(); 
    464476      if ( me.remote_app.application()->problem_type() 
    465            == SubspaceProblemT::remote_c_app_t::value ) 
    466       { 
    467          const OptProblem<typename SubspaceProblemT::remote_c_app_t> &p  
     477           == ProblemT::remote_c_app_t::value ) 
     478      { 
     479         const OptProblem<typename ProblemT::remote_c_app_t> &p  
    468480            = problem.expose 
    469             <OptProblem<typename SubspaceProblemT::remote_c_app_t> >(); 
     481            <OptProblem<typename ProblemT::remote_c_app_t> >(); 
    470482          
    471483         num_r = p->num_real_vars(); 
     
    476488      else 
    477489      { 
    478          const OptProblem<typename SubspaceProblemT::remote_mi_app_t> &p  
     490         const OptProblem<typename ProblemT::remote_mi_app_t> &p  
    479491            = problem.expose 
    480             <OptProblem<typename SubspaceProblemT::remote_mi_app_t> >(); 
     492            <OptProblem<typename ProblemT::remote_mi_app_t> >(); 
    481493          
    482494         num_r = p->num_real_vars(); 
     
    503515      me.set_num_real_vars(num_r - me.fixed_real.size()); 
    504516      me.set_real_labels(no_labels); 
    505       SubspaceApplication_helper::filter_labels 
    506          (SubspaceProblemT::set_real_label, me, me.fixed_real, *r_lbl); 
     517      filter_labels(&ProblemT::set_real_label, me, me.fixed_real, *r_lbl); 
    507518      { 
    508519         std::vector<double> l; 
     
    520531      } 
    521532 
    522  
    523       // integer data 
     533      // set the size of integer & binary data 
    524534      if (( ! me.fixed_int.empty() ) &&  
    525535          ( num_i <= me.fixed_int.rbegin()->first )) 
     
    528538                        "fixed integer variable outside base application " 
    529539                        "domain"); 
    530       me.set_num_int_vars(num_i - me.fixed_int.size()); 
     540      if (( ! me.fixed_binary.empty() ) &&  
     541          ( num_b <= me.fixed_binary.rbegin()->first )) 
     542         EXCEPTION_MNGR(std::runtime_error,  
     543                        "SubspaceApplication_helper::update_domain_info" 
     544                        "fixed binary variable outside base application " 
     545                        "domain"); 
     546      me.set_num_int_vars( num_b - me.fixed_binary.size(), 
     547                           num_i - me.fixed_int.size() ); 
     548 
     549      // copy integer data 
    531550      me.set_int_labels(no_labels); 
    532       SubspaceApplication_helper::filter_labels 
    533          (SubspaceProblemT::set_int_label, me, me.fixed_int, *i_lbl); 
     551      filter_labels(&ProblemT::set_int_label, me, me.fixed_int, *i_lbl); 
    534552      { 
    535553         std::vector<int> l; 
     
    550568 
    551569 
    552       // binary data 
    553       if (( ! me.fixed_binary.empty() ) &&  
    554           ( num_b <= me.fixed_binary.rbegin()->first )) 
    555          EXCEPTION_MNGR(std::runtime_error,  
    556                         "SubspaceApplication_helper::update_domain_info" 
    557                         "fixed binary variable outside base application " 
    558                         "domain"); 
    559       me.set_num_binary_vars(num_b - me.fixed_binary.size()); 
     570      // copy binary data 
    560571      me.set_binary_labels(no_labels); 
    561       SubspaceApplication_helper::filter_labels 
    562          (SubspaceProblemT::set_binary_label, me, me.fixed_binary, *b_lbl); 
     572      filter_labels(&ProblemT::set_binary_label, me, me.fixed_binary, *b_lbl); 
    563573   } 
    564574}; 
     
    567577template<> 
    568578struct SubspaceApplication_helper::MIDomain<false> { 
    569    template<typename SubspaceProblemT> 
     579   template<typename ProblemT> 
    570580   inline static  
    571    void update_domain_info(SubspaceProblemT &me) 
     581   void update_domain_info(ProblemT &me) 
    572582   { 
    573583      size_t num_r = 0; 
     
    581591      utilib::Any problem = me.remote_app.application()->get_problem(); 
    582592      if ( me.remote_app.application()->problem_type() 
    583            == SubspaceProblemT::remote_c_app_t::value ) 
    584       { 
    585          const OptProblem<typename SubspaceProblemT::remote_c_app_t> &p  
     593           == ProblemT::remote_c_app_t::value ) 
     594      { 
     595         const OptProblem<typename ProblemT::remote_c_app_t> &p  
    586596            = problem.expose 
    587             <OptProblem<typename SubspaceProblemT::remote_c_app_t> >(); 
     597            <OptProblem<typename ProblemT::remote_c_app_t> >(); 
    588598          
    589599         num_r = p->num_real_vars(); 
     
    594604      else 
    595605      { 
    596          const OptProblem<typename SubspaceProblemT::remote_mi_app_t> &p  
     606         const OptProblem<typename ProblemT::remote_mi_app_t> &p  
    597607            = problem.expose 
    598             <OptProblem<typename SubspaceProblemT::remote_mi_app_t> >(); 
     608            <OptProblem<typename ProblemT::remote_mi_app_t> >(); 
    599609 
    600610         if ( p->num_int_vars() != me.fixed_int.size() ) 
     
    628638      me.set_num_real_vars(num_r - me.fixed_real.size()); 
    629639      me.set_real_labels(no_labels); 
    630       SubspaceApplication_helper::filter_labels 
    631          (&SubspaceProblemT::set_real_label, me, me.fixed_real, *r_lbl); 
     640      filter_labels(&ProblemT::set_real_label, me, me.fixed_real, *r_lbl); 
    632641      { 
    633642         std::vector<double> l; 
Note: See TracChangeset for help on using the changeset viewer.