def test5():
    model_cache = "./test/model_5.stan.pkl"

    N = 1
    M = 1
    data = {"y": 1}

    code = """
    data {
      int<lower=0,upper=1> y;
    }
    parameters {
      vector[3] beta;
    }
    transformed parameters {
      real n_avoid;
      real n_shock;
      real p;
      
      n_avoid = 0;
      n_shock = 0;
      p = beta[1] + beta[2] * n_avoid + beta[3] * n_shock;
      
    }
    model {
      beta ~ normal(0, 100);
      y ~ bernoulli_logit(p);
    }
    """

    def init_params(data, params):
        y = data["y"]
        params["beta"] = torch.rand(3)

    def model(data, params):
        y = data["y"]
        beta = params["beta"]
        # INIT transformed parameters
        n_avoid = torch.zeros(1)  # matrix
        n_shock = torch.zeros(1)  # matrix
        p = torch.zeros(1)  # matrix

        n_avoid = torch.zeros(1)
        n_shock = torch.zeros(1)
        p = beta[0] + beta[1] * n_avoid + beta[2] * n_shock

        beta = _pyro_sample(beta, "beta", "normal", [0, 100])

        y = _pyro_sample(y, "y", "bernoulli_logit", p, obs=y)

    m, e = compare_models(code,
                          data,
                          init_params,
                          model,
                          None,
                          n_runs=2,
                          model_cache=model_cache)
    print(m, e)
def test4():
    model_cache = "./test/model_4.stan.pkl"
    n_samples = 1
    code = """
        data {
            int N;
            real y[N];
        }
        parameters {
            real mu;
            real<lower=0> sigma;
        }
        transformed parameters {
            real mu_p;
            mu_p = -200*mu;
        }
        model {
            mu ~ normal(0,100);
            y ~ normal(mu_p, sigma);
        }
    """
    N = 1
    data = {'N': N, 'y': [1] * N}

    transformed_data = None

    def init_params(data, params):
        N = data["N"]
        y = data["y"]
        params["mu"] = init_real("mu")
        params["sigma"] = init_real("sigma", low=0.)

    def model(data, params):
        N = data["N"]
        y = data["y"]
        mu = params["mu"]
        sigma = params["sigma"]

        mu_p = -200. * mu

        mu = pyro.sample("mu", dist.Normal(torch.zeros(N),
                                           torch.ones(N) * 100.))

        pyro.sample("y", dist.Normal(mu_p, sigma), obs=y)

    m, e = compare_models(code,
                          data,
                          init_params,
                          model,
                          transformed_data,
                          n_runs=2,
                          model_cache=model_cache)
    print(m, e)
    assert m == 0, "test not successful"
Exemple #3
0
 def OnButton2Button(self, event):
     chosen_models_indices = self.listBox2.GetSelections()
     chosen_models=[self.listBox2.GetString(item) if item<3\
      else self.user_defined_model_1 if item==3\
      else self.user_defined_model_2\
      for item in chosen_models_indices]
     compare_fig, comp_dict = compare_models(chosen_models, self.data,
                                             self.param_dict)
     self.param_dict.update(comp_dict)
     self.print_figure(compare_fig)
     self.SetTitle(u'Comparison')
def test1():
    model_cache = "./test/model_1.stan.pkl"
    n_samples = 1
    code = """
        data {
            int N;
            real y[N];
        }
        parameters {
            real mu;
            real<lower=0> sigma;
        }
        model {
            y ~ normal(mu, sigma);
        }
    """
    N = 1
    data = {'N': N, 'y': list(0.5 + np.random.randn(N) * 0.5)}

    transformed_data = None

    def init_params(data, params):
        N = data["N"]
        y = data["y"]
        params["mu"] = init_real("mu")
        params["sigma"] = init_real("sigma", low=0.)

    def model(data, params):
        N = data["N"]
        y = data["y"]
        mu = params["mu"]
        sigma = params["sigma"]
        pyro.sample("y", dist.Normal(mu, sigma), obs=y)

    compare_models(code,
                   data,
                   init_params,
                   model,
                   transformed_data,
                   n_runs=2,
                   model_cache=model_cache)
