AERA
p_monitor.cpp
1 //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
2 //_/_/
3 //_/_/ AERA
4 //_/_/ Autocatalytic Endogenous Reflective Architecture
5 //_/_/
6 //_/_/ Copyright (c) 2018-2025 Jeff Thompson
7 //_/_/ Copyright (c) 2018-2025 Kristinn R. Thorisson
8 //_/_/ Copyright (c) 2018-2025 Icelandic Institute for Intelligent Machines
9 //_/_/ http://www.iiim.is
10 //_/_/
11 //_/_/ Copyright (c) 2010-2012 Eric Nivel
12 //_/_/ Center for Analysis and Design of Intelligent Agents
13 //_/_/ Reykjavik University, Menntavegur 1, 102 Reykjavik, Iceland
14 //_/_/ http://cadia.ru.is
15 //_/_/
16 //_/_/ Part of this software was developed by Eric Nivel
17 //_/_/ in the HUMANOBS EU research project, which included
18 //_/_/ the following parties:
19 //_/_/
20 //_/_/ Autonomous Systems Laboratory
21 //_/_/ Technical University of Madrid, Spain
22 //_/_/ http://www.aslab.org/
23 //_/_/
24 //_/_/ Communicative Machines
25 //_/_/ Edinburgh, United Kingdom
26 //_/_/ http://www.cmlabs.com/
27 //_/_/
28 //_/_/ Istituto Dalle Molle di Studi sull'Intelligenza Artificiale
29 //_/_/ University of Lugano and SUPSI, Switzerland
30 //_/_/ http://www.idsia.ch/
31 //_/_/
32 //_/_/ Institute of Cognitive Sciences and Technologies
33 //_/_/ Consiglio Nazionale delle Ricerche, Italy
34 //_/_/ http://www.istc.cnr.it/
35 //_/_/
36 //_/_/ Dipartimento di Ingegneria Informatica
37 //_/_/ University of Palermo, Italy
38 //_/_/ http://diid.unipa.it/roboticslab/
39 //_/_/
40 //_/_/
41 //_/_/ --- HUMANOBS Open-Source BSD License, with CADIA Clause v 1.0 ---
42 //_/_/
43 //_/_/ Redistribution and use in source and binary forms, with or without
44 //_/_/ modification, is permitted provided that the following conditions
45 //_/_/ are met:
46 //_/_/ - Redistributions of source code must retain the above copyright
47 //_/_/ and collaboration notice, this list of conditions and the
48 //_/_/ following disclaimer.
49 //_/_/ - Redistributions in binary form must reproduce the above copyright
50 //_/_/ notice, this list of conditions and the following disclaimer
51 //_/_/ in the documentation and/or other materials provided with
52 //_/_/ the distribution.
53 //_/_/
54 //_/_/ - Neither the name of its copyright holders nor the names of its
55 //_/_/ contributors may be used to endorse or promote products
56 //_/_/ derived from this software without specific prior
57 //_/_/ written permission.
58 //_/_/
59 //_/_/ - CADIA Clause: The license granted in and to the software
60 //_/_/ under this agreement is a limited-use license.
61 //_/_/ The software may not be used in furtherance of:
62 //_/_/ (i) intentionally causing bodily injury or severe emotional
63 //_/_/ distress to any person;
64 //_/_/ (ii) invading the personal privacy or violating the human
65 //_/_/ rights of any person; or
66 //_/_/ (iii) committing or preparing for any act of war.
67 //_/_/
68 //_/_/ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
69 //_/_/ CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
70 //_/_/ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
71 //_/_/ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
72 //_/_/ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
73 //_/_/ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
74 //_/_/ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
75 //_/_/ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
76 //_/_/ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
77 //_/_/ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
78 //_/_/ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
79 //_/_/ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
80 //_/_/ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
81 //_/_/ OF SUCH DAMAGE.
82 //_/_/
83 //_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
84 
85 #include "p_monitor.h"
86 #include "mem.h"
87 #include "mdl_controller.h"
88 
89 using namespace std::chrono;
90 using namespace r_code;
91 
92 namespace r_exec {
93 
94 PMonitor::PMonitor(MDLController *controller,
95  BindingMap *bindings,
96  Fact *prediction,
97  Code* mk_rdx,
98  bool rate_failures) : Monitor(controller, bindings, prediction, mk_rdx), rate_failures_(rate_failures) { // prediction is f0->pred->f1->obj; not simulated.
99 
100  prediction_target_ = prediction->get_pred()->get_target(); // f1.
101  auto now = Now();
102 
103  bindings->reset_fwd_timings(prediction_target_);
104 
105  MonitoringJob<PMonitor> *j = new MonitoringJob<PMonitor>(this, prediction_target_->get_before() + Utils::GetTimeTolerance());
106  _Mem::Get()->push_time_job(j);
107 }
108 
109 PMonitor::~PMonitor() {
110 }
111 
112 bool PMonitor::reduce(_Fact *input) { // input is always an actual fact.
113 
114  if (target_->is_invalidated()) {
115  return true; }
116 
117  if (target_->get_pred()->grounds_invalidated(input)) { // input is a counter-evidence for one of the antecedents: abort.
118 
119  target_->invalidate();
120  return true;
121  }
122 
123  Pred *prediction = input->get_pred();
124  if (prediction) {
125 
126  switch (prediction->get_target()->is_evidence(prediction_target_)) {
127  case MATCH_SUCCESS_POSITIVE: // predicted confirmation, skip.
128  return false;
129  case MATCH_SUCCESS_NEGATIVE:
130  if (prediction->get_target()->get_cfd() > prediction_target_->get_cfd()) {
131 
132  target_->invalidate(); // a predicted counter evidence is stronger than the target, invalidate and abort: don't rate the model.
133  return true;
134  } else
135  return false;
136  case MATCH_FAILURE:
137  return false;
138  }
139  } else {
140  //uint32 oid=input->get_oid();
141  switch (((Fact *)input)->is_evidence(prediction_target_)) {
142  case MATCH_SUCCESS_POSITIVE:
143  controller_->register_pred_outcome(target_, mk_rdx_, true, input, input->get_cfd(), rate_failures_);
144  return true;
145  case MATCH_SUCCESS_NEGATIVE:
146  if (rate_failures_)
147  controller_->register_pred_outcome(target_, mk_rdx_, false, input, input->get_cfd(), rate_failures_);
148  return true;
149  case MATCH_FAILURE:
150  return false;
151  }
152  }
153 
154  return false;
155 }
156 
157 void PMonitor::update(Timestamp &next_target) { // executed by a time core, upon reaching the expected time of occurrence of the target of the prediction.
158 
159  if (!target_->is_invalidated()) {
160 
161  // Received nothing matching the target's object so far (neither positively nor negatively).
162  // It is only a failure if the target is a fact. If the target is an anti-fact then reaching this
163  // point means that the object was not observed *as expected* (not a failure).
164  // TODO: If the model correctly predicts an anti-fact that the object won't be observed, then should we register
165  // a success for the model? If yes then what should "evidence" point? Maybe nil?
166  if (rate_failures_ && target_->get_pred()->get_target()->is_fact())
167  controller_->register_pred_outcome(target_, mk_rdx_, false, NULL, 1, rate_failures_);
168  }
169  controller_->remove_monitor(this);
170  next_target = Timestamp(seconds(0));
171 }
172 }
r_code::Code
Definition: r_code/object.h:224