Python &引用;“平行化”;涉及教皇的任务
我正试图使用Python脚本为我的研究小组解决一个问题。我们实验室的代码是用Fortran 77编写的。代码本质上是此任务的黑盒。我们为它提供5个输入值,它输出5个输出值。将这些输出值与地面真实值进行比较。我们调整5个输入值,直到我们收到的输出值大约等于我们的基本事实 这个过程的工作方式如下:我们将5个输入值写入一个.txt文件。我们为代码执行.exe,它读取input.txt。代码会吐出一堆信息,包括我们将这些值与基本事实进行比较以判断这些输入值有多好。我们调整输入值并重新运行.exe。等等 这个任务通常需要几个小时,因为这个黑匣子程序中隐藏着一个高度非线性的方程。也有可能使程序崩溃的对数和SQRT,即输入值的5维空间包括可能使程序崩溃的区域 普通的SciPy优化算法似乎无法处理程序的粗糙性,而且永远不会收敛。因此,我编写了一个脚本,基本上强制执行近似解决方案,然后在近似解决方案上运行内置优化脚本,因为我知道/希望近似解决方案不靠近会使程序崩溃的区域 这也需要几个小时,因为代码每次都必须运行.exe,而且它是从单个.txt读取的,所以我无法想象能够以传统方式并行化此任务。我使用pOpen打开脚本中的exe,并使用典型的open(“balance.txt”、“w”)命令打开文件进行写入,等等 对于这种类型的问题有什么解决方案吗?例如,如果一个.exe每次运行时都必须拉入一个.txt文件,那么就加快搜索速度?除了手动复制我的代码的4个副本,将.py脚本的搜索空间分成1/4个部分,并让它们都独立运行(假设是4核系统)之外 编辑:下面是代码:Python &引用;“平行化”;涉及教皇的任务,python,parallel-processing,fortran,scientific-computing,Python,Parallel Processing,Fortran,Scientific Computing,我正试图使用Python脚本为我的研究小组解决一个问题。我们实验室的代码是用Fortran 77编写的。代码本质上是此任务的黑盒。我们为它提供5个输入值,它输出5个输出值。将这些输出值与地面真实值进行比较。我们调整5个输入值,直到我们收到的输出值大约等于我们的基本事实 这个过程的工作方式如下:我们将5个输入值写入一个.txt文件。我们为代码执行.exe,它读取input.txt。代码会吐出一堆信息,包括我们将这些值与基本事实进行比较以判断这些输入值有多好。我们调整输入值并重新运行.exe。等等
def writeInput(Input):
f=open("input.txt","w")
f.write(Input)
f.close()
def grabOutput():
ps=Popen("code.exe",shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE)
for line in iter(ps.stdout.readline,''):
**Iterate through .exe output finding 5 output values**
result = np.array(5 values read by above)
return result
def mainFunc(Input):
# f(x) -> f required by optimization algorithms for minimization
global criteria
writeInput(Input)
result=grabOutput()
###################################
# Omitted optimization function related stuff
####################################
residual = result - criteria
return residual
################################################
# Main code
################################################
bounds=[(0.1,4.),(0.1,4.),(-4.,4.),(-.4,4.),(0.1,1.)]
x0=np.array([1.,1.,1.,0.5,0.5])
criteria=np.array([0.26,5.49e19,1.0e20,1870.,587.])
flag=False
while flag==False:
try:
# Optimization routine that uses just an initial guess
answer=broyden1(mainFunc,x0)
# Could also use
# answer=differential_evolution(mainFunc,bounds)
# if I wanted to specify the bounds of the input space
# which is why I also specify bounds=[...] above.
print "answer = ",answer
flag=True
except:
continue
你应该表现出你剧本的魅力。阅读需要多长时间?欢迎来到:你能阅读吗?exe需要多长时间才能运行?除非速度非常快,否则通过文件i/o传递值的开销可能不是问题。如果你不愿意学习足够的fortran语言来改变它,你似乎没有任何选择。运行.exe大约需要1秒。问题是,我并不完全了解任何内部并行代码的方法。这是Fortran 77,这段代码可能是我有生以来见过的文档记录最差的代码。例如,我们的顾问使用“XX”、“YY”、“XYX”、“XXYY2”作为变量名,大约有40k行(没有文档)。