Example #1
0
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;
}
Example #2
0
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);
	}