diff --git a/triqs/mc_tools/mc_move_set.hpp b/triqs/mc_tools/mc_move_set.hpp index f7d8f0a6..43178a7b 100644 --- a/triqs/mc_tools/mc_move_set.hpp +++ b/triqs/mc_tools/mc_move_set.hpp @@ -96,6 +96,8 @@ namespace triqs { namespace mc_tools { void reject() { reject_(); } double acceptance_rate() const { return acceptance_rate_;} + uint64_t n_proposed_config () const { return NProposed;} + uint64_t n_accepted_config () const { return Naccepted;} void collect_statistics(boost::mpi::communicator const & c) { uint64_t nacc_tot=0, nprop_tot=1; diff --git a/triqs/utility/debug_stream.hpp b/triqs/utility/debug_stream.hpp new file mode 100644 index 00000000..32fd4bb8 --- /dev/null +++ b/triqs/utility/debug_stream.hpp @@ -0,0 +1,70 @@ +/******************************************************************************* + * + * TRIQS: a Toolbox for Research in Interacting Quantum Systems + * + * Copyright (C) 2014 by O. Parcollet + * + * TRIQS is free software: you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * TRIQS. If not, see . + * + ******************************************************************************/ +#pragma once +#include +#include + +namespace triqs { +namespace utility { + + /** + * \brief Output stream with a condition + * + * This class behaves pretty much like a standard ostream + * except that the printing is "under" condition + * + * Example: + * + * debug_stream rep( std::cerr, [&mc](){ return mc.config_id() %100 == 0;} + * + */ + class debug_stream { + std::ostream* out; + std::function condition; + + public: + debug_stream(std::ostream* out_, std::function condition) : out(out_), condition(condition) {} + debug_stream(std::ostream* out_) : out(out_) {} + + template debug_stream& operator<<(T const& x) { +#ifdef TRIQS_DEBUG + if (condition && condition()) (*out) << x; +#endif + return *this; + } + + // this is the type of std::cout + typedef std::basic_ostream> CoutType; + + // this is the function signature of std::endl + typedef CoutType& (*StandardEndLine)(CoutType&); + + // define an operator<< to take in std::endl + debug_stream& operator<<(StandardEndLine manip) { + // call the function, but we cannot return it's value +#ifdef TRIQS_DEBUG + if (condition && condition()) manip(*out); +#endif + return *this; + } + }; +} +}