/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.model.option.definition; import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.Validate; import org.threeten.bp.ZonedDateTime; import com.opengamma.analytics.math.surface.Surface; /** * Describes a partial differential for a option price V in the form * $\frac{\partial V}{\partial t} + a(S,t) \frac{\partial^2 V}{\partial S^2}$ + b(S,t) \frac{\partial V}{\partial S} + (S,t)V = 0$ */ public class PDEOptionDataBundle extends StandardOptionDataBundle { private final Surface<Double, Double, Double> _a; private final Surface<Double, Double, Double> _b; private final Surface<Double, Double, Double> _c; public PDEOptionDataBundle(final Surface<Double, Double, Double> a, final Surface<Double, Double, Double> b, final Surface<Double, Double, Double> c, final double spot, final ZonedDateTime date) { super(null, 0.0, null, spot, date); Validate.notNull(a, "null a"); Validate.notNull(b, "null b"); Validate.notNull(c, "null c"); _a = a; _b = b; _c = c; } public double getA(final double f, final double t) { return _a.getZValue(f, t); } public double getB(final double f, final double t) { return _b.getZValue(f, t); } public double getC(final double f, final double t) { return _c.getZValue(f, t); } @Override public PDEOptionDataBundle withSpot(final double spot) { return new PDEOptionDataBundle(_a, _b, _c, spot, getDate()); } @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + _a.hashCode(); result = prime * result + _b.hashCode(); result = prime * result + _c.hashCode(); return result; } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (!super.equals(obj)) { return false; } if (!(obj instanceof PDEOptionDataBundle)) { return false; } final PDEOptionDataBundle other = (PDEOptionDataBundle) obj; if (!ObjectUtils.equals(_a, other._a)) { return false; } if (!ObjectUtils.equals(_b, other._b)) { return false; } if (!ObjectUtils.equals(_c, other._c)) { return false; } return true; } }