def tests():

    sigma1 = 0.01
    sigma2 = 0.008
    beta1 = 0.5
    beta2 = 0.1
    rho = 0.4
    dt = 0.001
    T = 0.5
    t = 0
    T1 = 0.25
    T2 = 1

    Q0 = 0.03
    R0 = 0.0
    
    S = 1
    numPath = 1000

    port = FXHedgePort(t, T, T1, T2)    
    evor = RateEvolver(sigma1, sigma2, beta1, beta2, rho, dt, Q0, port)
    print evor.__str__()
    
    #print "dQ = ", evor.dQ_vec()
    print "QT = ", evor.GetQ()

    calculator = FXFwdCalculator()
    fairK = calculator.calFairStrike(S, Q0, R0, t, T)
    print "fairK = ", fairK
    print "One path value = ", calculator.calVal(S, evor.GetQ()[0], R0, t, T, fairK)


    MCEng1 = MCHedgeEngine(evor, port)
    unHedged, triHedged, factorHedged = MCEng1.runMC(numPath, S, R0)
    print "triN1 =", MCEng1.triN1, "triN2 =", MCEng1.triN2

    print "UnHedged PNL mean is", unHedged.mean(), "sd is", unHedged.std()
    print "TriHedged PNL mean is", triHedged.mean(), "sd is", triHedged.std()
    print "FactorHedged PNL mean is", factorHedged.mean(), "sd is", factorHedged.std()
def wrapForOneT(T, numPath):
    '''
    Wrapper for a tenor, T
    '''
    sigma1 = 0.01
    sigma2 = 0.008
    beta1 = 0.5
    beta2 = 0.1
    rho = -0.4
    dt = 0.001
    t = 0.0
    T1 = 0.25
    T2 = 1.0
    Q0 = 0.03
    R0 = 0.0
    S = 1.0

    port = FXHedgePort(t, T, T1, T2)    
    evor = RateEvolver(sigma1, sigma2, beta1, beta2, rho, dt, Q0, port)    
    MCEng1 = MCHedgeEngine(evor, port)
    print "T =", T
    MCEng1.comparePerformance(numPath, S, R0)