📄 lpkit.c
字号:
addtoo[i] = TRUE;
lp->non_zeros++;
}
else
addtoo[i] = FALSE;
MALLOC(newmat, lp->non_zeros);
inc_mat_space(lp, 0);
lp->rows++;
lp->sum++;
inc_row_space(lp);
if(lp->scaling_used) {
/* shift scale */
for(i = lp->sum; i > lp->rows; i--)
lp->scale[i] = lp->scale[i - 1];
lp->scale[lp->rows] = 1;
}
if(lp->names_used)
sprintf(lp->row_name[lp->rows], "r_%d", lp->rows);
if(lp->scaling_used && lp->columns_scaled)
for(i = 1; i <= lp->columns; i++)
row[i] *= lp->scale[lp->rows + i];
if(constr_type == GE)
lp->ch_sign[lp->rows] = TRUE;
else
lp->ch_sign[lp->rows] = FALSE;
elmnr = 0;
stcol = 0;
for(i = 1; i <= lp->columns; i++) {
for(j = stcol; j < lp->col_end[i]; j++) {
newmat[elmnr].row_nr = lp->mat[j].row_nr;
newmat[elmnr].value = lp->mat[j].value;
elmnr++;
}
if(addtoo[i]) {
if(lp->ch_sign[lp->rows])
newmat[elmnr].value = -row[i];
else
newmat[elmnr].value = row[i];
newmat[elmnr].row_nr = lp->rows;
elmnr++;
}
stcol = lp->col_end[i];
lp->col_end[i] = elmnr;
}
memcpy(lp->mat, newmat, lp->non_zeros * sizeof(matrec));
free(newmat);
free(addtoo);
for(i = lp->sum; i > lp->rows; i--) {
lp->orig_upbo[i] = lp->orig_upbo[i - 1];
lp->orig_lowbo[i] = lp->orig_lowbo[i - 1];
lp->basis[i] = lp->basis[i - 1];
lp->lower[i] = lp->lower[i - 1];
lp->must_be_int[i] = lp->must_be_int[i - 1];
}
/* changed from i <= lp->rows to i < lp->rows, MB */
for(i = 1 ; i < lp->rows; i++)
if(lp->bas[i] >= lp->rows)
lp->bas[i]++;
if(constr_type == LE || constr_type == GE) {
lp->orig_upbo[lp->rows] = lp->infinite;
}
else if(constr_type == EQ) {
lp->orig_upbo[lp->rows] = 0;
}
else {
fprintf(stderr, "Wrong constraint type\n");
exit(EXIT_FAILURE);
}
lp->orig_lowbo[lp->rows] = 0;
if(constr_type == GE && rh != 0)
lp->orig_rh[lp->rows] = -rh;
else
lp->orig_rh[lp->rows] = rh;
lp->row_end_valid = FALSE;
lp->bas[lp->rows] = lp->rows;
lp->basis[lp->rows] = TRUE;
lp->lower[lp->rows] = TRUE;
lp->eta_valid = FALSE;
}
void str_add_constraint(lprec *lp,
char *row_string,
short constr_type,
REAL rh)
{
int i;
REAL *aRow;
char *p, *newp;
CALLOC(aRow, lp->columns + 1);
p = row_string;
for(i = 1; i <= lp->columns; i++) {
aRow[i] = (REAL) strtod(p, &newp);
if(p == newp)
error("Bad string in str_add_constr");
else
p = newp;
}
add_constraint(lp, aRow, constr_type, rh);
free(aRow);
}
void del_constraint(lprec *lp, int del_row)
{
int i, j;
unsigned elmnr;
int startcol;
if(del_row<1 || del_row>lp->rows)
{
fprintf(stderr, "There is no constraint nr. %d\n", del_row);
exit(EXIT_FAILURE);
}
elmnr = 0;
startcol = 0;
for(i = 1; i <= lp->columns; i++) {
for(j = startcol; j < lp->col_end[i]; j++) {
if(lp->mat[j].row_nr != del_row) {
lp->mat[elmnr] = lp->mat[j];
if(lp->mat[elmnr].row_nr > del_row)
lp->mat[elmnr].row_nr--;
elmnr++;
}
else
lp->non_zeros--;
}
startcol = lp->col_end[i];
lp->col_end[i] = elmnr;
}
for(i = del_row; i < lp->rows; i++) {
lp->orig_rh[i] = lp->orig_rh[i + 1];
lp->ch_sign[i] = lp->ch_sign[i + 1];
lp->bas[i] = lp->bas[i + 1];
if(lp->names_used)
strcpy(lp->row_name[i], lp->row_name[i + 1]);
}
for(i = 1; i < lp->rows; i++)
if(lp->bas[i] > del_row)
lp->bas[i]--;
for(i = del_row; i < lp->sum; i++) {
lp->lower[i] = lp->lower[i + 1];
lp->basis[i] = lp->basis[i + 1];
lp->orig_upbo[i] = lp->orig_upbo[i + 1];
lp->orig_lowbo[i] = lp->orig_lowbo[i + 1];
lp->must_be_int[i] = lp->must_be_int[i + 1];
if(lp->scaling_used)
lp->scale[i] = lp->scale[i + 1];
}
lp->rows--;
lp->sum--;
lp->row_end_valid = FALSE;
lp->eta_valid = FALSE;
lp->basis_valid = FALSE;
}
void add_lag_con(lprec *lp, REAL *row, short con_type, REAL rhs)
{
int i;
REAL sign;
if(con_type == LE || con_type == EQ)
sign = 1;
else if(con_type == GE)
sign = -1;
else
error("con_type not implemented\n");
lp->nr_lagrange++;
if(lp->nr_lagrange == 1) {
CALLOC(lp->lag_row, lp->nr_lagrange);
CALLOC(lp->lag_rhs, lp->nr_lagrange);
CALLOC(lp->lambda, lp->nr_lagrange);
CALLOC(lp->lag_con_type, lp->nr_lagrange);
}
else {
REALLOC(lp->lag_row, lp->nr_lagrange);
REALLOC(lp->lag_rhs, lp->nr_lagrange);
REALLOC(lp->lambda, lp->nr_lagrange);
REALLOC(lp->lag_con_type, lp->nr_lagrange);
}
CALLOC(lp->lag_row[lp->nr_lagrange-1], lp->columns+1);
lp->lag_rhs[lp->nr_lagrange-1] = rhs * sign;
for( i = 1; i <= lp->columns; i++)
lp->lag_row[lp->nr_lagrange-1][i] = row[i] * sign;
lp->lambda[lp->nr_lagrange-1] = 0;
lp->lag_con_type[lp->nr_lagrange-1]=(con_type == EQ);
}
void str_add_lag_con(lprec *lp, char *row, short con_type, REAL rhs)
{
int i;
REAL *a_row;
char *p, *new_p;
CALLOC(a_row, lp->columns + 1);
p = row;
for(i = 1; i <= lp->columns; i++) {
a_row[i] = (REAL) strtod(p, &new_p);
if(p == new_p)
error("Bad string in str_add_lag_con");
else
p = new_p;
}
add_lag_con(lp, a_row, con_type, rhs);
free(a_row);
}
void add_column(lprec *lp, REAL *column)
{
int i, elmnr;
/* if the column has only one entry, this should be handled as a bound, but
this currently is not the case */
lp->columns++;
lp->sum++;
inc_col_space(lp);
inc_mat_space(lp, lp->rows + 1);
if(lp->scaling_used) {
for(i = 0; i <= lp->rows; i++)
column[i] *= lp->scale[i];
lp->scale[lp->sum] = 1;
}
elmnr = lp->col_end[lp->columns - 1];
for(i = 0 ; i <= lp->rows ; i++)
if(column[i] != 0) {
lp->mat[elmnr].row_nr = i;
if(lp->ch_sign[i])
lp->mat[elmnr].value = -column[i];
else
lp->mat[elmnr].value = column[i];
lp->non_zeros++;
elmnr++;
}
lp->col_end[lp->columns] = elmnr;
lp->orig_lowbo[lp->sum] = 0;
lp->orig_upbo[lp->sum] = lp->infinite;
lp->lower[lp->sum] = TRUE;
lp->basis[lp->sum] = FALSE;
lp->must_be_int[lp->sum] = FALSE;
if(lp->names_used)
sprintf(lp->col_name[lp->columns], "var_%d", lp->columns);
lp->row_end_valid = FALSE;
}
void str_add_column(lprec *lp, char *col_string)
{
int i;
REAL *aCol;
char *p, *newp;
CALLOC(aCol, lp->rows + 1);
p = col_string;
for(i = 0; i <= lp->rows; i++) {
aCol[i] = (REAL) strtod(p, &newp);
if(p == newp)
error("Bad string in str_add_column");
else
p = newp;
}
add_column(lp, aCol);
free(aCol);
}
void del_column(lprec *lp, int column)
{
int i, j, from_elm, to_elm, elm_in_col;
if(column > lp->columns || column < 1)
error("Column out of range in del_column");
for(i = 1; i <= lp->rows; i++) {
if(lp->bas[i] == lp->rows + column)
lp->basis_valid = FALSE;
else if(lp->bas[i] > lp->rows + column)
lp->bas[i]--;
}
for(i = lp->rows + column; i < lp->sum; i++) {
if(lp->names_used)
strcpy(lp->col_name[i - lp->rows], lp->col_name[i - lp->rows + 1]);
lp->must_be_int[i] = lp->must_be_int[i + 1];
lp->orig_upbo[i] = lp->orig_upbo[i + 1];
lp->orig_lowbo[i] = lp->orig_lowbo[i + 1];
lp->upbo[i] = lp->upbo[i + 1];
lp->lowbo[i] = lp->lowbo[i + 1];
lp->basis[i] = lp->basis[i + 1];
lp->lower[i] = lp->lower[i + 1];
if(lp->scaling_used)
lp->scale[i] = lp->scale[i + 1];
}
for(i = 0; i < lp->nr_lagrange; i++)
for(j = column; j <= lp->columns; j++)
lp->lag_row[i][j] = lp->lag_row[i][j+1];
to_elm = lp->col_end[column-1];
from_elm = lp->col_end[column];
elm_in_col = from_elm-to_elm;
for(i = from_elm; i < lp->non_zeros; i++) {
lp->mat[to_elm] = lp->mat[i];
to_elm++;
}
for(i = column; i < lp->columns; i++)
lp->col_end[i] = lp->col_end[i + 1] - elm_in_col;
lp->non_zeros -= elm_in_col;
lp->row_end_valid = FALSE;
lp->eta_valid = FALSE;
lp->sum--;
lp->columns--;
}
void set_upbo(lprec *lp, int column, REAL value)
{
if(column > lp->columns || column < 1)
error("Column out of range");
if(lp->scaling_used)
value /= lp->scale[lp->rows + column];
if(value < lp->orig_lowbo[lp->rows + column])
error("Upperbound must be >= lowerbound");
lp->eta_valid = FALSE;
lp->orig_upbo[lp->rows + column] = value;
}
void set_lowbo(lprec *lp, int column, REAL value)
{
if(column > lp->columns || column < 1)
error("Column out of range");
if(lp->scaling_used)
value /= lp->scale[lp->rows + column];
if(value > lp->orig_upbo[lp->rows + column])
error("Upperbound must be >= lowerbound");
/*
if(value < 0)
error("Lower bound cannot be < 0");
*/
lp->eta_valid = FALSE;
lp->orig_lowbo[lp->rows + column] = value;
}
void set_int(lprec *lp, int column, short must_be_int)
{
if(column > lp->columns || column < 1)
error("Column out of range");
lp->must_be_int[lp->rows + column] = must_be_int;
if(must_be_int == TRUE)
if(lp->columns_scaled)
unscale_columns(lp);
}
void set_rh(lprec *lp, int row, REAL value)
{
if(row > lp->rows || row < 0)
error("Row out of Range");
if ((row == 0) && (!lp->maximise)) /* setting of RHS of OF IS meaningful */
value = -value;
if(lp->scaling_used) {
if(lp->ch_sign[row])
lp->orig_rh[row] = -value * lp->scale[row];
else
lp->orig_rh[row] = value * lp->scale[row];
}
else
if(lp->ch_sign[row])
lp->orig_rh[row] = -value;
else
lp->orig_rh[row] = value;
lp->eta_valid = FALSE;
}
void set_rh_vec(lprec *lp, REAL *rh)
{
int i;
if(lp->scaling_used) {
for(i = 1; i <= lp->rows; i++)
if(lp->ch_sign[i])
lp->orig_rh[i] = -rh[i]*lp->scale[i];
else
lp->orig_rh[i] = rh[i]*lp->scale[i];
}
else
for(i = 1; i <= lp->rows; i++)
if(lp->ch_sign[i])
lp->orig_rh[i] = -rh[i];
else
lp->orig_rh[i] = rh[i];
lp->eta_valid = FALSE;
}
void str_set_rh_vec(lprec *lp, char *rh_string)
{
int i;
REAL *newrh;
char *p, *newp;
CALLOC(newrh, lp->rows + 1);
p = rh_string;
for(i = 1; i <= lp->rows; i++) {
newrh[i] = (REAL) strtod(p, &newp);
if(p == newp)
error("Bad string in str_set_rh_vec");
else
p = newp;
}
set_rh_vec(lp, newrh);
free(newrh);
}
void set_maxim(lprec *lp)
{
int i;
if(lp->maximise == FALSE) {
for(i = 0; i < lp->non_zeros; i++)
if(lp->mat[i].row_nr == 0)
lp->mat[i].value *= -1;
lp->eta_valid = FALSE;
lp->orig_rh[0] *= -1;
}
lp->maximise = TRUE;
lp->ch_sign[0] = TRUE;
}
void set_minim(lprec *lp)
{
int i;
if(lp->maximise == TRUE) {
for(i = 0; i < lp->non_zeros; i++)
if(lp->mat[i].row_nr == 0)
lp->mat[i].value = -lp->mat[i].value;
lp->eta_valid = FALSE;
lp->orig_rh[0] *= -1;
}
lp->maximise = FALSE;
lp->ch_sign[0] = FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -