Exemple #1
0
def test_duplicate_sensname_exception(tmpdir):
    """Test that exceptions are raised for erroneous sensnames"""
    # pylint: disable=abstract-class-instantiated
    mock_erroneous_designinput = pd.DataFrame(data=[
        ["sensname", "numreal", "type", "param_name"],
        ["rms_seed", "", "seed"],
        ["rms_seed", "", "seed"],
    ])
    tmpdir.chdir()
    defaultvalues = pd.DataFrame()

    writer = pd.ExcelWriter("designinput3.xlsx", engine="openpyxl")
    MOCK_GENERAL_INPUT.to_excel(writer,
                                sheet_name="general_input",
                                index=False,
                                header=None)
    mock_erroneous_designinput.to_excel(writer,
                                        sheet_name="designinput",
                                        index=False,
                                        header=None)
    defaultvalues.to_excel(writer,
                           sheet_name="defaultvalues",
                           index=False,
                           header=None)
    writer.save()

    with pytest.raises(
            ValueError,
            match="Two sensitivities can not share the same sensname"):
        excel2dict_design("designinput3.xlsx")
Exemple #2
0
def test_duplicate_sensname_exception(tmpdir):
    mock_erroneous_designinput = pd.DataFrame(data=[
        ["sensname", "numreal", "type", "param_name"],
        ["rms_seed", "", "seed"],
        ["rms_seed", "", "seed"],
    ])
    tmpdir.chdir()
    defaultvalues = pd.DataFrame()

    writer = pd.ExcelWriter("designinput3.xlsx")
    MOCK_GENERAL_INPUT.to_excel(writer,
                                sheet_name="general_input",
                                index=False,
                                header=None)
    mock_erroneous_designinput.to_excel(writer,
                                        sheet_name="designinput",
                                        index=False,
                                        header=None)
    defaultvalues.to_excel(writer,
                           sheet_name="defaultvalues",
                           index=False,
                           header=None)
    writer.save()

    with pytest.raises(
            ValueError,
            match="Two sensitivities can not share the same sensname"):
        dict_design = excel2dict_design("designinput3.xlsx")  # noqa
Exemple #3
0
def test_strip_spaces(tmpdir):
    """Spaces before and after parameter names are probabaly
    invisible user errors in Excel sheets. Remove them."""
    mock_spacious_designinput = pd.DataFrame(data=[
        ["sensname", "numreal", "type", "param_name"],
        ["rms_seed   ", "", "seed"],
    ])
    defaultvalues_spacious = pd.DataFrame(data=[
        ["parametername", "value"],
        ["  spacious_multiplier", 1.2],
        ["spacious2  ", 3.3],
    ])
    tmpdir.chdir()
    writer = pd.ExcelWriter("designinput_spaces.xlsx")
    MOCK_GENERAL_INPUT.to_excel(writer,
                                sheet_name="general_input",
                                index=False,
                                header=None)
    mock_spacious_designinput.to_excel(writer,
                                       sheet_name="designinput",
                                       index=False,
                                       header=None)
    defaultvalues_spacious.to_excel(writer,
                                    sheet_name="defaultvalues",
                                    index=False,
                                    header=None)
    writer.save()

    dict_design = excel2dict_design("designinput_spaces.xlsx")
    assert list(dict_design["sensitivities"].keys())[0] == "rms_seed"

    # Check default values parameter names:
    def_params = list(dict_design["defaultvalues"].keys())
    assert [par.strip() for par in def_params] == def_params
Exemple #4
0
def test_mixed_senstype_exception(tmpdir):
    mock_erroneous_designinput = pd.DataFrame(data=[
        ["sensname", "numreal", "type", "param_name"],
        ["rms_seed", "", "seed"],
        ["", "", "dist"],
    ])
    tmpdir.chdir()
    defaultvalues = pd.DataFrame()

    writer = pd.ExcelWriter("designinput4.xlsx", engine="openpyxl")
    MOCK_GENERAL_INPUT.to_excel(writer,
                                sheet_name="general_input",
                                index=False,
                                header=None)
    mock_erroneous_designinput.to_excel(writer,
                                        sheet_name="designinput",
                                        index=False,
                                        header=None)
    defaultvalues.to_excel(writer,
                           sheet_name="defaultvalues",
                           index=False,
                           header=None)
    writer.save()

    with pytest.raises(ValueError,
                       match="contains more than one sensitivity type"):
        dict_design = excel2dict_design("designinput4.xlsx")  # noqa
def test_generate_full_mc(tmpdir):
    """Test generation of full monte carlo"""
    inputfile = TESTDATA / "config/design_input_mc_with_correls.xlsx"
    input_dict = excel2dict_design(inputfile)

    design = DesignMatrix()
    design.generate(input_dict)

    # Checking dimensions of design matrix
    assert design.designvalues.shape == (500, 16)

    # Checking reproducibility from distribution_seed
    assert design.designvalues["PARAM1"].sum() == 17.419

    # Write to disk and check some validity
    tmpdir.chdir()
    design.to_xlsx("designmatrix.xlsx")
    assert Path("designmatrix.xlsx").exists
    diskdesign = pd.read_excel("designmatrix.xlsx",
                               sheet_name="DesignSheet01",
                               engine="openpyxl")
    assert "REAL" in diskdesign
    assert "SENSNAME" in diskdesign
    assert "SENSCASE" in diskdesign
    assert not diskdesign.empty

    diskdefaults = pd.read_excel("designmatrix.xlsx",
                                 sheet_name="DefaultValues",
                                 engine="openpyxl")
    assert not diskdefaults.empty
    assert len(diskdefaults.columns) == 2
def test_generate_onebyone(tmpdir):
    """Test generation of onebyone design"""

    inputfile = TESTDATA / "config/design_input_example1.xlsx"
    input_dict = excel2dict_design(inputfile)

    design = DesignMatrix()
    design.generate(input_dict)
    # Checking dimensions of design matrix
    assert design.designvalues.shape == (80, 10)

    # Write to disk and check some validity
    tmpdir.chdir()
    design.to_xlsx("designmatrix.xlsx")
    assert Path("designmatrix.xlsx").exists
    diskdesign = pd.read_excel("designmatrix.xlsx", engine="openpyxl")
    assert "REAL" in diskdesign
    assert "SENSNAME" in diskdesign
    assert "SENSCASE" in diskdesign
    assert not diskdesign.empty

    diskdefaults = pd.read_excel("designmatrix.xlsx",
                                 sheet_name="DefaultValues",
                                 engine="openpyxl")
    assert not diskdefaults.empty
    assert len(diskdefaults.columns) == 2
Exemple #7
0
def test_generate_full_mc(tmpdir):
    """Test generation of full monte carlo"""
    if "__file__" in globals():
        # Easen up copying test code into interactive sessions
        testdir = os.path.dirname(os.path.abspath(__file__))
    else:
        testdir = os.path.abspath(".")

    inputfile = (testdir + "/data/sensitivities/config/" +
                 "design_input_mc_with_correls.xlsx")
    input_dict = excel2dict_design(inputfile)

    design = DesignMatrix()
    design.generate(input_dict)

    # Checking dimensions of design matrix
    assert design.designvalues.shape == (500, 16)

    # Checking reproducibility from distribution_seed
    assert design.designvalues["PARAM1"].sum() == 17.419

    # Write to disk and check some validity
    tmpdir.chdir()
    design.to_xlsx("designmatrix.xlsx")
    assert os.path.exists("designmatrix.xlsx")
    diskdesign = pd.read_excel("designmatrix.xlsx", sheet_name="DesignSheet01")
    assert "REAL" in diskdesign
    assert "SENSNAME" in diskdesign
    assert "SENSCASE" in diskdesign
    assert not diskdesign.empty

    diskdefaults = pd.read_excel("designmatrix.xlsx",
                                 sheet_name="DefaultValues")
    assert not diskdefaults.empty
    assert len(diskdefaults.columns) == 2
