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 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 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); } } } } } }