Ошибка деления нуля в Windows, но не в LinuxPython

Программы на Python
Ответить
Anonymous
 Ошибка деления нуля в Windows, но не в Linux

Сообщение Anonymous »

У меня есть фрагмент числового кода, который я пытаюсь запустить на рабочей станции. Он отлично работает на моем ноутбуке под управлением Arch Linux, но каким-то образом на рабочей станции с Windows 10 я получаю ошибку ZeroDivisionError. Я запускаю его как скрипт .py, поскольку многопроцессорность не работает в Jupyter Notebook. Минимальный рабочий пример кода, выдающего эту ошибку, приложен ниже.
import numpy as np
from mpmath import factorial #replaced scipy factorial with this
import os
from mpmath import mp #arbitrary floating point arithmetic
import matplotlib.pyplot as plt
import scipy.special as sp
import csv
import sys
import time
from multiprocessing import Pool

mp.dps = 10

def H(n,x):
return mp.hermite(n,x)

#Setting alpha = 1
alpha = 1

#Defining the wavefunction
def wavefn(n,x):
return H(n,alpha**(1/2)*x)*mp.exp(-alpha*x**2 /2)*(alpha/mp.pi)**(1/4)/(2**n*factorial(n))**(1/2)
def H1_real(x, y, deltat):
return (mp.cos(mp.sqrt(x**2+y**2)*deltat) * mp.cos((x**2*y**2 - x**2 - y**2)*deltat)
+ x * mp.sin(mp.sqrt(x**2+y**2)*deltat) * mp.sin((x**2 + y**2 - x**2*y**2)*deltat)/mp.sqrt(x**2+y**2))
def H1_imag(x, y, deltat):
return (mp.cos(mp.sqrt(x**2 + y**2)*deltat)*mp.sin((x**2+y**2-x**2*y**2)*deltat)
- x*mp.cos((x**2+y**2-x**2*y**2)*deltat)*mp.sin(mp.sqrt(x**2+y**2)*deltat)/mp.sqrt(x**2+y**2))

def fock_mode_H1(m, n, q, deltat, L):
print(f"Now generating H1 integral for (m,n) = ({m},{n})")
real_part = mp.quad(
lambda x, y: H1_real(x/q, y/q, deltat) * wavefn(m, x) * wavefn(n, y),
[-L/2, 0, L/2],
[-L/2, 0, L/2]
) / (L**2)

imag_part = mp.quad(
lambda x, y: H1_imag(x/q, y/q, deltat) * wavefn(m, x) * wavefn(n, y),
[-L/2, 0, L/2],
[-L/2, 0, L/2]
) / (L**2)

return real_part + 1j * imag_part

def fock_mode_H1_partial(args):
m, n = args
return fock_mode_H1(m,n,q,deltat,L)

cutoff = 35
mode_arr = np.arange(33,cutoff)
x_modes, y_modes = np.meshgrid(mode_arr,mode_arr)
r = mp.log(2)
s = mp.mpf('1')
q = mp.exp(r) * s
L = 40
deltat = mp.mpf('0.1')

grid_points = list(zip(x_modes.ravel(), y_modes.ravel())) # Flatten meshgrid into a list of points

# Define the parallel_map function
def parallel_map(f, points, num_workers=None):
with Pool(processes=num_workers) as pool:
results = pool.map(f, points)
return np.array(results).reshape(x_modes.shape) # Reshape back to the grid

if __name__ == "__main__":
print("Current directory: " + os.getcwd())
print(f"The mode cutoff is {cutoff}")
processes = 12
print(f"Will now create {processes} processes")
init_state_mat_up = np.array([mp.mpf('1') if i == 0 else mp.mpf('0') for i in range(cutoff * cutoff)]).reshape((cutoff,cutoff))
init_state_mat_down = init_state_mat_up.copy()
init_state_mat_down[0,0] = mp.mpf('0')

print("Generating the matrix for auxilliary state")
start_time = time.time()
aux_mode_H1 = parallel_map(fock_mode_H1_partial,grid_points,processes)
print("H1 matrix initialized!")