Exemple #8
0
def test_generate_onebyone(tmpdir):
    """Test generation of onebyone design"""

    if "__file__" in globals():
        # Easen up copying test code into interactive sessions
        testdir = os.path.dirname(os.path.abspath(__file__))
    else:
        testdir = os.path.abspath(".")

    inputfile = testdir + "/data/sensitivities/config/" + "design_input_example1.xlsx"
    input_dict = excel2dict_design(inputfile)

    design = DesignMatrix()
    design.generate(input_dict)
    # Checking dimensions of design matrix
    assert design.designvalues.shape == (80, 10)

    # Write to disk and check some validity
    tmpdir.chdir()
    design.to_xlsx("designmatrix.xlsx")
    assert os.path.exists("designmatrix.xlsx")
    diskdesign = pd.read_excel("designmatrix.xlsx")
    assert "REAL" in diskdesign
    assert "SENSNAME" in diskdesign
    assert "SENSCASE" in diskdesign
    assert not diskdesign.empty

    diskdefaults = pd.read_excel("designmatrix.xlsx",
                                 sheet_name="DefaultValues")
    assert not diskdefaults.empty
    assert len(diskdefaults.columns) == 2
Exemple #9
0
def main():
    """fmudesign is a command line utility for generating design matrices

    Wrapper for the the fmu.tools.sensitivities module"""

    parser = get_parser()
    args = parser.parse_args()

    # Defaulted options should be reset to None, so that the other
    # defaulting level inside _excel2dict can do its work.
    if args.designinput == parser.get_default("designinput"):
        args.designinput = None
    if args.defaultvalues == parser.get_default("defaultvalues"):
        args.defaultvalues = None
    if args.general_input == parser.get_default("general_input"):
        args.general_input = None

    sheetnames = dict()
    if args.designinput:
        sheetnames["designinput"] = args.designinput
    if args.defaultvalues:
        sheetnames["defaultvalues"] = args.defaultvalues
    if args.general_input:
        sheetnames["general_input"] = args.general_input

    if sheetnames:
        print("Worksheets changed from default:")
        print(sheetnames)

    if isinstance(args.config, str):
        if not Path(args.config).is_file():
            raise IOError("Input file {} does not exist".format(args.config))
        input_dict = excel2dict_design(args.config, sheetnames)

    if args.config == args.destination:
        raise IOError('Identical name "{}" have been provided for the input'
                      "file and the output file. "
                      " Exiting.....".format(args.config))

    design = DesignMatrix()

    design.generate(input_dict)

    Path(args.destination).parent.mkdir(exist_ok=True, parents=True)

    design.to_xlsx(args.destination)
Exemple #10
0
def test_background_sheet(tmpdir):
    """Test loading background values from a sheet"""
    tmpdir.chdir()
    general_input = pd.DataFrame(data=[
        ["designtype", "onebyone"],
        ["repeats", 3],
        ["rms_seeds", "default"],
        ["background", "backgroundsheet"],
        ["distribution_seed", "None"],
    ])
    defaultvalues = pd.DataFrame(columns=["param_name", "default_value"],
                                 data=[["extraseed", "0"]])
    background = pd.DataFrame(data=[
        ["param_name", "dist_name", "dist_param1"],
        ["extraseed", "scenario", "30,40,50"],
    ])

    writer = pd.ExcelWriter("designinput.xlsx", engine="openpyxl")
    general_input.to_excel(writer,
                           sheet_name="general_input",
                           index=False,
                           header=None)
    MOCK_DESIGNINPUT.to_excel(writer,
                              sheet_name="design_input",
                              index=False,
                              header=None)
    defaultvalues.to_excel(writer, sheet_name="defaultvalues", index=False)
    background.to_excel(writer,
                        sheet_name="backgroundsheet",
                        index=False,
                        header=None)
    writer.save()

    dict_design = excel2dict_design("designinput.xlsx")

    # Assert it has been interpreted correctly from input files:
    assert dict_design["background"]["parameters"]["extraseed"] == [
        "scenario",
        ["30,40,50"],
        None,
    ]
    assert dict_design["repeats"] == 3
    assert dict_design["defaultvalues"]["extraseed"] == 0
