89 #include "reduction_core.h"
90 #include "time_core.h"
91 #include "pgm_overlay.h"
92 #include "binding_map.h"
99 #include "../r_code/list.h"
100 #include "../r_comp/segments.h"
102 #include "../submodules/CoreLibrary/CoreLibrary/pipe.h"
127 std::chrono::microseconds base_period_;
128 uint32 reduction_core_count_;
129 uint32 time_core_count_;
132 float32 mdl_inertia_sr_thr_;
133 uint32 mdl_inertia_cnt_thr_;
134 float32 tpx_dsr_thr_;
135 std::chrono::microseconds min_sim_time_horizon_;
136 std::chrono::microseconds max_sim_time_horizon_;
137 float32 sim_time_horizon_factor_;
138 std::chrono::microseconds tpx_time_horizon_;
139 std::chrono::microseconds perf_sampling_period_;
140 float32 float_tolerance_;
141 std::chrono::microseconds time_tolerance_;
142 std::chrono::microseconds primary_thz_;
143 std::chrono::microseconds secondary_thz_;
148 uint32 goal_pred_success_res_;
149 bool keep_invalidated_objects_;
160 uint32 reduction_job_count_;
161 std::chrono::microseconds reduction_job_avg_latency_;
162 std::chrono::microseconds _reduction_job_avg_latency_;
163 uint32 time_job_count_;
164 std::chrono::microseconds time_job_avg_latency_;
165 std::chrono::microseconds _time_job_avg_latency_;
186 std::vector<Group *> initial_groups_;
189 virtual void set_last_oid(int32 oid) = 0;
190 virtual void bind(
View *view) = 0;
194 static const uint32 RUNTIME_OUTPUT_STREAM_COUNT = 10;
195 std::ostream *runtime_output_streams_[RUNTIME_OUTPUT_STREAM_COUNT];
198 std::ostream *default_runtime_output_stream_;
200 std::vector<P<r_code::Code> > axiom_values_;
204 static void _unpack_code(
r_code::Code *hlp, uint16 fact_object_index,
r_code::Code *fact_object, uint16 read_index);
206 static _Mem *Get() {
return (
_Mem *)Mem::Get(); }
215 void init(std::chrono::microseconds base_period,
216 uint32 reduction_core_count,
217 uint32 time_core_count,
218 float32 mdl_inertia_sr_thr,
219 uint32 mdl_inertia_cnt_thr,
221 std::chrono::microseconds min_sim_time_horizon,
222 std::chrono::microseconds max_sim_time_horizon,
223 float32 sim_time_horizon_factor,
224 std::chrono::microseconds tpx_time_horizon,
225 std::chrono::microseconds perf_sampling_period,
226 float32 float_tolerance,
227 std::chrono::microseconds time_tolerance,
228 std::chrono::microseconds primary_thz,
229 std::chrono::microseconds secondary_thz,
232 uint32 goal_pred_success_res,
235 bool keep_invalidated_objects);
237 State get_state()
const {
return state_; }
243 uint64 get_probe_level()
const {
return probe_level_; }
244 uint32 get_reduction_core_count()
const {
return reduction_core_count_; }
245 uint32 get_time_core_count()
const {
return time_core_count_; }
246 float32 get_mdl_inertia_sr_thr()
const {
return mdl_inertia_sr_thr_; }
247 uint32 get_mdl_inertia_cnt_thr()
const {
return mdl_inertia_cnt_thr_; }
248 float32 get_tpx_dsr_thr()
const {
return tpx_dsr_thr_; }
249 std::chrono::microseconds get_min_sim_time_horizon()
const {
return min_sim_time_horizon_; }
250 std::chrono::microseconds get_max_sim_time_horizon()
const {
return max_sim_time_horizon_; }
251 std::chrono::microseconds get_sim_time_horizon(std::chrono::microseconds horizon)
const {
252 return std::chrono::microseconds((int64)(horizon.count() * sim_time_horizon_factor_));
254 std::chrono::microseconds get_tpx_time_horizon()
const {
return tpx_time_horizon_; }
255 std::chrono::microseconds get_primary_thz()
const {
return primary_thz_; }
256 std::chrono::microseconds get_secondary_thz()
const {
return secondary_thz_; }
258 bool get_debug()
const {
return debug_; }
259 uint32 get_ntf_mk_res()
const {
return ntf_mk_res_; }
260 uint32 get_goal_pred_success_res(Group *host, Timestamp now, Timestamp::duration time_to_live)
const {
263 return goal_pred_success_res_;
264 if (time_to_live.count() == 0)
266 return r_code::Utils::GetResilience(now, time_to_live, host->get_upr());
276 void shutdown_core();
278 virtual bool load(
const std::vector<r_code::Code *> *objects, uint32 stdin_oid, uint32 stdout_oid, uint32 self_oid);
294 void run_in_diagnostic_time(std::chrono::milliseconds run_time);
295 static Timestamp diagnostic_time_now_;
296 static Timestamp get_diagnostic_time_now();
298 virtual void on_diagnostic_time_tick();
304 void push_reduction_job(_ReductionJob *j);
305 P<TimeJob> pop_time_job(
bool waitForItem =
true);
306 void push_time_job(TimeJob *j);
313 void inject_from_io_device(View *view);
330 View* inject_marker_value_from_io_device(
349 View* inject_marker_value_from_io_device(
369 View::SyncMode sync_mode)
371 return inject_marker_value_from_io_device(obj, prop, val, after, before, sync_mode, get_stdin());
391 return inject_marker_value_from_io_device(
392 obj, prop, val, after, before, View::SYNC_PERIODIC, group);
411 return inject_marker_value_from_io_device(
412 obj, prop, val, after, before, View::SYNC_PERIODIC, get_stdin());
431 View* inject_marker_value_from_io_device(
452 View::SyncMode sync_mode)
454 return inject_marker_value_from_io_device(obj, prop, val, after, before, sync_mode, get_stdin());
475 return inject_marker_value_from_io_device(
476 obj, prop, val, after, before, View::SYNC_PERIODIC, group);
496 return inject_marker_value_from_io_device(
497 obj, prop, val, after, before, View::SYNC_PERIODIC, get_stdin());
516 View* inject_marker_value_from_io_device(
537 View::SyncMode sync_mode)
539 return inject_marker_value_from_io_device(obj, prop, val, after, before, sync_mode, get_stdin());
560 return inject_marker_value_from_io_device(obj, prop, val, after, before, View::SYNC_PERIODIC, group);
580 return inject_marker_value_from_io_device(obj, prop, val, after, before, View::SYNC_PERIODIC, get_stdin());
601 Timestamp after, Timestamp before, View::SyncMode sync_mode,
r_code::Code* group);
620 Timestamp after, Timestamp before, View::SyncMode sync_mode)
622 return inject_marker_value_from_io_device(obj, prop, val, after, before, sync_mode, get_stdin());
644 return inject_marker_value_from_io_device(
645 obj, prop, val, after, before, View::SYNC_PERIODIC, group);
664 Timestamp after, Timestamp before)
666 return inject_marker_value_from_io_device(
667 obj, prop, val, after, before, View::SYNC_PERIODIC, get_stdin());
688 Timestamp after, Timestamp before, View::SyncMode sync_mode,
r_code::Code* group);
707 Timestamp after, Timestamp before, View::SyncMode sync_mode)
709 return inject_marker_value_from_io_device(obj, prop, opcode, vals, after, before, sync_mode, get_stdin());
731 return inject_marker_value_from_io_device(
732 obj, prop, opcode, vals, after, before, View::SYNC_PERIODIC, group);
751 Timestamp after, Timestamp before)
753 return inject_marker_value_from_io_device(
754 obj, prop, opcode, vals, after, before, View::SYNC_PERIODIC, get_stdin());
770 View* inject_fact_from_io_device(
771 r_code::Code*
object, Timestamp after, Timestamp before, View::SyncMode sync_mode,
787 return inject_fact_from_io_device(
788 object, after, before, View::SYNC_PERIODIC, group);
801 void inject(
View *view,
bool is_from_io_device =
false);
802 void inject_async(
View *view);
803 void inject_new_object(
View *view);
805 void inject_null_program(
Controller *c,
Group *group, std::chrono::microseconds time_to_live,
bool take_past_inputs);
806 void inject_hlps(std::vector<View *> views,
Group *destination);
807 void inject_notification(
View *view,
bool lock);
810 void propagate_sln(
r_code::Code *
object, float32 change, float32 source_sln_thr);
813 void inject_copy(
View *view,
Group *destination);
816 void register_reduction_job_latency(std::chrono::microseconds latency);
817 void register_time_job_latency(std::chrono::microseconds latency);
818 void inject_perf_stats();
823 virtual void eject(
View *view, uint16 node_id);
856 const std::vector<r_code::Code *> *objects,
const char* name);
861 virtual r_comp::Image *get_objects(
bool include_invalidated =
false) = 0;
888 default_runtime_output_stream_ = default_runtime_output_stream;
898 static std::ostream &Output(TraceLevel l);
921 std::chrono::milliseconds run_time_;
923 size_t n_reduction_jobs_this_sampling_period_;
924 std::vector<P<_ReductionJob>> reduction_job_queue_;
925 size_t reduction_job_queue_index_;
927 std::deque<P<TimeJob>> ordered_time_job_queue_;
928 Timestamp tick_time_;
931 bool need_diagnostic_time_tick_;
941 void bind(
View *view)
override;
942 void set_last_oid(int32 oid)
override;
950 r_comp::Image *get_objects(
bool include_invalidated =
false)
override;
957 std::atomic_int32_t last_oid_;
959 void bind(
View *view)
override;
960 void set_last_oid(int32 oid)
override;
996 void inject(O *
object,
View *view);
1001 #include "mem.tpl.cpp"