/**
  * Constructs a synthetic oracle for data generated from a Bayesian network.
  * @param vector_var_order  vector variables for dataset features
  * @param class_variable    finite variable for class
  * @param var_type_order    order of variable types
  */
 explicit syn_oracle_bayes_net(const bayesian_network<Factor>& bn,
                               parameters params = parameters())
   : base(bn.arguments(), vector_var_vector(),
          std::vector<variable::variable_typenames>
          (bn.arguments().size(), variable::FINITE_VARIABLE)),
     params(params), bn(bn),
     current_rec(finite_numbering_ptr_, vector_numbering_ptr_, dvector) {
   rng.seed(static_cast<unsigned>(params.random_seed));
 }
    //! Throws an assertion violation if the DBN is not valid
    void check_valid() const {
      // The arguments at the current and next time step
      domain_type vars_t  = arguments(processes(), current_step);
      domain_type vars_t1 = arguments(processes(), next_step);

      // Check the prior and the transition model
      assert(prior.arguments() == vars_t);
      assert(is_superset(transition.arguments(),vars_t1));
      assert(is_subset(transition.arguments(), set_union(vars_t, vars_t1)));
    }