Exemple #11
0
def main(args=None):
    """fmudesign is a command line utility for generating design matrices

    Wrapper for the the fmu.tools.sensitivities module"""

    args = _do_parse_args(args)

    sheetnames = dict()
    if args.designinput:
        sheetnames["designinput"] = args.designinput
    if args.defaultvalues:
        sheetnames["defaultvalues"] = args.defaultvalues
    if args.general_input:
        sheetnames["general_input"] = args.general_input

    if sheetnames:
        print("Worksheets changed from default:")
        print(sheetnames)

    if isinstance(args.config, str):
        if not os.path.isfile(args.config):
            raise IOError("Input file {} does not exist".format(args.config))
        input_dict = excel2dict_design(args.config, sheetnames)

    if args.config == args.destination:
        raise IOError('Identical name "{}" have been provided for the input'
                      "file and the output file. "
                      " Exiting.....".format(args.config))

    design = DesignMatrix()

    design.generate(input_dict)

    folder = os.path.dirname(args.destination)

    if folder and not os.path.exists(folder):
        os.makedirs(folder)

    design.to_xlsx(args.destination)
#    input_dict=yaml.load(input_file)

path = "./tests/data/sensitivities/config/"
prefix = "design_input_"
postfix = ".xlsx"
config = [
    "example1",
    "example2",
    "example_velocities",
    "singlereference",
    "singlereference_and_seed",
    "default_no_seed",
    "onebyone",
    "background_no_seed",
    "background_extseeds",
    "mc_with_correls",
    "montecarlo_full",
    "mc_corr_depend",
]

for input in range(len(config)):
    filename = path + prefix + config[input] + postfix
    print("Reading {}".format(filename))
    input_dict = excel2dict_design(filename)
    # input_dict.to_yaml(input_dict, 'examples/output/'+config[input]+'.yaml')
    design = DesignMatrix()
    design.generate(input_dict)
    design.to_xlsx("examples/output/design_" + config[input] + postfix)
    # if design.backgroundvalues is not None:
    # design.background_to_excel('examples/output/background.xlsx')
Exemple #13
0
def test_prediction_rejection_sampled_ensemble(tmpdir):
    """Test making a design matrix for prediction realizations based on an
    ensemble made with manual history matching (rejection sampling).

    In the use-case this test is modelled on, the design matrix is used
    to set up a prediction ensemble where each DATA file points to another
    Eclipse run on disk which contains the history, identified by the
    realization index ("HMREAL") in the history match run.
    """
    tmpdir.chdir()
    general_input = pd.DataFrame(data=[
        ["designtype", "onebyone"],
        ["repeats", 3],  # This matches the number of HM-samples we have.
        ["rms_seeds", None],  # Geogrid from HM realization is used
        ["background", "hmrealizations.xlsx"],
        ["distribution_seed", None],
    ])
    defaultvalues = pd.DataFrame(
        columns=["param_name", "default_value"],
        data=[
            # All background parameters must be mentioned in
            # DefaultValues (but these defaults are not used in
            # this particular test scenario)
            ["HMREAL", "-1"],
            ["ORAT", 6000],
            ["RESTARTPATH", "FOO"],
            ["HMITER", "-1"],
        ],
    )

    # Background to separate file, these define some history realizations that
    # all scenarios should run over:
    pd.DataFrame(
        columns=["RESTARTPATH", "HMREAL", "HMITER"],
        data=[
            ["/scratch/foo/2020a_hm3/", 31, 3],
            ["/scratch/foo/2020a_hm3/", 38, 3],
            ["/scratch/foo/2020a_hm3/", 54, 3],
        ],
    ).to_excel("hmrealizations.xlsx")

    writer = pd.ExcelWriter("designinput.xlsx", engine="openpyxl")
    general_input.to_excel(writer,
                           sheet_name="general_input",
                           index=False,
                           header=None)
    pd.DataFrame(
        columns=[
            "sensname",
            "numreal",
            "type",
            "param_name",
            "dist_name",
            "dist_param1",
            "dist_param2",
        ],
        data=[
            ["ref", None, "background", None],
            ["oil_rate", None, "dist", "ORAT", "uniform", 5000, 9000],
        ],
    ).to_excel(writer, sheet_name="design_input", index=False)
    defaultvalues.to_excel(writer, sheet_name="defaultvalues", index=False)
    writer.save()

    dict_design = excel2dict_design("designinput.xlsx")
    design = DesignMatrix()
    design.generate(dict_design)

    assert set(
        design.designvalues["RESTARTPATH"]) == {"/scratch/foo/2020a_hm3/"}
    assert set(design.designvalues["HMITER"]) == {3}
    assert all(design.designvalues["REAL"] == [0, 1, 2, 3, 4, 5])
    assert all(design.designvalues["SENSNAME"] == [
        "ref",
        "ref",
        "ref",
        "oil_rate",
        "oil_rate",
        "oil_rate",
    ])

    # This is the most important bit in this test function, that the realization
    # list in the background xlsx is repeated for each sensitivity:
    assert all(design.designvalues["HMREAL"] == [31, 38, 54, 31, 38, 54])
