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