static int sync_current_delta(struct sb *sb, enum unify_flags unify_flag) { struct delta_ref *delta_ref; unsigned delta; int err = 0; #if TUX3_FLUSHER == TUX3_FLUSHER_SYNC down_write(&sb->delta_lock); #endif /* Get delta that have to write */ delta_ref = delta_get(sb); #ifdef UNIFY_DEBUG delta_ref->unify_flag = unify_flag; #endif delta = delta_ref->delta; delta_put(sb, delta_ref); trace("delta %u", delta); /* Make sure the delta transition was done for current delta */ err = wait_for_transition(sb, delta); if (err) return err; assert(delta_after_eq(sb->staging_delta, delta)); /* Wait until committing the current delta */ err = wait_for_commit(sb, delta); assert(err || delta_after_eq(sb->committed_delta, delta)); #if TUX3_FLUSHER == TUX3_FLUSHER_SYNC up_write(&sb->delta_lock); #endif return err; }
/* Critical value complex chooser option */ static double CriticalValueChooser( double S, double Xc, double Xp, double T, double Tc, double Tp, double r, double b, double v) { double Sv, ci, Pi, dc, dp, yi, di; const double epsilon = 0.001; assert_valid_price(S); assert_valid_time(T); Sv = S; ci = gbs_call(Sv, Xc, Tc - T, r, b, v); Pi = gbs_put (Sv, Xp, Tp - T, r, b, v); dc = delta_call(Sv, Xc, Tc - T, r, b, v); dp = delta_put (Sv, Xp, Tp - T, r, b, v); yi = ci - Pi; di = dc - dp; /* Newton-Raphson search process */ while (fabs(yi) > epsilon) { Sv = Sv - (yi) / di; ci = gbs_call(Sv, Xc, Tc - T, r, b, v); Pi = gbs_put (Sv, Xp, Tp - T, r, b, v); dc = delta_call(Sv, Xc, Tc - T, r, b, v); dp = delta_put (Sv, Xp, Tp - T, r, b, v); yi = ci - Pi; di = dc - dp; } return Sv; }