该文档翻译自Rosetta官网的教程性文档 Rosetta Tutorials, Demos, and Protocol Captures,原文链接:https://www.rosettacommons.org/demos/latest/Home 。“😇”内的内容为译者添加。
Contents
10. Minimization: Finding Deeper Energy Wells
KEYWORDS: CORE_CONCEPTS GENERAL
Tutorial by Kristen Blacklock (kristin.blacklock@rutgers.edu). Edited by Vikram K. Mulligan (vmullig@uw.edu). Created 20 June 2016.
Updated 29 May 2017 by Vikram K. Mulligan (vmullig@uw.edu) to reflect changes to the default scorefunction.
10.1. ~ 10.2. Introduction & Goals
蛋白质绝非静态结构,而是在其构象空间中不断波动,并作为某种状态的系综而存在。蛋白质在其所有构象中的每一个快照都可以与一个能量(函数)相关联,其中一些构象具有高能量,一些具有低能量。在分子建模中,通常需要找到该能量函数的全局最小值(代表最低能量构象)。然而,这是一项非常困难的任务,因为需要采样的能量空间非常大,所以我们只能选择另一种方法:寻找局部最小值。
而最小化(Minimization)是在给定起始结构的构象和能量的情况下,寻找能量函数中最接近局部最小值的一种技术。Rosetta 有一个核心算法,叫做最小化器(minimizer),它解决了将一个结构优化到它最近的局部能量最小值的问题:通过使用某种梯度下降最小化方法,以找到能量函数中最近的局部最小值。最小化器可以使用许多不同的最小化算法,但本质上,所有最小化算法都选择一个矢量作为下降方向,沿着这个矢量前进,直到能量停止下降(线性搜索,line search),然后选择一个新的方向并重复。在本教程中,我们将使用lbfgs\_armijo\_nonmonotone
算法,这是一个只需要调用一次的多步骤算法(而不是调用重复迭代来达到收敛)。
一般来说,最小化是确定的,不像依赖于蒙特卡罗搜索的方法。多次重复最小化通常没有什么用处;所产生的系综不太可能因此而变多。这也侧面说明了,最小化对于不同平台之间,甚至不同编译器之间的微小数值精度差异非常敏感。
许多 Rosetta 模块调用最小化器,但最简单的方法之一是使用可执行程序minimize
。在本教程中,您将学习以三种不同的方式使用特定的最小化算法,首先允许结构中的所有残基在最小化期间移动,然后使用两种方法,只允许自由度(degrees of freedom,DOFs)的一部分发生变化。具体来说,我们将:
- 学习通过命令行运行
score
和minimize
程序。 - 创建并利用 约束文件(constraints file)来阻止CA原子移动。
- 创建并利用 movemap 来控制最小化过程中允许移动的自由度。
- 比较和分析每种最小化类型的输出文件和结构。
10.3. How-To: Minimize
10.3.1. Analyzing the input structure
查看3HON.pdb
结构。这一结构直接取自 RCSB PDB,Rosetta认为其包含的结构特征不是最优的(虽然与实验X射线数据相比可能无关紧要)。首先,让我们得到这个构象的初始分数,在命令行中输入:
cd <path_to_Rosetta>/main/demos/tutorials/minimization/
<path_to_Rosetta>/main/source/bin/score.default.linuxgccrelease -s 3hon.pdb
将会产生default.sc
打分文件,内容如下(😇译者在这里给出的数据并非原教程数据(他竟然放了张图片…),因为使用的是3.13版本,所以可能在数值上略有出入😇):
SCORE: score fa_atr fa_rep fa_sol fa_intra_rep fa_intra_sol_xover4 lk_ball_wtd fa_elec pro_close hbond_sr_bb hbond_lr_bb hbond_bb_sc hbond_sc dslf_fa13 omega fa_dun p_aa_pp yhh_planarity ref rama_prepro allatom_rms gdtmm gdtmm1_1 gdtmm2_2 gdtmm3_3 gdtmm4_3 gdtmm7_4 irms maxsub maxsub2.0 rms description
SCORE: 292.410 -259.925 169.436 143.593 0.834 12.369 -4.366 -38.638 15.694 -3.538 -9.816 -1.268 -1.503 0.000 0.201 219.207 -5.243 0.000 19.622 35.751 0.000 1.000 1.000 1.000 1.000 1.000 1.000 0.000 55.000 55.000 0.000 3hon_0001
该文件的第一行是标题行,它告诉我们哪些列对应于哪些评分项。在这个文件的第二行,我们看到晶体构象的 Rosetta 总评分为 292.410 😇原教程为240.074😇,并且它有一个特别高的排斥性评分fa_rep
,这意味着在这个结构中原子之间存在冲突,以及一个很高的 Dunbrack 统计评分fa_dun
,这意味着这个结构中的很多 rotamers 都是低概率的😇上述两点与原教程是一致的😇。下面让我们试着用最小化器来解决这些问题。
10.3.2. Setting up the flags file
首次我们需要指定如何运行最小化器,打开minimizer_flags
一探究竟:
-s 3hon.pdb
-run:min_type lbfgs_armijo_nonmonotone
-run:min_tolerance 0.001
第一个标签-s
指示我们的输入结构;第二个标签-run:min_type
指示所使用的最小化算法,在此我们使用 lbfgs_armijo_nonmonotone
,但实际上 lbfgs_armijo_nonmonotone
是默认算法,所以在此你也可以不写这一行;第三个标签-run:min_tolerance
指定了最小化算法的收敛容忍度。Rosetta 对于函数最小化至少有两种容忍度,“常规”(因为没有更好的名称)容忍度和绝对容忍度。“常规”容忍度是被最小化函数值的相对值,例如 0.01 的容忍度意味着最小函数值可能在真实局部最小值的 1% 以内。绝对公差不考虑当前函数值,即 0.01 的绝对容差意味着最小函数值与真正的局部最小值相差最多 0.01 REU。最小化器默认使用“常规”容忍度;这里了解更多关于绝对容忍度的信息。一般来说,将“常规”容忍度设置为0.01是非常宽松的,因此建议指定小于 0.01 的公差设置。在本教程中我们将其设置为0.001。
10.3.3. Running the minimization command
使用minimizer_flags
上述运行最小化器:
<path_to_Rosetta>/main/source/bin/minimize.default.linuxgccrelease @minimizer_flags
如果程序没报错且输出如下,那就说明最小化成功:
minimize: Score: 0 -65.9488
minimize: FinalScore: -65.9488
protocols.jd2.JobDistributor: 3hon_0001 reported success in 2 seconds
protocols.jd2.JobDistributor: no more batches to process...
protocols.jd2.JobDistributor: 1 jobs considered, 1 jobs attempted in 2 seconds
同时你将会有score.sc
及3hon_0001.pdb
,下一步就是分析他们。
10.3.4. Analyzing the output
score.sc
内容如下:
SEQUENCE:
SCORE: total_score dslf_fa13 fa_atr fa_dun fa_elec fa_intra_rep fa_intra_sol_xover4 fa_rep fa_sol hbond_bb_sc hbond_lr_bb hbond_sc hbond_sr_bb lk_ball_wtd omega p_aa_pp pro_close rama_prepro ref yhh_planarity description
SCORE: -65.949 0.000 -253.841 95.084 -49.087 0.719 13.274 31.521 131.536 -3.530 -17.509 -3.513 -8.083 -8.167 3.710 -15.377 0.279 -2.612 19.622 0.025 3hon_0001
对比能量最小化与晶体结构得分:
SCORE: total_score dslf_fa13 fa_atr fa_dun fa_elec fa_intra_rep fa_intra_sol_xover4 fa_rep fa_sol hbond_bb_sc hbond_lr_bb hbond_sc hbond_sr_bb lk_ball_wtd omega p_aa_pp pro_close rama_prepro ref yhh_planarity description
SCORE: -65.949 0 -253.841 95.084 -49.087 0.719 13.274 31.521 131.536 -3.53 -17.509 -3.513 -8.083 -8.167 3.71 -15.377 0.279 -2.612 19.622 0.025 3hon_0001
SCORE: 292.41 0 -259.925 219.207 -38.638 0.834 12.369 169.436 143.593 -1.268 -9.816 -1.503 -3.538 -4.366 0.201 -5.243 15.694 35.751 19.622 0 3hon
可以发现总能量、fa_dun
、fa_rep
有了明显下降。请注意,你所获得的精确数值可能与上面所列出的略有不同(+/- 0.5能量单位),这是因为平台与平台之间微小的数值精度差异可能会在轨迹上累积,从而在最终输出中产生明显(但仍然很小)的差异。这里可能还会有一些额外的评分项,因为评分函数可能比本教程时的版本更新。但重要的是,大多数评分项的值已经下降了!
使用Pymol打开并对比3hon.pdb
及3hon_0001.pdb
,可以发现:
Executive: RMSD = 0.654 (44 to 44 atoms)
同时,loop区域的最后9个残基与原来的构象相比有了很大的变化,大多数残基的 rotamers 已经不再是它们原来的构象了😇绿色为晶体结构,蓝色为最小化结构,stick 的展示方式略😇。有时在起始构象中允许如此大的移动可能是不可取的。为此,我们可以使用带有约束的最小化来最小化我们的输入结构,其中某些原子的运动将被分数函数惩罚。
10.4. How-To: Minimization with Constraints
现在,我们将在3HON C末端尾部 9 个残基的主链重原子上应用调和坐标约束(coordinate constraints, csts)。你可以把这些约束想象成“松紧带”或“橡皮筋”,它们在最小化轨迹中轻轻地把每个主骨架重原子拉回原来的位置。实际上,约束是在整体能量函数中添加的一个额外的、人工的势能(一系列惩罚偏离输入坐标的谐波势能)。
10.4.1. Setting up the flags file and constraints file
我们需要在标志文件中添加额外的选项,以便让 Rosetta 读取保持原子位置的约束信息。此外,我们需要告诉 Rosetta 在它正在使用的能量函数中添加额外的约束势。为此,我们在权重文件中为约束评分项设置非零权重,见minwithcsts_flags
:
-s 3hon.pdb
-run:min_type lbfgs_armijo_nonmonotone
-run:min_toleranace 0.001
-constraints:cst_file cstfile
-score:weights ref2015_cst
-out:suffix _minwithcsts
前三个标签已经讲解过;第四个标签constraints:cst_file
指明所使用约束文件的名称;第五个标签score:weights
指定能量函数使用哪一组权重,在本教程中,我们指定了ref2015_cst
权重文件,这是 Rosetta 数据库中预定义的权重文件,它添加了chainbreak
、coordinate_constraint
、atom_pair_constraint
、angle_constraint
、dihedral_constraint
和res_type_constraint
,其余与ref2015
相同,每一个都是 1.0 权重;第六个标签-out:suffix
设置后缀。
10.4.2. Running the minimization command
运行:
<path_to_Rosetta>/main/source/bin/minimize.default.linuxgccrelease @minwithcsts_flags
此时,注意 log 中输出的core.scoring.constraints
行,这说明我们的约束成功施加上了:
core.scoring.constraints.util: Constraint choice: cstfile
core.scoring.constraints.ConstraintsIO: read constraints from cstfile
core.scoring.constraints.ConstraintsIO: Read in 39 constraints
···
minimize: Score: 0 -44.3008
minimize: FinalScore: -44.3008
protocols.jd2.JobDistributor: 3hon_minwithcsts_0001 reported success in 2 seconds
protocols.jd2.JobDistributor: no more batches to process...
protocols.jd2.JobDistributor: 1 jobs considered, 1 jobs attempted in 2 seconds
运行成功会得到score_minwithcsts.sc
及3hon_minwithcsts_0001.pdb
,下面来分析。
10.4.3. Analyzing the output
score_minwithcsts.sc
内容如下:
SEQUENCE:
SCORE: total_score angle_constraint atom_pair_constraint chainbreak coordinate_constraint dihedral_constraint dslf_fa13 fa_atr fa_dun fa_elec fa_intra_rep fa_intra_sol_xover4 fa_rep fa_sol hbond_bb_sc hbond_lr_bb hbond_sc hbond_sr_bb lk_ball_wtd metalbinding_constraint omega p_aa_pp pro_close rama_prepro ref res_type_constraint yhh_planarity description
SCORE: -44.301 0.000 0.000 0.000 1.485 0.000 0.000 -252.596 103.538 -52.550 0.700 12.855 31.165 137.396 -4.217 -16.796 -6.144 -7.241 -7.208 0.000 5.180 -13.616 1.013 3.093 19.622 0.000 0.021 3hon_minwithcsts_0001
SCORE: total_score dslf_fa13 fa_atr fa_dun fa_elec fa_intra_rep fa_intra_sol_xover4 fa_rep fa_sol hbond_bb_sc hbond_lr_bb hbond_sc hbond_sr_bb lk_ball_wtd omega p_aa_pp pro_close rama_prepro ref yhh_planarity description
SCORE: -44.301 0 -252.596 103.538 -52.55 0.7 12.855 31.165 137.396 -4.217 -16.796 -6.144 -7.241 -7.208 5.18 -13.616 1.013 3.093 19.622 0.021 3hon_minwithcsts_0001
SCORE: -65.949 0 -253.841 95.084 -49.087 0.719 13.274 31.521 131.536 -3.53 -17.509 -3.513 -8.083 -8.167 3.71 -15.377 0.279 -2.612 19.622 0.025 3hon_0001
SCORE: 292.41 0 -259.925 219.207 -38.638 0.834 12.369 169.436 143.593 -1.268 -9.816 -1.503 -3.538 -4.366 0.201 -5.243 15.694 35.751 19.622 0 3hon
同样,大多数来自约束最小化结构的分数都低于晶体结构的分数,还要注意新增加的约束最小化结构的能量项列表中的坐标约束项。比较最小化结构和约束最小化结构,我们看到总能量的增加主要是由fa_atr
和fa_dun
项的差异引起的。这有两个原因。首先,我们看到坐标约束项本身给分数增加了一个小的正值,因为主链重原子已经从它们的起始坐标稍微移动了;第二,因为这次的结构没有被允许移动太远,小的冲突和缺陷不能完全解决,导致分数比以前略高;所以在保持结构接近晶体结构和深入挖掘到最近的局部能量最小值之间有一个权衡。现在让我们来看看用csts最小化的结构,看看它与我们之前的结构有什么不同:
可见9个羧基端CA原子的位置几乎没有移动,😇其余骨架部分由轻微移动,但部分残基的 rotamer 被优化了;绿色为晶体结构,蓝色为最小化结构,黄色为约束最小化结构;下图由上图绕X轴旋转 180° 得😇。
10.5. How-To: Minimization with a MoveMap
在某些情况下,用户可能希望在最小化期间防止某些残基的内部几何形状移动,而不是原子的 XYZ 坐标。为了不允许主链 phi/psi 角和/或侧链 chi 角的移动,我们可以为最小化器提供一个 MoveMap,指定允许改变这些自由度中的哪些。
10.5.1. Some Concepts
10.5.1.1 MoveMap
movemap 是 Rosetta 最小化中的一个重要概念。它允许用户控制在最小化过程中哪些自由度可以改变,哪些自由度是固定的。例如,你可能不希望在建模中移动高度保守的侧链,或者希望在设计应用程序中保留某些相互作用。调用 Rosetta 最小化器的某些 protocols 接受用户定义的 movemap 文件。
在最小化器的使用中,movemap 允许用户指定主链骨架扭转角(phi和psi,在α-氨基酸残基的情况下)和/或侧链扭转角(chi)是否允许在能量函数最小化期间移动。此外,如果输入结构有多个链,movemap 还可以指定是否允许不同链之间的相对移动。注意:即使一个残基的主链和侧链的扭转运动在 movemap 中被关闭,它相对于其他残基的相对位置仍然可能根据折叠树(foldtree)上游的残基的运动而改变。
10.5.1.2 FoldTree
折叠树(foldtree)是与最小化相关的另一个重要概念。虽然折叠树的操作将在另一篇教程中更详细地介绍,但我们将在这里简要概述这个概念。当最小化时,自由度会改变,这可能会对结构产生模糊的后果。例如,如果我将残基5的扭转值从-60改为-50,可能会有几种情况:残基1到4可以保持不变,从5开始的所有残基都可以移动;残基1到4可以移动,5保持固定;残基5中的原子可以移动,但蛋白质中其余的原子保持不变,这意味着蛋白质的键合几何形状将严重扭曲;或者是上述三者的组合。折叠树建立了一个姿态中残基之间的层次关系,从而定义了自由度变化的影响。每个残基都有一个唯一的父残基(除了那个根残基, root residue),每个残基可以有一个或多个子残基(循环依赖是禁止的,例如,如果残基3是残基4的父残基,残基4就不能是残基3的父残基)。残基自由度的变化可以传播到残基的所有子残基,但不影响父残基。虽然典型姿态中的大多数残基是通过键连接联系在一起的,但两个残基可以通过一个贯穿空间的刚体变换(😇rigid body transform,有关刚体变换可以参考这篇专栏,这句话的意思是如果两个结构之间没有约束,他们可以发生刚性的相对运动而联系在一起,不过这教程说的真抽象😇称为跳跃,jump)联系在一起。如果存在两个单独的链(没有键连接它们),就需要至少有一个跳跃,将第一个链中的残基与第二个链中的残基联系起来 😇所以哪怕对于单独一条链你也可以自己设置跳跃的位置,从而允许/禁止跳跃所分割的两段结构的相对运动😇。
如上所述,调用最小化器时,特别是使用 MoveMap 时,应该注意折叠树。默认的 foldtree 以链A的残基1作为根,残基2是1的子残基,残基3是2的子残基,以此类推,并且跳转到任何其他链的第一个残基。任何可移动自由度都会影响折叠树中它下游的每个残基,即使该残基的自由度是由 MoveMap 固定的。例如,让我们考虑一个使用默认折叠树的20残基的姿态的情况,使用 MoveMap 阻止从8到20的残基的骨架重原子的移动;能量最小化将改变残基1到7的主自由度,使残基8到20在过程中在空间中摆动(尽管在这种情况下,残基8到20不能彼此相对移动)。
10.5.1.3 The MoveMap File Format
movemap 文件中的每一行都标识一个跳跃、残基或残基范围,后面跟着允许的自由度:
RESIDUE <#> <BB/CHI/BBCHI/NO> # 单个残基 <#> 的单个限制选项
RESIDUE <#1> <#2> <BB/CHI/BBCHI/NO> # 一系列残基 <#1> ~ <#2> 的单个限制选项
JUMP <#> <YES/NO> # 单个跳跃 <#> 的单个限制选项
例如:
RESIDUE 35 BB # 允许残基 35 的骨架扭转角运动
RESIDUE 32 48 BBCHI # 允许残基 32 ~ 48 的骨架及侧链扭转角运动
JUMP * YES # 允许所有由任意 jump 分割的两结构之间的刚性运动,*代表任意
如果一个残基出现不止一次,最后一次出现在文件中的标识决定了它的自由度(即 movemap 的行是不可交换的,不像用于控制打包器的TaskOperations——参见打包教程)。例如,上面指定的 movemap 中残基 35 出现在了第一及第二行中,最终其自由度为允许残基骨架及侧链扭转角运动,即第二行。
需要注意的是:如果在 movemap 中没有指定残基或跳跃,它将恢复到默认行为,这个默认行为是特定于 protocol 的。在许多但不是所有的情况下,默认行为是允许所有扭转自由度(BB, CHI)和所有刚体自由度(跳跃)移动的。当有疑问时,最好明确用户请求的行为。
10.5.2. Setting up the flagsfile and movemap file
对于下一个最小化演示,我们需要在 flags 文件中添加一个选项来告诉 Rosetta 读取 movemap 文件。新标志文件minwithmm_flags
的内容如下:
-s 3hon.pdb
-run:min_type lbfgs_armijo_nonmonotone
-run:min_toleranace 0.001
-movemap movemapfile
-out:suffix _minwithmm
新标签-movemap
指定所使用的 movemap 文件,其内容如下 😇请读者自行理解😇:
RESIDUE * BBCHI
RESIDUE 47 55 NO
10.5.3. Running the minimization command
运行:
<path_to_Rosetta>/main/source/bin/minimize.default.linuxgccrelease @minwithmm_flags
出现:
minimize: Initializing movemap from file movemapfile
···
minimize: Score: 0 -6.55532
minimize: FinalScore: -6.55532
protocols.jd2.JobDistributor: 3hon_minwithmm_0001 reported success in 2 seconds
protocols.jd2.JobDistributor: no more batches to process...
protocols.jd2.JobDistributor: 1 jobs considered, 1 jobs attempted in 2 seconds
10.5.4. Analyzing the output
首先分析打分文件:
SCORE: total_score dslf_fa13 fa_atr fa_dun fa_elec fa_intra_rep fa_intra_sol_xover4 fa_rep fa_sol hbond_bb_sc hbond_lr_bb hbond_sc hbond_sr_bb lk_ball_wtd omega p_aa_pp pro_close rama_prepro ref yhh_planarity description
SCORE: -6.555 0 -246.327 124.744 -45.004 0.735 13.304 31.952 126.09 -4.161 -16.462 -3.044 -6.751 -8.12 4.612 -13.914 12.2 3.929 19.622 0.039 3hon_minwithmm_0001
SCORE: -44.301 0 -252.596 103.538 -52.55 0.7 12.855 31.165 137.396 -4.217 -16.796 -6.144 -7.241 -7.208 5.18 -13.616 1.013 3.093 19.622 0.021 3hon_minwithcsts_0001
SCORE: -65.949 0 -253.841 95.084 -49.087 0.719 13.274 31.521 131.536 -3.53 -17.509 -3.513 -8.083 -8.167 3.71 -15.377 0.279 -2.612 19.622 0.025 3hon_0001
SCORE: 292.41 0 -259.925 219.207 -38.638 0.834 12.369 169.436 143.593 -1.268 -9.816 -1.503 -3.538 -4.366 0.201 -5.243 15.694 35.751 19.622 0 3hon
可以发现,带 movemap 的最小化结构的总得分仍然低于晶体结构,但其能量高于其他两个,这主要是由于pro_close
项(与脯氨酸环闭合相关的能量)和fa_dun
项的差异。接下来是结构分析:将带 movemap 的最小化结构与晶体结构对比后(😇蓝色为晶体结构,玫红色为带 movemap 的最小化结构😇),可以看出 9 个C末端残基发生了移动。然而,当我们只对 9 个C末端残基进行比对时,很明显,最小化器并没有改变他们的主链或侧链角度。
# whole structure
Executive: RMSD = 2.251 (55 to 55 atoms)
# nine C-terminal residues
Executive: RMSD = 0.000 (9 to 9 atoms)
10.6. More detailed algorithm overview (for advanced users)
😇该部分为机翻,尚未检查😇
新手和普通用户可能会跳过本教程的这一部分;它的目的是让高级用户更深入地了解工具的工作方式,希望这将帮助他们更有效地使用工具。如前所述,最小化器通过变异体在梯度下降最小化中工作。Rosetta中的所有能量项不仅定义了一种根据系统自由度的当前值计算能量值的方法,而且还定义了一种根据自由度的当前值计算空间自由度导数的方法。最小化器使用这些导数函数来计算总体梯度向量,∇E。这是一个偏导向量:∇E = dE/dx1, dE/dx2,…, dE/dxN,其中x1…xN是可移动的自由度,计算自由度的当前值。该矢量在构象空间中指向“上坡”方向,其负值指向“下坡”方向。然后,最小化器向“下坡”方向“行进”(这意味着它将-ε∇E添加到当前的自由度矢量中,其中ε是某个任意小的标量值),只有当能量停止减少并开始增加时,才会停止这种“线搜索”。在这一点上,它重新计算∇E(现在它将指向一个稍微不同的方向)并重复搜索。这将继续,直到梯度足够平坦(即足够小的量级),如最小阈值所定义的。
这里有一个稍微复杂的地方。上面描述的方法是在使用“linmin_iterated”风格时发生的。不幸的是,这是相对低效的:如果同时使用一阶和二阶导数信息来选择线搜索方向,最小化可以更快地收敛。正确而准确地做到这一点(牛顿法)意味着计算和反求Hessian矩阵,它是给定N个移动自由度的偏二阶导数的NxN矩阵。由于计算、反求和更新这个大矩阵会大大减慢最小化器的速度,所以折衷的方法是使用最后几个计算得到的梯度值“∇E”来估计Hessian矩阵的逆矩阵。为了达到这一目的,已经提出了许多准牛顿方法,包括Davidon-Fletcher-Powell (DFP)方法和Broyden-Fletcher-Goldfarb-Shanno (BFGS)方法。Rosetta具有后一种方法的两种特点:标准BFGS方法(不准确地命名为“dfpmin”)和低内存、性能更好的变体(称为“lbfgs”)。它们的变化也存在,它们使用不同的停止条件,并以微妙的不同方式进行线路搜索。Rosetta中当前的默认样式是“lbfgs_armijo_nonmonotone”,基准测试已经显示为大蛋白质产生最佳性能。
非常小的系统(例如小肽)可能表现出更好的“dfpmin_armijo_nonmonotone”行为。使用较慢但更准确的“linmin_iterated”风格也可以避免使用逆Hessian近似的某些罕见的工件(在调试行为怪异的protocol时,这是一件好事)。