namespace tum::device¶
Overview¶
namespace device {
// global variables
int kRowCap = 32;
// global functions
bool bonded(const int* deg, const int* cols, int nAtoms, int kMax, int a, int b);
bool inSix(const int* r, int atom);
bool shareAtoms(const int* a, const int* b);
int commonCount(const int* a, const int* b);
bool commonInThree(const int* a, const int* b, const int* c);
bool shareNeigh(const int* deg, const int* cols, int nAtoms, int kMax, int a, int b);
int hopsAtMost(const int* deg, const int* cols, int nAtoms, int kMax, int a, int b, int cap);
bool hopBoundPrimitiveSix(const int* r, const int* deg, const int* cols, int nAtoms, int kMax);
bool notNeighboursOfRing(const int* deg, const int* cols, int nAtoms, int kMax, const int* trip, const int* ring);
bool basalConditions(const int* deg, const int* cols, int nAtoms, int kMax, const int* b1, const int* b2);
int ringsThrough(const int* A, int nA, const int* B, int nB, const int* C, int nC, int skipA, int skipB, int* out, int cap);
int fetchAdd(int* p);
void enumSixFrom(int i, const int* deg, const int* cols, int nAtoms, int kMax, int maxRings, int* nRings, int* ringAtoms);
void invertOneRing(int r, const int* nRings, const int* ringAtoms, int nAtoms, int maxPer, int* throughCount, int* through);
void sortThroughRow(int* row, int n);
bool seenEarlier(const int* bi, const int* deg, const int* cols, const int* throughCount, const int* through, int nAtoms, int kMax, int maxPer, int slot, int n, int j);
void emitBasalFrom(int i, const int* nRings, const int* ringAtoms, const int* deg, const int* cols, const int* throughCount, const int* through, int nAtoms, int kMax, int maxPer, int maxPairs, int* nPairs, int* pairs);
void applyHcPair(int p, const int* nPairs, const int* pairs, const int* ringAtoms, const int* throughCount, const int* through, int nAtoms, int maxPer, int* hc);
void ddcFrom(int i, const int* nRings, const int* ringAtoms, const int* throughCount, const int* through, const int* hc, int nAtoms, int maxPer, int* ddc);
void atomIceFrom(int r, const int* nRings, const int* ringAtoms, const int* hc, const int* ddc, int nAtoms, int* atomHc, int* atomDdc);
} // namespace device
Detailed Documentation¶
Global Variables¶
int kRowCap = 32
Longest atom row the kernels accept.
Candidate buffers are sized by it and ddcFrom keeps one bit per entry in an unsigned. A liquid atom of a 3.5 A cutoff graph can lie in more than 16 six-rings; a graph with a longer row goes to the host (tum_offload.hpp).
Global Functions¶
int hopsAtMost(const int* deg, const int* cols, int nAtoms, int kMax, int a, int b, int cap)
Graph distance from a to b when it is at most cap, else -1.
cap is 1 or 2: the Franzblau reject bound for a six-ring.
bool hopBoundPrimitiveSix(const int* r, const int* deg, const int* cols, int nAtoms, int kMax)
Hop-bounded Franzblau SP test on a six-cycle of the bond graph.
bool basalConditions(const int* deg, const int* cols, int nAtoms, int kMax, const int* b1, const int* b2)
beta(b1, b2) for rings sharing no atom: some alternating triplet {l_p, l_p+2, l_p+4} of b1 bonds one-to-one onto an alternating triplet {m_q, m_q+2, m_q+4} of b2, and no other atom of b2 is bonded to b1.
All 2 x 2 x 6 alignments are tried, so rotation, direction and ring order do not matter.
void enumSixFrom(int i, const int* deg, const int* cols, int nAtoms, int kMax, int maxRings, int* nRings, int* ringAtoms)
Enumerate hop-bound primitive six-rings whose lowest vertex is i.
nRings counts every ring found; only the first maxRings are stored.
void invertOneRing(int r, const int* nRings, const int* ringAtoms, int nAtoms, int maxPer, int* throughCount, int* through)
throughCount counts every stored ring through the atom; only the first maxPer ids are kept.
bool seenEarlier(const int* bi, const int* deg, const int* cols, const int* throughCount, const int* through, int nAtoms, int kMax, int maxPer, int slot, int n, int j)
True when ring j is in the through row of a bond neighbour of bi[0] or bi[1] visited before (slot, n), so each candidate is tested once.
void emitBasalFrom(int i, const int* nRings, const int* ringAtoms, const int* deg, const int* cols, const int* throughCount, const int* through, int nAtoms, int kMax, int maxPer, int maxPairs, int* nPairs, int* pairs)
Ordered basal pairs (i, j).
Every pair passing beta has a bond from bi[0] or bi[1] into bj, so the neighbours of those two atoms reach every candidate.
void ddcFrom(int i, const int* nRings, const int* ringAtoms, const int* throughCount, const int* through, const int* hc, int nAtoms, int maxPer, int* ddc)
epsilon(i) for a ring that is not HC, as ring::equatorialConditions : every atom in 3 other rings, and pairwise distinct P_k in T_k with P_0, P_2, P_4 sharing an atom, P_1, P_3, P_5 sharing an atom and, for some starting atom and direction of i, the alternate pairs sharing 3 atoms.
On a pass marks i and every P_k of every valid assignment.