3
$\begingroup$

I am trying to solve a nonlinear problem with only a set of continuous variables (where the nonlinearity stems from negative inconsistent - across differently indexed variables - large powers), e.g., one variable has a power -0.2 and another -3.5. I used Ipopt through Pyomo and received the below output. The problem was solved by Knitro through AMPL years ago, and the objective function values (from Ipopt and Knitro) are not any close.

1.What do you think is happening here? Why does it converge to an infeasible point and report it as a result?

2.Is there any alternative solver I could try within Pyomo?

Ipopt 3.11.1: 

****************************************************************************** This program contains Ipopt, a library for large-scale nonlinear optimization.  Ipopt is released as open source code under the Eclipse Public License (EPL).
         For more information visit http://projects.coin-or.org/Ipopt
******************************************************************************

NOTE: You are using Ipopt by default with the MUMPS linear solver.
      Other linear solvers might be more efficient (see Ipopt documentation).


This is Ipopt version 3.11.1, running with linear solver mumps.

Number of nonzeros in equality constraint Jacobian...:        0 Number of nonzeros in inequality constraint Jacobian.:  2858853 Number of nonzeros in Lagrangian Hessian.............:    31110

Total number of variables............................:     9677
                     variables with only lower bounds:     9677
                variables with lower and upper bounds:        0
                     variables with only upper bounds:        0 Total number of equality constraints.................:        0 Total number of inequality constraints...............:  1559235
        inequality constraints with only lower bounds:   523080    inequality constraints with lower and upper bounds:        0
        inequality constraints with only upper bounds:  1036155

iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls    0 -1.7292478e+006 1.51e+005 9.89e+000  -1.0 0.00e+000 
-  0.00e+000 0.00e+000   0    1 -1.7295299e+006 1.50e+005 1.12e+001  -1.0 6.06e+002   0.0 9.47e-004 3.57e-003f  1    2 -1.7314126e+006 1.49e+005 1.14e+001  -1.0 4.52e+004    -  1.33e-003 9.59e-003f  1    3 -1.7314994e+006 1.49e+005 1.17e+001  -1.0 5.97e+002  -0.5 6.36e-003 1.37e-003f  1    4 -1.7323450e+006 1.47e+005 1.68e+001  -1.0 9.65e+002  -1.0 4.05e-003 9.91e-003f  1    5 -1.7324589e+006 1.47e+005 1.66e+001  -1.0 2.38e+003  -1.4 6.32e-003 1.51e-003f  1    6 -1.7352921e+006 1.45e+005 1.63e+001  -1.0 4.27e+004    -  5.78e-003 1.45e-002f  1    7 -1.7358416e+006 1.44e+005 1.63e+001  -1.0 1.19e+004    -  6.52e-003 5.48e-003f  1    8 -1.7372923e+006 1.42e+005 1.60e+001  -1.0 6.27e+003    -  6.59e-003 1.45e-002f  1    9 -1.7378360e+006 1.41e+005 1.59e+001  -1.0 1.85e+003    -  3.87e-003 8.04e-003f  1 iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls   10
-1.7382291e+006 1.40e+005 1.58e+001  -1.0 4.44e+003    -  2.21e-003 6.91e-003f  1   11 -1.7387577e+006 1.38e+005 1.56e+001  -1.0 5.04e+003    -  1.02e-002 1.01e-002f  1   12 -1.7389229e+006 1.38e+005 1.55e+001  -1.0 1.65e+003    -  5.40e-003 5.82e-003f  1   13 -1.7393875e+006 1.35e+005 1.53e+001  -1.0 1.51e+003    -  6.59e-003 1.50e-002f  1   14 -1.7393109e+006 1.34e+005 1.64e+001  -1.0 1.26e+003    -  1.41e-002 8.77e-003f  1   15 -1.7391161e+006 1.33e+005 1.68e+001  -1.0 8.47e+002    -  9.61e-003 6.09e-003f  1   16 -1.7387181e+006 1.32e+005 1.67e+001  -1.0 6.72e+002    -  9.61e-003 9.63e-003f  1   17 -1.7382631e+006 1.31e+005 1.67e+001  -1.0 4.98e+002    -  9.57e-003 6.71e-003f  1   18 -1.7381868e+006 1.31e+005 3.53e+001  -1.0 4.09e+002    -  3.06e-003 8.33e-004f  1   19 -1.7371899e+006 1.30e+005 1.90e+001  -1.0 3.96e+002    -  1.72e-004 1.27e-002f  1 iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls   20 -1.7362542e+006 1.29e+005
1.63e+001  -1.0 3.20e+002    -  8.66e-003 7.16e-003h  1   21 -1.7348790e+006 1.27e+005 3.86e+001  -1.0 2.86e+002    -  7.04e-004 8.64e-003h  1   22 -1.7336666e+006 1.27e+005 1.87e+001  -1.0 2.91e+002    -  1.38e-002 5.78e-003h  1   23 -1.7317366e+006 1.26e+005 2.15e+001  -1.0 3.49e+002    -  8.14e-003 8.01e-003h  1   24 -1.7295260e+006 1.25e+005 2.49e+001  -1.0 3.51e+002    -  7.46e-003 7.30e-003h  1   25 -1.7276058e+006 1.24e+005 2.73e+001  -1.0 3.98e+002    -  7.61e-003 5.05e-003h  1   26 -1.7249847e+006 1.23e+005 3.19e+001  -1.0 4.44e+002    -  7.48e-003 5.94e-003h  1   27 -1.7222735e+006 1.23e+005 5.99e+001  -1.0 4.43e+002    -  7.50e-003 4.96e-003h  1   28 -1.7190370e+006 1.22e+005 6.60e+001  -1.0 4.97e+002    -  5.17e-003 4.82e-003h  1   29 -1.7166933e+006 1.22e+005 1.31e+002  -1.0 5.99e+002    -  4.85e-003 2.68e-003h  1 iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls   30 -1.7156839e+006 1.22e+005 2.21e+002 
-1.0 6.57e+002    -  2.96e-003 9.50e-004h  1   31 -1.7136458e+006 1.22e+005 1.39e+002  -1.0 7.14e+002    -  2.78e-004 1.79e-003h  1   32 -1.7111915e+006 1.21e+005 1.68e+002  -1.0 8.48e+002    -  2.23e-003 1.85e-003h  1   33 -1.7094299e+006 1.21e+005 8.00e+001  -1.0 1.07e+003    -  3.63e-004 1.07e-003h  1   34 -1.7081456e+006 1.21e+005 5.96e+002  -1.0 1.28e+003    -  3.52e-003 6.71e-004h  1   35 -1.7045886e+006 1.21e+005 5.30e+002  -1.0 1.49e+003    -  1.41e-003 1.66e-003h  1   36 -1.7029935e+006 1.21e+005 1.14e+003  -1.0 2.20e+003    -  1.42e-003 5.05e-004h  1   37 -1.7015932e+006 1.21e+005 1.64e+003  -1.0 2.62e+003    -  7.80e-004 3.59e-004h  1   38 -1.6998463e+006 1.21e+005 2.10e+003  -1.0 3.33e+003    -  5.86e-004 3.67e-004h  1   39 -1.6985938e+006 1.21e+005 4.33e+003  -1.0 5.07e+003    -  6.34e-004 1.96e-004h  1 iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls   40 -1.6970693e+006 1.21e+005 4.61e+003  -1.0 6.92e+003    - 
2.03e-004 1.80e-004h  1   41 -1.6967167e+006 1.21e+005 3.38e+003  -1.0 1.08e+004    -  1.86e-006 2.98e-005h  1   42 -1.6964594e+006 1.21e+005 3.43e+003  -1.0 1.24e+004    -  2.16e-005 2.09e-005h  1   43 -1.6960265e+006 1.21e+005 1.19e+004  -1.0 1.42e+004    -  1.22e-004 3.32e-005h  1   44 -1.6953687e+006 1.21e+005 1.79e+004  -1.0 2.12e+004    -  6.15e-005 3.78e-005h  1   45 -1.6951933e+006 1.21e+005 6.56e+004  -1.0 3.49e+004    -  5.04e-005 1.18e-005h  1   46r-1.6951933e+006 1.21e+005 1.00e+003   5.1 0.00e+000    -  0.00e+000 3.94e-007R  5   47r-1.7007303e+006 1.21e+005 1.04e+003   5.1 6.46e+007    -  3.82e-006
4.08e-005f  1   48r-1.7031261e+006 1.20e+005 1.03e+003   3.0 1.79e+006    -  2.63e-004 4.95e-004f  1   49r-1.7041104e+006 1.19e+005 1.04e+003   3.0 4.53e+006    -  9.16e-004 2.06e-004f  1 iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls   50r-1.7095152e+006 1.17e+005 1.04e+003   3.0 3.87e+006    -  2.00e-003
8.75e-004f  1   51r-1.8866957e+006 3.02e+005 1.04e+003   3.0 1.17e+007    -  4.26e-004 4.82e-003f  1   52 -1.8867312e+006 3.02e+005 2.03e+002  -1.0 3.59e+003   0.8 3.47e-005 3.57e-005f  1   53 -1.8867829e+006 3.02e+005 2.03e+002  -1.0 3.18e+003   0.3 3.54e-005 5.02e-005f  1   54 -1.8870483e+006 3.02e+005 2.03e+002  -1.0 2.36e+003  -0.2 6.12e-005 2.51e-004f  1   55 -1.8871681e+006 3.02e+005 2.03e+002  -1.0 2.18e+003   0.3 7.68e-005 1.13e-004f  1   56 -1.8876126e+006 3.02e+005 2.02e+002  -1.0 1.78e+003  -0.2 9.65e-005 4.12e-004f  1   57 -1.8880735e+006 3.02e+005 2.02e+002  -1.0 1.70e+003  -0.7 2.72e-004 4.09e-004f  1   58 -1.8898043e+006 3.02e+005 2.02e+002  -1.0 1.55e+003  -1.2 3.55e-004 1.36e-003f  1   59 -1.8908320e+006 3.02e+005 2.02e+002  -1.0 2.25e+004    -  5.52e-005 9.04e-004h  1 iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls   60 -1.8926835e+006 3.02e+005
2.45e+002  -1.0 1.42e+004    -  5.79e-004 1.16e-003f  1   61 -1.8937447e+006 3.01e+005 2.42e+002  -1.0 1.56e+003  -0.7 4.39e-004 6.61e-004f  1   62 -1.8950149e+006 3.01e+005 2.35e+002  -1.0 2.08e+003  -1.2 3.12e-004 7.35e-004f  1   63 -1.8965425e+006 3.01e+005 2.37e+002  -1.0 2.10e+003    -  4.57e-004 8.70e-004f  1   64 -1.8969693e+006 3.01e+005 2.37e+002  -1.0 2.11e+003    -  4.30e-004 2.38e-004f  1   65 -1.8984479e+006 3.01e+005 2.36e+002  -1.0 2.20e+003    -  5.09e-004 8.38e-004f  1   66 -1.8995440e+006 3.01e+005 2.36e+002  -1.0 2.45e+003    -  5.10e-004 6.42e-004f  1   67 -1.9001378e+006 3.01e+005 2.36e+002  -1.0 2.17e+003    -  5.15e-004 3.66e-004f  1   68 -1.9009338e+006 3.00e+005 2.36e+002  -1.0 2.08e+003    -  4.37e-004 5.19e-004f  1   69 -1.9021128e+006 3.00e+005 2.35e+002  -1.0 1.99e+003    -  5.58e-004 7.98e-004f  1 iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls   70 -1.9026180e+006 3.00e+005 2.35e+002 
-1.0 2.06e+003    -  1.47e-004 3.51e-004f  1   71 -1.9027830e+006 3.00e+005 2.35e+002  -1.0 2.11e+003    -  1.26e-005 1.14e-004f  1   72 -1.9034292e+006 3.00e+005 2.35e+002  -1.0 2.13e+003    -  7.58e-004 4.36e-004f  1   73 -1.9042225e+006 3.00e+005 2.35e+002  -1.0 2.34e+003    -  5.04e-004 5.31e-004f  1   74 -1.9046505e+006 3.00e+005 2.35e+002  -1.0 2.66e+003    -  3.77e-004 2.73e-004f  1   75 -1.9050938e+006 3.00e+005 2.35e+002  -1.0 2.91e+003    -  2.50e-005 2.72e-004f  1   76 -1.9056574e+006 3.00e+005 2.35e+002  -1.0 3.13e+003    -  5.85e-004 3.24e-004f  1   77 -1.9061540e+006 3.00e+005 2.35e+002  -1.0 4.01e+003    -  3.37e-004 2.66e-004f  1   78 -1.9067267e+006 3.00e+005 2.35e+002  -1.0 4.58e+003    -  2.77e-004 2.76e-004f  1   79 -1.9070506e+006 3.00e+005 2.35e+002  -1.0 5.35e+003    -  1.82e-004 1.33e-004f  1 iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls   80 -1.9073483e+006 3.00e+005 2.35e+002  -1.0 6.37e+003    - 
2.16e-004 1.08e-004f  1   81 -1.9077093e+006 3.00e+005 2.35e+002  -1.0 7.23e+003    -  1.26e-004 1.14e-004f  1   82 -1.9080169e+006 3.00e+005 2.35e+002  -1.0 9.03e+003    -  1.05e-004 7.96e-005f  1   83 -1.9082633e+006 3.00e+005 2.35e+002  -1.0 1.14e+004    -  2.35e-005 5.10e-005f  1   84 -1.9083384e+006 3.00e+005 2.35e+002  -1.0 1.46e+004    -  2.26e-006 1.24e-005f  1   85 -1.9084228e+006 3.00e+005 8.72e+002  -1.0 1.60e+004    -  7.15e-005 1.27e-005f  1   86 -1.9088284e+006 3.00e+005 2.36e+002  -1.0 1.77e+004    -  2.43e-005 5.40e-005f  1   87 -1.9088744e+006 3.00e+005 2.43e+003  -1.0 4.03e+004    -  1.46e-005 2.72e-006f  1   88 -1.9090741e+006 3.00e+005 1.66e+003  -1.0 4.76e+004    -  7.37e-006 9.93e-006f  1   89r-1.9090741e+006 3.00e+005 1.00e+003   5.0 0.00e+000    -  0.00e+000 1.98e-007R  2 iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls   90r-1.9117648e+006 3.04e+005 1.00e+003   5.0 7.29e+007    -  6.41e-006
1.12e-005f  1   91r-2.1032212e+006 6.41e+005 1.02e+003   2.9 1.98e+007    -  6.21e-004 4.00e-003f  1   92r-2.3809515e+006 1.38e+006 1.03e+003   2.9 4.19e+007    -  1.14e-003 3.51e-003f  1   93r-2.4939888e+006 1.67e+006 1.04e+003   2.9 1.61e+007    -  2.46e-003 4.69e-003f  1   94r-2.7761309e+006 2.57e+006 8.41e+003   2.9 8.00e+006    -  3.18e-003
2.35e-002f  1   95r-2.6728405e+006 2.19e+006 5.71e+004   2.9 2.42e+006    -  2.52e-002 5.77e-002f  1   96r-2.8038551e+006 2.68e+006 2.84e+007   2.9 7.94e+005    -  9.44e-002 1.82e-001f  1   97r-2.7662202e+006 2.53e+006 2.31e+007   2.9 2.08e+004    -  2.05e-001 2.06e-001f  1   98r-2.7497552e+006 2.46e+006 1.57e+007   2.9 1.29e+005    -  1.63e-001
4.69e-001f  1   99r-2.7405025e+006 2.42e+006 9.02e+006   2.9 8.10e+004    -  2.03e-001 7.07e-001f  1 iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls  100r-2.7220229e+006 2.35e+006
5.05e+006   2.9 9.17e+002    -  2.28e-001 6.97e-001f  1  101r-2.7000216e+006 2.28e+006 2.93e+006   2.9 2.73e+004    - 
4.42e-001 6.34e-001f  1  102r-2.6688323e+006 2.17e+006 1.41e+006   2.9 3.23e+004    -  1.00e+000 9.04e-001f  1  103r-2.6489554e+006 2.11e+006 6.37e+005   2.9 1.90e+004    -  1.00e+000 1.00e+000f  1  104r-2.6473015e+006 2.10e+006 2.75e+005   2.9 1.33e+003    - 
1.00e+000 1.00e+000h  1  105r-2.6472264e+006 2.10e+006 1.14e+005   2.9 1.34e+002    -  1.00e+000 1.00e+000f  1  106r-2.6471852e+006 2.10e+006 4.25e+004   2.9 6.86e+001    -  1.00e+000 1.00e+000f  1  107r-2.6471586e+006 2.10e+006 1.29e+004   2.9 3.93e+001    - 
1.00e+000 1.00e+000f  1  108r-2.7052367e+006 2.30e+006 3.99e+003   2.2 7.66e+004    -  8.48e-001 7.25e-001f  1  109r-2.7499870e+006 2.45e+006 6.27e+002   2.2 4.91e+004    -  9.74e-001 1.00e+000f  1 iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls  110r-2.7507558e+006 2.45e+006 8.13e+000   2.2 3.06e+003    - 
1.00e+000 1.00e+000h  1  111r-2.7763702e+006 2.55e+006 2.63e+002   0.1 3.63e+004    -  8.21e-001 7.50e-001f  1  112r-2.7835442e+006 2.57e+006 1.22e+002   0.1 1.22e+004    -  9.07e-001 6.88e-001f  1  113r-2.7860550e+006 2.58e+006 5.69e+001   0.1 3.94e+003    - 
9.06e-001 7.59e-001f  1  114r-2.7868349e+006 2.59e+006 1.55e+000   0.1 9.51e+002    -  1.00e+000 1.00e+000f  1  115r-2.7870579e+006 2.59e+006 3.90e+001  -1.3 3.30e+002    -  9.51e-001 7.76e-001f  1  116r-2.7871275e+006 2.59e+006 3.70e+000  -1.3 8.42e+001    - 
9.76e-001 1.00e+000f  1  117r-2.7871272e+006 2.59e+006 1.46e-002  -1.3 9.47e-002    -  1.00e+000 1.00e+000h  1  118r-2.7871386e+006 2.59e+006 1.32e+000  -3.1 1.35e+001    -  1.00e+000 9.67e-001f  1  119r-2.7871409e+006 2.59e+006 2.33e-003  -3.1 2.75e+000    - 
1.00e+000 1.00e+000f  1 iter    objective    inf_pr   inf_du lg(mu)  ||d||  lg(rg) alpha_du alpha_pr  ls  120r-2.7871411e+006 2.59e+006
1.96e-002  -4.6 2.55e-001    -  1.00e+000 1.00e+000f  1  121r-2.7871413e+006 2.59e+006 6.10e-005  -4.6 3.04e-001    - 
1.00e+000 1.00e+000h  1  122r-2.7871413e+006 2.59e+006 3.80e-003  -6.9 7.53e-003    -  1.00e+000 1.00e+000f  1  123r-2.7871414e+006 2.59e+006 2.36e-008  -6.9 5.92e-002    -  1.00e+000 1.00e+000h  1 In iteration 123, 1 Slack too small, adjusting variable bound  124r-2.7871414e+006
2.59e+006 2.70e-004  -9.0 4.02e-005    -  1.00e+000 1.00e+000f  1 In iteration 124, 1 Slack too small, adjusting variable bound

