Esempio n. 1
0
 public ClLinearEquation(ClLinearExpression cle,
                         ClAbstractVariable clv,
                         ClStrength strength,
                         double weight) : base((ClLinearExpression) cle.Clone(), strength, weight)
 {
   _expression.AddVariable(clv, -1.0);
 }
Esempio n. 2
0
 public ClLinearEquation(ClLinearExpression cle1,
                         ClLinearExpression cle2,
                         ClStrength strength,
                         double weight) : base((ClLinearExpression)cle1.Clone(), strength, weight)
 {
     _expression.AddExpression(cle2, -1.0);
 }
Esempio n. 3
0
 public ClLinearEquation(ClLinearExpression cle,
                         ClAbstractVariable clv,
                         ClStrength strength,
                         double weight) : base((ClLinearExpression)cle.Clone(), strength, weight)
 {
     _expression.AddVariable(clv, -1.0);
 }
Esempio n. 4
0
        //// END PUBLIC INTERFACE ////

        /// <summary>
        /// Add the constraint expr=0 to the inequality tableau using an
        /// artificial variable.
        /// </summary>
        /// <remarks>
        /// To do this, create an artificial variable av and add av=expr
        /// to the inequality tableau, then make av be 0 (raise an exception
        /// if we can't attain av=0).
        /// </remarks>
        private void AddWithArtificialVariable(ClLinearExpression expr)
        /* throws ExClRequiredFailure, ExClInternalError */
        {
            ClSlackVariable     av    = new ClSlackVariable(++_artificialCounter, "a");
            ClObjectiveVariable az    = new ClObjectiveVariable("az");
            ClLinearExpression  azRow = expr.Clone();

            AddRow(az, azRow);
            AddRow(av, expr);

            Optimize(az);

            ClLinearExpression azTableauRow = RowExpression(az);

            if (!Approx(azTableauRow.Constant, 0.0))
            {
                RemoveRow(az);
                RemoveColumn(av);
                throw new CassowaryRequiredFailureException();
            }

            // see if av is a basic variable
            ClLinearExpression e = RowExpression(av);

            if (e != null)
            {
                // find another variable in this row and pivot,
                // so that av becomes parametric
                if (e.IsConstant)
                {
                    // if there isn't another variable in the row
                    // then the tableau contains the equation av=0 --
                    // just delete av's row
                    RemoveRow(av);
                    RemoveRow(az);
                    return;
                }
                ClAbstractVariable entryVar = e.AnyPivotableVariable();
                Pivot(entryVar, av);
            }
            Assert(RowExpression(av) == null, "RowExpression(av) == null)");
            RemoveColumn(av);
            RemoveRow(az);
        }
Esempio n. 5
0
        public ClLinearInequality(ClLinearExpression cle,
                                  byte op_enum,
                                  ClAbstractVariable clv,
                                  ClStrength strength,
                                  double weight) : base((ClLinearExpression)cle.Clone(), strength, weight)
            /* throws ExClInternalError */
        {
            switch (op_enum)
            {
            case Cl.LEQ:
                _expression.MultiplyMe(-1.0);
                _expression.AddVariable(clv);
                break;

            case Cl.GEQ:
                _expression.AddVariable(clv, -1.0);
                break;

            default:
                // invalid operator
                throw new ExClInternalError("Invalid operator in ClLinearInequality constructor");
            }
        }
Esempio n. 6
0
    //// END PUBLIC INTERFACE ////
    
    /// <summary>
    /// Add the constraint expr=0 to the inequality tableau using an
    /// artificial variable.
    /// </summary>
    /// <remarks>
    /// To do this, create an artificial variable av and add av=expr
    /// to the inequality tableau, then make av be 0 (raise an exception
    /// if we can't attain av=0).
    /// </remarks>
    protected void AddWithArtificialVariable(ClLinearExpression expr)
      /* throws ExClRequiredFailure, ExClInternalError */
    {
      if (Trace)
        FnEnterPrint("AddWithArtificialVariable: " + expr);

      ClSlackVariable av = new ClSlackVariable(++_artificialCounter, "a");
      ClObjectiveVariable az = new ClObjectiveVariable("az");
      ClLinearExpression azRow = (ClLinearExpression) expr.Clone();
      
      if (Trace)
        TracePrint("before AddRows:\n" + this);

      AddRow(az, azRow);
      AddRow(av, expr);

      if (Trace)
        TracePrint("after AddRows:\n" + this);
      
      Optimize(az);

      ClLinearExpression azTableauRow = RowExpression(az);

      if (Trace)
        TracePrint("azTableauRow.Constant == " + azTableauRow.Constant);

      if (!Cl.Approx(azTableauRow.Constant, 0.0))
      {
        RemoveRow(az);
        RemoveColumn(av);
        throw new ExClRequiredFailure();
      }

      // see if av is a basic variable
      ClLinearExpression e = RowExpression(av);

      if (e != null)
      {
        // find another variable in this row and pivot,
        // so that av becomes parametric
        if (e.IsConstant)
        {
          // if there isn't another variable in the row
          // then the tableau contains the equation av=0 --
          // just delete av's row
          RemoveRow(av);
          RemoveRow(az);
          return;
        }
        ClAbstractVariable entryVar = e.AnyPivotableVariable();
        Pivot(entryVar, av);
      }
      Assert(RowExpression(av) == null, "RowExpression(av) == null)");
      RemoveColumn(av);
      RemoveRow(az);
    }
Esempio n. 7
0
 public ClLinearEquation(ClLinearExpression cle1,
                         ClLinearExpression cle2,
                         ClStrength strength,
                         double weight) : base((ClLinearExpression) cle1.Clone(), strength, weight)
 {
   _expression.AddExpression(cle2, -1.0);
 }
 public ClLinearInequality(ClLinearExpression cle,
                           byte op_enum,
                           ClAbstractVariable clv,
                           ClStrength strength,
                           double weight) : base((ClLinearExpression) cle.Clone(), strength, weight)
                           /* throws ExClInternalError */
 {
   switch (op_enum)
   {
     case Cl.LEQ:
       _expression.MultiplyMe(-1.0);
       _expression.AddVariable(clv);
       break;
     case Cl.GEQ:
       _expression.AddVariable(clv, -1.0);
       break;
     default:
       // invalid operator
       throw new ExClInternalError("Invalid operator in ClLinearInequality constructor");
   }
 }