Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
WorkUnitManager.hh
Go to the documentation of this file.
1 // -*- mode:c++;tab-width:2;indent-tabs-mode:t;show-trailing-whitespace:t;rm-trailing-spaces:t -*-
2 // vi: set ts=2 noet:
3 //
4 // (c) Copyright Rosetta Commons Member Institutions.
5 // (c) This file is part of the Rosetta software suite and is made available under license.
6 // (c) The Rosetta software is developed by the contributing members of the Rosetta Commons.
7 // (c) For more information, see http://www.rosettacommons.org. Questions about this can be
8 // (c) addressed to University of Washington UW TechTransfer, email: license@u.washington.edu.
9 
10 /// @file protocols/loops/WorkUnitManager.hh
11 /// @brief
12 /// @author Mike Tyka
13 
14 #ifndef INCLUDED_protocols_wum_WorkUnitManager_hh
15 #define INCLUDED_protocols_wum_WorkUnitManager_hh
16 
20 
21 #include <utility/pointer/ReferenceCount.hh>
22 // AUTO-REMOVED #include <core/import_pose/pose_stream/MetaPoseInputStream.hh>
23 #include <core/pose/Pose.fwd.hh>
24 #include <core/types.hh>
25 #include <protocols/moves/Mover.hh>
26 // AUTO-REMOVED #include <protocols/wum/MoverList.hh>
28 
29 #include <string>
30 #include <vector>
31 
32 #include <utility/vector1.hh>
33 
34 
35 
36 namespace protocols {
37 namespace wum {
38 
39 class WorkUnitQueue;
40 class WorkUnitQueue_Swapped;
41 class WorkUnitManager;
42 
44  WUM_MPI_REQUEST_WU=101, // A slave wants a new job
45  WUM_MPI_SEND_WU, // A slave wants to send the master a new job
46  WUM_MPI_DATA_BLOCK, // Tag for the data blocks
47  WUM_MPI_SPINDOWN, // A Master wants to shut down a slave ready for shut down
49 };
50 
52  public:
53  typedef std::list < WorkUnitBaseOP >::iterator iterator;
54  typedef std::list < WorkUnitBaseOP >::const_iterator const_iterator;
55 
56  public:
58 
59  virtual ~WorkUnitQueue(){};
60 
61  virtual core::Size size() const { return wus_.size(); }
62 
63  virtual void add( WorkUnitBaseOP new_wu ) { if( is_under_memory_limit() ) wus_.push_back( new_wu ); }
64  virtual void push_back( WorkUnitBaseOP new_wu ) { if( is_under_memory_limit() ) wus_.push_back( new_wu ); }
65  virtual void push_front( WorkUnitBaseOP new_wu ){ if( is_under_memory_limit() ) wus_.push_front( new_wu ); }
66 
67  virtual WorkUnitBaseOP &next();
68  virtual WorkUnitBaseOP pop_next();
69  virtual iterator erase( iterator i );
70 
71  iterator begin() { return wus_.begin(); }
72  const_iterator begin() const { return wus_.begin(); }
73  iterator end() { return wus_.end(); }
74  const_iterator end() const { return wus_.end(); }
75 
76  virtual void clear() { wus_.clear(); }
77 
78  /// @brief return total memory foot print in bytes
79  core::Size mem_foot_print() const;
80 
81  /// @brief report number of total structures, and memory foot prints
82  void mem_stats( core::Size &n_structs, core::Size &structs_memory, core::Size &WU_memory ) const;
83 
84  void set_memory_limit( core::Size memory_limit ) {
85  memory_limit_ = memory_limit;
86  }
87 
88  bool is_under_memory_limit() const {
89  if( memory_limit_ == 0 ) return true;
90  if( mem_foot_print() < memory_limit_ ) return true;
91  return false;
92  }
93 
94  protected:
95  std::list < WorkUnitBaseOP > wus_;
96 
97  private:
99 };
100 
101 
102 // as above but uses a disk-swap to prevent overflows
104  public:
106  WorkUnitQueue(),
107  swap_file_( swap_file ),
108  memory_limit_( memory_limit ),
109  wum_( wum )
110  {
111 
112  }
113 
115 
116  //virtual core::Size size();
117 
118  virtual void add( WorkUnitBaseOP new_wu );
119 
120  const std::string &swap_file() const { return swap_file_; }
121 
122  protected:
123 
124  virtual void add_to_swap( WorkUnitBaseOP new_wu );
125 
126  private:
129 
131 
132  // parameters
137  // variables
140 
141  private:
143 };
144 
145 
146 
147 
149  public:
150  friend class WorkUnitQueue_Swapped;
151 
153  }
154 
155  virtual ~WorkUnitManager(){}
156 
157  // @brief Main loop
158  void virtual go()=0;
159 
161 
162  public:
165 
168  const WorkUnitQueue& outbound() const { return outbound_wus_; }
169  const WorkUnitQueue& inbound() const { return inbound_wus_; }
170 
171  protected:
174 
175  protected:
176  void write_queues_to_file( const std::string &prefix = "default" ) const;
177  void write_work_unit( const WorkUnitBaseOP &wu, std::ostream &out ) const;
178  void write_queue( const WorkUnitQueue &the_queue, std::ostream &out ) const;
179 
180  void read_queues_from_file( const std::string &prefix = "default" );
181  bool read_work_unit( WorkUnitBaseOP &qualified_wu, std::istream &in );
182  void read_queue( WorkUnitQueue &the_queue, std::istream &in );
183 
184  /// @brief return total memory foot print in bytes
187  };
188 
189  private:
191  private:
194 
195 
196 };
197 
198 
199 
200 
201 
202 }
203 }
204 
205 #endif
206