Number of Iterations....: 124

                                   (scaled)                 (unscaled) Objective...............: -2.3436762840071004e+006 
-2.7871413928982806e+006 Dual infeasibility......:  9.2870257854463659e+002   1.1044295733229690e+003 Constraint violation....:  7.7957580080225132e+005   2.5871668139707851e+006 Complementarity.........:  2.2997082264203370e-004  
2.7348537992141043e-004 Overall NLP error.......:  7.7957580080225132e+005   2.5871668139707851e+006


Number of objective function evaluations             = 133 Number of objective gradient evaluations             = 87 Number of equality constraint evaluations            = 0 Number of inequality constraint evaluations          = 133 Number of equality constraint Jacobian evaluations   = 0 Number of inequality constraint Jacobian evaluations
= 128 Number of Lagrangian Hessian evaluations             = 125 Total CPU secs in IPOPT (w/o function evaluations)   =   1068.222 Total CPU secs in NLP function evaluations           =   1365.220

EXIT: Converged to a point of local infeasibility. Problem may be infeasible. WARNING: Loading a SolverResults object with a warning status into model=CTA;
        message from solver=Ipopt 3.11.1\x3a Converged to a locally infeasible
        point. Problem may be infeasible.
$\endgroup$
5
  • 1
    $\begingroup$ Is the point Ipopt is starting from feasible point? If not trying to start with a feasible point might help. $\endgroup$ Commented Jan 18, 2021 at 11:07
  • $\begingroup$ @worldsmithhelper that I haven't checked. Do you have any other suggestions in terms of alternative solvers adoptable in Pyomo? $\endgroup$
    – tcokyasar
    Commented Jan 18, 2021 at 17:22
  • $\begingroup$ For the kind of problems I try to solve (large and very sparse) I found that the most important settings are (in order): algorithm, linear solver, barrier parameter update strategy For (1) I use interior-point methods; anyway, you only have to consider options of (1) if you have a choice (e.g., in Knitro you can choose between interior-point methods and active-set methods, but I think for Ipopt there's only one method available AFAIK). For (2), I usually go with HSL MA57. MA27 is a bit slow and outdated. For (3), which is only relevant for barrier methods, I go with "adaptive" updates. $\endgroup$ Commented Jan 18, 2021 at 17:33
  • 1
    $\begingroup$ I never used Pyomo. So i don't know what other solvers are available, check the documentation. If you feel comfortable writing you own Pyomo wrapper there is a NLP (SQP based) solver which already has a very low level Python binding called WORHP ( worhp.de/content/pythonexample ) which tends be a bit slower but more reliable than Ipopt: plato.asu.edu/ftp/ampl-nlp.html . $\endgroup$ Commented Jan 18, 2021 at 17:39
  • 2
    $\begingroup$ If it's not terribly inconvenient, perhaps you could show us the constraints? $\endgroup$ Commented Jan 18, 2021 at 20:01

1 Answer 1

2
$\begingroup$

IPOPT most likely selects a different starting point than KNITRO did, and converges to a locally infeasible point. Not much you can do I'm afraid other than trying different starting points.

It should be noted that, depending on the domains and expressions, certain fractional powers can give results in the complex domain (among many nasty mathematical artefacts). This means that, without proper symbolic reformulation of the problem, a local NLP solver can only solve such problems by luck, because it needs to somehow avoid the complex domain points & singularities while trying to locate a solution in the real domain (otherwise you'll see a nice cmath exception or similar).

On the free side, you could alternatively try FilterSD, or our own Octeract Engine which will symbolically reformulate your problem to eliminate singularities and complex solutions. Because Octeract Engine is a deterministic global optimisation solver it will keep searching for a solution automatically without need for user-provided starting points.

Octeract Engine is free for academics, and in February 2021 it will also be free for commercial use! We are currently setting up the user account system etc. for the free users, so if you are not an academic simply ask for a trial and we'll send you the free licence automatically when the trial runs out.

Since you are using Pyomo, here is a step-by-step tutorial on how to use Octeract Engine with Pyomo.

$\endgroup$
2
  • $\begingroup$ Thanks for offering Octeract Engine. We internally work on Python and try to everything within its boundaries. If it can work with Pyomo, I would like to learn how to transition to it. $\endgroup$
    – tcokyasar
    Commented Jan 18, 2021 at 17:20
  • 2
    $\begingroup$ @TanerCokyasar added link for you to check out. $\endgroup$ Commented Jan 18, 2021 at 17:45

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.