Но есть некоторые вещи, которые заставляют меня скептически относиться к предоставлению предоставленного ответа. Кроме того, у меня есть реализация класса, которая делает ситуацию немного отличаться. Вот какой -то «уменьшенный» код, чтобы продемонстрировать основную логику: < /p>
Код: Выделить всё
from scipy.optimize import minimize
from mpi4py import MPI
import numpy as np
class Solver():
def __init__(self, SampleTimes, InitialArray):
self.comm = MPI.COMM_WORLD
self.rank = self.comm.Get_rank()
self.size = self.comm.Get_size()
self.SampleTimes = SampleTimes
self.InitialArray = InitialArray
self.Finished = False
def f(x_):
return
def Objective(self, x):
self.x = self.comm.bcast(x if self.rank == 0 else None, root=0)
tstep_select = np.array_split(self.SampleTimes, self.size)[self.rank]
local_results = []
for t in tstep_select:
result = self.f(self.x) # Some function of x
local_results.append( (t, result) )
all_results = self.comm.gather(local_results, root=0)
if self.rank==0:
all_results = [item for sublist in all_results for item in sublist]
all_results = np.array(all_results)
all_results = all_results[all_results[:,0].argsort()]
scalar = np.trapz(all_results[:,1], all_results[:,0])
return -scalar
def Maximize(self,):
if self.rank == 0:
self.Max = minimize(self.Objective, self.InitialArray)
self.Finished = self.comm.bcast(True, root=0)
return self.Max
else:
while not self.Finished:
self.Objective(None)
if __name__=='__main__':
t_eval = np.linspace(0, 100, 100)
Instance = Solver(SampleTimes=t_eval)
print(Instance.Maximize())
Как я понимаю, я не могу передать ни один на объектив для ранга! Как написано, Objective будет возвращать None на всех ранга!>
Подробнее здесь: https://stackoverflow.com/questions/796 ... y-minimize