code: private double gaussianUpdate(int predicate, int oid, double correctionConstant) {
          double param = params[predicate].getParameters()[oid];
          double x0 = 0.0;
          double modelValue = modelExpects[0][predicate].getParameters()[oid];
          double observedValue = observedExpects[predicate].getParameters()[oid];
          for (int i = 0; i < 50; i++) {
              double tmp = modelValue * Math.exp(correctionConstant * x0);
              double f = tmp + (param + x0) / sigma - observedValue;
              double fp = tmp * correctionConstant + 1 / sigma;
              if (fp == 0) {
                  break;
              }
              double x = x0 - f / fp;
              if (Math.abs(x - x0) < 0.000001) {
                  x0 = x;
                  break;
              }
              x0 = x;
          }
          return x0;
      }
docs: modeled on implementation in Zhang Le's maxent kit