indigoX
astar_optimisation.hpp
Go to the documentation of this file.
1 #ifndef INDIGOX_ALGORITHM_ELECTRON_ASSIGNMENT_ASTAR_OPTIMISATION_HPP
2 #define INDIGOX_ALGORITHM_ELECTRON_ASSIGNMENT_ASTAR_OPTIMISATION_HPP
3 
4 #include "../../graph/assignment.hpp"
5 #include "assigner.hpp"
6 #include <boost/dynamic_bitset/dynamic_bitset.hpp>
7 
8 #include <algorithm>
9 #include <cstdint>
10 #include <queue>
11 
12 namespace indigox::algorithm {
13 
14  using LocMask = boost::dynamic_bitset<>;
15 
16  struct QueueItem {
20  size_t nbr_begin_idx;
21 
22  inline bool IsInfinite() const {
24  return path == inf || heuristic == inf;
25  }
26  inline score_t Total() const { return path + heuristic; }
27  inline size_t CalcCount() const { return calc_mask.count(); }
28  bool operator>(const QueueItem &r) const;
29  QueueItem() = default;
30  QueueItem(const size_t loc_size, const size_t pos_size)
31  : path(0), heuristic(0), assignment(loc_size), unchange_mask(pos_size),
32  calc_mask(pos_size), new_calc_mask(pos_size), nbr_begin_idx(0) {}
33 
34  QueueItem(const score_t p, const score_t h, const AssignMask &ass,
35  const LocMask &unchange, const LocMask &calc,
36  const LocMask &new_calc, const size_t ni)
37  : path(p), heuristic(h), assignment(ass), unchange_mask(unchange),
38  calc_mask(calc), new_calc_mask(new_calc), nbr_begin_idx(ni) {}
39  };
40 
41  using queue_t = std::priority_queue<QueueItem, std::vector<QueueItem>,
42  std::greater<QueueItem>>;
43  class PriorityQueue : public queue_t {
44  public:
45  void reserve(size_t sz) { this->c.reserve(sz); }
46  size_t max_size() const { return this->c.max_size(); }
47  void clear() { this->c.clear(); }
48  };
49 
51  using NbrAssigns = std::array<AssignMask, 32>;
52 
53  public:
54  enum class Heuristic { Promiscuous, Abstemious };
55 
56  struct Settings {
57  static uint64_t MEMORY_LIMIT;
59  };
60 
61  public:
62  IXAStarOptimisation() = delete; // no default constructor
63 
69 
74  virtual void Initalise(const Molecule &mol) override;
75 
78  virtual void Run() override;
79 
80  private:
81  void DetermineLocationCounts();
82  void DetermineRequiredUnchangeables();
83  void DetermineInitialAssignment();
84  LocMask DetermineCalculableLocations(const QueueItem &q) const;
85  score_t CalculateNewPathScore(const QueueItem &q);
86  score_t CalculateHeuristicScore(const QueueItem &q) const;
87  score_t Promiscuous(const QueueItem &q) const;
88  score_t Abstemious(const QueueItem &q) const;
89  size_t GenerateNextAssignments(const QueueItem &q, NbrAssigns &out) const;
90 
91  inline size_t GetLocationPosition(const graph::AGVertex &v) const {
92  return std::distance(
93  _unique_locs.begin(),
94  std::find(_unique_locs.begin(), _unique_locs.end(), v));
95  }
96 
97  private:
98  PriorityQueue _q;
99  uint64_t _len_limit;
100  std::vector<graph::AGVertex> _unique_locs;
101  std::vector<uint32_t> _loc_counts;
102  std::vector<LocMask> _req_unchange;
103  };
104 } // namespace indigox::algorithm
105 
106 #endif /* INDIGOX_ALGORITHM_ELECTRON_ASSIGNMENT_ASTAR_OPTIMISATION_HPP */
Definition: access.hpp:7
size_t max_size() const
Definition: astar_optimisation.hpp:46
LocMask unchange_mask
Definition: astar_optimisation.hpp:19
static uint64_t MEMORY_LIMIT
Definition: astar_optimisation.hpp:57
std::priority_queue< QueueItem, std::vector< QueueItem >, std::greater< QueueItem > > queue_t
Definition: astar_optimisation.hpp:42
std::map< key_t, score_t > ScoreTable
Type of a score table.
Definition: assigner.hpp:27
Definition: astar_optimisation.hpp:50
score_t path
Definition: astar_optimisation.hpp:17
Definition: astar_optimisation.hpp:56
QueueItem(const size_t loc_size, const size_t pos_size)
Definition: astar_optimisation.hpp:30
Definition: astar_optimisation.hpp:16
uint64_t score_t
Type of the score of an electron assignment.
Definition: assigner.hpp:21
boost::dynamic_bitset<> LocMask
Definition: astar_optimisation.hpp:14
score_t Total() const
Definition: astar_optimisation.hpp:26
boost::dynamic_bitset<> AssignMask
Type of the mask used for assignments.
Definition: assigner.hpp:23
virtual void Run() override
Run the algorithm.
bool operator>(const QueueItem &r) const
bool IsInfinite() const
Definition: astar_optimisation.hpp:22
static Heuristic HEURISTIC
Definition: astar_optimisation.hpp:58
Heuristic
Definition: astar_optimisation.hpp:54
std::shared_ptr< IXAGVertex > AGVertex
Definition: fwd_declares.hpp:104
void clear()
Definition: astar_optimisation.hpp:47
static score_t Infinity
Value of an infinite score.
Definition: assigner.hpp:252
size_t CalcCount() const
Definition: astar_optimisation.hpp:27
Base class for an electron assignment algorithm.
Definition: assigner.hpp:44
Definition: molecule.hpp:15
void reserve(size_t sz)
Definition: astar_optimisation.hpp:45
Definition: astar_optimisation.hpp:43
size_t nbr_begin_idx
Definition: astar_optimisation.hpp:20
virtual void Initalise(const Molecule &mol) override
Initalisation method.
LocMask calc_mask
Definition: astar_optimisation.hpp:19
QueueItem(const score_t p, const score_t h, const AssignMask &ass, const LocMask &unchange, const LocMask &calc, const LocMask &new_calc, const size_t ni)
Definition: astar_optimisation.hpp:34
AssignMask assignment
Definition: astar_optimisation.hpp:18
LocMask new_calc_mask
Definition: astar_optimisation.hpp:19
score_t heuristic
Definition: astar_optimisation.hpp:17