Assignment Search Framework
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Pages
search_engine.h
Go to the documentation of this file.
1 /*
2  * search_engine.h
3  *
4  * LICENSE HERE
5  *
6  * Created on: 2016-08-24
7  * Author: Rick Valenzano
8  */
9 
10 #ifndef SEARCHENGINE_H_
11 #define SEARCHENGINE_H_
12 
13 #include <vector>
14 #include <cstdint>
15 
16 #include "goal_test_function.h"
17 #include "transition_system.h"
18 
19 //TODO Are these enums really the best way to do this? Have classes like an Exception?
20 //TODO Add time and time limits
21 //TODO Add debug modes for state-checking?
22 
35 enum class SearchStatus
36 {
38 };
39 
51 enum class SearchTermType
52 {
54 };
55 
61 template<class state_t, class action_t>
63 {
64 public:
68  SearchEngine();
69 
73  virtual ~SearchEngine();
74 
83 
92 
98  SearchStatus getStatus() const;
99 
111  SearchTermType getPlan(const state_t &init_state, std::vector<action_t> &sol_plan);
112 
118  bool foundSolution() const;
119 
125  std::vector<action_t> getLastPlan();
126 
134  double getLastPlanCost();
135 
143  void setStorageLimit(uint64_t limit);
144 
150  bool hitStorageLimit();
151 
159  void setHComputeLimit(uint64_t limit);
160 
166  bool hitHCompLimit();
167 
175  void setSuccCallLimit(uint64_t limit);
176 
182  bool hitSuccFuncLimit();
183 
191  void setGoalTestLimit(uint64_t limit);
192 
198  bool hitGoalTestLimit();
199 
205  uint64_t getStorageCount() const;
206 
212  uint64_t getHCompCount() const;
213 
219  uint64_t getSuccFuncCount() const;
220 
226  uint64_t getStateGenCount() const;
227 
233  uint64_t getActionGenCount() const;
234 
240  uint64_t getGoalTestCount() const;
241 
245  virtual void resetStatistics();
246 
250  virtual void resetEngine();
251 
257  virtual bool isConfigured() const;
258 
259 protected:
260 
267  virtual SearchTermType searchForPlan(const state_t &init_state) = 0;
268 
272  virtual void incrementGoalTestCount();
273 
277  virtual void incrementHCompCount();
278 
282  virtual void incrementSuccFuccCalls();
283 
287  virtual void incrementStateGenCount();
288 
294  virtual void increaseActionGenCount(double new_gens);
295 
298 
300 
302  std::vector<action_t> incumbent_plan;
303  double incumbent_cost;
304 
305  uint64_t storage_limit;
306  uint64_t storage_count;
307 
308  uint64_t h_comp_limit;
309  uint64_t h_comp_count;
310 
311  uint64_t succ_func_limit;
312  uint64_t succ_func_count;
313 
314  uint64_t goal_test_limit;
315  uint64_t goal_test_count;
316 
317  uint64_t state_gen_count;
318  uint64_t action_gen_count;
319 };
320 
321 template<class state_t, class action_t>
323  : goal_test(0), op_system(0), alg_status(SearchStatus::not_ready), have_incumbent(false), incumbent_cost(0.0),
324  storage_limit(0), storage_count(0), h_comp_limit(0), h_comp_count(0), succ_func_limit(0),
325  succ_func_count(0), goal_test_limit(0), goal_test_count(0), state_gen_count(0), action_gen_count(0)
326 {
327 }
328 
329 template<class state_t, class action_t>
331 {
332 }
333 
334 template<class state_t, class action_t>
336 {
337  goal_test = g;
338 
339  resetEngine();
340 }
341 
342 template<class state_t, class action_t>
344 {
345  op_system = o;
346 
347  resetEngine();
348 }
349 
350 template<class state_t, class action_t>
352 {
353  return alg_status;
354 }
355 
356 template<class state_t, class action_t>
357 SearchTermType SearchEngine<state_t, action_t>::getPlan(const state_t& init_state, std::vector<action_t>& sol_plan)
358 {
359  resetEngine();
360 
361  if(alg_status == SearchStatus::not_ready)
363 
364  alg_status = SearchStatus::active;
365  SearchTermType term = searchForPlan(init_state);
366 
367  alg_status = SearchStatus::terminated;
368 
369  sol_plan.clear();
370  if(incumbent_plan.size() > 0) {
371  for(unsigned i = 0; i < incumbent_plan.size(); i++) {
372  sol_plan.push_back(incumbent_plan[i]);
373  }
374  }
375 
376  return term;
377 }
378 
379 template<class state_t, class action_t>
381 {
382  storage_limit = limit;
383 }
384 
385 template<class state_t, class action_t>
387 {
388  h_comp_limit = limit;
389 }
390 
391 template<class state_t, class action_t>
393 {
394  succ_func_limit = limit;
395 }
396 
397 template<class state_t, class action_t>
399 {
400  return storage_count;
401 }
402 
403 template<class state_t, class action_t>
405 {
406  return h_comp_count;
407 }
408 
409 template<class state_t, class action_t>
411 {
412  return succ_func_count;
413 }
414 
415 template<class state_t, class action_t>
417 {
418  return state_gen_count;
419 }
420 
421 template<class state_t, class action_t>
423 {
424  return action_gen_count;
425 }
426 
427 template<class state_t, class action_t>
429 {
430  storage_count = 0;
431  h_comp_count = 0;
432  succ_func_count = 0;
433  state_gen_count = 0;
434  action_gen_count = 0;
435  goal_test_count = 0;
436 }
437 
438 template<class state_t, class action_t>
440 {
441  resetStatistics();
442 
443  have_incumbent = false;
444  incumbent_cost = -1.0;
445  incumbent_plan.clear();
446 
447  alg_status = SearchStatus::not_ready;
448  if(isConfigured())
449  alg_status = SearchStatus::ready;
450 }
451 
452 template<class state_t, class action_t>
454 {
455  return goal_test_count;
456 }
457 
458 template<class state_t, class action_t>
460 {
461  if(!goal_test || !op_system) {
462  return false;
463  }
464  return true;
465 }
466 
467 template<class state_t, class action_t>
469 {
470  if(storage_limit > 0 && storage_count >= storage_limit)
471  return true;
472  return false;
473 }
474 
475 template<class state_t, class action_t>
477 {
478  if(h_comp_limit > 0 && h_comp_count >= h_comp_limit)
479  return true;
480  return false;
481 }
482 
483 template<class state_t, class action_t>
484 inline std::vector<action_t> SearchEngine<state_t, action_t>::getLastPlan()
485 {
486  return incumbent_plan;
487 }
488 
489 template<class state_t, class action_t>
491 {
492  return incumbent_cost;
493 }
494 
495 template<class state_t, class action_t>
497 {
498  return have_incumbent;
499 }
500 
501 template<class state_t, class action_t>
503 {
504  if(succ_func_limit > 0 && succ_func_count >= succ_func_limit)
505  return true;
506  return false;
507 }
508 
509 template<class state_t, class action_t>
511 {
512  goal_test_limit = limit;
513 }
514 
515 template<class state_t, class action_t>
517 {
518  if(goal_test_limit > 0 && goal_test_count >= goal_test_limit)
519  return true;
520  return false;
521 }
522 
523 template<class state_t, class action_t>
525 {
526  action_gen_count += new_gens;
527 }
528 
529 template<class state_t, class action_t>
531 {
532  state_gen_count++;
533 }
534 
535 template<class state_t, class action_t>
537 {
538  goal_test_count++;
539 }
540 
541 template<class state_t, class action_t>
543 {
544  succ_func_count++;
545 }
546 
547 template<class state_t, class action_t>
549 {
550  h_comp_count++;
551 }
552 
553 #endif /* SEARCHENGINE_H_ */
virtual ~SearchEngine()
Definition: search_engine.h:330
const TransitionSystem< state_t, action_t > * op_system
The transition system.
Definition: search_engine.h:297
virtual void increaseActionGenCount(double new_gens)
Definition: search_engine.h:524
virtual void resetStatistics()
Definition: search_engine.h:428
void setTransitionSystem(const TransitionSystem< state_t, action_t > *o)
Definition: search_engine.h:343
uint64_t succ_func_count
The number of heuristic computations made during the current search.
Definition: search_engine.h:312
bool foundSolution() const
Definition: search_engine.h:496
uint64_t state_gen_count
The number of state generations during the current search.
Definition: search_engine.h:317
virtual void incrementStateGenCount()
Definition: search_engine.h:530
void setHComputeLimit(uint64_t limit)
Definition: search_engine.h:386
uint64_t getSuccFuncCount() const
Definition: search_engine.h:410
SearchStatus getStatus() const
Definition: search_engine.h:351
uint64_t getStateGenCount() const
Definition: search_engine.h:416
double incumbent_cost
The cost of the last solution.
Definition: search_engine.h:303
bool hitGoalTestLimit()
Definition: search_engine.h:516
Definition: goal_test_function.h:19
double getLastPlanCost()
Definition: search_engine.h:490
uint64_t action_gen_count
The number of state generations during the current search.
Definition: search_engine.h:318
uint64_t h_comp_count
The number of heuristic computations during the current search.
Definition: search_engine.h:309
uint64_t goal_test_limit
The limit on the number of goal tests. 0 for no limit.
Definition: search_engine.h:314
uint64_t goal_test_count
The number of goal tests performed during the current search.
Definition: search_engine.h:315
SearchTermType
Definition: search_engine.h:51
uint64_t succ_func_limit
The limit on how many successor function calls can be performed. 0 for no limit.
Definition: search_engine.h:311
virtual void incrementSuccFuccCalls()
Definition: search_engine.h:542
SearchStatus alg_status
The current search status.
Definition: search_engine.h:299
const GoalTestFunction< state_t > * goal_test
The goal test function.
Definition: search_engine.h:296
uint64_t storage_count
The number of states currently being stored.
Definition: search_engine.h:306
uint64_t getGoalTestCount() const
Definition: search_engine.h:453
virtual void incrementGoalTestCount()
Definition: search_engine.h:536
uint64_t getActionGenCount() const
Definition: search_engine.h:422
bool hitStorageLimit()
Definition: search_engine.h:468
void setGoalTestLimit(uint64_t limit)
Definition: search_engine.h:510
void setGoalTest(const GoalTestFunction< state_t > *g)
Definition: search_engine.h:335
bool hitHCompLimit()
Definition: search_engine.h:476
Definition: transition_system.h:23
Definition: search_engine.h:62
std::vector< action_t > incumbent_plan
The last solution found.
Definition: search_engine.h:302
void setSuccCallLimit(uint64_t limit)
Definition: search_engine.h:392
std::vector< action_t > getLastPlan()
Definition: search_engine.h:484
uint64_t storage_limit
The limit on how many states are stored. 0 for no limit.
Definition: search_engine.h:305
uint64_t getHCompCount() const
Definition: search_engine.h:404
virtual SearchTermType searchForPlan(const state_t &init_state)=0
virtual void incrementHCompCount()
Definition: search_engine.h:548
void setStorageLimit(uint64_t limit)
Definition: search_engine.h:380
virtual bool isConfigured() const
Definition: search_engine.h:459
bool hitSuccFuncLimit()
Definition: search_engine.h:502
uint64_t getStorageCount() const
Definition: search_engine.h:398
SearchTermType getPlan(const state_t &init_state, std::vector< action_t > &sol_plan)
Definition: search_engine.h:357
bool have_incumbent
If an incumbent solution is stored or not.
Definition: search_engine.h:301
uint64_t h_comp_limit
The limit on how many heuristic computations can be performed. 0 for no limit.
Definition: search_engine.h:308
virtual void resetEngine()
Definition: search_engine.h:439
SearchEngine()
Definition: search_engine.h:322