int nl_open(void) { int nl_fd, res; nl_fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_IET); if (nl_fd == -1) { log_error("%s %d\n", __FUNCTION__, errno); return -1; } memset(&src_addr, 0, sizeof(src_addr)); src_addr.nl_family = AF_NETLINK; src_addr.nl_pid = getpid(); src_addr.nl_groups = 0; /* not in mcast groups */ memset(&dest_addr, 0, sizeof(dest_addr)); dest_addr.nl_family = AF_NETLINK; dest_addr.nl_pid = 0; /* kernel */ dest_addr.nl_groups = 0; /* unicast */ res = nl_write(nl_fd, NULL, 0); if (res < 0) { log_error("%s %d\n", __FUNCTION__, res); return res; } return nl_fd; }
dfmt(int op) #endif { cgrad **cg0, **cg01, *cgi, *cgi0, *cgi00, *cgj, **cgnew, **cgprev, **cgx, *free_cg; ograd *og; real *LU, *LUdv, *LUdvi, *LUdrhs, *LUdvxi, *LUrhse, *LUve; int Max, aextra, i, m, me, n, n1, nextra; FILE *f; real t; char *dvtype, *dvt; static char *AXIN[2] = { "AX", "IN" }; dvthead dvth; char buf[32]; n = c_vars; if (n < o_vars) n = o_vars; n1 = n + 1; m = n_con; LUrhse = LUrhs + 2*m; LUve = LUv + 2*n; aextra = nextra = 0;; for (LU = LUrhs, cgx = Cgrad; LU < LUrhse; LU += 2, cgx++) if (LU[0] > negInfinity) { if (LU[0]) aextra++; if (LU[0] < LU[1] && LU[1] < Infinity) { nextra++; if (LU[1]) aextra++; for(cgi = *cgx; cgi; cgi = cgi->next) aextra++; } else if (LU[0]) aextra++; } else if (LU[1]) aextra++; for (LU = LUv; LU < LUve; LU += 2) { if (LU[0] > negInfinity) { aextra++; nextra++; if (LU[0]) aextra++; } if (LU[1] < Infinity) { aextra++; nextra++; if (LU[1]) aextra++; } } me = m + nextra; LUdvi = LUdv = (real *)Malloc((me + n)*2*sizeof(real) + me*sizeof(cgrad *) + aextra*sizeof(cgrad) + m); LUdvxi = LUdv + 2*m; LUdrhs = LUdvxi + 2*nextra; free_cg = (cgrad *)(LUdrhs + 2*n); cg0 = cg01 = (cgrad **)(free_cg + aextra); cgnew = cg0 + m; dvt = dvtype = (char *)(cgnew + nextra); for (LU = LUrhs, cgx = Cgrad; LU < LUrhse; LU += 2, cgx++) { cgi0 = 0; for(cgi = cgi00 = *cgx; cgi; cgi = cgj) { cgj = cgi->next; cgi->next = cgi0; cgi0 = cgi; cgi->varno++; } *cg01++ = cgi0; if (LU[0] > negInfinity) { *LUdvi++ = LU[0] == LU[1] ? negInfinity : 0; *LUdvi++ = Infinity; if (LU[0] < LU[1] && LU[1] < Infinity) { *LUdvxi++ = 0; *LUdvxi++ = Infinity; cgprev = cgnew++; for(cgi = *cgx; cgi; cgi = cgi->next) { *cgprev = cgj = free_cg++; cgprev = &cgj->next; cgj->varno = cgi->varno; cgj->coef = -cgi->coef; } if (LU[1]) { cgi = *cgprev = free_cg++; cgi->varno = n1; cgi->coef = -LU[1]; cgprev = &cgi->next; } *cgprev = 0; *dvt++ = 2; } else *dvt++ = LU[0] == LU[1] ? 3 : 0; if (LU[0]) { cgi = cgi00->next = free_cg++; cgi->varno = n1; cgi->coef = LU[0]; cgi->next = 0; } } else { *dvt++ = 1; *LUdvi++ = 0; *LUdvi++ = Infinity; for(cgi = cgi0; cgi; cgi = cgi->next) cgi->coef = -cgi->coef; if (LU[1]) { cgi = cgi00->next = free_cg++; cgi->varno = n1; cgi->coef = -LU[1]; cgi->next = 0; } } } for (LU = LUv, i = 1; LU < LUve; LU += 2, i++) { if (LU[0] > negInfinity) { *LUdvxi++ = 0; *LUdvxi++ = Infinity; *cgnew++ = cgi = free_cg++; cgi->varno = i; cgi->coef = 1; if (LU[0]) { cgi = cgi->next = free_cg++; cgi->varno = n1; cgi->coef = LU[0]; } cgi->next = 0; } if (LU[1] < Infinity) { *LUdvxi++ = 0; *LUdvxi++ = Infinity; *cgnew++ = cgi = free_cg++; cgi->varno = i; cgi->coef = -1; if (LU[1]) { cgi = cgi->next = free_cg++; cgi->varno = n1; cgi->coef = -LU[1]; } cgi->next = 0; } } memset(LUdrhs, 0, n*2*sizeof(real)); if (objno >= 0) for(og = Ograd[objno]; og; og = og->next) { LU = LUdrhs + 2*og->varno; LU[0] = LU[1] = og->coef; } if (Max = objtype[objno]) for(LU = LUdv; LU < LUdrhs; LU += 2) { t = LU[0]; LU[0] = -LU[1]; LU[1] = -t; } /* Negate columns with lower bound -Infinity, finite upper bound. */ /* This shouldn't be necessary, but shortens the MPS file */ /* and may avoid bugs in some solvers. */ for(cg01 = cg0, LU = LUdv; LU < LUdrhs; LU += 2, cg01++) if (LU[0] <= negInfinity && LU[1] < Infinity) { t = LU[0]; LU[0] = -LU[1]; LU[1] = -t; for(cgi = *cg01; cgi; cgi = cgi->next) cgi->coef = -cgi->coef; } if (op != 'm') { switch(op) { case 'b': binary_nl = 1; break; case 'g': binary_nl = 0; } nl_write(n, me, cg0, LUdv, LUdrhs, Max); } else { mps(n, me, cg0, LUdv, LUdrhs); f = openfo(".spc", "w"); fprintf(f, "BEGIN %s\nROWS %d\nCOLUMNS %d\n", Basename, n + 1, me+1); fprintf(f, "*true value: COLUMNS %d\n", me); fprintf(f, "ELEMENTS %d\nM%sIMIZE\nOBJECTIVE DUMMY\n", nzc + aextra, AXIN[Max]); fprintf(f, "END %s\n", Basename); fclose(f); f = openfo(".adj", "w"); g_fmt(buf, objconst(objno)); fprintf(f, "'objective' %s\n", buf); fclose(f); } f = openfo(".duw", "wb"); for(i = 0; i < 10; i++) dvth.Options[i] = ampl_options[i]; dvth.vbtol = ampl_vbtol; dvth.m = m; dvth.n = n; dvth.nextra = nextra; dvth.maxobj = Max; dvth.binary = binary_nl; fwrite(&dvth, sizeof(dvthead), 1, f); fwrite(dvtype, m, 1, f); fclose(f); }