void VNode::PrintPolicyTree(int depth, ostream& os) { if (depth != -1 && this->depth() > depth) return; vector<QNode*>& qnodes = children(); if (qnodes.size() == 0) { int astar = this->default_move().action; os << this << "-a=" << astar << endl; } else { QNode* qstar = NULL; for (int a = 0; a < qnodes.size(); a++) { QNode* qnode = qnodes[a]; if (qstar == NULL || qnode->lower_bound() > qstar->lower_bound()) { qstar = qnode; } } os << this << "-a=" << qstar->edge() << endl; vector<OBS_TYPE> labels; map<OBS_TYPE, VNode*>& vnodes = qstar->children(); for (map<OBS_TYPE, VNode*>::iterator it = vnodes.begin(); it != vnodes.end(); it++) { labels.push_back(it->first); } for (int i = 0; i < labels.size(); i++) { if (depth == -1 || this->depth() + 1 <= depth) { os << repeat("| ", this->depth()) << "| o=" << labels[i] << ": "; qstar->Child(labels[i])->PrintPolicyTree(depth, os); } } } }
int VNode::PolicyTreeSize() const { if (children_.size() == 0) return 0; QNode* best = NULL; for (int a = 0; a < children_.size(); a++) { QNode* child = children_[a]; if (best == NULL || child->lower_bound() > best->lower_bound()) best = child; } return best->PolicyTreeSize(); }
ValuedAction DESPOT::OptimalAction(VNode* vnode) { ValuedAction astar(-1, Globals::NEG_INFTY); for (int action = 0; action < vnode->children().size(); action++) { QNode* qnode = vnode->Child(action); if (qnode->lower_bound() > astar.value) { astar = ValuedAction(action, qnode->lower_bound()); } } if (vnode->default_move().value > astar.value) { astar = vnode->default_move(); } return astar; }
void DESPOT::Update(VNode* vnode) { if (vnode->IsLeaf()) { return; } double lower = vnode->default_move().value; double upper = vnode->default_move().value; double utility_upper = Globals::NEG_INFTY; for (int action = 0; action < vnode->children().size(); action++) { QNode* qnode = vnode->Child(action); lower = max(lower, qnode->lower_bound()); upper = max(upper, qnode->upper_bound()); utility_upper = max(utility_upper, qnode->utility_upper_bound); } if (lower > vnode->lower_bound()) { vnode->lower_bound(lower); } if (upper < vnode->upper_bound()) { vnode->upper_bound(upper); } if (utility_upper < vnode->utility_upper_bound) { vnode->utility_upper_bound = utility_upper; } }
void VNode::PrintTree(int depth, ostream& os) { if (depth != -1 && this->depth() > depth) return; if (this->depth() == 0) { os << "d - default value" << endl << "l - lower bound" << endl << "u - upper bound" << endl << "r - totol weighted one step reward" << endl << "w - total particle weight" << endl; } os << "(" << "d:" << this->default_move().value << " l:" << this->lower_bound() << ", u:" << this->upper_bound() << ", w:" << this->Weight() << ", weu:" << DESPOT::WEU(this) << ")" << endl; vector<QNode*>& qnodes = children(); for (int a = 0; a < qnodes.size(); a++) { QNode* qnode = qnodes[a]; vector<OBS_TYPE> labels; map<OBS_TYPE, VNode*>& vnodes = qnode->children(); for (map<OBS_TYPE, VNode*>::iterator it = vnodes.begin(); it != vnodes.end(); it++) { labels.push_back(it->first); } os << repeat("| ", this->depth()) << "a=" << qnode->edge() << ": " << "(d:" << qnode->default_value << ", l:" << qnode->lower_bound() << ", u:" << qnode->upper_bound() << ", r:" << qnode->step_reward << ")" << endl; for (int i = 0; i < labels.size(); i++) { if (depth == -1 || this->depth() + 1 <= depth) { os << repeat("| ", this->depth()) << "| o=" << labels[i] << ": "; qnode->Child(labels[i])->PrintTree(depth, os); } } } }
void AEMS::Update(VNode* vnode) { if (vnode->IsLeaf()) return; double lower = Globals::NEG_INFTY; double upper = Globals::NEG_INFTY; for (int action = 0; action < vnode->children().size(); action++) { QNode* qnode = vnode->Child(action); lower = max(lower, qnode->lower_bound()); upper = max(upper, qnode->upper_bound()); } if (lower > vnode->lower_bound()) vnode->lower_bound(lower); if (upper < vnode->upper_bound()) vnode->upper_bound(upper); }
void AEMS::Backup(VNode* vnode) { int iter = 0; logd << "- Backup " << vnode << " at depth " << vnode->depth() << endl; while (true) { logd << " Iter " << (iter++) << " " << vnode << endl; Update(vnode); logd << " Updated vnode " << vnode << endl; QNode* parentq = vnode->parent(); if (parentq == NULL) break; Update(parentq); logd << " Updated Q-node to (" << parentq->lower_bound() << ", " << parentq->upper_bound() << ")" << endl; vnode = parentq->parent(); } logd << "* Backup complete!" << endl; }