85 #include "hlp_controller.h"
86 #include "hlp_overlay.h"
89 using namespace r_code;
93 HLPController::HLPController(
_View *view) : OController(view), strong_requirement_count_(0), weak_requirement_count_(0), requirement_count_(0) {
95 bindings_ =
new HLPBindingMap();
97 Code *
object = get_unpacked_object();
98 bindings_->init_from_hlp(
object, get_object());
100 has_tpl_args_ =
object->code(object->code(HLP_TPL_ARGS).asIndex()).getAtomCount() > 0;
102 last_match_time_ = Now();
105 HLPController::~HLPController() {
108 void HLPController::invalidate() {
111 controllers_.clear();
114 void HLPController::add_requirement(
bool strong) {
116 reductionCS_.enter();
118 ++strong_requirement_count_;
120 ++weak_requirement_count_;
121 ++requirement_count_;
122 reductionCS_.leave();
125 void HLPController::remove_requirement(
bool strong) {
127 reductionCS_.enter();
129 --strong_requirement_count_;
131 --weak_requirement_count_;
132 --requirement_count_;
133 reductionCS_.leave();
136 uint32 HLPController::get_requirement_count(uint32 &weak_requirement_count, uint32 &strong_requirement_count) {
139 reductionCS_.enter();
140 r_c = requirement_count_;
141 weak_requirement_count = weak_requirement_count_;
142 strong_requirement_count = strong_requirement_count_;
143 reductionCS_.leave();
147 uint32 HLPController::get_requirement_count() {
150 reductionCS_.enter();
151 r_c = requirement_count_;
152 reductionCS_.leave();
156 uint16 HLPController::get_out_group_count()
const {
158 return get_object()->code(get_object()->code(HLP_OUT_GRPS).asIndex()).getAtomCount();
161 Code *HLPController::get_out_group(uint16 i)
const {
163 Code *hlp = get_object();
164 uint16 out_groups_index = hlp->code(HLP_OUT_GRPS).asIndex() + 1;
165 return hlp->get_reference(hlp->code(out_groups_index + i).asIndex());
170 bool saved_fwd_timings =
false;
171 Timestamp save_fwd_after, save_fwd_before;
172 if (narrow_fwd_timings && bm->has_fwd_after() && bm->has_fwd_before()) {
174 save_fwd_after = bm->get_fwd_after();
175 save_fwd_before = bm->get_fwd_before();
176 saved_fwd_timings =
true;
179 bool result = HLPOverlay::EvaluateBWDGuards(
this, bm);
181 if (saved_fwd_timings) {
183 if (!bm->match_fwd_timings(save_fwd_after, save_fwd_before))
191 bool HLPController::inject_prediction(
Fact *prediction, float32 confidence)
const {
193 Code *primary_host = get_host();
194 float32 sln_thr = primary_host->code(GRP_SLN_THR).asFloat();
195 if (confidence > sln_thr) {
197 View *view =
new View(View::SYNC_ONCE, Now(), confidence, 1, primary_host, primary_host, prediction);
198 _Mem::Get()->inject(view);
205 MatchResult HLPController::check_evidences(_Fact *target, _Fact *&evidence) {
207 MatchResult r = MATCH_FAILURE;
208 evidences_.CS_.enter();
211 for (e = evidences_.list_.begin(); e != evidences_.list_.end();) {
213 if ((*e).is_too_old(now))
214 e = evidences_.list_.erase(e);
217 if ((r = (*e).evidence_->is_evidence(target)) != MATCH_FAILURE) {
219 evidence = (*e).evidence_;
220 evidences_.CS_.leave();
227 evidences_.CS_.leave();
231 MatchResult HLPController::check_predicted_evidences(_Fact *target, _Fact *&evidence) {
233 MatchResult r = MATCH_FAILURE;
234 predicted_evidences_.CS_.enter();
237 for (e = predicted_evidences_.list_.begin(); e != predicted_evidences_.list_.end();) {
239 if ((*e).is_too_old(now))
240 e = predicted_evidences_.list_.erase(e);
243 if ((r = (*e).evidence_->is_evidence(target)) != MATCH_FAILURE) {
245 if (target->get_cfd() < (*e).evidence_->get_cfd()) {
247 evidence = (*e).evidence_;
248 predicted_evidences_.CS_.leave();
257 predicted_evidences_.CS_.leave();
261 bool HLPController::become_invalidated() {
263 if (is_invalidated())
266 for (uint16 i = 0; i < controllers_.size(); ++i) {
268 if (controllers_[i] != NULL && controllers_[i]->is_invalidated()) {
275 if (has_tpl_args()) {
277 if (refCount_ == 1 && ref_count_ > 1) {
282 ref_count_ = refCount_;
288 bool HLPController::is_orphan() {
292 if (get_requirement_count() == 0) {
302 uint16 out_group_count = get_out_group_count();
303 for (uint16 i = 0; i < out_group_count; ++i) {
307 _Mem::Get()->inject_notification(view,
true);
313 HLPController::EvidenceEntry::EvidenceEntry() : evidence_(NULL) {
316 HLPController::EvidenceEntry::EvidenceEntry(_Fact *evidence) : evidence_(evidence) {
321 HLPController::EvidenceEntry::EvidenceEntry(_Fact *evidence, _Fact *payload) : evidence_(evidence) {
326 void HLPController::EvidenceEntry::load_data(_Fact *evidence) {
328 after_ = evidence->get_after();
329 before_ = evidence->get_before();
330 confidence_ = evidence->get_cfd();
335 HLPController::PredictedEvidenceEntry::PredictedEvidenceEntry() : EvidenceEntry() {
338 HLPController::PredictedEvidenceEntry::PredictedEvidenceEntry(_Fact *evidence) : EvidenceEntry(evidence, evidence->get_pred()->get_target()) {