aGrUM  0.16.0
gum::prm::gspan::DFSCode Class Reference

Reprensent a Depth First Search coding of a graph. More...

#include <agrum/PRM/gspan/DFSCode.h>

Public Attributes

std::vector< EdgeCode *> codes
 The vector containing the EdgeCode composing this DFSCode. More...
 

Public Member Functions

 DFSCode ()
 Default constructor. More...
 
 DFSCode (const DFSCode &source)
 Copy constructor. More...
 
 ~DFSCode ()
 Destructor. More...
 
DFSCodeoperator= (const DFSCode &source)
 Copy operator. More...
 
bool operator== (const DFSCode &code) const
 Equality operator. More...
 
bool operator!= (const DFSCode &code) const
 Difference operator. More...
 
bool operator< (const DFSCode &code) const
 Lesser than operator. More...
 
bool operator<= (const DFSCode &code) const
 Lesser or equal than operator. More...
 

Static Public Member Functions

static bool validNeighbors (EdgeCode *e1, EdgeCode *e2)
 Returns true of e2 is a valid neighbor for e1 (i.e. More...
 

Public Types

typedef std::vector< EdgeCode *>::iterator iterator
 Code alias. More...
 
typedef std::vector< EdgeCode *>::const_iterator const_iterator
 Code alias. More...
 

Detailed Description

Reprensent a Depth First Search coding of a graph.

A DFSCode is composed of EdgeCode. Each EdgeCode is either a forward edge or a backward edge.

Regarding memory allocation EdgeCode are shared between related DFSCode, so delete DFSCode in a bottom up fashion.

Definition at line 53 of file DFSCode.h.

Member Typedef Documentation

◆ const_iterator

Code alias.

Definition at line 131 of file DFSCode.h.

◆ iterator

Code alias.

Definition at line 128 of file DFSCode.h.

Constructor & Destructor Documentation

◆ DFSCode() [1/2]

INLINE gum::prm::gspan::DFSCode::DFSCode ( )

Default constructor.

Create an empty DFSCode.

Definition at line 35 of file DFSCode_inl.h.

35 { GUM_CONSTRUCTOR(DFSCode); }
DFSCode()
Default constructor.
Definition: DFSCode_inl.h:35

◆ DFSCode() [2/2]

INLINE gum::prm::gspan::DFSCode::DFSCode ( const DFSCode source)

Copy constructor.

Proceeds with a deep copy.

Definition at line 38 of file DFSCode_inl.h.

References codes.

38  {
39  GUM_CONS_CPY(DFSCode);
40 
41  for (const auto code : source.codes)
42  codes.push_back(new EdgeCode(*code));
43  }
std::vector< EdgeCode *> codes
The vector containing the EdgeCode composing this DFSCode.
Definition: DFSCode.h:90
DFSCode()
Default constructor.
Definition: DFSCode_inl.h:35

◆ ~DFSCode()

INLINE gum::prm::gspan::DFSCode::~DFSCode ( )

Destructor.

This will delete all children of this DFSCode, with their respective EdgeCode.

Definition at line 46 of file DFSCode_inl.h.

References codes.

46  {
47  GUM_DESTRUCTOR(DFSCode);
48 
49  for (const auto item : codes)
50  delete item;
51  }
std::vector< EdgeCode *> codes
The vector containing the EdgeCode composing this DFSCode.
Definition: DFSCode.h:90
DFSCode()
Default constructor.
Definition: DFSCode_inl.h:35

Member Function Documentation

◆ operator!=()

INLINE bool gum::prm::gspan::DFSCode::operator!= ( const DFSCode code) const

Difference operator.

Parameters
codeThe code tested for difference with this.
Returns
Returns true if this and code are different.

Definition at line 78 of file DFSCode_inl.h.

References codes.

78  {
79  if (codes.size() == from.codes.size()) {
80  for (size_t idx = 0; idx < codes.size(); ++idx) {
81  if ((*codes[idx]) != (*codes[idx])) { return true; }
82  }
83 
84  return false;
85  } else {
86  return true;
87  }
88  }
std::vector< EdgeCode *> codes
The vector containing the EdgeCode composing this DFSCode.
Definition: DFSCode.h:90

◆ operator<()

INLINE bool gum::prm::gspan::DFSCode::operator< ( const DFSCode code) const

Lesser than operator.

Parameters
codeThe code on which the test is made.
Returns
Returns true if this is lesser than code.

Definition at line 91 of file DFSCode_inl.h.

References codes, gum::prm::gspan::EdgeCode::i, gum::prm::gspan::EdgeCode::isBackward(), gum::prm::gspan::EdgeCode::isForward(), gum::prm::gspan::EdgeCode::j, gum::prm::gspan::EdgeCode::l_i, gum::prm::gspan::EdgeCode::l_ij, and gum::prm::gspan::EdgeCode::l_j.

91  {
92  DFSCode::const_iterator iter = codes.begin();
93  DFSCode::const_iterator jter = from.codes.begin();
94 
95  for (; (iter != codes.end()) && (jter != from.codes.end());
96  ++iter, ++jter) {
97  if ((**iter) != (**jter)) {
98  EdgeCode& alpha = **iter;
99  EdgeCode& beta = **jter;
100 
101  if (alpha.isBackward()) {
102  if (beta.isForward()) {
103  return true;
104  } else if (alpha.j < beta.j) {
105  // beta is a backward edge
106  return true;
107  } else if ((alpha.j == beta.j) && (alpha.l_ij < beta.l_ij)) {
108  return true;
109  }
110 
111  return false;
112  } else {
113  // alpha is a forward edge
114  if (beta.isBackward()) {
115  return false;
116  } else if (beta.i < alpha.i) {
117  // Beta is a forward edge
118  return true;
119  } else if (beta.i == alpha.i) {
120  if (alpha.l_i < beta.l_i) {
121  return true;
122  } else if (alpha.l_i == beta.l_i) {
123  if (alpha.l_ij < beta.l_ij) {
124  return true;
125  } else if (alpha.l_ij == beta.l_ij) {
126  return alpha.l_j < beta.l_j;
127  }
128  }
129  }
130 
131  return false;
132  }
133 
134  return (**iter) < (**jter);
135  }
136  }
137 
138  return false;
139  }
std::vector< EdgeCode *> codes
The vector containing the EdgeCode composing this DFSCode.
Definition: DFSCode.h:90
std::vector< EdgeCode *>::const_iterator const_iterator
Code alias.
Definition: DFSCode.h:131
+ Here is the call graph for this function:

◆ operator<=()

INLINE bool gum::prm::gspan::DFSCode::operator<= ( const DFSCode code) const

Lesser or equal than operator.

Parameters
codeThe code on which the test is made.
Returns
Returns true if this is lesser than code.

Definition at line 142 of file DFSCode_inl.h.

References codes.

142  {
143  DFSCode::const_iterator iter = codes.begin();
144  DFSCode::const_iterator jter = from.codes.begin();
145 
146  for (; (iter != codes.end()) && (jter != from.codes.end());
147  ++iter, ++jter) {
148  if ((**iter) != (**jter)) { return (**iter) < (**jter); }
149  }
150 
151  return codes.size() <= from.codes.size();
152  }
std::vector< EdgeCode *> codes
The vector containing the EdgeCode composing this DFSCode.
Definition: DFSCode.h:90
std::vector< EdgeCode *>::const_iterator const_iterator
Code alias.
Definition: DFSCode.h:131

◆ operator=()

INLINE DFSCode & gum::prm::gspan::DFSCode::operator= ( const DFSCode source)

Copy operator.

Proceeds with a deep copy.

Definition at line 54 of file DFSCode_inl.h.

References codes.

54  {
55  for (const auto item : codes)
56  delete item;
57 
58  for (const auto srcitem : source.codes)
59  codes.push_back(new EdgeCode(*srcitem));
60 
61  return *this;
62  }
std::vector< EdgeCode *> codes
The vector containing the EdgeCode composing this DFSCode.
Definition: DFSCode.h:90

◆ operator==()

INLINE bool gum::prm::gspan::DFSCode::operator== ( const DFSCode code) const

Equality operator.

Parameters
codeThe code tested for equality with this.
Returns
Returns true if this and code are equal.

Definition at line 65 of file DFSCode_inl.h.

References codes.

65  {
66  if (codes.size() == from.codes.size()) {
67  for (size_t idx = 0; idx < codes.size(); ++idx) {
68  if ((*codes[idx]) != (*codes[idx])) { return false; }
69  }
70 
71  return true;
72  } else {
73  return false;
74  }
75  }
std::vector< EdgeCode *> codes
The vector containing the EdgeCode composing this DFSCode.
Definition: DFSCode.h:90

◆ validNeighbors()

bool gum::prm::gspan::DFSCode::validNeighbors ( EdgeCode e1,
EdgeCode e2 
)
inlinestatic

Returns true of e2 is a valid neighbor for e1 (i.e.

it respect the neighborhood restriction) if e1 precedes e2 in a DFSCode.

Parameters
e1An EdgeCode.
e2Another EdgeCode.
Returns
Returns true of e2 is a valid neighbor for e1 (i.e. it respect the neighborhood restriction) if e1 precedes e2 in a DFSCode.

Definition at line 142 of file DFSCode.h.

References gum::prm::gspan::EdgeCode::i, gum::prm::gspan::EdgeCode::isBackward(), gum::prm::gspan::EdgeCode::isForward(), and gum::prm::gspan::EdgeCode::j.

Referenced by gum::prm::gspan::Pattern::addArc().

142  {
143  if (e1->isBackward()) {
144  if (e2->isForward()) {
145  return (e2->i <= e1->i) && (e2->j = (e1->i + 1));
146  } else {
147  return (e2->i == e1->i) && (e1->j < e2->j);
148  }
149  } else {
150  // e1 is a forward edge
151  if (e2->isForward()) {
152  return (e2->i <= e1->j) && (e2->j == (e1->j + 1));
153  } else {
154  return (e2->i == e1->j) && (e2->j < e1->i);
155  }
156  }
157  }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Member Data Documentation

◆ codes


The documentation for this class was generated from the following files: