perkun  0.0.9
ExperimentalAIlanguage
perkun.h
1 /***************************************************************************
2  * Copyright (C) 2014 by Pawel Biernacki *
3  * pawel.f.biernacki@gmail.com *
4  * *
5  * This program is free software; you can redistribute it and/or modify *
6  * it under the terms of the GNU General Public License as published by *
7  * the Free Software Foundation; either version 3 of the License, or *
8  * (at your option) any later version. *
9  * *
10  * This program is distributed in the hope that it will be useful, *
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13  * GNU General Public License for more details. *
14  * *
15  * You should have received a copy of the GNU General Public License *
16  * along with this program; if not, write to the *
17  * Free Software Foundation, Inc., *
18  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19  ***************************************************************************/
20 #ifndef PERKUN_H
21 #define PERKUN_H
22 
23 #include <list>
24 #include <map>
25 #include <vector>
26 #include <string>
27 #include <iostream>
28 #include <stdexcept>
29 
30 
31 namespace perkun
32 {
33 
37 class value
38 {
39 private:
40  const std::string name;
41 public:
42  value(const std::string & n): name(n) {}
43 
44  const std::string & get_name() const { return name; }
45 };
46 
47 
53 class variable
54 {
55 private:
56  const std::string name;
57 
58 protected:
59  std::list<const value*> list_of_possible_values;
60 
61 public:
62  variable(const std::string & n): name(n) {}
63  virtual bool get_is_input_variable() const { return false; }
64  virtual bool get_is_hidden_variable() const { return false; }
65  virtual bool get_is_output_variable() const { return false; }
66  virtual const std::string get_type_name() const = 0;
67 
68  const std::string & get_name() const { return name; }
69 
70  void add_possible_value(const value * v)
71  {
72  list_of_possible_values.push_back(v);
73  }
74  const std::list<const value*> & get_list_of_possible_values() const { return list_of_possible_values; }
75 
76  bool get_can_have_value(const value * v) const;
77 
78  virtual void report_xml(std::ostream & s) const = 0;
79 };
80 
81 
87 {
88 private:
89  std::vector<value*> vector_of_values;
90 public:
91  collection_of_values& operator<<(value * v) { vector_of_values.push_back(v); return *this; }
93 
94  std::vector<value*>& get_vector_of_values() { return vector_of_values; }
95 
96  value* get_value(const char * v);
97 };
98 
103 {
104 public:
105  input_variable(const std::string & n): variable(n) {}
106  virtual bool get_is_input_variable() const { return true; }
107  virtual const std::string get_type_name() const { return "input"; }
108  virtual void report_xml(std::ostream & s) const
109  {
110  s << "<perkun:input_variable name=\"" << get_name() << "\">\n";
111  s << "<perkun:possible_values>\n";
112  for (std::list<const value*>::const_iterator i(list_of_possible_values.begin());
113  i != list_of_possible_values.end(); i++)
114  {
115  s << "<perkun:value name=\"" << (*i)->get_name() << "\" />\n";
116  }
117  s << "</perkun:possible_values>\n";
118  s << "</perkun:input_variable>\n";
119  }
120 };
121 
126 {
127 public:
128  output_variable(const std::string & n): variable(n) {}
129  virtual bool get_is_output_variable() const { return true; }
130  virtual const std::string get_type_name() const { return "output"; }
131  virtual void report_xml(std::ostream & s) const
132  {
133  s << "<perkun:output_variable name=\"" << get_name() << "\">\n";
134  s << "<perkun:possible_values>\n";
135  for (std::list<const value*>::const_iterator i(list_of_possible_values.begin());
136  i != list_of_possible_values.end(); i++)
137  {
138  s << "<perkun:value name=\"" << (*i)->get_name() << "\" />\n";
139  }
140  s << "</perkun:possible_values>\n";
141  s << "</perkun:output_variable>\n";
142  }
143 };
144 
149 {
150 public:
151  hidden_variable(const std::string & n): variable(n) {}
152  virtual bool get_is_hidden_variable() const { return true; }
153  virtual const std::string get_type_name() const { return "hidden"; }
154  virtual void report_xml(std::ostream & s) const
155  {
156  s << "<perkun:hidden_variable name=\"" << get_name() << "\">\n";
157  s << "<perkun:possible_values>\n";
158  for (std::list<const value*>::const_iterator i(list_of_possible_values.begin());
159  i != list_of_possible_values.end(); i++)
160  {
161  s << "<perkun:value name=\"" << (*i)->get_name() << "\" />\n";
162  }
163  s << "</perkun:possible_values>\n";
164  s << "</perkun:hidden_variable>\n";
165  }
166 };
167 
172 {
173 private:
174  std::vector<variable*> vector_of_variables;
175 public:
177  collection_of_variables& operator<<(variable* v) { vector_of_variables.push_back(v); return *this; }
178  std::vector<variable*> & get_vector_of_variables() { return vector_of_variables; }
179 
180  variable * get_variable(const char * v);
181 };
182 
187 class action
188 {
189 private:
190  collection_of_variables & my_variables;
191  collection_of_values & my_values;
192 
196  std::map<variable*, value*> map_output_variable_to_value;
197 
198 public:
200  my_variables(v),
201  my_values(w)
202  {
203  }
204 
205  const value * get_output_variable_value(variable * v) const { return map_output_variable_to_value.at(v); }
206 
207  void insert(variable * v, value * w) { map_output_variable_to_value.insert(std::pair<variable*,value*>(v, w)); }
208 
209  void report(std::ostream & s) const;
210 
211  void report_xml(std::ostream & s) const;
212 
213  bool get_match(const std::map<variable*, value*> & m) const;
214 
215  const std::map<variable*, value*>& get_map_output_variable_to_value() const
216  { return map_output_variable_to_value; }
217 };
218 
219 class visible_state;
220 
226 {
227 private:
228  collection_of_variables & my_variables;
229  collection_of_values & my_values;
230 
231  std::list<action*> list_of_actions;
232 
233  bool get_allowed(const std::map<variable*, std::vector<value*>::const_iterator> & m) const;
234 
235 public:
237  my_variables(v), my_values(w) {}
238 
240 
241  void populate();
242 
243  const std::list<action*> & get_list_of_actions() const { return list_of_actions; }
244 
245  std::list<action*> & get_list_of_actions() { return list_of_actions; }
246 
247  action * get(const std::map<variable*, value*> & m);
248 
249 };
250 
257 class state
258 {
259 private:
260  collection_of_variables & my_variables;
261  collection_of_values & my_values;
262  visible_state & my_visible_state;
263  collection_of_actions & my_actions;
264 
265  std::map<variable*, value*> map_hidden_variable_to_value;
266 
267  std::map<const action*, std::map<state*,float> > map_action_to_probability_distribution;
268 
269  bool impossible;
270 
271 public:
273  my_variables(v),
274  my_values(w),
275  my_visible_state(vs),
276  my_actions(a),
277  impossible(false)
278  {
279  }
280 
281  const value * get_hidden_variable_value(variable * v) const
282  {
283  return map_hidden_variable_to_value.at(v);
284  }
285 
286  void insert(variable * v, value * w) { map_hidden_variable_to_value.insert(std::pair<variable*,value*>(v, w)); }
287 
288  void report(std::ostream & s) const;
289 
290  void report_xml(std::ostream & s, bool with_model = true) const;
291 
292  bool get_match(const std::map<variable*, value*> & m) const;
293 
294  void set_model(action * a, std::map<state*,float> & m)
295  {
296  map_action_to_probability_distribution.insert(std::pair<const action*,std::map<state*,float> >(a, m));
297  }
298 
299  const visible_state & get_visible_state() const { return my_visible_state; }
300 
301  const std::map<const action*, std::map<state*,float> > & get_map_action_to_probability_distribution() const
302  { return map_action_to_probability_distribution; }
303 
304  std::map<const action*, std::map<state*,float> > & get_map_action_to_probability_distribution()
305  { return map_action_to_probability_distribution; }
306 
307  void make_random_model();
308 
309  int get_model_size() const;
310 
314  void test_model() const;
315 
316  void set_impossible()
317  {
318  impossible = true;
319  }
320 
321  bool get_possible() const { return !impossible; }
322 };
323 
325 
331 {
332 private:
333  collection_of_variables & my_variables;
334  collection_of_values & my_values;
335  collection_of_actions & my_actions;
336  collection_of_visible_states & my_visible_states;
337 
338  std::list<state*> list_of_states; // owned
339  std::map<variable*,value*> map_input_variable_to_value;
340 
345  std::list<action*> list_of_illegal_actions; // not owned
346 
347  bool get_allowed(const std::map<variable*, std::vector<value*>::const_iterator> & m) const;
348 
349 public:
351  my_variables(v),
352  my_values(w),
353  my_actions(a),
354  my_visible_states(q)
355  {
356  }
357 
358  void insert(variable * v, value * w) { map_input_variable_to_value.insert(std::pair<variable*,value*>(v, w)); }
359 
360  void populate();
361 
362  void report(std::ostream & s) const;
363 
364  void report_xml(std::ostream & s, bool with_states = true) const;
365 
366  bool get_match(const std::map<variable*, value*> & m) const;
367 
368  state * get(const std::map<variable*, value*> & m);
369 
370  const state * get(const std::map<variable*, value*> & m) const;
371 
372  const value* get_input_variable_value(variable* v) const { return map_input_variable_to_value.at(v); }
373 
374  const std::list<state*> & get_list_of_states() const { return list_of_states; }
375 
376  std::list<state*> & get_list_of_states() { return list_of_states; }
377 
378  float get_payoff() const;
379 
380  const collection_of_visible_states & get_visible_states() const { return my_visible_states; }
381 
382  collection_of_visible_states & get_visible_states() { return my_visible_states; }
383 
384  void make_random_model();
385 
386  int get_amount_of_states() const { return list_of_states.size(); }
387 
388  int get_model_size() const;
389 
390  void test_model() const;
391 
392  int get_amount_of_possible_states() const;
393 
394  void set_illegal(action * a) { list_of_illegal_actions.push_back(a); }
395 
396  bool get_is_illegal(action * a) const;
397 };
398 
404 class query: public std::map<variable*, value*>
405 {
406 private:
407  collection_of_variables & my_variables;
408 public:
409  query(collection_of_variables & v, const std::map<variable*,value*> & m):
410  my_variables(v), std::map<variable*, value*>(m) {}
411  void report(std::ostream & s) const;
412 
413  // take only the input variables and ignore the others
414  void make_input_query();
415 
416  // take only the hidden variables and ignore the others
417  void make_hidden_query();
418 
419  void check_contains_all_input_variables() const;
420 
421  void check_contains_only_input_variables() const;
422 
423  void check_contains_all_hidden_variables() const;
424 
425  void check_contains_only_input_or_hidden_variables() const;
426 
427  void check_contains_all_output_variables() const;
428 
429  void check_contains_only_output_variables() const;
430 };
431 
437 {
438 private:
439  collection_of_variables & my_variables;
440  collection_of_values & my_values;
441  collection_of_actions & my_actions;
442 
443  std::list<visible_state*> list_of_visible_states;
444 
445  std::map<const visible_state*,float> map_visible_state_to_payoff_value;
446 
447  bool get_allowed(const std::map<variable*, std::vector<value*>::const_iterator> & m) const;
448 
449 public:
452 
453  void populate();
454 
455  const visible_state * get(const std::map<variable*, value*> & m) const;
456 
457  visible_state * get(const std::map<variable*, value*> & m);
458 
459  float get_payoff(const visible_state * s)
460  {
461  return map_visible_state_to_payoff_value.at(s);
462  }
463 
464  void set_payoff(const visible_state *s, float p)
465  {
466  if (map_visible_state_to_payoff_value.find(s) == map_visible_state_to_payoff_value.end())
467  map_visible_state_to_payoff_value.insert(std::pair<const visible_state *,float>(s, p));
468  else
469  map_visible_state_to_payoff_value[s] = p;
470  }
471 
472  void set_payoff(const std::map<variable*, value*> & m, float p)
473  {
474  const visible_state * s = get(m);
475  if (s == NULL)
476  {
477  throw std::runtime_error("query failed");
478  }
479  set_payoff(s, p);
480  //std::cout << "SET PAYOFF " << p << "\n";
481  }
482 
483  void report(std::ostream & s) const;
484 
485  void report_xml(std::ostream & s) const;
486 
487  const std::list<visible_state*> & get_list_of_visible_states() const { return list_of_visible_states; }
488 
489  std::list<visible_state*> & get_list_of_visible_states() { return list_of_visible_states; }
490 
491  void make_random_model();
492 
493  void make_random_payoff();
494 
495  int get_amount_of_states() const;
496 
497  void test_model() const;
498 };
499 
504 class belief
505 {
506 private:
507  visible_state & my_visible_state;
508  std::map<state *, float> map_state_to_probability;
509 public:
510  belief(visible_state & v): my_visible_state(v) {}
511  float get_probability(state * s) const;
512 
513  void set_probability(state * s, float p) { map_state_to_probability.insert(std::pair<state*,float>(s, p)); }
514 
515  void set_probability(const std::map<variable*, value*> & query, float p)
516  {
517  state * s = my_visible_state.get(query);
518  if (s == NULL)
519  {
520  throw std::runtime_error("query failed");
521  }
522  set_probability(s, p);
523  }
524 
525  void report(std::ostream & s) const;
526 
527  void report_xml(std::ostream & s) const;
528 
529  void make_uniform();
530 
531  const visible_state & get_visible_state() const { return my_visible_state; }
532 };
533 
538 class tracker
539 {
540 private:
544  std::list<tracker*> & my_stack;
545 protected:
549  const std::string my_function_name;
550 
555 public:
559  tracker(std::list<tracker*> & stack, std::string f, int line);
560 
564  ~tracker();
565 
569  const std::string & get_function_name() const;
570 
574  int get_line_number() const;
575 
576  virtual void report(std::ostream & s) const;
577 
578  virtual void report_xml(std::ostream & s) const;
579 };
580 
587 {
588 protected:
589  enum target_type { COUT = 0x1, CERR = 0x2, SINGLE_FILE = 0x4, ITERATED_FILES = 0x8 };
590 
591  enum dump_stack_mode_type { dump_stack_as_XML, dump_stack_as_text };
592 
593  enum dump_belief_mode_type { dump_belief_as_XML, dump_belief_as_text };
594 
595  enum dump_iteration_report_mode_type { dump_iteration_report_as_XML, dump_iteration_report_as_text };
596 
597  dump_stack_mode_type dump_stack_mode;
598 
599  dump_belief_mode_type dump_belief_mode;
600 
601  dump_iteration_report_mode_type dump_iteration_report_mode;
602 
603  target_type dump_stack_target, dump_belief_target, dump_iteration_report_target;
604 
605 protected:
606  int min_report_depth, max_report_depth;
607 
608  int stack_file_counter, belief_file_counter, iteration_report_file_counter;
609 
610  virtual void dump_stack(std::ostream & s) const = 0;
611  virtual void dump_stack_XML(std::ostream & s) const = 0;
612 
613  virtual void dump_iteration_report(std::ostream & s) const = 0;
614  virtual void dump_iteration_report_XML(std::ostream & s) const = 0;
615 
616  virtual void dump_belief(std::ostream & s) const = 0;
617  virtual void dump_belief_XML(std::ostream & s) const = 0;
618 
619  virtual std::string get_stack_file_prefix() const;
620  virtual std::string get_iteration_report_file_prefix() const;
621  virtual std::string get_belief_file_prefix() const;
622 
623 protected:
624  void dump_stack_to_target_stream();
625  void dump_belief_to_target_stream();
626  void dump_iteration_report_to_target_stream();
627 
628 public:
629  void set_min_report_depth(int d) { min_report_depth = d; }
630  void set_max_report_depth(int d) { max_report_depth = d; }
631 
632  dump_controller();
633 };
634 
635 
636 
642 {
643 protected:
647  std::list<tracker*> stack_of_trackers;
648 
652  enum decision { BREAK, CONTINUE, NONE };
653 
658  virtual decision make_decision(const std::list<tracker*> & s);
659 
660 public:
665  virtual void dump_stack(std::ostream & s) const;
666  virtual void dump_stack_XML(std::ostream & s) const;
667 
668  virtual void dump_iteration_report(std::ostream & s) const;
669  virtual void dump_iteration_report_XML(std::ostream & s) const;
670 };
671 
677 {
678 protected:
679  float & my_max;
680  action *& my_argmax;
681  std::list<action*>::const_iterator & my_iterator;
682  int my_level;
683  const belief & my_belief;
684 public:
685  tracker_for_optimizer(std::list<tracker*> & stack, std::string f, int line,
686  float & max, action *& argmax, std::list<action*>::const_iterator & i, int l,
687  const belief & b
688  );
689 
690  float get_max() const;
691  action * get_argmax() const; // can be NULL !
692  action * get_current_action() const;
693  int get_level() const;
694  const belief & get_belief() const;
695 
696  virtual void report(std::ostream & s) const;
697  virtual void report_xml(std::ostream & s) const;
698 };
699 
707 {
708 protected:
709  collection_of_actions & my_actions;
710 protected:
711 
717  virtual std::list<action*>::const_iterator get_action_iteration_begin();
718 
722  virtual void action_iteration_increment(std::list<action*>::const_iterator & target);
723 
727  virtual bool get_action_iteration_terminated(const std::list<action*>::const_iterator & i);
728 
729 
731 };
732 
733 
739 {
740 private:
741  collection_of_variables & my_variables;
742  collection_of_values & my_values;
743  collection_of_visible_states & my_visible_states;
744 
748  float get_payoff_expected_value_for_consequences(const belief & b1, int n, const action & a);
749 
750 protected:
751  bool verbose_flag;
752 
758  const belief & b1, const action & a, const visible_state & vs, belief & target) const;
759 
760 public:
764  my_variables(v),
765  my_values(w),
766  my_visible_states(vs),
767  verbose_flag(false)
768  {
769  }
770 
774  float get_consequence_probability(const belief & b1, const action & a, const visible_state & vs) const;
775 
776 
781  void populate_belief_for_consequence(const belief & b1, const action & a, const visible_state & vs, belief & target) const;
782 
783 
787  const action * get_optimal_action(const belief & b, int n);
788 
789 };
790 
791 
816 {
817 private:
821  enum mode_type { NONE, DECLARING_VALUES, DECLARING_VARIABLES_VALUES } mode;
822 public:
827 
828  variable * e; // recently created variable (not owned), parsing time
829 
830  std::map<variable*, value*> q, initial_state_query, action_query; // queries, parsing time
831 
832  belief *current_belief, *former_belief; // beliefs (owned)
833 
834  const action * former_action; // former action (not owned)
835 
836  std::list<variable*> list_of_input_variables; // auxilliary, just for loop
837 
838 private:
839 
840  variable * get_variable(const char * v);
841 
842  value * get_value(const char * v);
843 
844  bool get_special_command(const char * buffer) const;
845 
846  void execute_special_command(const char * buffer);
847 
848  void explain() const;
849 
850  void verbose();
851 
852 public:
854 
855  void declare_values();
856  void declare_variables_values();
857  void add_value(const char * s);
858 
859  void create_input_variable(const char * s);
860  void create_hidden_variable(const char * s);
861  void create_output_variable(const char * s);
862 
863  void make_model();
864 
865  void test_model() const;
866 
867  void clear_query();
868 
869  void assert_query_fact(const char * v, const char * val);
870 
871  int parse(const char * filename);
872 
873 
878  virtual void set_apriori_belief(belief * b) const;
879 
880  virtual void print_initial_loop_message() const;
881 
882  virtual void print_current_belief();
883 
888  virtual void get_input(std::map<variable*, value*> & m, bool & eof);
889 
893  virtual void execute(const action * a);
894 
895 protected:
896  virtual void dump_belief(std::ostream & s) const;
897  virtual void dump_belief_XML(std::ostream & s) const;
898 };
899 
900 }
901 
902 std::ostream& operator<<(std::ostream & s, const perkun::query & q);
903 
904 
905 #endif
Definition: perkun.h:37
std::map< variable *, value * > map_output_variable_to_value
Definition: perkun.h:196
virtual void action_iteration_increment(std::list< action * >::const_iterator &target)
Definition: action_iteration_controller.cc:29
virtual bool get_action_iteration_terminated(const std::list< action * >::const_iterator &i)
Definition: action_iteration_controller.cc:34
Definition: perkun.h:171
Definition: perkun.h:148
Definition: perkun.h:187
Definition: perkun.h:86
virtual void set_apriori_belief(belief *b) const
Definition: optimizer_with_all_data.cc:40
Definition: perkun.h:257
Definition: perkun.h:31
virtual void on_error_in_populate_belief_for_consequence(const belief &b1, const action &a, const visible_state &vs, belief &target) const
Definition: optimizer.cc:24
std::list< tracker * > & my_stack
Definition: perkun.h:544
const std::string & get_function_name() const
Definition: tracker.cc:35
virtual void dump_stack(std::ostream &s) const
Definition: class_with_tracking.cc:25
Definition: perkun.h:330
const action * get_optimal_action(const belief &b, int n)
Definition: optimizer.cc:146
mode_type
Definition: perkun.h:821
virtual void execute(const action *a)
Definition: optimizer_with_all_data.cc:444
float get_payoff_expected_value_for_consequences(const belief &b1, int n, const action &a)
Definition: optimizer.cc:110
std::list< tracker * > stack_of_trackers
Definition: perkun.h:647
int my_line_number
Definition: perkun.h:554
Definition: perkun.h:436
Definition: perkun.h:738
Definition: perkun.h:706
decision
Definition: perkun.h:652
Definition: perkun.h:53
Definition: perkun.h:102
Definition: perkun.h:504
Definition: perkun.h:815
Definition: perkun.h:538
int get_line_number() const
Definition: tracker.cc:37
tracker(std::list< tracker * > &stack, std::string f, int line)
Definition: tracker.cc:25
void populate_belief_for_consequence(const belief &b1, const action &a, const visible_state &vs, belief &target) const
Definition: optimizer.cc:33
virtual std::list< action * >::const_iterator get_action_iteration_begin()
Definition: action_iteration_controller.cc:24
~tracker()
Definition: tracker.cc:30
std::list< action * > list_of_illegal_actions
Definition: perkun.h:345
Definition: perkun.h:125
virtual decision make_decision(const std::list< tracker * > &s)
Definition: class_with_tracking.cc:69
virtual void get_input(std::map< variable *, value * > &m, bool &eof)
Definition: optimizer_with_all_data.cc:391
Definition: perkun.h:225
Definition: perkun.h:404
Definition: perkun.h:641
Definition: perkun.h:676
const std::string my_function_name
Definition: perkun.h:549
float get_consequence_probability(const belief &b1, const action &a, const visible_state &vs) const
Definition: optimizer.cc:86
Definition: perkun.h:586
void test_model() const
Definition: state.cc:152