[Scip] Adding rows to cutpool
Gerald Gamrath
gamrath at zib.de
Tue Apr 3 11:10:23 MEST 2012
Dear Sheetal,
how do you get the indices stored in cutind and why do you think that
taking just the variable at this position in the SCIP variable array
should be the variable you want to have?
You do not need to alloc memory if SCIPgetVars(scip) just returns the
pointer to the internal variable array of SCIP. Please assert, that
scipvars[cutind[i]] <= SCIPgetNVars(scip).
Where do you do the generation of the cuts? It seems, that you do it
before the solving started, which is not allowed. What you could do then
is to add linear constraints, for which you set the initial flag to
FALSE and the separate flag to TRUE, so that they are only separated, if
needed. You can then also set the check and propagate flags to FALSE,
because the constraints are additional, redundant constraints.
Please, also have a look at the SCIP documentation (e.g.
http://scip.zib.de/doc/html/SEPA.html) and the examples coming with SCIP
(directory examples/ in the SCIP main folder), for example the TSP
example, which is also written in C++ and features a Subtour constraint
handler that also generates cuts. Furthermore the SCIP online
documentation (http://scip.zib.de/doc/html/index.html) provides a search
feature that allows you to look up the definition of methods and their
parameters.
Best,
Gerald
Am 02.04.2012 19:05, schrieb sheetal murkute:
> Hi,
>
> I added some asserts, and noticed that the assertions (xCol != NULL)
> and (yCol != NULL) fail.
> The assertions (xVar != NULL) and (yVar != NULL) do not fail.
>
> *I tried adding variables instead of columns:*
> *( I want to add two variables, indices are stored in cutind, and
> coefficient values are stored in *
> *cutval)*
>
> SCIP_CALL_EXC( SCIPcreateEmptyRow(scip, &newrow,
> namebuf.str().c_str(),-SCIPinfinity(scip), 0.0, FALSE,FALSE,FALSE) );
> SCIP_VAR** scipvars = (SCIP_VAR**) malloc( (A*K+A) * sizeof(SCIP_VAR*));
> scipvars = SCIPgetVars(scip);
> for(i=0;i<=1;i++){
> SCIP_CALL_EXC( SCIPaddVarToRow(scip, newrow, scipvars[cutind[i]],
> cutval[i]) );
> }
> SCIP_CALL_EXC( SCIPaddPoolCut(scip, newrow));
>
> *
> *
> *I get the error: *
>
> [src/scip/var.c:11655] ERROR: cannot add untransformed original
> variable <y#351> to LP row <row_1>
> [src/scip/scip.c:15535] ERROR: Error <-9> in function call
> terminate called after throwing an instance of 'SCIPException'
> what(): method cannot be called with this type of data
>
>
> Instead of using "scipvars = SCIPgetVars(scip);" , I also tried using
> '_vars' vector where I store my scip variables for later use. This
> also gives the same error - "cannot add untransformed original
> variable"
>
>
>
> -Sheetal
>
> On Fri, Mar 30, 2012 at 10:12 PM, Stefan Vigerske
> <stefan at math.hu-berlin.de <mailto:stefan at math.hu-berlin.de>> wrote:
>
> Hi,
>
> try adding some asserts and compile in debug mode (g++ -g):
>
> SCIP_Var* xVar=_vars[cutind[0]];
> assert(xVar != NULL);
>
> SCIP_COL * xCol = SCIPvarGetCol(xVar);
> assert(xCol != NULL);
> SCIP_Var* yVar=_vars[cutind[1]];
> assert(yVar != NULL);
>
> SCIP_COL * yCol = SCIPvarGetCol(yVar);
> assert(yCol != NULL);
>
> SCIP_COL** cols= (SCIP_COL**) malloc( 2 * sizeof(SCIP_COL*));
> cols[0]=xCol;
> cols[1]=yCol;
>
> SCIP_CALL_EXC( SCIPcreateRow(scip,&newrow, namebuf.str().c_str(),
> 2, cols, cutval, -SCIPinfinity(scip), 0, FALSE,FALSE,FALSE));
>
>
> Columns are only available for variables that are still active in
> the problem, i.e., have not been fixed or aggregated. For inactive
> variables, you would get a NULL from SCIPvarGetCol (I guess).
>
> It may be safer to add the variables to the row instead of the
> columns, since this is also possible for fixed variables:
> SCIP_CALL_EXC( SCIPcreateEmptyRow(scip, &newrow,
> namebuf.str().c_str(),
> -SCIPinfinity(scip), 0.0, FALSE,FALSE,FALSE) );
> SCIP_CALL_EXC( SCIPaddVarToRow(scip, newrow, _vars[5], 1.0) );
> SCIP_CALL_EXC( SCIPaddVarToRow(scip, newrow, _vars[351], -10.0) );
>
>
> Stefan
>
> sheetal murkute wrote:
>
> Hi,
>
> I tried using SCIPvarGetCol() and SCIPaddPoolCut() methods.
> I am getting segmentation fault at the SCIPcreateRow() line.
>
> I am now adding cuts as follows:
> _vars is a vector where I store my SCIP variables.
> cutind[0] = 5 ; cutind[1] = 351; // indices of nonzero row
> variables
> cutval[0] = 1; cutval[1] = -10; // coefficients of nonzero
> row variables
>
> SCIP_ROW * newrow;
>
> SCIP_Var* xVar=_vars[cutind[0]];
> SCIP_COL * xCol = SCIPvarGetCol(xVar);
> SCIP_Var* yVar=_vars[cutind[1]];
> SCIP_COL * yCol = SCIPvarGetCol(yVar);
> SCIP_COL** cols= (SCIP_COL**) malloc( 2 * sizeof(SCIP_COL*));
> cols[0]=xCol;
> cols[1]=yCol;
>
> SCIP_CALL_EXC( SCIPcreateRow(scip,&newrow,
> namebuf.str().c_str(), 2, cols,
>
> cutval, -SCIPinfinity(scip), 0, FALSE,FALSE,FALSE));
> SCIP_CALL_EXC( SCIPaddPoolCut(scip, newrow));
>
>
> Please let me know if anything is incorrect.
>
>
> -Sheetal
>
> On Wed, Mar 28, 2012 at 8:51 PM, Stefan Heinz<heinz at zib.de
> <mailto:heinz at zib.de>> wrote:
>
> Hi,
>
> The creation of your cut is not correct. The SCIP_COL*
> array is *not* an
> array of indices. You should use the method SCIPvarGetCol()
>
> http://scip.zib.de/doc/html/**pub__var_8h.html#**
> a75111eed912d3f76ec076b787f7a0**b12<http://scip.zib.de/doc/html/pub__var_8h.html#a75111eed912d3f76ec076b787f7a0b12>
>
>
>
> to get for a variable to corresponding column. To add your
> cut into the
> cut pool of SCIP you should use the method SCIPaddPoolCut()
>
>
> http://scip.zib.de/doc/html/**scip_8h.html#**
> a14b5af5c0722ae6284b2a2d2eb0b3**d5b<http://scip.zib.de/doc/html/scip_8h.html#a14b5af5c0722ae6284b2a2d2eb0b3d5b>
>
>
>
> Best Stefan
>
>
>
> On 03/27/2012 06:46 PM, sheetal murkute wrote:
>
> Hello,
>
> I want to add rows to cutpool.
> For this, I have written the code mentioned below:
>
> cutval = (double *) malloc((3) * sizeof(double *));
> SCIP_CUTPOOL * cutpool;
> SCIP_ROW * newrow;
> SCIP_COL * cutind;
> namebuf.str("");
> namebuf<<"row_"<<k;
> cutind[0] = 22 ; cutind[1] = 34; ( 22 and 34 are
> column numbers with
> nonzero values, there are total 2 non-zero
> coefficients in a row)
>
> SCIPcreateRow(scip,&newrow, namebuf.str().c_str(),
> 2,&cutind, cutval,
>
> -SCIPinfinity(scip), 0, FALSE,FALSE,FALSE);
> SCIPaddRowCutpool(scip, cutpool, newrow);
>
> *I am getting error saying:*
>
> /home/sxm4946/SCIP/**ziboptsuite-2.1.1/scip-2.1.1/**
>
> src/scip/scip/type_lp.h:73:
> error: forward declaration of a-struct SCIP_Cola-
> scipmcfv2.cpp:308: error: invalid use of incomplete
> type a-struct SCIP_Cola-
>
>
>
> Can you please help me with this?
>
>
>
>
>
>
> ______________________________**_________________
> Scip mailing list
> Scip at zib.de <mailto:Scip at zib.de>
> http://listserv.zib.de/**mailman/listinfo/scip<http://listserv.zib.de/mailman/listinfo/scip>
>
>
>
>
>
>
>
> _______________________________________________
> Scip mailing list
> Scip at zib.de <mailto:Scip at zib.de>
> http://listserv.zib.de/mailman/listinfo/scip
>
>
>
>
>
> --
> Thanks with Best Regards,
> Sheetal
>
> :)
>
>
> _______________________________________________
> Scip mailing list
> Scip at zib.de
> http://listserv.zib.de/mailman/listinfo/scip
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://listserv.zib.de/mailman/private/scip/attachments/20120403/452cbc33/attachment.html
More information about the Scip
mailing list