/// <summary>
 /// Visits the constant calculation.
 /// </summary>
 /// <param name="constantCalculation">The constant calculation.</param>
 protected override void VisitConstantCalculation(ConstantCalculation constantCalculation)
 {
     if (currentIdx == hitIndex)
     {
         constantCalculation.SetValue(GetValue());
     }
     currentIdx++;
 }
        /// <summary>
        /// Generates the calculation based on the given formation.
        /// </summary>
        /// <returns>
        /// The <see cref="Calculation" /> being generated.
        /// </returns>
        /// <exception cref="InvalidOperationException">Cannot generate the equation: the given equation generation formation is not valid, please see ErrorMessages property for details.</exception>
        public override Calculation Generate()
        {
            if (!this.IsValid)
            {
                throw new InvalidOperationException("Cannot generate the equation: the given equation generation formation is not valid, please see ErrorMessages property for details.");
            }
            Calculation result       = null;
            var         numOfFactors = numOfFactors_min;

            if (numOfFactors_max != 0)
            {
                numOfFactors = rnd.Next(numOfFactors_min, numOfFactors_max + 1);
            }

            for (var idx = 0; idx < numOfFactors; idx++)
            {
                long        factor = rnd.Next(max + 1);
                var         @operator = Utils.GenerateRandomOperator(this.acceptableOperators);
                Calculation left = result, right = new ConstantCalculation(factor);

                if (@operator == Operator.Add || @operator == Operator.Mul)
                {
                    var seed = rnd.Next(DateTime.Now.Millisecond);
                    if ((seed % 2) == 0)
                    {
                        left  = new ConstantCalculation(factor);
                        right = result;
                    }
                }

                if (this.rules != null)
                {
                    foreach (var rule in rules)
                    {
                        rule.Apply(left, right, Parameters, ref @operator);
                    }
                }

                result = Calculation.Merge(left, right, @operator);
            }
            return(result);
        }
 /// <summary>
 /// Visits the constant calculation.
 /// </summary>
 /// <param name="constantCalculation">The constant calculation.</param>
 protected virtual void VisitConstantCalculation(ConstantCalculation constantCalculation)
 {
 }
 /// <summary>
 /// Visits the constant calculation.
 /// </summary>
 /// <param name="constantCalculation">The constant calculation.</param>
 protected override void VisitConstantCalculation(ConstantCalculation constantCalculation)
 {
     base.VisitConstantCalculation(constantCalculation);
     this.numOfConstantCalculations++;
 }