count all failures for statistics

This commit is contained in:
Robert Haschke 2018-01-24 17:43:46 +01:00
parent 7a13d79bc4
commit 2184450bd6
9 changed files with 48 additions and 11 deletions

View File

@ -67,6 +67,9 @@ public:
virtual bool canCompute() const = 0;
virtual bool compute() = 0;
size_t numFailures() const override { return 0; }
void processFailures(const SolutionProcessor&) const override {}
/// called by a (direct) child when a new solution becomes available
virtual void onNewSolution(const SolutionBase& s) = 0;
@ -90,7 +93,6 @@ public:
size_t numSolutions() const override;
void processSolutions(const SolutionProcessor &processor) const override;
void processFailures(const SolutionProcessor &processor) const override {}
/// container used to represent a serial solution
typedef std::vector<const SolutionBase*> solution_container;
@ -182,7 +184,6 @@ public:
void init(const planning_scene::PlanningSceneConstPtr &scene) override;
size_t numSolutions() const override;
void processFailures(const SolutionProcessor &processor) const override {}
/// insertion is only allowed if children() is empty
bool insert(Stage::pointer&& stage, int before = -1) override;
@ -216,6 +217,7 @@ public:
bool compute() override;
size_t numSolutions() const override;
size_t numFailures() const override;
void processSolutions(const SolutionProcessor &processor) const override;
void processFailures(const SolutionProcessor &processor) const override;

View File

@ -143,6 +143,7 @@ public:
const std::string& name() const;
void setName(const std::string& name);
virtual size_t numSolutions() const = 0;
virtual size_t numFailures() const = 0;
bool storeFailures() const;
@ -183,6 +184,7 @@ public:
PRIVATE_CLASS(ComputeBase)
void reset() override;
virtual size_t numSolutions() const override;
virtual size_t numFailures() const override;
void processSolutions(const SolutionProcessor &processor) const override;
void processFailures(const SolutionProcessor &processor) const override;

View File

@ -129,9 +129,16 @@ public:
// store trajectory in internal trajectories_ list
SubTrajectory& addTrajectory(SubTrajectory&& trajectory);
// countFailures() serves as a filter before returning the result of compute()
inline bool countFailures(bool success) {
if (!success) ++num_failures_;
return success;
}
private:
std::list<SubTrajectory> solutions_;
std::list<SubTrajectory> failures_;
size_t num_failures_ = 0; // num of failures if not stored
};
PIMPL_FUNCTIONS(ComputeBase)

View File

@ -603,6 +603,11 @@ size_t Wrapper::numSolutions() const
return pimpl()->solutions_.size();
}
size_t Wrapper::numFailures() const
{
return pimpl()->failures_.size();
}
void Wrapper::processSolutions(const Stage::SolutionProcessor &processor) const
{
for(const auto& s : pimpl()->solutions_)

View File

@ -216,6 +216,7 @@ void Introspection::fillStageStatistics(const Stage& stage, moveit_task_construc
return true;
};
stage.processFailures(solutionProcessor);
s.num_failed = stage.numFailures();
}
moveit_task_constructor_msgs::TaskDescription& Introspection::fillTaskDescription(moveit_task_constructor_msgs::TaskDescription &msg)

View File

@ -227,6 +227,11 @@ size_t ComputeBase::numSolutions() const {
return pimpl()->solutions_.size();
}
size_t ComputeBase::numFailures() const
{
return pimpl()->num_failures_;
}
void ComputeBase::processSolutions(const Stage::SolutionProcessor &processor) const
{
for (const auto& s : pimpl()->solutions_)
@ -317,7 +322,7 @@ bool PropagatingEitherWayPrivate::compute()
if (me->computeBackward(state))
result |= true;
}
return result;
return countFailures(result);
}
void PropagatingEitherWayPrivate::newStartState(const Interface::iterator &it)
@ -472,7 +477,7 @@ bool GeneratorPrivate::canCompute() const {
bool GeneratorPrivate::compute() {
initProperties();
return static_cast<Generator*>(me_)->compute();
return countFailures(static_cast<Generator*>(me_)->compute());
}
void GeneratorPrivate::initProperties()
@ -544,7 +549,7 @@ bool ConnectingPrivate::compute() {
const InterfaceState& from = *it_pairs_.first;
const InterfaceState& to = *(it_pairs_.second++);
initProperties(from, to);
return static_cast<Connecting*>(me_)->compute(from, to);
return countFailures(static_cast<Connecting*>(me_)->compute(from, to));
}

View File

@ -3,6 +3,10 @@
# unique id within task
uint32 id
# successful and failed solution IDs of this stage
# successful solution IDs of this stage
uint32[] solved
# (optional) failed solution IDs of this stage
uint32[] failed
# number of failed solutions (if failed is empty)
uint32 num_failed

View File

@ -278,7 +278,8 @@ void RemoteTaskModel::processStageStatistics(const moveit_task_constructor_msgs:
}
Node *n = it->second;
bool changed = n->solutions_->processSolutionIDs(s.solved, s.failed);
bool changed = n->solutions_->processSolutionIDs(s.solved, s.failed, s.num_failed);
// emit notify about model changes when node was already visited
if (changed && (n->node_flags_ & WAS_VISITED)) {
QModelIndex idx = index(n);
@ -532,7 +533,8 @@ void RemoteSolutionModel::sortInternal()
// process solution ids received in stage statistics
bool RemoteSolutionModel::processSolutionIDs(const std::vector<uint32_t> &successful,
const std::vector<uint32_t> &failed)
const std::vector<uint32_t> &failed,
size_t num_failed)
{
// are there any new items?
bool changed = (successful.size() + failed.size() != data_.size());
@ -548,6 +550,14 @@ bool RemoteSolutionModel::processSolutionIDs(const std::vector<uint32_t> &succes
for (auto it = was_empty ? data_.begin() : ++last, end = data_.end(); it != end; ++it)
it->creation_rank = ++rank;
// the task may not report failure ids (in failed),
// but it may report the overall number of failures
num_failed_data_ = failed.size(); // needed to compute number of successes
if (num_failed_data_ > num_failed)
num_failed = num_failed_data_;
changed |= (num_failed != num_failed_);
num_failed_ = num_failed;
sortInternal();
return changed;
}

View File

@ -110,7 +110,8 @@ class RemoteSolutionModel : public QAbstractTableModel {
// successful and failed solutions ordered by id / creation
typedef std::list<Data> DataList;
DataList data_;
size_t num_failed_ = 0; // number of failed solutions in data_
size_t num_failed_data_ = 0; // number of failed solutions in data_
size_t num_failed_ = 0; // number of reported failures
// solutions ordered (by default according to cost)
int sort_column_ = -1;
@ -125,7 +126,7 @@ class RemoteSolutionModel : public QAbstractTableModel {
public:
RemoteSolutionModel(QObject *parent = nullptr);
uint numSuccessful() const { return data_.size() - num_failed_; }
uint numSuccessful() const { return data_.size() - num_failed_data_; }
uint numFailed() const { return num_failed_; }
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
@ -135,7 +136,7 @@ public:
void sort(int column, Qt::SortOrder order);
void setData(uint32_t id, float cost, const QString &name);
bool processSolutionIDs(const std::vector<uint32_t> &successful, const std::vector<uint32_t> &failed);
bool processSolutionIDs(const std::vector<uint32_t> &successful, const std::vector<uint32_t> &failed, size_t num_failed);
};
}