7861e794bcd4a127b78d353af6dc18da0bc4e1aa
[alexxy/gromacs.git] / src / gromacs / applied_forces / awh / histogramsize.h
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 2015,2016,2017,2018,2019,2020,2021, 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
61 namespace gmx
62 {
63
64 template<typename>
65 class ArrayRef;
66 struct AwhBiasStateHistory;
67 class AwhBiasParams;
68 class BiasParams;
69 class PointState;
70
71 /*! \internal
72  * \brief Tracks global size related properties of the bias histogram.
73  *
74  * Tracks the number of updates and the histogram size.
75  * Also keep track of the stage (initial/final of the AWH method
76  * and printing warnings about covering.
77  *
78  * \note Histogram sizes are floating-point values, since the histogram uses weighted
79  *        entries and we can assign a floating-point scaling factor when changing it.
80  */
81 class HistogramSize
82 {
83 public:
84     /*! \brief Constructor.
85      *
86      * \param[in] awhBiasParams         The Bias parameters from inputrec.
87      * \param[in] histogramSizeInitial  The initial histogram size.
88      */
89     HistogramSize(const AwhBiasParams& awhBiasParams, double histogramSizeInitial);
90
91 private:
92     /*! \brief
93      * Returns the new size of the reference weight histogram in the initial stage.
94      *
95      * This function also takes care resetting the histogram used for covering checks
96      * and for exiting the initial stage.
97      *
98      * \param[in]     params             The bias parameters.
99      * \param[in]     t                  Time.
100      * \param[in]     detectedCovering   True if we detected that the sampling interval has been
101      *                                   sufficiently covered.
102      * \param[in,out] weightsumCovering  The weight sum for checking covering.
103      * \param[in,out] fplog              Log file.
104      * \returns the new histogram size.
105      */
106     double newHistogramSizeInitialStage(const BiasParams& params,
107                                         double            t,
108                                         bool              detectedCovering,
109                                         ArrayRef<double>  weightsumCovering,
110                                         FILE*             fplog);
111
112 public:
113     /*! \brief
114      * Return the new reference weight histogram size for the current update.
115      *
116      * This function also takes care of checking for covering in the initial stage.
117      *
118      * \param[in]     params             The bias parameters.
119      * \param[in]     t                  Time.
120      * \param[in]     covered            True if the sampling interval has been covered enough.
121      * \param[in]     pointStates        The state of the grid points.
122      * \param[in,out] weightsumCovering  The weight sum for checking covering.
123      * \param[in,out] fplog              Log file.
124      * \returns the new histogram size.
125      */
126     double newHistogramSize(const BiasParams&          params,
127                             double                     t,
128                             bool                       covered,
129                             ArrayRef<const PointState> pointStates,
130                             ArrayRef<double>           weightsumCovering,
131                             FILE*                      fplog);
132
133     /*! \brief Restores the histogram size from history.
134      *
135      * \param[in] stateHistory  The AWH bias state history.
136      */
137     void restoreFromHistory(const AwhBiasStateHistory& stateHistory);
138
139     /*! \brief Store the histogram size state in a history struct.
140      *
141      * \param[in,out] stateHistory  The AWH bias state history.
142      */
143     void storeState(AwhBiasStateHistory* stateHistory) const;
144
145     /*! \brief Returns the number of updates since the start of the simulation.
146      */
147     int numUpdates() const { return numUpdates_; }
148
149     /*! \brief Increments the number of updates by 1.
150      */
151     void incrementNumUpdates() { numUpdates_ += 1; }
152
153     /*! \brief Returns the histogram size.
154      */
155     double histogramSize() const { return histogramSize_; }
156
157     /*! \brief Sets the histogram size.
158      *
159      * \param[in] histogramSize                 The new histogram size.
160      * \param[in] weightHistogramScalingFactor  The factor to scale the weight by.
161      */
162     void setHistogramSize(double histogramSize, double weightHistogramScalingFactor);
163
164     /*! \brief Returns true if we are in the initial stage of the AWH method.
165      */
166     bool inInitialStage() const { return inInitialStage_; }
167
168     /*! \brief Returns The log of the current sample weight, scaled because of the histogram rescaling.
169      */
170     double logScaledSampleWeight() const { return logScaledSampleWeight_; }
171
172 private:
173     int64_t numUpdates_; /**< The number of updates performed since the start of the simulation. */
174
175     /* The histogram size sets the update size and so controls the convergence rate of the free energy and bias. */
176     double histogramSize_; /**< Size of reference weight histogram. */
177
178     /* Values that control the evolution of the histogram size. */
179     bool   inInitialStage_;       /**< True if in the intial stage. */
180     bool   equilibrateHistogram_; /**< True if samples are kept from accumulating until the sampled distribution is close enough to the target. */
181     double logScaledSampleWeight_; /**< The log of the current sample weight, scaled because of the histogram rescaling. */
182     double maxLogScaledSampleWeight_; /**< Maximum sample weight obtained for previous (smaller) histogram sizes. */
183
184     /* Bool to avoid printing multiple, not so useful, messages to log */
185     bool havePrintedAboutCovering_; /**< True if we have printed about covering to the log while equilibrateHistogram==true */
186 };
187
188 } // namespace gmx
189
190 #endif /* GMX_AWH_HISTOGRAMSIZE_H */