16 #include "../Descriptor.h"
17 #include "../Digraph.h"
18 #include "../CIPMol.h"
25 namespace CIPLabeler {
33 static int parity4(
const std::vector<T> &trg,
const std::vector<T> &ref) {
34 if (ref.size() != 4 || trg.size() != ref.size()) {
35 throw std::runtime_error(
"Parity vectors must have size 4.");
38 if (ref[0] == trg[0]) {
39 if (ref[1] == trg[1]) {
41 if (ref[2] == trg[2] && ref[3] == trg[3])
44 if (ref[2] == trg[3] && ref[3] == trg[2])
46 }
else if (ref[1] == trg[2]) {
48 if (ref[2] == trg[1] && ref[3] == trg[3])
51 if (ref[2] == trg[3] && ref[3] == trg[1])
53 }
else if (ref[1] == trg[3]) {
55 if (ref[2] == trg[2] && ref[3] == trg[1])
58 if (ref[2] == trg[1] && ref[3] == trg[2])
61 }
else if (ref[0] == trg[1]) {
62 if (ref[1] == trg[0]) {
64 if (ref[2] == trg[2] && ref[3] == trg[3])
67 if (ref[2] == trg[3] && ref[3] == trg[2])
69 }
else if (ref[1] == trg[2]) {
71 if (ref[2] == trg[0] && ref[3] == trg[3])
74 if (ref[2] == trg[3] && ref[3] == trg[0])
76 }
else if (ref[1] == trg[3]) {
78 if (ref[2] == trg[2] && ref[3] == trg[0])
81 if (ref[2] == trg[0] && ref[3] == trg[2])
84 }
else if (ref[0] == trg[2]) {
85 if (ref[1] == trg[1]) {
87 if (ref[2] == trg[0] && ref[3] == trg[3])
90 if (ref[2] == trg[3] && ref[3] == trg[0])
92 }
else if (ref[1] == trg[0]) {
94 if (ref[2] == trg[1] && ref[3] == trg[3])
97 if (ref[2] == trg[3] && ref[3] == trg[1])
99 }
else if (ref[1] == trg[3]) {
101 if (ref[2] == trg[0] && ref[3] == trg[1])
104 if (ref[2] == trg[1] && ref[3] == trg[0])
107 }
else if (ref[0] == trg[3]) {
108 if (ref[1] == trg[1]) {
110 if (ref[2] == trg[2] && ref[3] == trg[0])
113 if (ref[2] == trg[0] && ref[3] == trg[2])
115 }
else if (ref[1] == trg[2]) {
117 if (ref[2] == trg[1] && ref[3] == trg[0])
120 if (ref[2] == trg[0] && ref[3] == trg[1])
122 }
else if (ref[1] == trg[0]) {
124 if (ref[2] == trg[2] && ref[3] == trg[1])
127 if (ref[2] == trg[1] && ref[3] == trg[2])
174 std::vector<Atom *> d_foci;
182 std::vector<Atom *> d_carriers;
The class for representing atoms.
void setCarriers(std::vector< Atom * > &&carriers)
virtual Descriptor label(Node *node, Digraph &digraph, const Rules &comp)
Edge * findInternalEdge(const std::vector< Edge * > &edges, Atom *f1, Atom *f2)
virtual void setPrimaryLabel(Descriptor desc)=0
void removeInternalEdges(std::vector< Edge * > &edges, Atom *f1, Atom *f2)
const std::vector< Atom * > & getFoci() const
bool isInternalEdge(const Edge *edge, Atom *f1, Atom *f2)
Configuration(const CIPMol &mol, Atom *focus)
virtual Descriptor label(const Rules &comp)=0
Configuration(const CIPMol &mol, std::vector< Atom * > &&foci)
const std::vector< Atom * > & getCarriers() const
static int parity4(const std::vector< T > &trg, const std::vector< T > &ref)