Example #1
0
    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]];
                    }
                }
            }
        }
Example #3
0
        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]];
                    }
                }
            }
        }
Example #4
0
    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);
    }
Example #5
0
    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();
        }
    }