::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';
}
}