Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 24 additions & 15 deletions src/algo/arg_iterator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,45 +2,54 @@
#include "algo/arg_iterator.h"
#include "data/htn_instance.h"

ArgIterator ArgIterator::getFullInstantiation(const USignature& sig, HtnInstance& _htn) {
std::vector<std::vector<int>> constantsPerArg;
ArgIterator ArgIterator::getFullInstantiation(const USignature &sig, HtnInstance &_htn)
{
std::vector<std::basic_string<int>> constantsPerArg;

// "Empty" signature?
if (sig._args.empty()) {
// "Empty" signature?
if (sig._args.empty())
{
return ArgIterator(sig._name_id, std::move(constantsPerArg));
}

// enumerate all arg combinations for variable args
// Get all constants of the respective type(s)
std::vector<int> sorts = _htn.getSorts(sig._name_id);
std::basic_string<int> sorts = _htn.getSorts(sig._name_id);
assert(sorts.size() == sig._args.size() || Log::e("Sorts table of predicate %s has an invalid size\n", TOSTR(sig)));

for (size_t pos = 0; pos < sorts.size(); pos++) {
for (size_t pos = 0; pos < sorts.size(); pos++)
{
int arg = sig._args[pos];

if (arg > 0 && _htn.isVariable(arg)) {

if (arg > 0 && _htn.isVariable(arg))
{
// free argument and no placeholder

int sort = sorts[pos];

// Scan through all eligible arguments, filtering out q constants
std::vector<int> eligibleConstants;
for (int arg : _htn.getConstantsOfSort(sort)) {
if (_htn.isQConstant(arg)) continue;
std::basic_string<int> eligibleConstants;
for (int arg : _htn.getConstantsOfSort(sort))
{
if (_htn.isQConstant(arg))
continue;
eligibleConstants.push_back(arg);
}

// Empty instantiation if there is not a single eligible constant at some pos
//log("OF_SORT %s : %i constants\n", _htn._name_back_table[sort].c_str(), eligibleConstants.size());
if (eligibleConstants.empty()) {
// log("OF_SORT %s : %i constants\n", _htn._name_back_table[sort].c_str(), eligibleConstants.size());
if (eligibleConstants.empty())
{
constantsPerArg.clear();
return ArgIterator(sig._name_id, std::move(constantsPerArg));
}

constantsPerArg.push_back(eligibleConstants);
} else {
}
else
{
// constant
constantsPerArg.push_back(std::vector<int>(1, arg));
constantsPerArg.push_back(std::basic_string<int>(1, arg));
}
}

Expand Down
64 changes: 38 additions & 26 deletions src/algo/arg_iterator.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,41 +10,49 @@

class HtnInstance;

class ArgIterator {
class ArgIterator
{

private:
std::vector<std::basic_string<int>> _eligible_args;

std::vector<std::vector<int>> _eligible_args;

struct It {
struct It
{
int _sig_id;
const std::vector<std::vector<int>>& _eligible_args;
const std::vector<std::basic_string<int>> &_eligible_args;
std::vector<size_t> _counter;
size_t _counter_number;
USignature _usig;

It(int sigId, const std::vector<std::vector<int>>& eligibleArgs)
: _sig_id(sigId), _eligible_args(eligibleArgs), _counter(eligibleArgs.size(), 0),
_counter_number(0), _usig(_sig_id, std::vector<int>(_counter.size())) {

for (size_t i = 0; i < _usig._args.size(); i++) {
It(int sigId, const std::vector<std::basic_string<int>> &eligibleArgs)
: _sig_id(sigId), _eligible_args(eligibleArgs), _counter(eligibleArgs.size(), 0),
_counter_number(0), _usig(_sig_id, std::basic_string<int>(_counter.size(), 0))
{
for (size_t i = 0; i < _usig._args.size(); i++)
{
assert(i < _eligible_args.size());
assert(!_eligible_args[i].empty());
_usig._args[i] = _eligible_args[i].front();
}
}

const USignature& operator*() {
const USignature &operator*()
{
return _usig;
}

const USignature& operator++() {
for (size_t i = 0; i < _counter.size(); i++) {
if (_counter[i]+1 == _eligible_args[i].size()) {
const USignature &operator++()
{
for (size_t i = 0; i < _counter.size(); i++)
{
if (_counter[i] + 1 == _eligible_args[i].size())
{
// reached max value of some position
_counter[i] = 0;
_usig._args[i] = _eligible_args[i].front();
} else {
}
else
{
// increment and done
_counter[i]++;
_usig._args[i] = _eligible_args[i].at(_counter[i]);
Expand All @@ -55,36 +63,40 @@ class ArgIterator {
return _usig;
}

bool operator==(const It& other) const {
bool operator==(const It &other) const
{
return _counter_number == other._counter_number;
}
bool operator!=(const It& other) const {
bool operator!=(const It &other) const
{
return !(*this == other);
}

} _begin, _end;

public:
ArgIterator(int sigId, std::vector<std::basic_string<int>> &&eligibleArgs) : _eligible_args(std::move(eligibleArgs)),
_begin(sigId, _eligible_args),
_end(sigId, _eligible_args)
{

ArgIterator(int sigId, std::vector<std::vector<int>>&& eligibleArgs) :
_eligible_args(std::move(eligibleArgs)),
_begin(sigId, _eligible_args),
_end(sigId, _eligible_args) {

size_t numChoices = _eligible_args.empty() ? 0 : 1;
for (const auto& args : _eligible_args) numChoices *= args.size();
for (const auto &args : _eligible_args)
numChoices *= args.size();
_end._counter_number = numChoices;
}

It begin() const {
It begin() const
{
return _begin;
}

It end() const {
It end() const
{
return _end;
}

static ArgIterator getFullInstantiation(const USignature& sig, HtnInstance& _htn);
static ArgIterator getFullInstantiation(const USignature &sig, HtnInstance &_htn);
};

#endif
Loading