7fb3a21ce9c6b663c9b7dd81ca4425930c217472
[alexxy/gromacs.git] / src / gromacs / awh / histogramsize.h
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 2015,2016,2017,2018,2019, by the GROMACS development team, led by
5  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
6  * and including many others, as listed in the AUTHORS file in the
7  * top-level source directory and at http://www.gromacs.org.
8  *
9  * GROMACS is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public License
11  * as published by the Free Software Foundation; either version 2.1
12  * of the License, or (at your option) any later version.
13  *
14  * GROMACS is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with GROMACS; if not, see
21  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
22  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
23  *
24  * If you want to redistribute modifications to GROMACS, please
25  * consider that scientific software is very special. Version
26  * control is crucial - bugs must be traceable. We will be happy to
27  * consider code for inclusion in the official distribution, but
28  * derived work must not be called official GROMACS. Details are found
29  * in the README & COPYING files - if they are missing, get the
30  * official version at http://www.gromacs.org.
31  *
32  * To help us fund GROMACS development, we humbly ask that you cite
33  * the research papers on the package. Check out http://www.gromacs.org.
34  */
35
36 /*! \internal \file
37  *
38  * \brief
39  * Declares the HistogramSize class.
40  *
41  * The data members of this class keep track of global size and update related
42  * properties of the bias histogram and the evolution of the histogram size.
43  * Initially histogramSize_ (and thus the convergence rate) is controlled
44  * heuristically to get good initial estimates,  i.e. increase the robustness
45  * of the method.
46  *
47  * \author Viveca Lindahl
48  * \author Berk Hess <hess@kth.se>
49  * \ingroup module_awh
50  */
51
52 #ifndef GMX_AWH_HISTOGRAMSIZE_H
53 #define GMX_AWH_HISTOGRAMSIZE_H
54
55 #include <cstdio>
56
57 #include <vector>
58
59 #include "gromacs/math/vectypes.h"
60 #include "gromacs/utility/arrayref.h"
61
62 namespace gmx
63 {
64
65 struct AwhBiasStateHistory;
66 struct AwhBiasParams;
67 class BiasParams;
68 class PointState;
69
70 /*! \internal
71  * \brief Tracks global size related properties of the bias histogram.
72  *
73  * Tracks the number of updates and the histogram size.
74  * Also keep track of the stage (initial/final of the AWH method
75  * and printing warnings about covering.
76  *
77  * \note Histogram sizes are floating-point values, since the histogram uses weighted
78  *        entries and we can assign a floating-point scaling factor when changing it.
79  */
80 class HistogramSize
81 {
82 public:
83     /*! \brief Constructor.
84      *
85      * \param[in] awhBiasParams         The Bias parameters from inputrec.
86      * \param[in] histogramSizeInitial  The initial histogram size.
87      */
88     HistogramSize(const AwhBiasParams& awhBiasParams, double histogramSizeInitial);
89
90 private:
91     /*! \brief
92      * Returns the new size of the reference weight histogram in the initial stage.
93      *
94      * This function also takes care resetting the histogram used for covering checks
95      * and for exiting the initial stage.
96      *
97      * \param[in]     params             The bias parameters.
98      * \param[in]     t                  Time.
99      * \param[in]     detectedCovering   True if we detected that the sampling interval has been
100      * sufficiently covered. \param[in,out] weightsumCovering  The weight sum for checking covering.
101      * \param[in,out] fplog              Log file.
102      * \returns the new histogram size.
103      */
104     double newHistogramSizeInitialStage(const BiasParams& params,
105                                         double            t,
106                                         bool              detectedCovering,
107                                         ArrayRef<double>  weightsumCovering,
108                                         FILE*             fplog);
109
110 public:
111     /*! \brief
112      * Return the new reference weight histogram size for the current update.
113      *
114      * This function also takes care of checking for covering in the initial stage.
115      *
116      * \param[in]     params             The bias parameters.
117      * \param[in]     t                  Time.
118      * \param[in]     covered            True if the sampling interval has been covered enough.
119      * \param[in]     pointStates        The state of the grid points.
120      * \param[in,out] weightsumCovering  The weight sum for checking covering.
121      * \param[in,out] fplog              Log file.
122      * \returns the new histogram size.
123      */
124     double newHistogramSize(const BiasParams&              params,
125                             double                         t,
126                             bool                           covered,
127                             const std::vector<PointState>& pointStates,
128                             ArrayRef<double>               weightsumCovering,
129                             FILE*                          fplog);
130
131     /*! \brief Restores the histogram size from history.
132      *
133      * \param[in] stateHistory  The AWH bias state history.
134      */
135     void restoreFromHistory(const AwhBiasStateHistory& stateHistory);
136
137     /*! \brief Store the histogram size state in a history struct.
138      *
139      * \param[in,out] stateHistory  The AWH bias state history.
140      */
141     void storeState(AwhBiasStateHistory* stateHistory) const;
142
143     /*! \brief Returns the number of updates since the start of the simulation.
144      */
145     int numUpdates() const { return numUpdates_; }
146
147     /*! \brief Increments the number of updates by 1.
148      */
149     void incrementNumUpdates() { numUpdates_ += 1; }
150
151     /*! \brief Returns the histogram size.
152      */
153     double histogramSize() const { return histogramSize_; }
154
155     /*! \brief Sets the histogram size.
156      *
157      * \param[in] histogramSize                 The new histogram size.
158      * \param[in] weightHistogramScalingFactor  The factor to scale the weight by.
159      */
160     void setHistogramSize(double histogramSize, double weightHistogramScalingFactor);
161
162     /*! \brief Returns true if we are in the initial stage of the AWH method.
163      */
164     bool inInitialStage() const { return inInitialStage_; }
165
166     /*! \brief Returns The log of the current sample weight, scaled because of the histogram rescaling.
167      */
168     double logScaledSampleWeight() const { return logScaledSampleWeight_; }
169
170 private:
171     int64_t numUpdates_; /**< The number of updates performed since the start of the simulation. */
172
173     /* The histogram size sets the update size and so controls the convergence rate of the free energy and bias. */
174     double histogramSize_; /**< Size of reference weight histogram. */
175
176     /* Values that control the evolution of the histogram size. */
177     bool   inInitialStage_;       /**< True if in the intial stage. */
178     bool   equilibrateHistogram_; /**< True if samples are kept from accumulating until the sampled distribution is close enough to the target. */
179     double logScaledSampleWeight_; /**< The log of the current sample weight, scaled because of the histogram rescaling. */
180     double maxLogScaledSampleWeight_; /**< Maximum sample weight obtained for previous (smaller) histogram sizes. */
181
182     /* Bool to avoid printing multiple, not so useful, messages to log */
183     bool havePrintedAboutCovering_; /**< True if we have printed about covering to the log while equilibrateHistogram==true */
184 };
185
186 } // namespace gmx
187
188 #endif /* GMX_AWH_HISTOGRAMSIZE_H */