Python &引用;“平行化”;涉及教皇的任务

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。等等

我正试图使用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核系统)之外

编辑:下面是代码:

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行(没有文档)。