用于指定参数扫描的micro dsl
pscan的Python项目详细描述
一种模块,其唯一目的是通过 用于指定要扫描的参数值的通用框架。
组合参数扫描,联合参数扫描,“科学” 参数扫描,以及重复多少次的高级选项 可以进行模拟。
这个模块是在作者厌倦了同样的内容之后编写的 每次他想扫描他的 模拟。
模块设计的动力是意识到 基本上只有四种类型的“参数扫描” 必须完成。
- 多次运行相同的参数(例如stoch模拟)
- 共同改变某些参数(例如(i,j)=(1,2),(2,3),(3,4), …)
- 组合地改变参数(例如(i,j)=(1,1),(1,2),(2,1), (2,2))
- 改变“科学的”(例如(i0,j),(i,j0)表示固定的i0,j0,变化的 i,j)
所有这三项都可以用声明的方式指定(例如,用英语 句子)相对容易,但通常每个句子都需要编码 容易搞错嵌套循环。此模块将 可以查询iterable中的哪些参数以获取下一组 扫描中的参数。如果扫描中途停止,它将记住 它的状态,允许你重新加载,改变扫描参数, 继续跑步。如果您的代码需要 根据先前的模拟定期生成下一个参数。
如果有几个“联合”的不同参数,则每个“组”都有 将以组合方式交互。更抽象地说,你应该考虑 与“单个”相同的联合变化参数集 参数。
下面是一个使用包的所有特性的示例。说我们 有两个参数a和b,我们希望它们共同变化,并且 另一个参数c,我们想根据 (a,b)。为了使事情更复杂,我们要运行模拟2 每组(a,b,c)的时间,除了如果“c”太大,我们运行 减少重复以节省时间。这通常会涉及很多 仔细编码的样板文件,但是我们只能告诉PScan.Scan 我们想要的:
>>> from pscan import Scan >>> import numpy as np >>> def f(a,b,c): >>> print('a = ', a, ', b = ', b, ', c = ', c) >>> p = {} >>> p['a'] = np.linspace(0, 10, 5) >>> p['b'] = np.linspace(0.1, -0.5, 5) >>> p['c'] = np.linspace(10, 20, 3) >>> default_count = lambda p: 2 >>> # None specifies to default to previous value >>> big_c_count = lambda p: 1 if p['c'] >= 14 else None >>> >>> s = Scan.from_dict(p, joint_lists=[['a','b']]) >>> s.add_count(default_count) # these will be called >>> s.add_count(big_c_count) # in the order they were added >>> s.run_scan(f) # verify scan validity and run a = 0.0 , b = 0.1 , c = 10.0 a = 0.0 , b = 0.1 , c = 10.0 a = 2.5 , b = -0.05 , c = 10.0 a = 2.5 , b = -0.05 , c = 10.0 a = 5.0 , b = -0.2 , c = 10.0 a = 5.0 , b = -0.2 , c = 10.0 a = 7.5 , b = -0.35 , c = 10.0 a = 7.5 , b = -0.35 , c = 10.0 a = 10.0 , b = -0.5 , c = 10.0 a = 10.0 , b = -0.5 , c = 10.0 a = 0.0 , b = 0.1 , c = 15.0 a = 2.5 , b = -0.05 , c = 15.0 a = 5.0 , b = -0.2 , c = 15.0 a = 7.5 , b = -0.35 , c = 15.0 a = 10.0 , b = -0.5 , c = 15.0 a = 0.0 , b = 0.1 , c = 20.0 a = 2.5 , b = -0.05 , c = 20.0 a = 5.0 , b = -0.2 , c = 20.0 a = 7.5 , b = -0.35 , c = 20.0 a = 10.0 , b = -0.5 , c = 20.0