#ifdef MPI // \****************************************************** // Datei ClusteringScheduler.h // Autor: Peter Unruh // \****************************************************** /* abs. Basisklasse fuer alle Scheduler, die vom ClusteringSolver im ClusteredAlg eingesetzt werden koennen; Insbesondere : Kenntnis von der Anzahl der Cluster, eigener Rolle im Cluster und des aktuellen ClusteringLevels; Verkuerzung der Teilkettenlaengen bei mehreren Cluster; Funktionen fuer den Austausch der Statistik zwischen der Scheduler, insb. MeanUpdateRatio */ #ifndef _SA_ClusteringScheduler_h_ #define _SA_ClusteringScheduler_h_ #include #include "SA_ParScheduler.h" enum ROLE {SLAVE=0, MASTER, CHIEF}; // Die Rolle der Prozessors in der Berechnung /** * Abstract base class of all classes which can be used by the SA_ClusteringSolver */ class SA_ClusteringScheduler : public SA_ParScheduler { private: /// This object generates the output of this scheduler SA_Output saclustoutput; protected: /// @name datamember that describe the current clustering state //@{ /// unsigned long act_cluster; /// unsigned long do_clustering; /// number of clusters unsigned long n_cluster; /// size of clusters unsigned cluster_size; //@} /// @name data member on which the clustering decision is based //@} /// the ratio of updates and iterations (solution switches) in a cluster double mean_update_ratio; /// mean ratio of accepts and updates on a single processor double mean_accept_ratio; //@} // eine Variante der WarmingUp-Funktion, die von mehreren benutzt werden kann // liefert die T0 // Parameter Length steht dabei fuer m0 // ksi0 ist die angestrebte Startakzeptanzrate // double AartsWarmingUp(SA_Problem & P, SA_Solution &s, SA_Solution &b, MPI_Comm comm, float Length); public: /// Constructor SA_ClusteringScheduler(); /// Destructor ~SA_ClusteringScheduler(); virtual SA_Output *GetSchedulerOutput(); /* Functions for the ClusterigSolver*/ // aktuelle ClusterLevel ; wird beim BroadcastSubchainOrder umverteilt /// void SetActCluster(unsigned long a){act_cluster = a;} /// void SetDoClustering(unsigned long a){do_clustering = a;} /// unsigned long GetActCluster(void){return act_cluster;} /// unsigned long GetDoClustering(void){return do_clustering;} // Die "uber mehrere Prozessoren gemittelten Raten bei aktueller Temperatur; // genau wie GetAcceptRation liefern nach SetNewT i.A. keine sinvollen Werte !! /** update ratio at current temperature, undefined right after a call of SetNewT() * @return mean update ratio, in [0,1] */ double GetMeanUpdateRatio(); /** accept ratio at current temperature, undefined right after a call of SetNewT() * @return mean accept ratio, in [0,1] */ double GetMeanAcceptRatio(); /* Basic implementations of the Collect/Bcast fuctions for the subchain data*/ // notwendige stat. Daten der Teilketten von allen Cluster auf dem Chief sammeln; // der Communicator comm enthaelt alle Master der Cluster, Chief hat die Nr. 0 in comm. // in dieser Version werden Sum, Sum2, n_iter sowie mean_update_ratio, mean_accept_ratio gesammelt /// The statistical data is collected from all cluster master by the chief processor. virtual void CollectSubchainStatistics(MPI_Comm comm = MPI_COMM_SELF); // Schreibt die Daten der Teilkette(n) /// depreciated void OutputSubchainStatistics(std::ostream & output); // Chief verteilt die Auftraege ; TRUE <=> SA noch nicht abgeschlossen ( also not frozen ) /** Chief submitts orders. * @return TRUE if the frozen state is not yet reached, FALSE otherwise */ virtual int BroadcastSubchainOrder(MPI_Comm comm = MPI_COMM_SELF); /* von dem jeweiligen Scheduler zu implementierende Fkts:*/ // die Anzahl der Cluster dem Scheduler mitteilen /** Abstract method to set the number of clusters. Has to be implemented by derivated * classes. */ virtual void SetClusterNumber(unsigned long n_clu, unsigned long clu_size); }; #endif #endif //MPI