обратная матрица Python3 mpi4py EOFError: EOF при чтении строки

Я пишу фрагмент кода, который будет инвертировать матрицу с использованием mpi4py. Я получаю сообщение об ошибке, которое вызывает у меня проблемы.

Я помещаю 2 переменные по умолчанию m, n, и пользователь вставляет числа в процесс rank 0 для заполнения матрицы. Процесс rank 0 отправляет матрицу process 1 и process 2. В process 1 я инициализирую матрицу и определитель, вычисляю определитель и отправляю обратно в rank 0. В process 2 я инициализирую матрицу, нахожу обратную матрицу и возвращаю обратную матрицу процессу 0.

Затем в process 0 я получаю определитель и обратную матрицу. Если определитель равен 0, то будет отправлено сообщение и программа завершится (обратную матрицу можно вычислить даже если определитель равен 0, но это неверно). Если не 0, программа напечатает обратную матрицу.

Обратите внимание: я знаю, что текущая реализация — не лучший способ распараллелить эту проблему, но мне нужно было с чего-то начать.

Определитель выдавал мне некоторые ошибки, поэтому я инициализировал его как пустой массив numpy из 2 элементов, где первый элемент является определителем, а второй равен 0. Я немного отредактировал код с моего родного языка на английский, чтобы его можно было прочитать и понимается проще, поэтому может содержать некоторые ошибки.

Проблема в том, что когда я хочу дать пользователю право писать размер матрицы. Я проверил некоторые связанные ответы и попытался использовать map(), raw_input() и другие параметры, но ни один из них не сработал.

Код:

import numpy as np
from numpy.linalg import inv
from scipy.linalg import det
from mpi4py import MPI



comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()

m = int(input())
n = int(input())

if rank==0:
    matrix = np.zeros((m,n))
    determinant = np.zeros((2))
    for i in range (0,m):
        for j in range(0,n):
            print("Enter the value for the field: m = ", i+1, ", n = ", j+1,"\n")
            matrix[i][j] = float(input())

    comm.Send(matrix, dest=1, tag=0)
    comm.Send(matrix, dest=2, tag=0)
    comm.Recv(determinant, source=1, tag=0)
    comm.Recv(matrix, source=2, tag=0)
    if(determinant[0]==0):
        print("There is no inverse matrix since the determinant is 0!")
    else:
        print("Inverse matrix:\n",matrica)
elif rank==1:
    matrix = np.zeros((m,n))
    determinant = np.zeros((2))
    comm.Recv(matrix, source=0, tag=0)
    determinant = np.array([[det(matrix)],[0]])
    comm.Send(determinant, dest=0)
elif rank==2:
    matrix = np.zeros((m,n))
    comm.Recv(matrix, source=0, tag=0)
    matrix = inv(matrix)
    comm.Send(matrix, dest=0)
else:
    exit()

Ошибка:

Traceback (most recent call last):
  File "lambda.py", line 13, in <module>
    m = int(input())
EOFError: EOF when reading a line
Traceback (most recent call last):
  File "lambda.py", line 13, in <module>
    m = int(input())
EOFError: EOF when reading a line

РЕДАКТИРОВАТЬ: я использую PuTTY для подключения к ОС Debian из университета.

Версия интерпретатора: sys.version_info(основная=3, второстепенная=5, микро=1, уровень выпуска='final', серийный номер=0)

Я ввожу командную строку: mpirun -np 3 python3 lambda.py, я получаю EoFError и вставляю числа до точки, где он должен что-то сделать, когда вместо этого он продолжает работать как бесконечный цикл. (Лучше видно на картинке) Изображение

Добавлен код для трассировки ввода:

m = int(input("Enter number of rows, m = \n"))
n = int(input("Enter number of columns, n = \n"))

Изображение 2