Exemple #14
0
def test_excel2dict_design(tmpdir):
    """Test that we can convert an Excelfile to a dictionary"""
    tmpdir.chdir()
    defaultvalues = pd.DataFrame()
    # pylint: disable=abstract-class-instantiated
    writer = pd.ExcelWriter("designinput.xlsx")
    MOCK_GENERAL_INPUT.to_excel(writer,
                                sheet_name="general_input",
                                index=False,
                                header=None)
    MOCK_DESIGNINPUT.to_excel(writer,
                              sheet_name="designinput",
                              index=False,
                              header=None)
    defaultvalues.to_excel(writer,
                           sheet_name="defaultvalues",
                           index=False,
                           header=None)
    writer.save()

    dict_design = excel2dict_design("designinput.xlsx")
    assert isinstance(dict_design, dict)
    assert dict_design["designtype"] == "onebyone"
    assert dict_design["distribution_seed"] is None
    assert "defaultvalues" in dict_design

    assert isinstance(dict_design["defaultvalues"], dict)
    assert not dict_design["defaultvalues"]  # (it is empty)

    assert isinstance(dict_design["sensitivities"], dict)

    sens = dict_design["sensitivities"]
    # This now contains a key for each sensitivity to make
    assert "rms_seed" in sens
    assert isinstance(sens["rms_seed"], dict)
    assert sens["rms_seed"]["seedname"] == "RMS_SEED"
    assert sens["rms_seed"]["senstype"] == "seed"  # upper-cased

    # Check that we can vary some strings
    writer = pd.ExcelWriter("designinput2.xlsx")
    MOCK_GENERAL_INPUT.to_excel(writer,
                                sheet_name="Generalinput",
                                index=False,
                                header=None)
    MOCK_DESIGNINPUT.to_excel(writer,
                              sheet_name="Design_input",
                              index=False,
                              header=None)
    defaultvalues.to_excel(writer,
                           sheet_name="DefaultValues",
                           index=False,
                           header=None)
    writer.save()

    dict_design = excel2dict_design("designinput2.xlsx")
    assert isinstance(dict_design, dict)
    assert dict_design["sensitivities"]["rms_seed"]["senstype"] == "seed"

    # Dump to yaml:
    inputdict_to_yaml(dict_design, "dictdesign.yaml")
    assert os.path.exists("dictdesign.yaml")
    assert "RMS_SEED" in "".join(open("dictdesign.yaml").readlines())