coriolis/metis/src/metis/Configuration.h

153 lines
8.1 KiB
C++

// -*- C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved
//
// ===================================================================
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S |
// | M e t i s - h M e t i s W r a p p e r |
// | |
// | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== |
// | C++ Header : "./Configuration.h" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#ifndef __METIS_CONFIGURATION__
#define __METIS_CONFIGURATION__
#include <string>
#include <boost/function.hpp>
namespace Hurricane {
class Record;
class Cell;
}
namespace Metis {
using Hurricane::Record;
using Hurricane::Cell;
// -------------------------------------------------------------------
// Class : "Metis::Configuration".
class Configuration {
public:
typedef boost::function< void(void) > RefreshCb_t;
public:
enum MetisOption { CustomOptions =0
, HMetisNRuns =1
, HMetisCType =2
, HMetisRType =3
, HMetisVCycle =4
, HMetisReconst =5
, HMetisPreAssign =6
, HMetisRandom =7
, HMetisDebugLevel =8
, HMetisOptionsSize=9
};
enum HMetisCTypeValues { CTypeHFC =1 // Hybrid First Choice Scheme.
, CTypeFC =2 // First Choice Scheme.
, CTypeGFC =3 // Greedy First Choice Scheme.
, CTypeHyperEdge =4 // Hyper-Edge Scheme.
, CTypeEdge =5 // Edge Scheme.
};
enum HMetisRTypeValues { RTypeFM =1 // Uncoarsening Fiduccia-Mattheyses.
, RTypeOneWayFM =2 // Uncoarsening One Way Fiduccia-Mattheyses.
, RTypeEarlyExitFM =3 // Uncoarsening Early Exit Fiduccia-Mattheyses.
};
enum HMetisVCycleValues { VCycleDisable =0 // Do not perform any V-Cycle Reffinment.
, VCycleFinal =1 // Perform V-Cycle on each final bisection step.
, VCycleBestIntermed =2 // Perform V-Cycle on each intermediate solution.
, VCycleAllIntermed =3 // Perform V-Cycle on all intermediate solution.
};
enum HMetisReconstValues { ReconstRemoveCutHE =0 // Remove cut hyperedges.
, ReconstKeepCutHE =1 // Keep each part of the cuts hyperedges.
};
enum HMetisDebugValues { DebugDisable =0 // Disable debugging.
, DebugCoarseningStage=1 // Debug coarsening stage.
, DebugInitialPart =2 // Debug initial partition stage.
, DebugRefinement =4 // Debug refinement stage.
, DebugMultRuns =8 // Debug multiple runs stage.
, DebugMoreMultRuns =16 // More debug of the multiple runs stage.
};
public:
static Configuration* getDefault ();
public:
// Constructor & Destructor.
Configuration ();
~Configuration ();
Configuration* clone () const;
// Methods.
void print ( Cell* ) const;
inline RefreshCb_t& getRefreshCb ();
inline bool getPartOrKWayHMetis () const;
inline unsigned int getNumberOfInstancesStopCriterion () const;
inline int getGlobalConnectionsWeightRatio () const;
inline int getUbFactor () const;
inline int* getHMetisOptions ();
inline int getHMetisOption ( MetisOption );
inline void setRefreshCb ( Configuration::RefreshCb_t );
inline void setPartOrKWayHMetis ( bool usePart );
inline void setNumberOfInstancesStopCriterion ( unsigned int );
inline void setGlobalConnectionsWeightRatio ( int );
inline void setUbFactor ( int );
inline void setHMetisOption ( MetisOption, int value );
Record* _getRecord () const;
std::string _getString () const;
std::string _getTypeName () const;
private:
// Attributes.
static Configuration* _default;
RefreshCb_t _refreshCb;
bool _partOrKWayHMetis; // True for Recursive 2-part, false for KWay.
unsigned int _numberOfInstancesStopCriterion; // Minimal number of instances to partition.
int _globalConnectionsWeightRatio;
int _ubFactor;
int _hmetisOptions[HMetisOptionsSize];
private:
Configuration ( const Configuration& );
Configuration& operator= ( const Configuration& );
};
// Inline Methods.
inline Configuration::RefreshCb_t&
Configuration::getRefreshCb () { return _refreshCb; }
inline bool Configuration::getPartOrKWayHMetis () const { return _partOrKWayHMetis; }
inline unsigned int Configuration::getNumberOfInstancesStopCriterion () const { return _numberOfInstancesStopCriterion; }
inline int Configuration::getGlobalConnectionsWeightRatio () const { return _globalConnectionsWeightRatio; }
inline int Configuration::getUbFactor () const { return _ubFactor; }
inline int* Configuration::getHMetisOptions () { return _hmetisOptions; }
inline int Configuration::getHMetisOption ( MetisOption option ) { return (option<HMetisOptionsSize) ? _hmetisOptions[option] : 0; }
inline void Configuration::setRefreshCb ( Configuration::RefreshCb_t cb ) { _refreshCb=cb; }
inline void Configuration::setPartOrKWayHMetis ( bool usePart ) { _partOrKWayHMetis=usePart; }
inline void Configuration::setNumberOfInstancesStopCriterion ( unsigned int value ) { _numberOfInstancesStopCriterion=value; }
inline void Configuration::setGlobalConnectionsWeightRatio ( int value ) { _globalConnectionsWeightRatio=value; }
inline void Configuration::setUbFactor ( int value ) { _ubFactor=value; }
inline void Configuration::setHMetisOption ( MetisOption option, int value )
{ if (option<HMetisOptionsSize) _hmetisOptions[option] = value; }
} // End of Metis namespace.
INSPECTOR_P_SUPPORT(Metis::Configuration);
#endif // __METIS_CONFIGURATION__