/**
  * The value of this beed is recalculated. This is done by iterating over the arguments. When
  * there are no terms, the result is equal to {@link #initialValue()}. When one of the terms is
  * null, the result is null. When all terms are effective, the result is dependent on the specific
  * subclass.
  */
 private final void recalculate() {
   $value = initialValue();
   for (RealBeed<?> argument : $arguments) {
     if (!argument.isEffective()) {
       assignEffective(false);
       return;
     }
     $value = operation($value, argument.getdouble());
   }
   assignEffective(true);
 }
 /**
  * @pre argument != null;
  * @post new.getNbOccurrences(argument) == getNbOccurrences(argument) + 1;
  */
 public final void addArgument(RealBeed<?> argument) {
   assert argument != null;
   addUpdateSource(argument);
   $arguments.add(argument);
   // recalculate(); optimization
   if ($effective) {
     double oldValue = $value;
     if (!argument.isEffective()) {
       assignEffective(false);
     } else {
       assert argument.isEffective();
       if (argument.getdouble() != initialValue()) {
         $value = operation($value, argument.getdouble());
       }
     }
     if ((!$effective) || !MathUtil.equalPrimitiveValue(oldValue, $value)) {
       updateDependents(new ActualDoubleEvent(this, oldValue, $effective ? $value : null, null));
     }
   }
   // otherwise, there is an existing null argument; the new argument cannot change null value
 }