/// <summary> /// Represents copy of variable /// </summary> /// <exception cref="NullReferenceException"></exception> public Variable(Variable variable) { _coefficient = new Fraction(variable._coefficient); SetLabel(variable.Label); Power = variable.Power; }
/// <summary> /// Adds var to current variable /// </summary> /// <exception cref="NullReferenceException"></exception> public void Add(Variable var) { if (var.Label != Label || var.Power != Power) throw new FormatException("Input variable must be with same labels and powers"); _coefficient += var._coefficient; }
/// <summary> /// Multiplys Constraint(left and right sides) by number /// </summary> public void Multiply(int number) { for (var i = 0; i < _leftSide.Count; i++) { _leftSide[i] = new Variable(_leftSide[i]); _leftSide[i].Multiply(number); } if (number < 0) ChangeSign(); _rightSide *= number; }
/// <summary> /// Multiplys Constraint(left and right sides) by fraction /// </summary> /// <exception cref="NullReferenceException"></exception> public void Multiply(Fraction fraction) { for (var i = 0; i < _leftSide.Count; i++) { _leftSide[i] = new Variable(_leftSide[i]); _leftSide[i].Multiply(fraction); } //foreach (Variable var in this._leftSide) // var.Multiply(fraction); if (fraction < 0) ChangeSign(); _rightSide *= fraction; }
/// <summary> /// Divides Constraint(left and right sides) by number /// </summary> /// <exception cref="DivideByZeroException"></exception> public void Divide(int number) { for (var i = 0; i < _leftSide.Count; i++) { _leftSide[i] = new Variable(_leftSide[i]); _leftSide[i].Divide(number); } //foreach (Variable var in this._leftSide) // var.Divide(number); if (number < 0) ChangeSign(); _rightSide /= number; }
/// <summary> /// Adds variable with or without sign change /// </summary> /// <param name="var">Variable</param> /// <param name="withSignChange">If true change sign('>=' -> '=', if var.Coefficient less than 0)</param> public void AddVariable(Variable var, bool withSignChange) { if (withSignChange) { if (var.Coefficient > 0) Sign = Sign == "<=" || Sign == "<" ? "=" : Sign; if (var.Coefficient < 0) Sign = Sign == ">=" || Sign == ">" ? "=" : Sign; } for (var i = 0; i < _leftSide.Count; i++) if (_leftSide[i].Label == var.Label && _leftSide[i].Power == var.Power) { var tmp = _leftSide[i]; _leftSide.Remove(tmp); var newVar = new Variable(var.Coefficient + tmp.Coefficient, var.Label, var.Power); _leftSide.Add(newVar); return; } _leftSide.Add(new Variable(var)); }
/// <summary> /// Removes variable from target function by label /// </summary> public void RemoveVariable(string variableLabel) { var removedVariable = new Variable(); foreach (var variable in _formula) if (variable.Label == variableLabel) { removedVariable = variable; break; } _formula.Remove(removedVariable); _arguments.Remove(variableLabel); if (_variablesWithMaxCoefficient.Contains(variableLabel)) _variablesWithMaxCoefficient.Remove(variableLabel); }
/// <summary> /// Adds variable to formula /// </summary> /// <exception cref="NullReferenceException"></exception> public void AddVariable(Variable var) { if (_arguments.Contains(var.Label)) { for (var i = 0; i < _formula.Count; i++) if (_formula[i].Label == var.Label && _formula[i].Power == var.Power) { var tmp = _formula[i]; _formula.Remove(tmp); var newVar = new Variable(var.Coefficient + tmp.Coefficient, var.Label, var.Power); _formula.Add(newVar); return; } } _formula.Add(new Variable(var.Coefficient, var.Label, var.Power)); _arguments.Add(var.Label); }
/// <summary> /// Adds zero constrain for specified variable /// </summary> private void AddZeroConstraint(string variableLabel) { var variable = new Variable("1/1", variableLabel); ZeroConstraints.Add(new Constraint(new List<Variable> { variable }, ">=", "0/0")); }