person MarcoBubi    schedule 21.02.2016    source источник
comment
Вы упомянули, что отредактировали код с вашего родного языка на английский. Не могли бы вы протестировать измененный код и убедиться, что он ведет себя так же, как ваш собственный код? В противном случае нам бессмысленно устранять неполадки.   -  person mech    schedule 21.02.2016
comment
Как вы на самом деле выполняете код? Вы уверены, что это Python3.   -  person Bhargav Rao    schedule 21.02.2016
comment
@MarcoBubi, не могли бы вы запустить следующее в своем интерпретаторе или сохранить его как файл Python, запустить его и сообщить нам результат? В нем должна быть указана версия вашего переводчика: import sys;print(sys.version_info)   -  person mech    schedule 21.02.2016
comment
sys.version_info(major=3, minor=5, micro=1, releaselevel='final', serial=0) Я использую замазку для подключения к университетскому терминалу, я уверен, что это python3, код, который я исполняю это: mpirun -np 3 python3 lambda.py, так как lambda.py — это имя файла. @ali_m ввода нет, так как появляется ошибка, если я устанавливаю m = 3 и n = 3, то он работает нормально.   -  person MarcoBubi    schedule 21.02.2016
comment
Выполнение должно быть приостановлено в этой строке до тех пор, пока вы не введете ввод и не нажмете клавишу возврата. Что происходит в вашем случае? Вы можете сделать это поведение более очевидным, добавив строку подсказки, например. s = input("Enter the value for m: ").   -  person ali_m    schedule 21.02.2016
comment
@ali_m, так что в основном это работает так ... Я ввожу элемент, скажем, 3 и 3. Это позволяет мне записать 9 элементов, и после этого ничего не происходит. Я могу написать больше входных данных, но это не заканчивается.   -  person MarcoBubi    schedule 21.02.2016
comment
Это звучит как совершенно другое поведение по сравнению с EOFError, которое вы описали в своем вопросе. Не могли бы вы обновить свой вопрос, чтобы уточнить, что происходит?   -  person ali_m    schedule 21.02.2016
comment
@ali_m Я опишу все, что делаю. Вот так: я запускаю файл с помощью командной строки, mpirun -np 3 python3 lambda.py. Я получаю EOFError, я ввожу 3 и 3. Затем я вхожу в цикл for и записываю все 9 элементов матрицы, после чего похоже, что я вхожу в бесконечный цикл, где я могу ввести любую строку, но код выиграл' иметь тенденцию. Вот скриншот: prntscr.com/a68wzj   -  person MarcoBubi    schedule 21.02.2016
comment
Не могли бы вы добавить детали к своему вопросу, а не к комментариям? Другим намного легче следить за тем, что происходит.   -  person ali_m    schedule 21.02.2016


Ответы (1)


Ваша проблема не имеет ничего общего с матрицами: ваша линия

m = int(input())

происходит на всех узлах. Вам нужно сделать это на корневом узле, а затем поделиться результатами, как вам нравится, скажем, с помощью широковещательной рассылки. Например, если мы начнем с

from mpi4py import MPI

x = input("enter x: ")

мы получаем

(3.5) dsm@winter:~/coding/mpipar$ mpirun -np 3 python m1.py
enter x: enter x: Traceback (most recent call last):
  File "m1.py", line 3, in <module>
    x = input("enter x: ")
EOFError: EOF when reading a line
enter x: Traceback (most recent call last):
  File "m1.py", line 3, in <module>
    x = input("enter x: ")
EOFError: EOF when reading a line

и обратите внимание, что есть две ошибки. Но если мы защитим его:

from mpi4py import MPI

comm = MPI.COMM_WORLD
rank = comm.Get_rank()

x = None
if rank == 0:
    x = input("enter x: ")

x = comm.bcast(x, root=0)

print("rank", rank, "thinks x is", x)

тогда мы получаем

(3.5) dsm@winter:~/coding/mpipar$ mpirun -np 3 python m2.py
enter x: abc
rank 0 thinks x is abc
rank 1 thinks x is abc
rank 2 thinks x is abc
person DSM    schedule 22.02.2016
comment
Да, это работает! Спасибо! Я знал, что это нужно сделать так, просто понятия не имел, как это сделать, довольно новичок в python. Думаю, мне нужно еще немного проверить документы. :П - person MarcoBubi; 22.02.2016