⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qp_full_filtered_pricing.h

📁 很多二维 三维几何计算算法 C++ 类库
💻 H
字号:
// Copyright (c) 1997-2007  ETH Zurich (Switzerland).// All rights reserved.//// This file is part of CGAL (www.cgal.org); you may redistribute it under// the terms of the Q Public License version 1.0.// See the file LICENSE.QPL distributed with CGAL.//// Licensees holding a valid commercial license may use this file in// accordance with the commercial license agreement provided with the software.//// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.//// $URL: svn+ssh://scm.gforge.inria.fr/svn/cgal/branches/CGAL-3.3-branch/QP_solver/include/CGAL/QP_solver/QP_full_filtered_pricing.h $// $Id: QP_full_filtered_pricing.h 38453 2007-04-27 00:34:44Z gaertner $// //// Author(s)     : Sven Schoenherr//                 Bernd Gaertner <gaertner@inf.ethz.ch>//                 Franz Wessendorp //                 Kaspar Fischer#ifndef CGAL_QP_FULL_FILTERED_PRICING_H#define CGAL_QP_FULL_FILTERED_PRICING_H// includes#include <CGAL/QP_solver/QP__filtered_base.h>CGAL_BEGIN_NAMESPACE// =================// class declaration// =================template < typename Q, typename ET, typename Tags, class NT_ = double, class ET2NT_ =    To_double<ET> >class QP_full_filtered_pricing;// ===============// class interface// ===============template < typename Q, typename ET, typename Tags, class NT_, class ET2NT_ >class QP_full_filtered_pricing : public QP__filtered_base<Q,ET,Tags,NT_,ET2NT_> {    // self    typedef  QP_pricing_strategy<Q, ET, Tags>       Base;    typedef  typename Tags::Is_nonnegative     Is_nonnegative;    typedef  QP__filtered_base<Q, ET, Tags, NT_, ET2NT_>         Filtered_base;    typedef  QP_full_filtered_pricing<Q, ET, Tags, NT_, ET2NT_>  Self;  public:    // number type    typedef  NT_                        NT;    typedef  ET2NT_                     ET2NT;    // creation    QP_full_filtered_pricing( ET2NT et2nt = ET2NT());    // operations    int  pricing(int& direction );        // cleanup    ~QP_full_filtered_pricing() { };  private:    int pricing_helper(int& direction, Tag_true  is_in_standard_form);    int pricing_helper(int& direction, Tag_false is_in_standard_form);};// ----------------------------------------------------------------------------// =============================// class implementation (inline)// =============================// constructiontemplate < typename Q, typename ET, typename Tags, class NT_, class ET2NT_ >  inlineQP_full_filtered_pricing<Q,ET,Tags,NT_,ET2NT_>::QP_full_filtered_pricing( ET2NT et2nt)    : Base( "full filtered"),      Filtered_base( et2nt){ }    // operationstemplate < typename Q, typename ET, typename Tags, class NT_, class ET2NT_ >int  QP_full_filtered_pricing<Q,ET,Tags,NT_,ET2NT_>::pricing (int& direction) {  return (pricing_helper(direction, Is_nonnegative()));}template < typename Q, typename ET, typename Tags, class NT_, class ET2NT_ >int  QP_full_filtered_pricing<Q,ET,Tags,NT_,ET2NT_>::pricing_helper(int& /*direction*/, Tag_true ) // standard form{    // get properties of quadratic program    int  w = this->solver().number_of_working_variables();    // initialize filtered computation    this->init_NT();    // loop over all non-basic variables    int  j,  min_j  = -1;    NT   mu, min_mu = this->nt0;    for ( j = 0; j < w; ++j) {	// variable non-basic?	if ( ! this->solver().is_basic( j)) {		    // don't price artificial variables	    if (this->solver().is_artificial( j)) continue;	    // compute mu_j	    mu = this->mu_j_NT( j);	    CGAL_qpe_debug {		this->vout() << "mu_" << j << " [NT]: " << mu << std::endl;	    }	    // new minimum?	    if ( mu < min_mu) { min_j = j; min_mu = mu; }	}    }    // exact check of entering variable    if ( min_j >= 0) {	if ( this->mu_j( min_j) >= this->et0) {	    // exact check failed!	    CGAL_qpe_debug {		this->vout() << "--> exact check of entering variable failed!"		       << std::endl;	    }	    	    min_j  = -1;	    min_mu = this->nt0;	}    }    // certify non-existance of entering variable, if necessary    if ( min_j < 0) {	// update row and column maxima	this->update_maxima();	// loop over all non-basic variables again	for ( j = 0; j < w; ++j) {	    // variable non-basic?	    if ( ! this->solver().is_basic( j)) {	    	        // don't price artificial variables	        if (this->solver().is_artificial( j)) continue;		// certify 'mu_j >= 0'		if ( ! this->certify_mu_j_NT( j)) {		    // entering variable missed by inexact arithmetic		    min_j = j;		    break;		}	    }	}    }    CGAL_qpe_debug {       this->vout() << std::endl;    }    // return index of entering variable    return min_j;}template < typename Q, typename ET, typename Tags, class NT_, class ET2NT_ >int  QP_full_filtered_pricing<Q,ET,Tags,NT_,ET2NT_>::pricing_helper(int& direction, Tag_false ) // bounds for variables{    // get properties of quadratic program    int  w = this->solver().number_of_working_variables();    // initialize filtered computation    this->init_NT();    // loop over all non-basic variables    int  j,  min_j  = -1;    NT   mu, min_mu = this->nt0;    for ( j = 0; j < w; ++j) {	// variable non-basic?	if ( ! this->solver().is_basic( j)) {		    // don't price artificial variables	    if (this->solver().is_artificial( j)) continue;	    // compute mu_j	    mu = this->mu_j_NT( j);	    CGAL_qpe_debug {		this->vout() << "mu_" << j << " [NT]: " << mu << std::endl;	    }	    // from pricing strategy base class	    price_dantzig (j, mu, this->nt0, min_j, min_mu, direction);	}    }    if ( min_j >= 0) {        // exact check; do we really have an entering variable	if (!this->is_improving(min_j, this->mu_j( min_j), this->et0)) {	    // exact check failed!	    CGAL_qpe_debug {		this->vout() << "--> exact check of entering variable failed!"		       << std::endl;	    }	    	    min_j  = -1;	    min_mu = this->nt0;	}    }    if ( min_j == -1) {        // try to certify non-existence of entering variable, based on        // error bounds	this->update_maxima();	// loop over all non-basic variables again	for ( j = 0; j < w; ++j) {	    // variable non-basic?	    if ( ! this->solver().is_basic( j)) {	    	        // don't price artificial variables	        if (this->solver().is_artificial( j)) continue;		// certify that j is not improving		if ( ! this->certify_mu_j_NT( j)) {		    // entering variable missed by inexact arithmetic		    min_j = j;		    break;		}	    }	}    }    CGAL_qpe_debug {       this->vout() << std::endl;    }    // return index of entering variable    return min_j;}CGAL_END_NAMESPACE#endif // CGAL_QP_FULL_FILTERED_PRICING_H// ===== EOF ==================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -