Hello,
I apologize in advance for the following question(s). I am not quite sure what the source of my problem is, so I will provide all information that may be necessary:
I am trying to model a cell signaling pathway. It comprises of 25 ODE constraints (over 1500 time points) and ~25 rate coefficients which I am trying to estimate using Pyomo and certain experimental values.
The model is large with ~90,000 variables. I am using Pyomo along with IPOPT and Pardiso (seems to be the fastest solver).
I already have known rate coefficient values that are accurate/feasible. I can enter them into the model in a normal Python script and receive expected values. In this sense, I know that my model is correct.
Now, I have converted this model into a Pyomo script and initialized starting values using the known rate coefficients.
The Pyomo model does not work.
First red flag: from the first iteration, the unscaled constraint violation is ~1e9. I would expect this to be nearly 0, as I have initialized with feasible values. (I also have the "warm start" option on).
Second red flag: After many iterations (~300), I receive values that are completely incorrect. Shouldn't Pyomo just use the values I have initialized with, since they are the closest to convergence feasibly? (If so, the solver should also come to an answer in very few iterations, no?) If I narrow the bounds too much to basically force the answer I want, I receive "restoration failed". Other times, the solver will return rate coefficient values that are correct (due to aggressive bounding), but all other values depending on the rate coefficients will be way off!
Third red flag: The model values shouldn't exactly hit the experimental values. In this case, a reasonable convergence tolerance is ~20. I have set 'tol' to a generous 1e3 just to see if the model will terminate. IPOPT is repeatedly iterating solutions with objective convergence values of ~1e2, but it STILL does not terminate. The only way my model ever terminates is through "restoration failed", "converging to a point of local infeasibility," or by hitting a set max iter. Am I not specifying the convergence tolerance correctly?
This is how I start the solver:
results = opt.solve(disc_instance,tee=True, options={'max_iter': 300, 'acceptable_tol':1e3,'tol': 1e03, 'dual_inf_tol': 1e10, 'compl_inf_tol': 1e-1, 'warm_start_init_point': 'yes', 'linear_solver': "pardiso" 'bound_frac': 1e-20, 'bound_push': 1e-20}, report_timing=True)
Conclusion:
Any suggestion as to what my problem could be? Do I have too many constraints? I don't think I'll be able to decrease the # of constraints much further...
Thank you, any suggestion is greatly appreciated!
Bodhi
PS: I am also open to sharing my code if needed.