public static void Main() { // Since the value infinity is never used, we define // 'infinity' symbolic purposes only const double infinity = 0; const int NUMCON = 1; /* Number of constraints. */ const int NUMVAR = 3; /* Number of variables. */ const int NUMANZ = 9; /* Number of numzeros in A. */ double[] c = { 0.0, -1.0, 0.0 }; mosek.boundkey[] bkc = { mosek.boundkey.lo }; double[] blc = { 1.0 }; double[] buc = { infinity }; mosek.boundkey[] bkx = { mosek.boundkey.lo, mosek.boundkey.lo, mosek.boundkey.lo }; double[] blx = { 0.0, 0.0, 0.0 }; double[] bux = { +infinity, +infinity, +infinity }; int[][] asub = { new int[] { 0 }, new int[] { 0 }, new int[] { 0 } }; double[][] aval = { new double[] { 1.0 }, new double[] { 1.0 }, new double[] { 1.0 } }; mosek.Task task = null; mosek.Env env = null; double[] xx = new double[NUMVAR]; try { // Make mosek environment. env = new mosek.Env(); // Direct the env log stream to the user specified // method env_msg_obj.streamCB env.set_Stream(mosek.streamtype.log, new msgclass("")); // Initialize the environment. env.init(); // Create a task object linked with the environment env. task = new mosek.Task(env, 0, 0); // Directs the log task stream to the user specified // method task_msg_obj.streamCB task.set_Stream(mosek.streamtype.log, new msgclass("")); /* Give MOSEK an estimate of the size of the input data. * This is done to increase the speed of inputting data. * However, it is optional. */ task.putmaxnumvar(NUMVAR); task.putmaxnumcon(NUMCON); task.putmaxnumanz(NUMANZ); /* Append 'NUMCON' empty constraints. * The constraints will initially have no bounds. */ task.append(mosek.accmode.con, NUMCON); /* Append 'NUMVAR' variables. * The variables will initially be fixed at zero (x=0). */ task.append(mosek.accmode.var, NUMVAR); /* Optionally add a constant term to the objective. */ task.putcfix(0.0); for (int j = 0; j < NUMVAR; ++j) { /* Set the linear term c_j in the objective.*/ task.putcj(j, c[j]); /* Set the bounds on variable j. * blx[j] <= x_j <= bux[j] */ task.putbound(mosek.accmode.var, j, bkx[j], blx[j], bux[j]); /* Input column j of A */ task.putavec(mosek.accmode.var, /* Input columns of A.*/ j, /* Variable (column) index.*/ asub[j], /* Row index of non-zeros in column j.*/ aval[j]); /* Non-zero Values of column j. */ } /* Set the bounds on constraints. * for i=1, ...,NUMCON : blc[i] <= constraint i <= buc[i] */ for (int i = 0; i < NUMCON; ++i) { task.putbound(mosek.accmode.con, i, bkc[i], blc[i], buc[i]); } /* * The lower triangular part of the Q * matrix in the objective is specified. */ int[] qsubi = { 0, 1, 2, 2 }; int[] qsubj = { 0, 1, 0, 2 }; double[] qval = { 2.0, 0.2, -1.0, 2.0 }; /* Input the Q for the objective. */ task.putobjsense(mosek.objsense.minimize); task.putqobj(qsubi, qsubj, qval); task.optimize(); // Print a summary containing information // about the solution for debugging purposes task.solutionsummary(mosek.streamtype.msg); mosek.solsta solsta; mosek.prosta prosta; /* Get status information about the solution */ task.getsolutionstatus(mosek.soltype.itr, out prosta, out solsta); task.getsolutionslice(mosek.soltype.itr, // Interior point solution. mosek.solitem.xx, // Which part of solution. 0, // Index of first variable. NUMVAR, // Index of last variable+1 xx); switch (solsta) { case mosek.solsta.optimal: case mosek.solsta.near_optimal: Console.WriteLine("Optimal primal solution\n"); for (int j = 0; j < NUMVAR; ++j) { Console.WriteLine("x[{0}]:", xx[j]); } break; case mosek.solsta.dual_infeas_cer: case mosek.solsta.prim_infeas_cer: case mosek.solsta.near_dual_infeas_cer: case mosek.solsta.near_prim_infeas_cer: Console.WriteLine("Primal or dual infeasibility.\n"); break; case mosek.solsta.unknown: Console.WriteLine("Unknown solution status.\n"); break; default: Console.WriteLine("Other solution status"); break; } } catch (mosek.Exception e) { Console.WriteLine(e); } finally { if (task != null) { task.Dispose(); } if (env != null) { env.Dispose(); } } } /* Main */
public void Optimize(Story story, PositionTable <double> position, PositionTable <int> segment) { int count = -1; List <double> X = new List <double>(); int[,] index = new int[story.Characters.Count, story.FrameCount]; for (int i = 0; i < story.Characters.Count; ++i) { for (int frame = 0; frame < story.FrameCount; ++frame) { index[i, frame] = -2; } } for (int i = 0; i < story.Characters.Count; ++i) { for (int frame = 0; frame < story.FrameCount; ++frame) { if (story.SessionTable[i, frame] != -1) { if (frame > 0 && story.SessionTable[i, frame - 1] != -1 && segment[i, frame] == segment[i, frame - 1]) { index[i, frame] = count; } else { index[i, frame] = ++count; X.Add(position[i, frame]); } } } } Dictionary <Tuple <int, int>, double> Q = new Dictionary <Tuple <int, int>, double>(); for (int i = 0; i < X.Count; ++i) { Q.Add(new Tuple <int, int>(i, i), 1); } //int[,] Q = new int[X.Count, X.Count]; for (int i = 0; i < story.Characters.Count; ++i) { for (int frame = 0; frame < story.FrameCount - 1; ++frame) { int left = frame; int right = frame + 1; if (story.SessionTable[i, left] != -1 && story.SessionTable[i, right] != -1 && segment[i, left] != segment[i, right]) { if (!Q.ContainsKey(new Tuple <int, int>(index[i, left], index[i, left]))) { Q.Add(new Tuple <int, int>(index[i, left], index[i, left]), 0); } if (!Q.ContainsKey(new Tuple <int, int>(index[i, right], index[i, right]))) { Q.Add(new Tuple <int, int>(index[i, right], index[i, right]), 0); } if (!Q.ContainsKey(new Tuple <int, int>(index[i, left], index[i, right]))) { Q.Add(new Tuple <int, int>(index[i, left], index[i, right]), 0); } if (!Q.ContainsKey(new Tuple <int, int>(index[i, right], index[i, left]))) { Q.Add(new Tuple <int, int>(index[i, right], index[i, left]), 0); } Q[new Tuple <int, int>(index[i, left], index[i, left])] += 2; Q[new Tuple <int, int>(index[i, right], index[i, right])] += 2; Q[new Tuple <int, int>(index[i, left], index[i, right])] -= 2; Q[new Tuple <int, int>(index[i, right], index[i, left])] -= 2; } } } List <int> li = new List <int>(); List <int> lj = new List <int>(); List <double> lv = new List <double>(); foreach (KeyValuePair <Tuple <int, int>, double> pair in Q) { if (pair.Key.Item1 >= pair.Key.Item2 && pair.Value != 0) { li.Add(pair.Key.Item1); lj.Add(pair.Key.Item2); lv.Add((double)pair.Value); } } int[] qsubi = li.ToArray(); int[] qsubj = lj.ToArray(); double[] qval = lv.ToArray(); List <Tuple <int, int> > listInner = new List <Tuple <int, int> >(); List <Tuple <int, int> > listOuter = new List <Tuple <int, int> >(); for (int frame = 0; frame < story.FrameCount; ++frame) { List <Tuple <int, double> > l = new List <Tuple <int, double> >(); for (int i = 0; i < story.Characters.Count; ++i) { if (story.SessionTable[i, frame] != -1) { l.Add(new Tuple <int, double>(i, position[i, frame])); } } l.Sort((a, b) => a.Item2.CompareTo(b.Item2)); for (int k = 0; k < l.Count - 1; ++k) { int x = l[k].Item1; int y = l[k + 1].Item1; if (story.SessionTable[x, frame] == story.SessionTable[y, frame]) { if (!listInner.Contains(new Tuple <int, int>(index[x, frame], index[y, frame]))) { listInner.Add(new Tuple <int, int>(index[x, frame], index[y, frame])); } } else { if (!listOuter.Contains(new Tuple <int, int>(index[x, frame], index[y, frame]))) { listOuter.Add(new Tuple <int, int>(index[x, frame], index[y, frame])); } } } } Debug.Assert(!ExistingCircle(listInner, X.Count)); Debug.Assert(!ExistingCircle(listOuter, X.Count)); foreach (Tuple <int, int> tuple in listInner) { Debug.Write(tuple.Item1.ToString() + "->" + tuple.Item2.ToString() + ", "); } const double infinity = 0; int NumConstraint = listInner.Count + listOuter.Count; int NumVariable = X.Count; double[] blx = new double[NumVariable]; double[] bux = new double[NumVariable]; mosek.boundkey[] bkx = new mosek.boundkey[NumVariable]; for (int i = 0; i < NumVariable; ++i) { bkx[i] = mosek.boundkey.ra; blx[i] = -12000; bux[i] = 12000; } bkx[0] = mosek.boundkey.fx; bkx[0] = 0; bkx[0] = 0; int[][] asub = new int[NumVariable][]; double[][] aval = new double[NumVariable][]; List <int>[] asubList = new List <int> [NumVariable]; List <double>[] avalList = new List <double> [NumVariable]; for (int i = 0; i < NumVariable; ++i) { asubList[i] = new List <int>(); avalList[i] = new List <double>(); } for (int i = 0; i < listInner.Count; ++i) { Tuple <int, int> pair = listInner[i]; int x = pair.Item1; int y = pair.Item2; asubList[x].Add(i); avalList[x].Add(-1); asubList[y].Add(i); avalList[y].Add(1); } for (int i = 0; i < listOuter.Count; ++i) { int j = i + listInner.Count; Tuple <int, int> pair = listOuter[i]; int x = pair.Item1; int y = pair.Item2; asubList[x].Add(j); avalList[x].Add(-1); asubList[y].Add(j); avalList[y].Add(1); } for (int i = 0; i < NumVariable; ++i) { asub[i] = asubList[i].ToArray(); aval[i] = avalList[i].ToArray(); } mosek.boundkey[] bkc = new mosek.boundkey[NumConstraint]; double[] blc = new double[NumConstraint]; double[] buc = new double[NumConstraint]; for (int i = 0; i < listInner.Count; ++i) { bkc[i] = mosek.boundkey.fx; //blc[i] = 28; //buc[i] = 28; blc[i] = _app.Status.Config.Style.DefaultInnerGap; buc[i] = _app.Status.Config.Style.DefaultInnerGap; } for (int i = listInner.Count; i < listInner.Count + listOuter.Count; ++i) { bkc[i] = mosek.boundkey.lo; //blc[i] = 84; blc[i] = _app.Status.Config.Style.OuterGap; buc[i] = 1000; } mosek.Task task = null; mosek.Env env = null; double[] xx = new double[NumVariable]; DateTime start = DateTime.Now; try { env = new mosek.Env(); env.set_Stream(mosek.streamtype.log, new msgclass("")); env.init(); task = new mosek.Task(env, 0, 0); task.set_Stream(mosek.streamtype.log, new msgclass("")); task.putmaxnumvar(NumVariable); task.putmaxnumcon(NumConstraint); //task.putdouparam(mosek.dparam.intpnt_nl_tol_pfeas, 1.0e-1); //task.putdouparam(mosek.dparam.intpnt_tol_dfeas, 1.0e-1); //task.putdouparam(mosek.dparam.intpnt_nl_tol_rel_gap, 1.0e-1); //task.putdouparam(mosek.dparam.intpnt_co_tol_infeas, 1.0e-13); //task.putdouparam(mosek.dparam.intpnt_nl_tol_mu_red, 1.0e-13); task.append(mosek.accmode.con, NumConstraint); task.append(mosek.accmode.var, NumVariable); task.putcfix(0.0); for (int j = 0; j < NumVariable; ++j) { task.putcj(j, 0); task.putbound(mosek.accmode.var, j, bkx[j], blx[j], bux[j]); task.putavec(mosek.accmode.var, j, asub[j], aval[j]); } for (int i = 0; i < NumConstraint; ++i) { task.putbound(mosek.accmode.con, i, bkc[i], blc[i], buc[i]); } task.putobjsense(mosek.objsense.minimize); task.putqobj(qsubi, qsubj, qval); task.optimize(); task.solutionsummary(mosek.streamtype.msg); mosek.solsta solsta; mosek.prosta prosta; task.getsolutionstatus(mosek.soltype.itr, out prosta, out solsta); task.getsolutionslice(mosek.soltype.itr, mosek.solitem.xx, 0, NumVariable, xx); switch (solsta) { case mosek.solsta.optimal: case mosek.solsta.near_optimal: Console.WriteLine("Optimal primal solution\n"); //for (int j = 0; j < NumVariable; ++j) // Console.WriteLine("x[{0}]:", xx[j]); break; case mosek.solsta.dual_infeas_cer: case mosek.solsta.prim_infeas_cer: case mosek.solsta.near_dual_infeas_cer: case mosek.solsta.near_prim_infeas_cer: Console.WriteLine("Primal or dual infeasibility.\n"); break; case mosek.solsta.unknown: Console.WriteLine("Unknown solution status.\n"); break; default: Console.WriteLine("Other solution status"); break; } } catch (mosek.Exception e) { Console.WriteLine(e.Code); Console.WriteLine(e); } finally { if (task != null) { task.Dispose(); } if (env != null) { env.Dispose(); } } Console.WriteLine("///{0}", DateTime.Now - start); for (int i = 0; i < story.Characters.Count; ++i) { for (int frame = 0; frame < story.FrameCount; ++frame) { if (story.SessionTable[i, frame] != -1) { position[i, frame] = xx[index[i, frame]]; } } } }
public void Optimize(Story story, PositionTable <double> position) { int count = 0; List <double> list = new List <double>(); int[,] index = new int[story.Characters.Count, story.FrameCount]; for (int i = 0; i < story.Characters.Count; ++i) { for (int frame = 0; frame < story.FrameCount; ++frame) { if (story.SessionTable[i, frame] != -1) { index[i, frame] = count++; list.Add(position[i, frame]); } } } double[] X = list.ToArray <double>(); int[,] Q = new int[X.Length, X.Length]; for (int i = 0; i < story.Characters.Count; ++i) { for (int frame = 0; frame < story.FrameCount - 1; ++frame) { int left = frame; int right = frame + 1; if (story.SessionTable[i, left] != -1 && story.SessionTable[i, right] != -1) { Q[index[i, left], index[i, left]] += 2; Q[index[i, right], index[i, right]] += 2; Q[index[i, left], index[i, right]] -= 2; Q[index[i, right], index[i, left]] -= 2; } } } List <int> li = new List <int>(); List <int> lj = new List <int>(); List <double> lv = new List <double>(); for (int i = 0; i < X.Length; ++i) { for (int j = 0; j <= i; ++j) { if (Q[i, j] != 0) { li.Add(i); lj.Add(j); lv.Add((double)Q[i, j]); } } } int[] qsubi = li.ToArray(); int[] qsubj = lj.ToArray(); double[] qval = lv.ToArray(); List <Tuple <int, int> > listInner = new List <Tuple <int, int> >(); List <Tuple <int, int> > listOuter = new List <Tuple <int, int> >(); for (int frame = 0; frame < story.FrameCount; ++frame) { List <Tuple <int, double> > l = new List <Tuple <int, double> >(); for (int i = 0; i < story.Characters.Count; ++i) { if (story.SessionTable[i, frame] != -1) { l.Add(new Tuple <int, double>(i, position[i, frame])); } } l.Sort((a, b) => a.Item2.CompareTo(b.Item2)); for (int k = 0; k < l.Count - 1; ++k) { int x = l[k].Item1; int y = l[k + 1].Item1; if (story.SessionTable[x, frame] == story.SessionTable[y, frame]) { listInner.Add(new Tuple <int, int>(index[x, frame], index[y, frame])); } else { listOuter.Add(new Tuple <int, int>(index[x, frame], index[y, frame])); } } } const double infinity = 0; int NumConstraint = listInner.Count + listOuter.Count; int NumVariable = X.Length; double[] blx = new double[NumVariable]; double[] bux = new double[NumVariable]; mosek.boundkey[] bkx = new mosek.boundkey[NumVariable]; for (int i = 0; i < NumVariable; ++i) { bkx[i] = mosek.boundkey.fr; } int[][] asub = new int[NumVariable][]; double[][] aval = new double[NumVariable][]; List <int>[] asubList = new List <int> [NumVariable]; List <double>[] avalList = new List <double> [NumVariable]; for (int i = 0; i < NumVariable; ++i) { asubList[i] = new List <int>(); avalList[i] = new List <double>(); } for (int i = 0; i < listInner.Count; ++i) { Tuple <int, int> pair = listInner[i]; int x = pair.Item1; int y = pair.Item2; asubList[x].Add(i); avalList[x].Add(-1); asubList[y].Add(i); avalList[y].Add(1); } for (int i = 0; i < listOuter.Count; ++i) { int j = i + listInner.Count; Tuple <int, int> pair = listOuter[i]; int x = pair.Item1; int y = pair.Item2; asubList[x].Add(j); avalList[x].Add(-1); asubList[y].Add(j); avalList[y].Add(1); } for (int i = 0; i < NumVariable; ++i) { asub[i] = asubList[i].ToArray(); aval[i] = avalList[i].ToArray(); } mosek.boundkey[] bkc = new mosek.boundkey[NumConstraint]; double[] blc = new double[NumConstraint]; double[] buc = new double[NumConstraint]; for (int i = 0; i < listInner.Count; ++i) { bkc[i] = mosek.boundkey.fx; blc[i] = 28; buc[i] = 28; } for (int i = listInner.Count; i < listInner.Count + listOuter.Count; ++i) { bkc[i] = mosek.boundkey.lo; blc[i] = 84; buc[i] = infinity; } mosek.Task task = null; mosek.Env env = null; double[] xx = new double[NumVariable]; try { env = new mosek.Env(); env.init(); task = new mosek.Task(env, 0, 0); task.putmaxnumvar(NumVariable); task.putmaxnumcon(NumConstraint); task.append(mosek.accmode.con, NumConstraint); task.append(mosek.accmode.var, NumVariable); task.putcfix(0.0); for (int j = 0; j < NumVariable; ++j) { task.putcj(j, 0); task.putbound(mosek.accmode.var, j, bkx[j], blx[j], bux[j]); task.putavec(mosek.accmode.var, j, asub[j], aval[j]); } for (int i = 0; i < NumConstraint; ++i) { task.putbound(mosek.accmode.con, i, bkc[i], blc[i], buc[i]); } task.putobjsense(mosek.objsense.minimize); task.putqobj(qsubi, qsubj, qval); task.optimize(); mosek.solsta solsta; mosek.prosta prosta; task.getsolutionstatus(mosek.soltype.itr, out prosta, out solsta); task.getsolutionslice(mosek.soltype.itr, mosek.solitem.xx, 0, NumVariable, xx); } catch (mosek.Exception e) { Console.WriteLine(e.Code); Console.WriteLine(e); } finally { if (task != null) { task.Dispose(); } if (env != null) { env.Dispose(); } } for (int i = 0; i < story.Characters.Count; ++i) { for (int frame = 0; frame < story.FrameCount; ++frame) { if (story.SessionTable[i, frame] != -1) { position[i, frame] = xx[index[i, frame]]; } } } }
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.append(mosek.accmode.var, numvar); task.append(mosek.accmode.con, numvar); for (int i = 0; i < numvar; ++i) { task.putavec(mosek.accmode.var, i, asub[i], aval[i]); } for (int i = 0; i < numvar; ++i) { task.putbound(mosek.accmode.con, i, mosek.boundkey.fx, 0.0, 0.0); } for (int i = 0; i < numvar; ++i) { task.putbound(mosek.accmode.var, 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); }
public static void Main() { // Since the value infinity is never used, we define // 'infinity' symbolic purposes only double infinity = 0; const int NUMCON = 3; const int NUMVAR = 3; const int NUMANZ = 9; double[] c = { 1.5, 2.5, 3.0 }; mosek.boundkey[] bkc = { mosek.boundkey.up, mosek.boundkey.up, mosek.boundkey.up }; double[] blc = { -infinity, -infinity, -infinity }; double[] buc = { 100000, 50000, 60000 }; mosek.boundkey[] bkx = { mosek.boundkey.lo, mosek.boundkey.lo, mosek.boundkey.lo }; double[] blx = { 0.0, 0.0, 0.0 }; double[] bux = { +infinity, +infinity, +infinity }; int[][] asub = new int[NUMVAR][]; asub[0] = new int[] { 0, 1, 2 }; asub[1] = new int[] { 0, 1, 2 }; asub[2] = new int[] { 0, 1, 2 }; double[][] aval = new double[NUMVAR][]; aval[0] = new double[] { 2.0, 3.0, 2.0 }; aval[1] = new double[] { 4.0, 2.0, 3.0 }; aval[2] = new double[] { 3.0, 3.0, 2.0 }; double[] xx = new double[NUMVAR]; mosek.Task task = null; mosek.Env env = null; try { // Create mosek environment. env = new mosek.Env(); // Initialize the environment. env.init(); // Create a task object linked with the environment env. task = new mosek.Task(env, NUMCON, NUMVAR); /* Give MOSEK an estimate on the size of * the data to input. This is done to increase * the speed of inputting data and is optional.*/ task.putmaxnumvar(NUMVAR); task.putmaxnumcon(NUMCON); task.putmaxnumanz(NUMANZ); /* Append the constraints. */ task.append(mosek.accmode.con, NUMCON); /* Append the variables. */ task.append(mosek.accmode.var, NUMVAR); /* Put C. */ task.putcfix(0.0); for (int j = 0; j < NUMVAR; ++j) { task.putcj(j, c[j]); } /* Put constraint bounds. */ for (int i = 0; i < NUMCON; ++i) { task.putbound(mosek.accmode.con, i, bkc[i], blc[i], buc[i]); } /* Put variable bounds. */ for (int j = 0; j < NUMVAR; ++j) { task.putbound(mosek.accmode.var, j, bkx[j], blx[j], bux[j]); } /* Put A. */ if (NUMCON > 0) { for (int j = 0; j < NUMVAR; ++j) { task.putavec(mosek.accmode.var, j, asub[j], aval[j]); } } task.putobjsense(mosek.objsense.maximize); try { task.optimize(); } catch (mosek.Warning w) { Console.WriteLine("Mosek warning:"); Console.WriteLine(w.Code); Console.WriteLine(w); } task.getsolutionslice(mosek.soltype.bas, /* Basic solution. */ mosek.solitem.xx, /* Which part of solution. */ 0, /* Index of first variable. */ NUMVAR, /* Index of last variable+1 */ xx); for (int j = 0; j < NUMVAR; ++j) { Console.WriteLine("x[{0}]:{1}", j, xx[j]); } /* Make a change to the A matrix */ task.putaij(0, 0, 3.0); task.optimize(); /* Append a new varaible x_3 to the problem */ task.append(mosek.accmode.var, 1); /* Get index of new variable, this should be 3 */ int numvar; task.getnumvar(out numvar); /* Set bounds on new varaible */ task.putbound(mosek.accmode.var, numvar - 1, mosek.boundkey.lo, 0, +infinity); /* Change objective */ task.putcj(numvar - 1, 1.0); /* Put new values in the A matrix */ int[] acolsub = new int[] { 0, 2 }; double[] acolval = new double[] { 4.0, 1.0 }; task.putavec(mosek.accmode.var, numvar - 1, /* column index */ acolsub, acolval); /* Change optimizer to simplex free and reoptimize */ task.putintparam(mosek.iparam.optimizer, mosek.optimizertype.free_simplex); task.optimize(); /* Append a new constraint */ task.append(mosek.accmode.con, 1); /* Get index of new constraint, this should be 4 */ int numcon; task.getnumcon(out numcon); /* Set bounds on new constraint */ task.putbound( mosek.accmode.con, numcon - 1, mosek.boundkey.up, -infinity, 30000); /* Put new values in the A matrix */ int[] arowsub = new int[] { 0, 1, 2, 3 }; double[] arowval = new double[] { 1.0, 2.0, 1.0, 1.0 }; task.putavec(mosek.accmode.con, numcon - 1, /* row index */ arowsub, arowval); task.optimize(); } catch (mosek.Exception e) { Console.WriteLine(e.Code); Console.WriteLine(e); } if (task != null) { task.Dispose(); } if (env != null) { env.Dispose(); } }