CLEASE修正

2 阅读1分钟

CLEASE修正:

montecarlo.montecarlo.py line 382

if call_observers:
改成:
if call_observers and move_accepted:

montecarlo.metadynamics_sampler.py line 210

x = np.linspace(xmin, xmax, 200)
改为
nbins = self.bias.nbins
x = np.linspace(xmin, xmax, nbins)

对metadynamcis收敛的修正:由于x范围可能有些达不到,修改收敛条件为忽视两端bin访问为0的点,但是限制至少要9成被访问。

montecarlo/metadynamics_sampler.py

    def visit_is_flat(self):
        """Return True if the histogram of visits is flat."""
        i_min = self.visit_hist.get_index(self.visit_hist.xmin)
        i_max = self.visit_hist.get_index(self.visit_hist.xmax)
        coeff = self.visit_hist.get_coeff()[i_min:i_max]
        avg = np.mean(coeff)

        # Use min and not np.min. It looks like np.min behaves weird
        # when it is running on a worker thread
        minval = min(coeff.tolist())
        self.progress_info["mean"] = avg

        if avg > 0.0:
            self.progress_info["minval"] = minval / avg
        else:
            self.progress_info["minval"] = 0.0

        if np.max(avg) == 0:
            return False
        return minval > self.flat_limit * avg
改为:
def visit_is_flat(self):
    """Return True if the histogram of visits is flat."""
    i_min = self.visit_hist.get_index(self.visit_hist.xmin)
    i_max = self.visit_hist.get_index(self.visit_hist.xmax)
    coeff = self.visit_hist.get_coeff()[i_min:i_max]
    # 找到所有非零元素的索引
    non_zero_indices = np.nonzero(coeff)[0]
    # 截取两端的零值区域
    start = non_zero_indices[0]
    end = non_zero_indices[-1]
    trimmed_coeff = coeff[start:end+1]  # 切片右端不包含,所以 +1
    avg = np.mean(trimmed_coeff)
    self.progress_info["mean"] = avg
    # 检查有效区域长度是否足够(至少占总区域数的 90%)
    if len(trimmed_coeff) < 0.9 * self.visit_hist.nbins:
        self.progress_info["minval"] = 0.0
        return False
    # 使用 min 而非 np.min(原注释:np.min 在 worker thread 中可能有异常)
    minval = min(trimmed_coeff.tolist())
    if avg > 0.0:
        self.progress_info["minval"] = minval / avg
    else:
        self.progress_info["minval"] = 0.0
    # 原代码中的 np.max(avg) 实际上是标量,并且理论该判定被有效区域判定覆盖,但保留。
    if np.max(avg) == 0:
        return False
    return minval > self.flat_limit * avg

还有一个字典问题报错,但是想不起来了。不影响计算,新安装运算之后出现报错再说。