public void defineKinkAngle2(branch branch, leaf leaf1, leaf leaf2, mosek.Task task, int numCon, int numVar) { for (int t = 0; t < branch.tuples.Count(); t++) { task.putaij(numCon + t, numVar + t, -1); task.putconbound(numCon + t, mosek.boundkey.fx, 0, 0); var tup = branch.tuples[t]; for (int h = 0; h < 2; h++) { Minilla3D.Elements.nurbsElement.tuple target = null; leaf leaf = null; if (h == 0) { target = tup.left; leaf = leaf1; } if (h == 1) { target = tup.right; leaf = leaf2; } target.dcdtstar[0] = target.dcdt[1]; target.dcdtstar[1] = -target.dcdt[0]; double gamma = 0; for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { gamma += target.dcdt[i] * target.gij[i, j] * target.dcdt[j]; gamma += target.dcdt[i] * target.gij[i, j] * target.dcdt[j]; } } for (int k = 0; k < target.nNode; k++) { for (int i = 0; i < 2; i++) { target.s[i] = target.d1[i][k]; } var val = 0d; for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { val += target.s[i] * target.Gij[i, j] * target.dcdtstar[j]; } } val *= target.refDv; val /= Math.Sqrt(gamma); task.putaij(numCon + t, target.internalIndex[k] + leaf.varOffset, val); } } } }
public void defineKinkAngle(branch branch,leaf leaf,mosek.Task task, int numCon, int numVar) { //todo add valDc// for (int t= 0; t < branch.tuples.Count(); t++) { task.putaij(numCon + t, numVar + t, -1); task.putconbound(numCon + t, mosek.boundkey.fx, 0, 0); var tup = branch.tuples[t]; var target = tup.target; target.dcdtstar[0] = target.dcdt[1]; target.dcdtstar[1] = -target.dcdt[0]; double gamma = 0; for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { gamma += target.dcdt[i] * target.gij[i, j] * target.dcdt[j]; } } for (int k = 0; k < target.nNode; k++) { for (int i = 0; i < 2; i++) { target.s[i] =target.d1[i][k]; } var val = 0d; for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { val += target.s[i] * target.Gij[i, j] * target.dcdtstar[j]; } } val *= target.refDv; val /= Math.Sqrt(gamma); task.putaij(numCon + t, target.internalIndex[k] + leaf.varOffset, val); } } }
public void tieBranchD3(branch branch, leaf leaf, mosek.Task task, int num0/*1 or 2*/, int num1/*0 or 1*/) { if (leaf.branch[0] == branch) { if (leaf.nU == branch.N) { for (int i = 0; i < branch.N; i++) { for (int k = 0; k < 3; k++) { task.putconbound((i * num0 + num1) * 3 + k + branch.conOffset, mosek.boundkey.fx, 0, 0); if (leaf.flip[0]) { task.putaij(branch.conOffset + (i * num0 + num1) * 3 + k, (i) * 3 + k + branch.varOffset, 1); task.putaij(branch.conOffset + (i * num0 + num1) * 3 + k, ((branch.N - 1 - i) * 3 + k) + leaf.varOffset, -1); } else { task.putaij(branch.conOffset + (i * num0 + num1) * 3 + k, (i) * 3 + k + branch.varOffset, 1); task.putaij(branch.conOffset + (i * num0 + num1) * 3 + k, (i) * 3 + k + leaf.varOffset, -1); } } } } } if (leaf.branch[1] == branch) { if (leaf.nV == branch.N) { for (int i = 0; i < branch.N; i++) { for (int k = 0; k < 3; k++) { task.putconbound((i * num0 + num1) * 3 + k + branch.conOffset, mosek.boundkey.fx, 0, 0); if (leaf.flip[1]) { task.putaij(branch.conOffset + (i * num0 + num1) * 3 + k, (i) * 3 + k + branch.varOffset, 1); task.putaij(branch.conOffset + (i * num0 + num1) * 3 + k, (leaf.nU * (branch.N - i) - 1) * 3 + k + leaf.varOffset, -1); } else { task.putaij(branch.conOffset + (i * num0 + num1) * 3 + k, (i) * 3 + k + branch.varOffset, 1); task.putaij(branch.conOffset + (i * num0 + num1) * 3 + k, (leaf.nU * (i + 1) - 1) * 3 + k + leaf.varOffset, -1); } } } } } if (leaf.branch[2] == branch) { if (leaf.nU == branch.N) { for (int i = 0; i < branch.N; i++) { for (int k = 0; k < 3; k++) { task.putconbound((i * num0 + num1) * 3 + k + branch.conOffset, mosek.boundkey.fx, 0, 0); if (leaf.flip[2]) { task.putaij(branch.conOffset + (i * num0 + num1) * 3 + k, (i) * 3 + k + branch.varOffset, 1); task.putaij(branch.conOffset + (i * num0 + num1) * 3 + k, (leaf.nU * (leaf.nV - 1) + (branch.N - 1 - i)) * 3 + k + leaf.varOffset, -1); } else { task.putaij(branch.conOffset + (i * num0 + num1) * 3 + k, (i) * 3 + k + branch.varOffset, 1); task.putaij(branch.conOffset + (i * num0 + num1) * 3 + k, (leaf.nU * (leaf.nV - 1) + i) * 3 + k + leaf.varOffset, -1); } } } } } if (leaf.branch[3] == branch) { if (leaf.nV == branch.N) { for (int i = 0; i < branch.N; i++) { for (int k = 0; k < 3; k++) { task.putconbound((i * num0 + num1)*3+k + branch.conOffset, mosek.boundkey.fx, 0, 0); if (leaf.flip[3]) { task.putaij(branch.conOffset + (i * num0 + num1) * 3 + k, (i) * 3 + k + branch.varOffset, 1); task.putaij(branch.conOffset + (i * num0 + num1) * 3 + k, (leaf.nU * (branch.N - 1 - i)) * 3 + k + leaf.varOffset, -1); } else { task.putaij(branch.conOffset + (i * num0 + num1) * 3 + k, (i) * 3 + k + branch.varOffset, 1); task.putaij(branch.conOffset + (i * num0 + num1) * 3 + k, (leaf.nU * i) * 3 + k + leaf.varOffset, -1); } } } } } }
static public void put_a(mosek.Task task, double[][] aval, int[][] asub, int[] ptrb, int[] ptre, int numvar, int[] basis ) { // Since the value infinity is never used, we define // 'infinity' symbolic purposes only double infinity = 0; mosek.stakey[] skx = new mosek.stakey [numvar]; mosek.stakey[] skc = new mosek.stakey [numvar]; for (int i=0;i<numvar ;++i) { skx[i] = mosek.stakey.bas; skc[i] = mosek.stakey.fix; } task.appendvars(numvar); task.appendcons(numvar); for (int i=0;i<numvar ;++i) task.putacol(i, asub[i], aval[i]); for (int i=0 ; i<numvar ;++i) task.putconbound( i, mosek.boundkey.fx, 0.0, 0.0); for (int i=0 ; i<numvar ;++i) task.putvarbound( i, mosek.boundkey.fr, -infinity, infinity); //task.makesolutionstatusunknown(mosek.soltype.bas); /* Define a basic solution by specifying status keys for variables & constraints. */ for (int i=0 ; i<numvar ;++i) task.putsolutioni ( mosek.accmode.var, i, mosek.soltype.bas, skx[i], 0.0, 0.0, 0.0, 0.0); for (int i=0 ; i<numvar ;++i) task.putsolutioni ( mosek.accmode.con, i, mosek.soltype.bas, skc[i], 0.0, 0.0, 0.0, 0.0); task.initbasissolve(basis); }