我正在使用python 3,最近我能够为FORTRAN求解器连接某些类型的优化问题(感谢堆栈溢出时的eryksun)。
正在出现的小问题是python notebook(jupyter)中的求解器输出没有显示出来。请注意,解算器返回正确的解决方案,但它不显示其进度或任何消息。虽然,如果从julia笔记本调用相同的FORTRAN求解器,我可以在julia笔记本中看到输出。求解器输出/消息只是对stdout的FORTRAN write()语句。
例如,这是朱莉娅笔记本显示的内容:
Hello World from Wrapper!
Iter: 0 Nfun: 1 f1(x) = 24.20000 Eps = 116.4338
Iter: 1 Nfun: 2 f1(x) = 24.20000 Eps = 48.68118
Iter: 2 Nfun: 3 f1(x) = 6.307350 Eps = 7.505725
Iter: 3 Nfun: 4 f1(x) = 6.307350 Eps = 4.854666
Iter: 4 Nfun: 5 f1(x) = 3.580435 Eps = 0.1099409
Iter: 5 Nfun: 6 f1(x) = 3.580435 Eps = 0.8368376E-01
.....
求解器将所需的文件输出编号作为参数。对于FORTRAN,stdout为6。当我从python和julia调用求解器时,我将此参数设置为6。
它似乎与jupyter中的内核(python与julia)有关,但我无法找到一种简单直接的方式来查看此输出,这对于调试和验证目的至关重要。
任何提示或建议?
提前谢谢!
跟进:这是调用FORTRAN求解器的代码 - 它有31个参数。 参数num_outcalls(设置为6)和disp(对于详细模式设置为3)。 FORTRAN是加载的fortran库“solver_lib.so”
retval = FORTRAN.c_mpbngc(OptProb.dim.ctypes._as_parameter_, \
OptProb.X.ctypes._as_parameter_, \
OptProb.Tx.ctypes._as_parameter_, \
OptProb.Blox.ctypes._as_parameter_, \
OptProb.Bupx.ctypes._as_parameter_, \
OptProb.num_objfunc.ctypes._as_parameter_, \
ct.byref(ct.c_int(OptProb.num_genconstr)), \
ct.byref(ct.c_int(OptProb.num_linconstr)), \
OptProb.Tlinconstr.ctypes._as_parameter_, \
OptProb.Blo_linconstr.ctypes._as_parameter_, \
OptProb.Bup_linconstr.ctypes._as_parameter_, \
OptProb.CClinconstr.ctypes._as_parameter_, \
OptProb.F.ctypes._as_parameter_, \
OptProb.ptrfuncFASGTYPE(OptProb.ptrObjFunc), \
ct.byref(ct.c_double(OptProb.r_linsear)), \
ct.byref(ct.c_int(OptProb.max_numcallsobjfun_linsear)),\
OptProb.Gam.ctypes._as_parameter_, \
ct.byref(ct.c_double(OptProb.tol)), \
ct.byref(ct.c_double(OptProb.tol_constrfeas)), \
ct.byref(ct.c_int(OptProb.max_numsubgrads)), \
OptProb.num_iters.ctypes._as_parameter_, \
OptProb.max_numcallsobjfun.ctypes._as_parameter_, \
OptProb.num_outcalls.ctypes._as_parameter_, \
OptProb.disp.ctypes._as_parameter_, \
OptProb.err_type.ctypes._as_parameter_, \
OptProb.IWORK.ctypes._as_parameter_, \
ct.byref(ct.c_int(OptProb.LIWORK)), \
OptProb.WORK.ctypes._as_parameter_, \
ct.byref(ct.c_int(OptProb.LWORK)), \
OptProb.ptrfuncFASGTYPE(OptProb.ptrObjFunc), \
OptProb.USER.ctypes._as_parameter_)