SETTLE约束算法的批量化处理】的更多相关文章

技术背景 在上一篇文章中,我们介绍了在分子动力学模拟中SETTLE约束算法的实现与应用,其中更多的是针对于单个的水分子.但由于相关代码是通过jax这一框架来实现的,因此对于多分子的体系,可以采用jax所支持的vmap来实现,简单快捷.同时为了模块化的编程,本文中的代码相对于上一篇文章做了函数封装,也更符合jax这种函数化编程的风格. 构建多分子体系 本文使用的是一个16个水分子这样的一个体系,pdb文件内容如下所示: CRYST1 9.039 7.826 7.379 90.00 90.00 90…
技术背景 在之前的两篇文章中,我们分别讲解了SETTLE算法的原理和基本实现和SETTLE约束算法的批量化处理.SETTLE约束算法在水分子体系中经常被用到,该约束算法具有速度快.可并行.精度高的优点.本文我们需要探讨的是该约束算法中的一个细节,问题是这样定义的,给定坐标系\(XYZ\)下的两个已知三角形\(\Delta A_0B_0C_0\)和三角形\(\Delta A_1B_1C_1\),以三角形\(\Delta A_0B_0C_0\)构造一个平面\(\pi_0\),将\(\pi_0\)平移…
技术背景 在上一篇文章中,我们讨论了在分子动力学里面使用LINCS约束算法及其在具备自动微分能力的Jax框架下的代码实现.约束算法,在分子动力学模拟的过程中时常会使用到,用于固定一些既定的成键关系.例如LINCS算法一般用于固定分子体系中的键长关系,而本文将要提到的SETTLE算法,常用于固定一个构成三角形的体系,最常见的就是水分子体系.对于一个水分子而言,O-H键的键长在模拟的过程中可以固定,H-H的长度,或者我们更常见的作为一个H-O-H的夹角出现的参量,也需要固定.纯粹从计算量来考虑的话,…
题目: 不难看出题意主要是给出ml+md个格式为xi-xj<=ak的不等式,xi-xj为i,j俩头牛的距离,要我们求x1-xn的最大值. 经过上下加减我们可以将这几个不等式化成x1-xn<=a1+a2+a3+a4+....+ak,在这加减的过程中我们不难看到dijstra的身影,这加加减减的过程不正是松弛操作吗! 这时我们就得到了正解——差分约束算法,此算法主要用于处理差分约束系统:如果一个系统由n个变量和m个约束条件组成,形成m个形如ai-aj≤k的不等式(i,j∈[1,n],k为常数),则…
差分约束 差分约束,一般用来解决有\(n\)个未知数,\(m\)个不等式方程的问题,形如: \[\begin{cases} \ x_{a_1}-x_{b_1}\leq y_1\\ \ x_{a_2}-x_{b_2}\leq y_2\\ \ \cdots\\ \ x_{a_m}-x_{b_m}\leq y_m\\ \end{cases} \] 可以判断有没有解,以及给出一组解 简单观察可以知道,每个未知数的系数都为\(1\),且不等式一边是两个未知数相减,另一边是一个常数 为了达到这种形式,一般都…
怎么搞?        1. 如果要求最大值      想办法把每个不等式变为标准x-y<=k的形式,然后建立一条从y到x权值为k的边,变得时候注意x-y<k =>x-y<=k-1     将这些约束条件转化为差分约束,不妨设T[x] = S[1]+S[2]+....S[x],那么上面式子就可以转化为:         1. T[si+ni] - T[si-1] > ki          2. T[si+ni] - T[si-1] < ki          又差分约…
题目描述 给出一组包含 $m$ 个不等式,有 $n$ 个未知数的形如: 的不等式组,求任意一组满足这个不等式组的解. 输入格式 第一行为两个正整数 $n,m$,代表未知数的数量和不等式的数量. 接下来 $m$ 行,每行包含三个整数 $c,c',y$,代表一个不等式 $x_c-x_{c'} \leqslant y$. 输出格式 一行,$n$ 个数,表示 $x_1​,x_2​⋯x_n$​ 的一组可行解,如果有多组解,请输出任意一组,无解请输出$NO$. 样例数据 输入 3 3 1 2 3 2 3 -…
技术背景 Vmap是一种在python里面经常提到的向量化运算的功能,比如之前大家常用的就是numba和jax中的向量化运算的接口.虽然numpy中也使用到了向量化的运算,比如计算两个numpy数组的加和,就是一种向量化的运算.但是在numpy中模块封装的较好,定制化程度低,但是使用便捷,只需要调用最上层的接口即可.现在最新版本的mindspore也已经推出了vmap的功能,像mindspore.numba还有jax,与numpy的最大区别就是,需要在使用过程中对需要向量化运算的函数额外嵌套一层…
技术背景 在前面几篇跟SETTLE约束算法相关的文章(1, 2, 3)中,都涉及到了大量的向量旋转的问题--通过一个旋转矩阵,给定三个空间上的欧拉角\(\alpha, \beta, \gamma\),将指定的向量绕对应轴进行旋转操作.而本文主要就阐述这些旋转操作中,有可能面临到的一个重要问题--万向节死锁问题(Gimbal Lock). 一般大家觉得用图像化的方式来展示问题会显得更加的直观,但是这里我们准备直接用公式来陈述一下这个问题,也许会更直接.首先我们知道几个熟悉的旋转矩阵: \[R_Y(…
Weighted Sum Approach 该方法给出的表达式为: 首先,λ被称之为权重向量,观察和式,这完全就是m维向量的点乘公式嘛.具体的说,在目标空间中,把算法求出的一个目标点和原点相连构造成一个向量,此时,该方法的做法是将该向量与对应权重向量点乘,由向量点乘的几何意义可知,所得的数为该向量在权重向量方向上的投影长度,因为权重向量不变,最大/小化该长度值其实就是在优化该向量.可知若要增大该向量在权重向量上投影的长度,一方面可以增大/减小与权重向量的夹角,另一方面可以增大/减小该向量的长度.…