“Parellelizing”涉及pOpen的任务

时间:2017-04-25 02:09:04

标签: python parallel-processing fortran scientific-computing

我正在尝试使用Python脚本为我的研究小组解决问题。我们的实验室代码是用Fortran 77编写的。代码本质上是一个黑盒子。我们提供5个输入值,它吐出5个输出值。将这些输出值与基本事实进行比较。我们调整5个输入值,直到我们收到大约等于我们的基本事实的输出值。

此过程的工作方式如下:我们将5个输入值写入.txt文件。我们为代码执行.exe,它读取输入.txt。代码吐出了大量信息,包括我们与基础事实相比较的值,以判断这些输入值有多好。我们调整输入值并重新运行.exe。等等。

此任务通常需要数小时,因为此黑盒程序中隐藏了一个高度非线性的方程式。还有对数和sqrts可能导致程序崩溃,即输入值的5维空间包括可能导致程序崩溃的区域。

正常的SciPy优化算法似乎无法处理程序的崩溃并且永远不会收敛。所以,我写了一个基本上暴力破坏大约的脚本。解决方案,然后在大约上运行内置的优化脚本。解决方案,因为我知道/希望大约。解决方案不在将导致程序崩溃的区域附近。

这也需要几个小时,因为代码每次都必须运行.exe,而且它是从单个.txt中读取的,所以我无法想象能够以传统方式并行化这个任务。我使用pOpen在脚本中打开exe,并使用典型的open(“balance.txt”,“w”)命令打开文件进行写入等。

是否存在针对此类问题的任何解决方案,即,如果每次运行时都必须提取.txt文件的.exe,请加快搜索速度?除了手动制作我的代码的4份副本之外,将.py脚本的搜索空间分成1/4,并让它们全部独立运行(假设是4核系统)?

编辑:这里基本上是代码:

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

0 个答案:

没有答案