<html><body>
<p><tt><br>
&gt;&gt;I am a beginner regarding CLP, and I would like to ask you whether CLP can be called from a C program. If so, is there some documentation that explains how to do that?</tt><br>
<br>
<tt>&nbsp; Hi,</tt><br>
<br>
<tt>Do you mean exactly C, not C++? For C I do not know the answer (the chances are it may not be possible because COIN it written in C++). For C++ please see below. CLP documentation starts with a simple example which shows how to solve problem from a file. I would also put a reference to file &nbsp; </tt><tt><b>Clp-1.10.0/Clp/examples/addRows.cpp</b></tt><tt>&nbsp;(or similar) to the front page of CLP doc. It shows how to create and solve CLP problem in memory. Please find two examples below. #1 follows CLP doc. #2 follows what John Forrest sent me over lately. The second one worked much better for me. ( Also to be able to &quot;make&quot; your program, first follow the instructions in </tt><tt><b>Clp-1.10.0/</b></tt><tt><b>INSTALL</b></tt><tt>).</tt><br>
<br>
----------------------------------------------------<br>
          Dr. Alexey Lvov<br>
IBM T.J. Watson Research Institute<br>
1101 Kitchawan Rd. (Rt. 134) Office 34-159<br>
Yorktown Heights  NY  10598<br>
Tel: (914)-945-3732.<br>
<br>
<br>
<br>
<br>
<br>
<tt>1) (a piece from &nbsp; </tt><tt>Clp-1.10.0/Clp/examples</tt><tt>/addRows.cpp &nbsp; &nbsp;)</tt><br>
<br>
<tt>// &nbsp; &nbsp; make DRIVER=NNN &nbsp; &nbsp; &nbsp;makes file NNN.cpp &nbsp; &nbsp;//</tt><br>
<br>
<tt>#include &quot;ClpSimplex.hpp&quot;</tt><br>
<tt>#include &quot;ClpPrimalColumnSteepest.hpp&quot;</tt><br>
<tt>#include &quot;ClpDualRowSteepest.hpp&quot;</tt><br>
<br>
<br>
<br>
<tt>int main ()</tt><br>
<tt>{</tt><br>
<tt>&nbsp; // Minimize &nbsp;x0 &nbsp;+ &nbsp;2 * x1 &nbsp;+ &nbsp;4 * x2 &nbsp;+ &nbsp;5 * x3,</tt><br>
<tt>&nbsp; //</tt><br>
<tt>&nbsp; // &nbsp;0 &lt;= x0 &lt;= 15,</tt><br>
<tt>&nbsp; // &nbsp;0 &lt;= x1 &nbsp; &nbsp; &nbsp;,</tt><br>
<tt>&nbsp; // &nbsp; &nbsp; &nbsp; x2 is not bound by any constraints,</tt><br>
<tt>&nbsp; // -1 &lt;= x3 &nbsp; &nbsp; &nbsp;,</tt><br>
<tt>&nbsp; //</tt><br>
<tt>&nbsp; // x0 &nbsp;- &nbsp;x2 &nbsp;&lt;= &nbsp;3,</tt><br>
<tt>&nbsp; //</tt><br>
<tt>&nbsp; // x0 &nbsp;+ &nbsp;x1 &nbsp;+ &nbsp;x2 &nbsp;+ &nbsp;x3 &nbsp;= &nbsp;23.</tt><br>
<br>
<br>
<br>
<tt>&nbsp; // --- BEGIN add the objective function and bounds on individual var. &nbsp;--- //</tt><br>
<br>
<tt>&nbsp; const int num_variables = 4;</tt><br>
<br>
<tt>&nbsp; ClpSimplex model;</tt><br>
<tt>&nbsp; model.resize(0,num_variables); // The first argument must be 0.</tt><br>
<br>
<tt>&nbsp; model.setObjectiveCoefficient(0, &nbsp;1.0);</tt><br>
<tt>&nbsp; // Lower bounds for variables are 0.0 by default.</tt><br>
<tt>&nbsp; model.setColumnUpper( &nbsp; &nbsp; &nbsp; &nbsp; 0, 15.0);</tt><br>
<br>
<tt>&nbsp; model.setObjectiveCoefficient(1, &nbsp;2.0);</tt><br>
<tt>&nbsp; // Lower bounds for variables are 0.0 by default</tt><br>
<tt>&nbsp; model.setColumnUpper( &nbsp; &nbsp; &nbsp; &nbsp; 1, &nbsp;COIN_DBL_MAX);</tt><br>
<br>
<tt>&nbsp; model.setObjectiveCoefficient(2, &nbsp;4.0);</tt><br>
<tt>&nbsp; model.setColumnLower( &nbsp; &nbsp; &nbsp; &nbsp; 2, &nbsp;-COIN_DBL_MAX);</tt><br>
<tt>&nbsp; model.setColumnUpper( &nbsp; &nbsp; &nbsp; &nbsp; 2, &nbsp;COIN_DBL_MAX);</tt><br>
<br>
<tt>&nbsp; model.setObjectiveCoefficient(3, &nbsp;5.0);</tt><br>
<tt>&nbsp; model.setColumnLower( &nbsp; &nbsp; &nbsp; &nbsp; 3, -1.0);</tt><br>
<tt>&nbsp; model.setColumnUpper( &nbsp; &nbsp; &nbsp; &nbsp; 3, &nbsp;COIN_DBL_MAX);</tt><br>
<br>
<tt>&nbsp; // --- &nbsp;END &nbsp;add the objective function and bounds on individual var. &nbsp;--- //</tt><br>
<br>
<br>
<tt>&nbsp; // -- BEGIN add equality and ineq. constr. on lin. combinations of var. -- //</tt><br>
<br>
<tt>&nbsp; int * &nbsp; &nbsp;rowIndex;</tt><br>
<tt>&nbsp; double * rowValue;</tt><br>
<tt>&nbsp; int &nbsp; &nbsp; &nbsp;num_nonzero_coef;</tt><br>
<br>
<tt>&nbsp; num_nonzero_coef = 2;</tt><br>
<tt>&nbsp; rowIndex = new int &nbsp; [num_nonzero_coef];</tt><br>
<tt>&nbsp; rowValue = new double[num_nonzero_coef];</tt><br>
<tt>&nbsp; rowIndex[0] = 0; rowValue[0] = &nbsp;1.0;</tt><br>
<tt>&nbsp; rowIndex[1] = 2; rowValue[1] = -1.0;</tt><br>
<tt>&nbsp; // The 4-th argument is the lower bound,</tt><br>
<tt>&nbsp; // The 5-th argument is the upper bound.</tt><br>
<tt>&nbsp; model.addRow(num_nonzero_coef, rowIndex, rowValue, -COIN_DBL_MAX, 3.0);</tt><br>
<tt>&nbsp; delete[] rowValue;</tt><br>
<tt>&nbsp; delete[] rowIndex;</tt><br>
<br>
<tt>&nbsp; num_nonzero_coef = 4;</tt><br>
<tt>&nbsp; rowIndex = new int &nbsp; [num_nonzero_coef];</tt><br>
<tt>&nbsp; rowValue = new double[num_nonzero_coef];</tt><br>
<tt>&nbsp; rowIndex[0] = 0; rowValue[0] = 1.0;</tt><br>
<tt>&nbsp; rowIndex[1] = 1; rowValue[1] = 1.0;</tt><br>
<tt>&nbsp; rowIndex[2] = 2; rowValue[2] = 1.0;</tt><br>
<tt>&nbsp; rowIndex[3] = 3; rowValue[3] = 1.0;</tt><br>
<tt>&nbsp; // The standard way of adding an equality constraint is to set both</tt><br>
<tt>&nbsp; // the lower and upper bound to the same value.</tt><br>
<tt>&nbsp; model.addRow(num_nonzero_coef, rowIndex, rowValue, 23.0, 23.0);</tt><br>
<tt>&nbsp; delete[] rowValue;</tt><br>
<tt>&nbsp; delete[] rowIndex;</tt><br>
<br>
<tt>&nbsp; // -- &nbsp;END &nbsp;add equality and ineq. constr. on lin. combinations of var. -- //</tt><br>
<br>
<br>
<br>
<tt>&nbsp; // Increase level of detail</tt><br>
<tt>&nbsp; model.setLogLevel(4);</tt><br>
<br>
<tt>&nbsp; // The model has been set up. Now solve!</tt><br>
<tt>&nbsp; model.primal();</tt><br>
<br>
<br>
<br>
<tt>&nbsp; char const * const status_message[5] = {</tt><br>
<tt>&nbsp; &nbsp; &quot;optimal&quot;,</tt><br>
<tt>&nbsp; &nbsp; &quot;primal infeasible&quot;,</tt><br>
<tt>&nbsp; &nbsp; &quot;primal unbounded, dual infeasible&quot;,</tt><br>
<tt>&nbsp; &nbsp; &quot;stopped on iterations etc&quot;,</tt><br>
<tt>&nbsp; &nbsp; &quot;stopped due to errors&quot;};</tt><br>
<tt>&nbsp; std::cout &lt;&lt; &quot;Model status is \&quot;&quot;</tt><br>
<tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;&lt; status_message[model.status()] &lt;&lt; &quot;\&quot; after &quot;</tt><br>
<tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;&lt; model.numberIterations() &lt;&lt; &quot; iterations - objective is &quot;</tt><br>
<tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;&lt; model.objectiveValue() &lt;&lt; std::endl;</tt><br>
<br>
<tt>&nbsp; std::cout &lt;&lt; &quot;The model has &quot; &lt;&lt; model.numberRows()</tt><br>
<tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;&lt; &quot; rows and &quot; &nbsp; &nbsp; &lt;&lt; model.numberColumns()</tt><br>
<tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;&lt; &quot; variables.&quot; &lt;&lt; std::endl;</tt><br>
<br>
<tt>&nbsp; if (num_variables != model.numberColumns()) {</tt><br>
<tt>&nbsp; &nbsp; std::cout &lt;&lt; &quot;ERROR : num_variables != model.numberColumns() .\n&quot;;</tt><br>
<tt>&nbsp; &nbsp; return -1;</tt><br>
<tt>&nbsp; }</tt><br>
<br>
<tt>&nbsp; double * columnPrimal = model.primalColumnSolution();</tt><br>
<tt>&nbsp; int iColumn;</tt><br>
<tt>&nbsp; printf(&quot;Solution:\n&quot;);</tt><br>
<tt>&nbsp; for (iColumn = 0; iColumn &lt; num_variables; iColumn++)</tt><br>
<tt>&nbsp; &nbsp; printf(&quot;x%d = %8.5f\n&quot;, iColumn, columnPrimal[iColumn]);</tt><br>
<br>
<br>
<br>
<tt>&nbsp; return 0;</tt><br>
<tt>}</tt><br>
<br>
<br>
<br>
<br>
<br>
<tt>2) </tt><br>
<br>
<tt>#include &quot;ClpSimplex.hpp&quot;</tt><br>
<tt>#include &quot;ClpSolve.hpp&quot;</tt><br>
<tt>#include &quot;CoinModel.hpp&quot;</tt><br>
<br>
<tt>.......</tt><br>
<tt>..........</tt><br>
<tt>&nbsp; ClpSimplex * model = new ClpSimplex;</tt><br>
<tt>&nbsp; model-&gt;resize(0, lp_num_variables); // The first argument must be 0.</tt><br>
<br>
<tt>&nbsp; for (i = 0; i &lt; lp_num_variables; i++) {</tt><br>
<tt>&nbsp; &nbsp; model-&gt;setObjectiveCoefficient(i, lp_objective_function[i]);</tt><br>
<tt>&nbsp; &nbsp; model-&gt;setColumnLower(i, (i &lt; lp_num_s_variables) ? 0.0 : -COIN_DBL_MAX);</tt><br>
<tt>&nbsp; &nbsp; model-&gt;setColumnUpper(i, COIN_DBL_MAX);</tt><br>
<tt>&nbsp; }</tt><br>
<br>
<tt>&nbsp; {</tt><br>
<tt>&nbsp; &nbsp; // use {} so model2 will vanish</tt><br>
<tt>&nbsp; &nbsp; CoinModel model2;</tt><br>
<tt>&nbsp; &nbsp; for (i = 0; i &lt; lp_num_constr_on_s; i++) { // equality constraints</tt><br>
<tt>&nbsp; &nbsp; &nbsp; model2.addRow(lp_constraints[i].num_coefficients,</tt><br>
<tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lp_constraints[i].indexes,</tt><br>
<tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lp_constraints[i].coefficients,</tt><br>
<tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lp_constraints[i].right_part,</tt><br>
<tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lp_constraints[i].right_part);</tt><br>
<tt>&nbsp; &nbsp; }</tt><br>
<tt>&nbsp; &nbsp; for ( &nbsp; &nbsp; ; i &lt; lp_num_constraints; &nbsp; &nbsp;i++) { // inequality constraints</tt><br>
<tt>&nbsp; &nbsp; &nbsp; model2.addRow(lp_constraints[i].num_coefficients,</tt><br>
<tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lp_constraints[i].indexes,</tt><br>
<tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lp_constraints[i].coefficients,</tt><br>
<tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lp_constraints[i].right_part,</tt><br>
<tt>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; COIN_DBL_MAX);</tt><br>
<tt>&nbsp; &nbsp; }</tt><br>
<tt>&nbsp; &nbsp; model-&gt;addRows(model2,false);</tt><br>
<tt>&nbsp; }</tt><br>
<tt>&nbsp; </tt><br>
<tt>&nbsp; model-&gt;setLogLevel(1);</tt><br>
<tt>&nbsp; ClpSolve solveOptions;</tt><br>
<tt>&nbsp; model-&gt;setPerturbation(50);</tt><br>
<tt>&nbsp; model-&gt;initialSolve(solveOptions);</tt><br>
<tt>........... &nbsp; &nbsp; &nbsp; </tt><br>
..........<br>
<br>
<br>
</body></html>