Пример #1
0
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;
}
Пример #2
0
/* 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;
}