ResolvedSwaptionHullWhiteModelBoundary.java

package net.finmath.finitedifference.interestrate.boundaries;

import net.finmath.finitedifference.boundaries.BoundaryCondition;
import net.finmath.finitedifference.interestrate.models.FDMHullWhiteModel;
import net.finmath.finitedifference.interestrate.products.FiniteDifferenceInterestRateProduct;
import net.finmath.finitedifference.interestrate.products.Swaption;

/**
 * Boundary wrapper for {@link Swaption.ResolvedSwaption} under
 * {@link FDMHullWhiteModel}.
 *
 * <p>
 * The internal product {@link Swaption.ResolvedSwaption} is only an adapter
 * used
 * to resolve exercise dates and event conditions. Boundary conditions should
 * still be taken from the original outer {@link Swaption}.
 * </p>
 *
 * <p>
 * This wrapper allows the boundary factory to keep using the runtime product
 * class name while delegating all boundary logic to
 * {@link SwaptionHullWhiteModelBoundary}.
 * </p>
 *
 * @author Alessandro Gnoatto
 */
public class ResolvedSwaptionHullWhiteModelBoundary implements FiniteDifferenceInterestRateBoundary {

	/**
	 * The delegate.
	 */
	private final SwaptionHullWhiteModelBoundary delegate;

	/**
	 * Creates the boundary wrapper.
	 *
	 * @param model The Hull-White model.
	 */
	public ResolvedSwaptionHullWhiteModelBoundary(final FDMHullWhiteModel model) {
		this.delegate = new SwaptionHullWhiteModelBoundary(model);
	}

	@Override
	public BoundaryCondition[] getBoundaryConditionsAtLowerBoundary(
			final FiniteDifferenceInterestRateProduct product,
			final double time,
			final double... stateVariables) {

		final Swaption originalSwaption = unwrap(product);

		return delegate.getBoundaryConditionsAtLowerBoundary(
				originalSwaption,
				time,
				stateVariables
				);
	}

	@Override
	public BoundaryCondition[] getBoundaryConditionsAtUpperBoundary(
			final FiniteDifferenceInterestRateProduct product,
			final double time,
			final double... stateVariables) {

		final Swaption originalSwaption = unwrap(product);

		return delegate.getBoundaryConditionsAtUpperBoundary(
				originalSwaption,
				time,
				stateVariables
				);
	}

	private Swaption unwrap(final FiniteDifferenceInterestRateProduct product) {
		if (!(product instanceof Swaption.ResolvedSwaption)) {
			throw new IllegalArgumentException(
					"ResolvedSwaptionHullWhiteModelBoundary requires a Swaption.ResolvedSwaption product."
					);
		}

		return ((Swaption.ResolvedSwaption) product).getOriginalSwaption();
	}
}