minimize does not stop
Dear Scipy devs and users : I wrote a program using scipy.optimize.minimize, but the function does not stop no matter how I tweak the parameters and options. Any ideas on how to fix this ? [cid:fbab36b8-539b-4950-a0b3-e00b561c5f21] In the procedure of running the program, there was no information printed to the screen, and the maxiter and ftol and callback do not work. Bravo ! Hao Wang
Here is the full list of the code (minimize function doesn't work) : from scipy.optimize import minimize import numpy as np import random def marx_reallocate(x_data): x_len = int(x_data[-2]) y_len = int(x_data[-1]) p_list = x_data[x_len+y_len:-2] print('marx_reallocate') x = p_list[0:x_len] y = p_list[x_len:x_len+y_len] a = x_data[0:x_len] b = x_data[x_len:x_len+y_len] sum_val = 0.0 for x_ind_0 in range(0, x.__len__()-1): for x_ind_1 in range(x_ind_0+1, x.__len__()): sum_val += (x[x_ind_0] - a[x_ind_0] - x[x_ind_1] + a[x_ind_1])**2 for x_ind in range(0, x.__len__()): for y_ind in range(0, y.__len__()): sum_val += (x[x_ind] - a[x_ind] - y[y_ind] - b[y_ind])**2 for y_ind_0 in range(0, y.__len__()-1): for y_ind_1 in range(y_ind_0+1, y.__len__()): sum_val += (y[y_ind_0] + b[y_ind_0] - y[y_ind_1] - b[y_ind_1])**2 print(sum_val) return sum_val def cons_0(x_data): y_len = int(x_data[-1]) x_len = int(x_data[-2]) p_list = x_data[x_len+y_len:-2] return sum(np.array(p_list[:x_len])) - sum(np.array(p_list[x_len:x_len+y_len])) def cons_1(x_data): y_len = int(x_data[-1]) x_len = int(x_data[-2]) a_list = x_data[:x_len] x_list = x_data[x_len:x_len+y_len] flag = 1 #a_list = p_list[0] #x_list = args[0] for a_val, x_val in zip(a_list, x_list): if a_val > x_val - 1e-7: flag = 0 return flag return flag def cons_2(x_data): y_len = int(x_data[-1]) x_len = int(x_data[-2]) flag = 1 b_list = x_data[x_len:x_len+y_len] y_list = x_data[2*x_len+y_len:2*(x_len+y_len)] for b_val, y_val in zip(b_list, y_list): if b_val > y_val - 1e-7: flag = 0 return flag return flag def cons_3(x_data): y_len = int(x_data[-1]) x_len = int(x_data[-2]) args = x_data[:x_len+y_len] p_list = x_data[x_len+y_len: 2*(x_len+y_len)] args_0 = args[:x_len] args_1 = args[x_len:x_len+y_len] p_list_0 = p_list[:x_len] p_list_1 = p_list[x_len:x_len+y_len] return sum( np.array(p_list_0) - args_0 ) + sum( np.array(p_list_1) - args_1 ) - 2.5*(x_len+y_len)*2.0 def compute_Marx(p_list): #print('Flag 0') x_list = [] y_list = [] for p_id in range(0, p_list[0].__len__()): x_list.append(random.random() * 5.0) for p_id in range(0, p_list[1].__len__()): y_list.append(random.random() * 5.0) #print('Flag 1') x0_data = x_list[:] x0_data.extend(y_list) cons = ({'type' : 'eq', 'fun' : cons_0}, {'type' : 'ineq', 'fun' : cons_1}, {'type' : 'ineq', 'fun' : cons_2}, {'type' : 'eq', 'fun' : cons_3} ) #print('Flag 2') #arg_tuple = (p_list, x_list.__len__(), y_list.__len__()) x0_data.extend(p_list[0]) x0_data.extend(p_list[1]) x0_data.extend([x_list.__len__(), y_list.__len__()]) #print(x0_data) res = minimize(fun=marx_reallocate, x0=x0_data, method='SLSQP', tol=1e-4, constraints=cons, options={"maxiter":20, "disp":True}) #marx_reallocate(x0, (p_list, x_list.__len__(), y_list.__len__())) print(res) if __name__ == '__main__': item_rank_list_large = [] item_rank_list_small = [] with open('LDOS.csv', 'r') as FILE: for line in FILE: data_rec = line.strip().split(',') user_id = int(data_rec[1]) item_id = int(data_rec[2]) rating_val = float(data_rec[3]) if rating_val > 2.5-1e-7: item_rank_list_large.append(rating_val) else: item_rank_list_small.append(rating_val) p_list = [] p_list.append(np.array(item_rank_list_large)) p_list.append(np.array(item_rank_list_small)) p_list = np.array(p_list, dtype='object') compute_Marx(p_list) ________________________________ From: Andrew Nelson <andyfaff@gmail.com> Sent: Saturday, July 16, 2022 8:46 PM To: SciPy Users List <scipy-user@python.org> Subject: [SciPy-User] Re: minimize does not stop On Sun, 17 Jul 2022 at 09:24, Hao Wang <haow85@live.com<mailto:haow85@live.com>> wrote: [cid:18209d4de2b9fb5208b1] Would it be possible to provide a minimal working example so we could help you further?
Unfortunately that is not a MWE, firstly because the example is a little bit convoluted, and secondly because it's using data from a file that we don't have. On Sun, 17 Jul 2022 at 18:24, Hao Wang <haow85@live.com> wrote:
Here is the full list of the code (minimize function doesn't work) :
from scipy.optimize import minimize import numpy as np import random
def marx_reallocate(x_data):
x_len = int(x_data[-2]) y_len = int(x_data[-1])
p_list = x_data[x_len+y_len:-2]
print('marx_reallocate')
x = p_list[0:x_len] y = p_list[x_len:x_len+y_len]
a = x_data[0:x_len] b = x_data[x_len:x_len+y_len]
sum_val = 0.0
for x_ind_0 in range(0, x.__len__()-1): for x_ind_1 in range(x_ind_0+1, x.__len__()): sum_val += (x[x_ind_0] - a[x_ind_0] - x[x_ind_1] + a[x_ind_1])**2
for x_ind in range(0, x.__len__()): for y_ind in range(0, y.__len__()): sum_val += (x[x_ind] - a[x_ind] - y[y_ind] - b[y_ind])**2
for y_ind_0 in range(0, y.__len__()-1): for y_ind_1 in range(y_ind_0+1, y.__len__()): sum_val += (y[y_ind_0] + b[y_ind_0] - y[y_ind_1] - b[y_ind_1])**2
print(sum_val)
return sum_val
def cons_0(x_data):
y_len = int(x_data[-1]) x_len = int(x_data[-2])
p_list = x_data[x_len+y_len:-2]
return sum(np.array(p_list[:x_len])) - sum(np.array(p_list[x_len:x_len+y_len]))
def cons_1(x_data):
y_len = int(x_data[-1]) x_len = int(x_data[-2])
a_list = x_data[:x_len] x_list = x_data[x_len:x_len+y_len]
flag = 1 #a_list = p_list[0] #x_list = args[0]
for a_val, x_val in zip(a_list, x_list): if a_val > x_val - 1e-7: flag = 0 return flag
return flag
def cons_2(x_data):
y_len = int(x_data[-1]) x_len = int(x_data[-2])
flag = 1
b_list = x_data[x_len:x_len+y_len] y_list = x_data[2*x_len+y_len:2*(x_len+y_len)]
for b_val, y_val in zip(b_list, y_list): if b_val > y_val - 1e-7: flag = 0 return flag
return flag
def cons_3(x_data):
y_len = int(x_data[-1]) x_len = int(x_data[-2])
args = x_data[:x_len+y_len] p_list = x_data[x_len+y_len: 2*(x_len+y_len)]
args_0 = args[:x_len] args_1 = args[x_len:x_len+y_len]
p_list_0 = p_list[:x_len] p_list_1 = p_list[x_len:x_len+y_len]
return sum( np.array(p_list_0) - args_0 ) + sum( np.array(p_list_1) - args_1 ) - 2.5*(x_len+y_len)*2.0
def compute_Marx(p_list):
#print('Flag 0')
x_list = [] y_list = []
for p_id in range(0, p_list[0].__len__()): x_list.append(random.random() * 5.0)
for p_id in range(0, p_list[1].__len__()): y_list.append(random.random() * 5.0)
#print('Flag 1')
x0_data = x_list[:] x0_data.extend(y_list)
cons = ({'type' : 'eq', 'fun' : cons_0}, {'type' : 'ineq', 'fun' : cons_1}, {'type' : 'ineq', 'fun' : cons_2}, {'type' : 'eq', 'fun' : cons_3} )
#print('Flag 2')
#arg_tuple = (p_list, x_list.__len__(), y_list.__len__())
x0_data.extend(p_list[0]) x0_data.extend(p_list[1]) x0_data.extend([x_list.__len__(), y_list.__len__()])
#print(x0_data)
res = minimize(fun=marx_reallocate, x0=x0_data, method='SLSQP', tol=1e-4, constraints=cons, options={"maxiter":20, "disp":True})
#marx_reallocate(x0, (p_list, x_list.__len__(), y_list.__len__()))
print(res)
if __name__ == '__main__':
item_rank_list_large = [] item_rank_list_small = []
with open('LDOS.csv', 'r') as FILE: for line in FILE: data_rec = line.strip().split(',') user_id = int(data_rec[1]) item_id = int(data_rec[2]) rating_val = float(data_rec[3]) if rating_val > 2.5-1e-7: item_rank_list_large.append(rating_val) else: item_rank_list_small.append(rating_val)
p_list = [] p_list.append(np.array(item_rank_list_large)) p_list.append(np.array(item_rank_list_small)) p_list = np.array(p_list, dtype='object')
compute_Marx(p_list)
------------------------------ *From:* Andrew Nelson <andyfaff@gmail.com> *Sent:* Saturday, July 16, 2022 8:46 PM *To:* SciPy Users List <scipy-user@python.org> *Subject:* [SciPy-User] Re: minimize does not stop
On Sun, 17 Jul 2022 at 09:24, Hao Wang <haow85@live.com> wrote:
Would it be possible to provide a minimal working example so we could help you further?
_______________________________________________ SciPy-User mailing list -- scipy-user@python.org To unsubscribe send an email to scipy-user-leave@python.org https://mail.python.org/mailman3/lists/scipy-user.python.org/ Member address: andyfaff@gmail.com
-- _____________________________________ Dr. Andrew Nelson _____________________________________
Dear Andrew, Attached is the dataset. Please let me know if you can make it work. Bravo ! Hao Wang ________________________________ From: Andrew Nelson <andyfaff@gmail.com> Sent: Sunday, July 17, 2022 6:53 PM To: SciPy Users List <scipy-user@python.org> Subject: [SciPy-User] Re: minimize does not stop Unfortunately that is not a MWE, firstly because the example is a little bit convoluted, and secondly because it's using data from a file that we don't have. On Sun, 17 Jul 2022 at 18:24, Hao Wang <haow85@live.com<mailto:haow85@live.com>> wrote: Here is the full list of the code (minimize function doesn't work) : from scipy.optimize import minimize import numpy as np import random def marx_reallocate(x_data): x_len = int(x_data[-2]) y_len = int(x_data[-1]) p_list = x_data[x_len+y_len:-2] print('marx_reallocate') x = p_list[0:x_len] y = p_list[x_len:x_len+y_len] a = x_data[0:x_len] b = x_data[x_len:x_len+y_len] sum_val = 0.0 for x_ind_0 in range(0, x.__len__()-1): for x_ind_1 in range(x_ind_0+1, x.__len__()): sum_val += (x[x_ind_0] - a[x_ind_0] - x[x_ind_1] + a[x_ind_1])**2 for x_ind in range(0, x.__len__()): for y_ind in range(0, y.__len__()): sum_val += (x[x_ind] - a[x_ind] - y[y_ind] - b[y_ind])**2 for y_ind_0 in range(0, y.__len__()-1): for y_ind_1 in range(y_ind_0+1, y.__len__()): sum_val += (y[y_ind_0] + b[y_ind_0] - y[y_ind_1] - b[y_ind_1])**2 print(sum_val) return sum_val def cons_0(x_data): y_len = int(x_data[-1]) x_len = int(x_data[-2]) p_list = x_data[x_len+y_len:-2] return sum(np.array(p_list[:x_len])) - sum(np.array(p_list[x_len:x_len+y_len])) def cons_1(x_data): y_len = int(x_data[-1]) x_len = int(x_data[-2]) a_list = x_data[:x_len] x_list = x_data[x_len:x_len+y_len] flag = 1 #a_list = p_list[0] #x_list = args[0] for a_val, x_val in zip(a_list, x_list): if a_val > x_val - 1e-7: flag = 0 return flag return flag def cons_2(x_data): y_len = int(x_data[-1]) x_len = int(x_data[-2]) flag = 1 b_list = x_data[x_len:x_len+y_len] y_list = x_data[2*x_len+y_len:2*(x_len+y_len)] for b_val, y_val in zip(b_list, y_list): if b_val > y_val - 1e-7: flag = 0 return flag return flag def cons_3(x_data): y_len = int(x_data[-1]) x_len = int(x_data[-2]) args = x_data[:x_len+y_len] p_list = x_data[x_len+y_len: 2*(x_len+y_len)] args_0 = args[:x_len] args_1 = args[x_len:x_len+y_len] p_list_0 = p_list[:x_len] p_list_1 = p_list[x_len:x_len+y_len] return sum( np.array(p_list_0) - args_0 ) + sum( np.array(p_list_1) - args_1 ) - 2.5*(x_len+y_len)*2.0 def compute_Marx(p_list): #print('Flag 0') x_list = [] y_list = [] for p_id in range(0, p_list[0].__len__()): x_list.append(random.random() * 5.0) for p_id in range(0, p_list[1].__len__()): y_list.append(random.random() * 5.0) #print('Flag 1') x0_data = x_list[:] x0_data.extend(y_list) cons = ({'type' : 'eq', 'fun' : cons_0}, {'type' : 'ineq', 'fun' : cons_1}, {'type' : 'ineq', 'fun' : cons_2}, {'type' : 'eq', 'fun' : cons_3} ) #print('Flag 2') #arg_tuple = (p_list, x_list.__len__(), y_list.__len__()) x0_data.extend(p_list[0]) x0_data.extend(p_list[1]) x0_data.extend([x_list.__len__(), y_list.__len__()]) #print(x0_data) res = minimize(fun=marx_reallocate, x0=x0_data, method='SLSQP', tol=1e-4, constraints=cons, options={"maxiter":20, "disp":True}) #marx_reallocate(x0, (p_list, x_list.__len__(), y_list.__len__())) print(res) if __name__ == '__main__': item_rank_list_large = [] item_rank_list_small = [] with open('LDOS.csv', 'r') as FILE: for line in FILE: data_rec = line.strip().split(',') user_id = int(data_rec[1]) item_id = int(data_rec[2]) rating_val = float(data_rec[3]) if rating_val > 2.5-1e-7: item_rank_list_large.append(rating_val) else: item_rank_list_small.append(rating_val) p_list = [] p_list.append(np.array(item_rank_list_large)) p_list.append(np.array(item_rank_list_small)) p_list = np.array(p_list, dtype='object') compute_Marx(p_list) ________________________________ From: Andrew Nelson <andyfaff@gmail.com<mailto:andyfaff@gmail.com>> Sent: Saturday, July 16, 2022 8:46 PM To: SciPy Users List <scipy-user@python.org<mailto:scipy-user@python.org>> Subject: [SciPy-User] Re: minimize does not stop On Sun, 17 Jul 2022 at 09:24, Hao Wang <haow85@live.com<mailto:haow85@live.com>> wrote: [cid:1820e92884e9fb5208b1] Would it be possible to provide a minimal working example so we could help you further? _______________________________________________ SciPy-User mailing list -- scipy-user@python.org<mailto:scipy-user@python.org> To unsubscribe send an email to scipy-user-leave@python.org<mailto:scipy-user-leave@python.org> https://mail.python.org/mailman3/lists/scipy-user.python.org/ Member address: andyfaff@gmail.com<mailto:andyfaff@gmail.com> -- _____________________________________ Dr. Andrew Nelson _____________________________________
Does anyone have any idea on how to fix this problem ? ________________________________ From: Hao Wang <haow85@live.com> Sent: Sunday, July 17, 2022 10:05 PM To: SciPy Users List <scipy-user@python.org> Subject: [SciPy-User] Re: minimize does not stop Dear Andrew, Attached is the dataset. Please let me know if you can make it work. Bravo ! Hao Wang ________________________________ From: Andrew Nelson <andyfaff@gmail.com> Sent: Sunday, July 17, 2022 6:53 PM To: SciPy Users List <scipy-user@python.org> Subject: [SciPy-User] Re: minimize does not stop Unfortunately that is not a MWE, firstly because the example is a little bit convoluted, and secondly because it's using data from a file that we don't have. On Sun, 17 Jul 2022 at 18:24, Hao Wang <haow85@live.com<mailto:haow85@live.com>> wrote: Here is the full list of the code (minimize function doesn't work) : from scipy.optimize import minimize import numpy as np import random def marx_reallocate(x_data): x_len = int(x_data[-2]) y_len = int(x_data[-1]) p_list = x_data[x_len+y_len:-2] print('marx_reallocate') x = p_list[0:x_len] y = p_list[x_len:x_len+y_len] a = x_data[0:x_len] b = x_data[x_len:x_len+y_len] sum_val = 0.0 for x_ind_0 in range(0, x.__len__()-1): for x_ind_1 in range(x_ind_0+1, x.__len__()): sum_val += (x[x_ind_0] - a[x_ind_0] - x[x_ind_1] + a[x_ind_1])**2 for x_ind in range(0, x.__len__()): for y_ind in range(0, y.__len__()): sum_val += (x[x_ind] - a[x_ind] - y[y_ind] - b[y_ind])**2 for y_ind_0 in range(0, y.__len__()-1): for y_ind_1 in range(y_ind_0+1, y.__len__()): sum_val += (y[y_ind_0] + b[y_ind_0] - y[y_ind_1] - b[y_ind_1])**2 print(sum_val) return sum_val def cons_0(x_data): y_len = int(x_data[-1]) x_len = int(x_data[-2]) p_list = x_data[x_len+y_len:-2] return sum(np.array(p_list[:x_len])) - sum(np.array(p_list[x_len:x_len+y_len])) def cons_1(x_data): y_len = int(x_data[-1]) x_len = int(x_data[-2]) a_list = x_data[:x_len] x_list = x_data[x_len:x_len+y_len] flag = 1 #a_list = p_list[0] #x_list = args[0] for a_val, x_val in zip(a_list, x_list): if a_val > x_val - 1e-7: flag = 0 return flag return flag def cons_2(x_data): y_len = int(x_data[-1]) x_len = int(x_data[-2]) flag = 1 b_list = x_data[x_len:x_len+y_len] y_list = x_data[2*x_len+y_len:2*(x_len+y_len)] for b_val, y_val in zip(b_list, y_list): if b_val > y_val - 1e-7: flag = 0 return flag return flag def cons_3(x_data): y_len = int(x_data[-1]) x_len = int(x_data[-2]) args = x_data[:x_len+y_len] p_list = x_data[x_len+y_len: 2*(x_len+y_len)] args_0 = args[:x_len] args_1 = args[x_len:x_len+y_len] p_list_0 = p_list[:x_len] p_list_1 = p_list[x_len:x_len+y_len] return sum( np.array(p_list_0) - args_0 ) + sum( np.array(p_list_1) - args_1 ) - 2.5*(x_len+y_len)*2.0 def compute_Marx(p_list): #print('Flag 0') x_list = [] y_list = [] for p_id in range(0, p_list[0].__len__()): x_list.append(random.random() * 5.0) for p_id in range(0, p_list[1].__len__()): y_list.append(random.random() * 5.0) #print('Flag 1') x0_data = x_list[:] x0_data.extend(y_list) cons = ({'type' : 'eq', 'fun' : cons_0}, {'type' : 'ineq', 'fun' : cons_1}, {'type' : 'ineq', 'fun' : cons_2}, {'type' : 'eq', 'fun' : cons_3} ) #print('Flag 2') #arg_tuple = (p_list, x_list.__len__(), y_list.__len__()) x0_data.extend(p_list[0]) x0_data.extend(p_list[1]) x0_data.extend([x_list.__len__(), y_list.__len__()]) #print(x0_data) res = minimize(fun=marx_reallocate, x0=x0_data, method='SLSQP', tol=1e-4, constraints=cons, options={"maxiter":20, "disp":True}) #marx_reallocate(x0, (p_list, x_list.__len__(), y_list.__len__())) print(res) if __name__ == '__main__': item_rank_list_large = [] item_rank_list_small = [] with open('LDOS.csv', 'r') as FILE: for line in FILE: data_rec = line.strip().split(',') user_id = int(data_rec[1]) item_id = int(data_rec[2]) rating_val = float(data_rec[3]) if rating_val > 2.5-1e-7: item_rank_list_large.append(rating_val) else: item_rank_list_small.append(rating_val) p_list = [] p_list.append(np.array(item_rank_list_large)) p_list.append(np.array(item_rank_list_small)) p_list = np.array(p_list, dtype='object') compute_Marx(p_list) ________________________________ From: Andrew Nelson <andyfaff@gmail.com<mailto:andyfaff@gmail.com>> Sent: Saturday, July 16, 2022 8:46 PM To: SciPy Users List <scipy-user@python.org<mailto:scipy-user@python.org>> Subject: [SciPy-User] Re: minimize does not stop On Sun, 17 Jul 2022 at 09:24, Hao Wang <haow85@live.com<mailto:haow85@live.com>> wrote: [cid:1820e92884e9fb5208b1] Would it be possible to provide a minimal working example so we could help you further? _______________________________________________ SciPy-User mailing list -- scipy-user@python.org<mailto:scipy-user@python.org> To unsubscribe send an email to scipy-user-leave@python.org<mailto:scipy-user-leave@python.org> https://mail.python.org/mailman3/lists/scipy-user.python.org/ Member address: andyfaff@gmail.com<mailto:andyfaff@gmail.com> -- _____________________________________ Dr. Andrew Nelson _____________________________________
participants (2)
-
Andrew Nelson -
Hao Wang