::std::vector<int> refcounted_dataset::random_order() const
{
    typedef ::boost::counting_iterator<int> counter;
    ::std::vector<int> order(counter(0), counter(dataset_.GetNumberOfVariables()));
    return algorithm::random_shuffle(order);
}
bool refcounted_dataset::can_use_order(const ::std::vector<int>& order) const
{
    typedef ::std::vector<int>::const_iterator const_iterator;
    const int num_variables = dataset_.GetNumberOfVariables();
    ::std::vector<bool> visited(num_variables, false);
    for (const_iterator first = order.begin(); first != order.end(); ++first)
    {
        const int var = *first;
        if (var < 0 || var >= num_variables || visited[var])
        {
            return false;
        }
        visited[var] = true;
    }
    return num_variables > 0;
}
void test_order()
{
    std::cout << std::setprecision(std::numeric_limits<double>::digits10);
    bnl::refcounted_dataset ds("test.txt");
    bnl::local_log_bdeu_score local;
    std::vector<std::string> ids;
    std::vector<int> order;
    for (int i = 0; i < ds.data().GetNumberOfVariables(); ++i)
    {
        ids.push_back(ds.data().GetId(i));
        order.push_back(i);
    }
    std::vector<std::pair<double, std::vector<int> > > results;
    do
    {
        results.push_back(std::make_pair(bnl::log_score(order, ds, local), order));
    } while (std::next_permutation(order.begin(), order.end()));
    std::sort(results.begin(), results.end());
    double total = bnl::math::logsumexp(results | boost::adaptors::map_keys);
    for (std::size_t i = 0; i < results.size(); ++i)
    {
        const std::vector<int>& od = results[i].second;
        std::cout << ids[od[0]];
        for (unsigned j = 1; j < od.size(); ++j) std::cout << "<" << ids[od[j]];
        std::cout << ":  " << results[i].first << "  " << std::exp(results[i].first-total) << '\n';
    }
}
			
		