BasketGeometricOpenCLOption::BasketGeometricOpenCLOption(JSONHelper &parameters) : ClosedFormOpenCLOption(parameters),
    cl_start_prices(NULL),
    cl_asset_volatilities(NULL),
    cl_correlations(NULL)
{
    unsigned int tmp_size;

    strike_price = parameters.get_float("strike_price");
    maturity = parameters.get_float("maturity");
    risk_free_rate = parameters.get_float("risk_free_rate");

    start_prices = parameters.get_vector("start_price", &number_of_assets);
    asset_volatilities = parameters.get_vector("volatility", &tmp_size);
    if(tmp_size < number_of_assets) {
        number_of_assets = tmp_size;
    }
    correlations = parameters.get_matrix("correlation", &tmp_size);
    if(tmp_size < number_of_assets) {
        number_of_assets = tmp_size;
    }

    assert(start_prices != NULL);
    assert(asset_volatilities != NULL);
    assert(correlations != NULL);

    assert(number_of_assets > 0);

    assert(strike_price >= 0);
    assert(maturity > 0);
    assert(risk_free_rate >= 0);

    for(unsigned int i = 0; i < number_of_assets; i++)
    {
        assert(start_prices[i] >= 0);
        assert(asset_volatilities[i] >= 0);

        for(unsigned int j = 0; j < number_of_assets; j++)
        {
            assert(correlations[i*number_of_assets + j] >= 0);
            assert(correlations[i*number_of_assets + j] <= 1);
        }
    }
}