Вот результат обратной трассировки (в Windows)
Current directory: C:\Users\user\Downloads
The mode cutoff is 35
Will now create 12 processes
Generating the matrix for auxilliary state
Now generating H1 integral for (m,n) = (33,33)
Now generating H1 integral for (m,n) = (34,33)
Now generating H1 integral for (m,n) = (33,34)
Now generating H1 integral for (m,n) = (34,34)
multiprocessing.pool.RemoteTraceback:
"""
Traceback (most recent call last):
File "C:\Users\user\anaconda3\envs\strawenv\Lib\multiprocessing\pool.py", line 125, in worker
result = (True, func(*args, **kwds))
^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\anaconda3\envs\strawenv\Lib\multiprocessing\pool.py", line 48, in mapstar
return list(map(*args))
^^^^^^^^^^^^^^^^
File "C:\Users\user\Downloads\example.py", line 48, in fock_mode_H1_partial
return fock_mode_H1(m,n,q,deltat,L)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\Downloads\example.py", line 32, in fock_mode_H1
real_part = mp.quad(
^^^^^^^^
File "C:\Users\user\anaconda3\envs\strawenv\Lib\site-packages\mpmath\calculus\quadrature.py", line 748, in quad
v, err = rule.summation(lambda x: \
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\anaconda3\envs\strawenv\Lib\site-packages\mpmath\calculus\quadrature.py", line 233, in summation
result = self.sum_next(f, nodes, degree, prec, results, verbose)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\anaconda3\envs\strawenv\Lib\site-packages\mpmath\calculus\quadrature.py", line 308, in sum_next
S += self.ctx.fdot((w,f(x)) for (x,w) in nodes)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\anaconda3\envs\strawenv\Lib\site-packages\mpmath\ctx_mp_python.py", line 938, in fdot
for a, b in A:
^
File "C:\Users\user\anaconda3\envs\strawenv\Lib\site-packages\mpmath\calculus\quadrature.py", line 308, in
S += self.ctx.fdot((w,f(x)) for (x,w) in nodes)
^^^^
File "C:\Users\user\anaconda3\envs\strawenv\Lib\site-packages\mpmath\calculus\quadrature.py", line 749, in
rule.summation(lambda y: f(x,y), \
File "C:\Users\user\anaconda3\envs\strawenv\Lib\site-packages\mpmath\calculus\quadrature.py", line 233, in summation
result = self.sum_next(f, nodes, degree, prec, results, verbose)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\anaconda3\envs\strawenv\Lib\site-packages\mpmath\calculus\quadrature.py", line 308, in sum_next
S += self.ctx.fdot((w,f(x)) for (x,w) in nodes)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\anaconda3\envs\strawenv\Lib\site-packages\mpmath\ctx_mp_python.py", line 938, in fdot
for a, b in A:
^
File "C:\Users\user\anaconda3\envs\strawenv\Lib\site-packages\mpmath\calculus\quadrature.py", line 308, in
S += self.ctx.fdot((w,f(x)) for (x,w) in nodes)
^^^^
File "C:\Users\user\anaconda3\envs\strawenv\Lib\site-packages\mpmath\calculus\quadrature.py", line 749, in
rule.summation(lambda y: f(x,y), \
^^^^^^
File "C:\Users\user\Downloads\example.py", line 33, in
lambda x, y: H1_real(x/q, y/q, deltat) * wavefn(m, x) * wavefn(n, y),
^^^^^^^^^^^^
File "C:\Users\user\Downloads\example.py", line 22, in wavefn
return H(n,alpha**(1/2)*x)*mp.exp(-alpha*x**2 /2)*(alpha/mp.pi)**(1/4)/(2**n*factorial(n))**(1/2)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
File "", line 7, in __div__
File "C:\Users\user\anaconda3\envs\strawenv\Lib\site-packages\mpmath\libmp\libmpf.py", line 960, in mpf_div
raise ZeroDivisionError
ZeroDivisionError
"""

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "C:\Users\user\Downloads\example.py", line 78, in
aux_mode_H1 = parallel_map(fock_mode_H1_partial,grid_points,processes)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\Downloads\example.py", line 64, in parallel_map
results = pool.map(f, points)
^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\anaconda3\envs\strawenv\Lib\multiprocessing\pool.py", line 367, in map
return self._map_async(func, iterable, mapstar, chunksize).get()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\anaconda3\envs\strawenv\Lib\multiprocessing\pool.py", line 774, in get
raise self._value
ZeroDivisionError


Подробнее здесь: https://stackoverflow.com/questions/793 ... t-on-linux
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»