def test2():
    n_samples = 1
    model_cache = "./test/model_2.stan.pkl"
    dfile = "../example-models/bugs_examples/vol1/rats/rats.data.R"
    jfile = "./test/model_2.data.json"
    if not os.path.exists(jfile):
        os.system("Rscript --vanilla convert_data.R %s %s" % (dfile, jfile))
    if not os.path.exists(jfile):
        assert False, "R data to json conversion failed"
    with open(jfile, "r") as fj:
        file_data = json.load(fj)
    b, jd1, jd2 = divide_json_data(file_data)
    assert b, "could not divide json data"
    datas = [json_file_to_mem_format(jd1), json_file_to_mem_format(jd2)]

    def transformed_data(data):
        N = data["N"]
        T = data["T"]
        x = data["x"]
        y = data["y"]
        xbar = data["xbar"]
        x_minus_xbar = torch.zeros(T)
        for t in range(1, T + 1):
            x_minus_xbar[t - 1] = to_float((x[t - 1] - xbar))
        data["x_minus_xbar"] = x_minus_xbar
        y_linear = torch.zeros((N * T))
        for n in range(1, N + 1):
            for t in range(1, T + 1):
                y_linear[(((n - 1) * T) + t) - 1] = to_float(y[n - 1][t - 1])
        data["y_linear"] = y_linear

    def init_params(data, params):
        N = data["N"]
        T = data["T"]
        x = data["x"]
        y = data["y"]
        xbar = data["xbar"]
        params["alpha"] = init_real_and_cache("alpha", dims=(N))  # real/double
        params["beta"] = init_real_and_cache("beta", dims=(N))  # real/double
        params["mu_alpha"] = init_real_and_cache("mu_alpha")  # real/double
        params["mu_beta"] = init_real_and_cache("mu_beta")  # real/double
        params["sigmasq_y"] = init_real_and_cache("sigmasq_y",
                                                  low=0)  # real/double
        params["sigmasq_alpha"] = init_real_and_cache("sigmasq_alpha",
                                                      low=0)  # real/double
        params["sigmasq_beta"] = init_real_and_cache("sigmasq_beta",
                                                     low=0)  # real/double

    def model(data, params):
        N = data["N"]
        T = data["T"]
        x = data["x"]
        y = data["y"]
        xbar = data["xbar"]
        x_minus_xbar = data["x_minus_xbar"]
        y_linear = data["y_linear"]
        alpha = params["alpha"]
        beta = params["beta"]
        mu_alpha = params["mu_alpha"]
        mu_beta = params["mu_beta"]
        sigmasq_y = params["sigmasq_y"]
        sigmasq_alpha = params["sigmasq_alpha"]
        sigmasq_beta = params["sigmasq_beta"]
        # {
        pred = torch.zeros((N * T))

        for n in range(1, N + 1):
            for t in range(1, T + 1):
                pred[(((n - 1) * T) + t) - 1] = to_float(
                    _call_func(
                        "fma",
                        [beta[n - 1], x_minus_xbar[t - 1], alpha[n - 1]]))
        mu_alpha = _pyro_sample(mu_alpha, "mu_alpha", "normal",
                                (to_variable(0), to_variable(100)))
        mu_beta = _pyro_sample(mu_beta, "mu_beta", "normal",
                               (to_variable(0), to_variable(100)))
        sigmasq_y = _pyro_sample(sigmasq_y, "sigmasq_y", "inv_gamma",
                                 (to_variable(0.001), to_variable(0.001)))
        sigmasq_alpha = _pyro_sample(sigmasq_alpha, "sigmasq_alpha",
                                     "inv_gamma",
                                     (to_variable(0.001), to_variable(0.001)))
        sigmasq_beta = _pyro_sample(sigmasq_beta, "sigmasq_beta", "inv_gamma",
                                    (to_variable(0.001), to_variable(0.001)))
        sigma_alpha = _call_func("sqrt", [sigmasq_alpha])
        alpha = _pyro_sample(alpha, "alpha", "normal", (mu_alpha, sigma_alpha))
        sigma_beta = _call_func("sqrt", [sigmasq_beta])
        beta = _pyro_sample(beta, "beta", "normal", (mu_beta, sigma_beta))
        sigma_y = _call_func("sqrt", [sigmasq_y])
        y_linear = _pyro_sample(y_linear,
                                "y_linear",
                                "normal", (pred, sigma_y),
                                obs=y_linear)
        # }

    with open("../example-models/bugs_examples/vol1/rats/rats_vec.stan",
              "r") as f:
        code = f.read()

    code = do_pyro_compatibility_hacks(code)

    compare_models(code,
                   datas,
                   init_params,
                   model,
                   transformed_data,
                   n_samples=n_samples,
                   model_cache=model_cache)
def test_generic(dfile, mfile, pfile, n_runs, model_cache):
    try:
        generate_pyro_file(mfile, pfile)
    except AssertionError as e:
        return handle_error("generate_pyro_file", e)

    jfile = "%s.json" % pfile

    if not os.path.exists(jfile):
        os.system("Rscript --vanilla convert_data.R %s %s" % (dfile, jfile))
    if not os.path.exists(jfile):
        return 1, "R data to json conversion failed"
    with open(jfile, "r") as fj:
        file_data = json.load(fj)
    """
    try:
        b, jd1, jd2 = divide_json_data(file_data)
    except AssertionError as e:
        if "variable values in data.R file are nested dictionaries!" in str(e):
            _, _, etb = sys.exc_info()
            return 14, log_traceback(e, etb)
        raise

    if not b:
        print("Could not divide json data")
        return 2
    datas = [json_file_to_mem_format(jd1), json_file_to_mem_format(jd2)]
    """
    try:
        data = json_file_to_mem_format(file_data)
    except AssertionError as e:
        return handle_error("json_file_to_mem_format", e)

    try:
        validate_data_def, init_params, model, transformed_data = get_fns_pyro(
            pfile)
    except SyntaxError as e:
        return handle_error("import_pyro_code", e)
    #except AttributeError as e: #one of the attributes/functions was not found in pyro code
    #    return 3

    try:
        validate_data_def(data)
    except (AssertionError, KeyError) as e:
        return handle_error("validate_data_def", e)
    """for data in datas:
        try:
            validate_data_def(data)
        except (AssertionError, KeyError) as e:
            _, _, etb = sys.exc_info()
            return 16, "splitted data validation failed: %s" % log_traceback(e, etb)
        except:
            raise
    """

    try:
        assert model is not None, "model is None"
        assert init_params is not None, "init_params is None"
    except AssertionError as e:
        return handle_error("import_pyro_code", e)

    #if transformed_data is None:
    #    return 5

    with open(mfile, "r") as f:
        code = f.read()

    try:
        assert "increment_log_prob" not in code, "increment_log_prob used in Stan code"
    except AssertionError as e:
        return handle_error("load_stan_code", e)

    matched, err_s = compare_models(code,
                                    data,
                                    init_params,
                                    model,
                                    transformed_data,
                                    n_runs=n_runs,
                                    model_cache=model_cache)
    return matched, err_s