예제 #1
0
 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);
             }
         }
     }
 }
예제 #2
0
 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);
         }
     }
 }
예제 #3
0
        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);
                            }
                        }
                    }
                }
            }
        }
예제 #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.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);    
  }