5 # define F77_NAME(name) name ## _
7 # define F77_NAME(name) name
13 void F77_NAME(
dsaupd)(
int *ido,
char *bmat,
int *n,
char *which,
int *nev,
14 double *tol,
double *resid,
int *ncv,
double *V,
15 int *ldv,
int *iparam,
int *ipntr,
double *workd,
16 double *workl,
int *lworkl,
int *info);
18 void F77_NAME(
dseupd)(
int *rvec,
char *HowMny,
int *select,
double *d,
19 double *Z,
int *ldz,
double *sigma,
char *bmat,
int *n,
20 char *which,
int *nev,
double *tol,
double *resid,
21 int *ncv,
double *V,
int *ldv,
int *iparam,
int *ipntr,
22 double *workd,
double *workl,
int *lworkl,
int *info);
30 int minval =
MIN(i, j);
31 int maxval =
MAX(i, j);
33 edge_weights(maxval) += 1;
38 if (motif_lc ==
"m1") {
return M1; }
39 else if (motif_lc ==
"m2") {
return M2; }
40 else if (motif_lc ==
"m3") {
return M3; }
41 else if (motif_lc ==
"m4") {
return M4; }
42 else if (motif_lc ==
"m5") {
return M5; }
43 else if (motif_lc ==
"m6") {
return M6; }
44 else if (motif_lc ==
"m7") {
return M7; }
45 else if (motif_lc ==
"m8") {
return M8; }
46 else if (motif_lc ==
"m9") {
return M9; }
47 else if (motif_lc ==
"m10") {
return M10; }
48 else if (motif_lc ==
"m11") {
return M11; }
49 else if (motif_lc ==
"m12") {
return M12; }
50 else if (motif_lc ==
"m13") {
return M13; }
51 else if (motif_lc ==
"bifan") {
return bifan; }
52 else if (motif_lc ==
"bi-fan") {
return bifan; }
53 else if (motif_lc ==
"triangle") {
return triangle; }
54 else if (motif_lc ==
"clique3") {
return clique3; }
55 else if (motif_lc ==
"clique4") {
return clique4; }
56 else if (motif_lc ==
"clique5") {
return clique5; }
57 else if (motif_lc ==
"clique6") {
return clique6; }
58 else if (motif_lc ==
"clique7") {
return clique7; }
59 else if (motif_lc ==
"clique8") {
return clique8; }
60 else if (motif_lc ==
"clique9") {
return clique9; }
61 else if (motif_lc ==
"semiclique") {
return semiclique; }
62 else if (motif_lc ==
"semi-clique") {
return semiclique; }
63 else if (motif_lc ==
"edge") {
return edge; }
64 else if (motif_lc ==
"undir") {
return edge; }
65 else if (motif_lc ==
"undirected") {
return edge; }
188 int max_nodes = graph->
GetMxNId() + 1;
194 int src = NI.GetId();
195 int num_nbrs = NI.GetOutDeg();
197 for (
int i = 0; i < NI.GetInDeg(); ++i) {
198 int dst = NI.GetInNId(i);
199 if (!NI.IsOutNId(dst)) {
207 order =
TIntV(max_nodes);
208 for (
int i = 0; i < order.
Len(); ++i) {
209 order[degrees[i].Dat] = i;
218 int src = NI.GetId();
219 int src_pos = order[src];
222 TIntV neighbors_higher;
223 for (
int i = 0; i < NI.GetOutDeg(); i++) {
224 int nbr = NI.GetOutNId(i);
225 if (order[nbr] > src_pos) {
226 neighbors_higher.
Add(nbr);
229 for (
int i = 0; i < NI.GetInDeg(); i++) {
230 int nbr = NI.GetInNId(i);
231 if (!NI.IsOutNId(nbr) && order[nbr] > src_pos) {
232 neighbors_higher.
Add(nbr);
236 for (
int ind1 = 0; ind1 < neighbors_higher.
Len(); ind1++) {
237 for (
int ind2 = ind1 + 1; ind2 < neighbors_higher.
Len(); ind2++) {
238 int dst1 = neighbors_higher[ind1];
239 int dst2 = neighbors_higher[ind2];
241 if (graph->
IsEdge(dst1, dst2) || graph->
IsEdge(dst2, dst1)) {
242 bool motif_occurs =
false;
245 motif_occurs =
IsMotifM1(graph, src, dst1, dst2);
248 motif_occurs =
IsMotifM2(graph, src, dst1, dst2);
251 motif_occurs =
IsMotifM3(graph, src, dst1, dst2);
254 motif_occurs =
IsMotifM4(graph, src, dst1, dst2);
257 motif_occurs =
IsMotifM5(graph, src, dst1, dst2);
260 motif_occurs =
IsMotifM6(graph, src, dst1, dst2);
263 motif_occurs =
IsMotifM7(graph, src, dst1, dst2);
285 int center = NI.GetId();
289 for (
int i = 0; i < NI.GetOutDeg(); i++) {
290 int nbr = NI.GetOutNId(i);
293 for (
int i = 0; i < NI.GetInDeg(); i++) {
294 int nbr = NI.GetInNId(i);
295 if (!NI.IsOutNId(nbr)) {
300 for (
int ind1 = 0; ind1 < neighbors.
Len(); ind1++) {
301 for (
int ind2 = ind1 + 1; ind2 < neighbors.
Len(); ind2++) {
302 int dst1 = neighbors[ind1];
303 int dst2 = neighbors[ind2];
304 bool motif_occurs =
false;
307 motif_occurs =
IsMotifM8(graph, center, dst1, dst2);
310 motif_occurs =
IsMotifM9(graph, center, dst1, dst2);
313 motif_occurs =
IsMotifM10(graph, center, dst1, dst2);
316 motif_occurs =
IsMotifM11(graph, center, dst1, dst2);
319 motif_occurs =
IsMotifM12(graph, center, dst1, dst2);
322 motif_occurs =
IsMotifM13(graph, center, dst1, dst2);
347 node_ids.
Add(NI.GetId());
349 for (
int i = 0; i < node_ids.
Len(); i++) {
350 for (
int j = i + 1; j < node_ids.
Len(); j++) {
351 int src1 = node_ids[i];
352 int src2 = node_ids[j];
357 for (
int k = 0; k < NI1.
GetOutDeg(); k++) {
360 nbr_counts(nbr) += 1;
366 for (
int k = 0; k < NI2.
GetOutDeg(); k++) {
369 nbr_counts(nbr) += 1;
376 it < nbr_counts.
EndI(); it++) {
383 for (
int ind1 = 0; ind1 < common.
Len(); ind1++) {
384 for (
int ind2 = (ind1 + 1); ind2 < common.
Len(); ind2++) {
385 int dst1 = common[ind1];
386 int dst2 = common[ind2];
407 int src = NI.GetId();
408 for (
int j = 0; j < NI.GetDeg(); j++) {
409 int dst = NI.GetNbrNId(j);
410 if (dst <= src) {
continue; }
415 for (
int k = 0; k < dst_NI.
GetOutDeg(); k++) {
417 if (nbr != src && nbr != dst && NI.IsNbrNId(nbr)) {
422 for (
int k = 0; k < common.
Len(); k++) {
423 for (
int l = k + 1; l < common.
Len(); l++) {
424 int nbr1 = common[k];
425 int nbr2 = common[l];
426 if (!graph->
IsEdge(nbr1, nbr2)) {
445 int src = it.GetSrcNId();
446 int dst = it.GetDstNId();
451 if (!graph->
IsEdge(dst, src) || src < dst) {
459 int src = it.GetSrcNId();
460 int dst = it.GetDstNId();
506 cnw.
Run(clique_size);
557 for (
int i = 0; i <= max_nodes; i++) {
566 for (
int i = 0; i < k + 2; ++i) {
573 for (
int src = 0; src < N; src++) {
575 int deg = src_it.
GetDeg();
576 graph_k[src] =
TIntV(deg);
579 graph_k[src][
edge] = dst;
587 for (
int i = 0; i < U.
Len(); i++) {
597 for (
int i = 0; i < U.
Len(); i++) {
599 int size =
graph_[k][node].Len();
606 degs.
Trunc(end_size);
610 order =
TIntV(degs.Len());
611 for (
int i = 0; i < degs.Len(); i++) {
612 order[i] = degs[i].Dat;
617 for (
int i = 0; i < clique.
Len(); ++i) {
618 for (
int j = i + 1; j < clique.
Len(); ++j) {
625 for (
int i = 0; i < U.
Len(); i++) {
628 for (
int j = 0; j < nbrs.
Len(); j++) {
635 for (
int k = 0; k <
C_.
Len(); k++) {
636 clique[k + 2] =
C_[k];
645 for (
int i = 0; i < Up.
Len(); i++) {
649 TIntV nbrs_klast_new;
650 for (
int j = 0; j < nbrs_klast.
Len(); j++) {
651 int nbr = nbrs_klast[j];
655 nbrs_klast_new.
Add(nbr);
658 graph_[klast][node] = nbrs_klast_new;
672 for (
int i = 0; i < order.
Len(); i++) {
678 for (
int j = 0; j < U_prime.
Len(); j++) {
689 for (
int j = 0; j < U_prime.
Len(); j++) {
718 double tol,
int maxiter) {
736 for (
int i = 0; i < d.
Len(); i++) {
747 for (
int j = 0; j < N; j++) {
750 for (
int ind = 0; ind < W_col.
Len(); ind++) {
751 int i = W_col[ind].Key;
752 double val = W_col[ind].Dat;
762 fvec = evecs.
ColV[1];
763 for (
int i = 0; i < fvec.
Len(); i++) {
774 for (
int i = 0; i < weights.
Len(); i++) {
775 num_edges += weights[i].
Len();
778 for (
int i = 0; i < weights.
Len(); i++) {
781 for (
int i = 0; i < weights.
Len(); i++) {
785 graph->AddEdge(i, it->Key);
800 for (
int i = 0; i < ids.
Len(); i++) {
802 if (id_map.
IsKey(
id)) {
818 for (
int i = 0; i < fvec.
Len(); i++) {
824 for (
int i = 0; i < fvec.
Len(); i++) {
825 order[i] = fvec_inds[i].Dat;
833 double total_vol = 0;
834 for (
int ind = 0; ind < order.
Len(); ind++) {
838 total_vol += it->Dat;
841 double vol_comp = total_vol;
843 for (
int ind = 0; ind < order.
Len() - 1; ind++) {
844 int node = order[ind];
849 if (node == nbr) {
continue; }
850 double val = it->Dat;
852 if (rank[nbr] > ind) {
863 double mvol =
MIN(vol, vol_comp);
867 conds[ind] = cut / mvol;
872 double tol,
int maxiter) {
877 int max_wcc_size = 0;
878 int max_wcc_ind = -1;
879 for (
int i = 0; i < components.
Len(); i++) {
880 int size = components[i].
Len();
881 if (size > max_wcc_size) {
886 TCnCom comp = components[max_wcc_ind];
888 if (comp.
Len() == 1) {
889 printf(
"WARNING: No non-trivial connected components "
890 "(likely due to no instances of the motif)\n");
903 for (
int ind1 = 0; ind1 < comp.
Len(); ++ind1) {
904 int c_ind = comp[ind1];
906 int i_ind = id_map(c_ind);
913 int j_ind = id_map(ind2);
916 matrix_entries[j_ind].Add(
TIntFltKd(i_ind, val));
928 Sweep(W, fvec, conds, order);
932 double min_cond = 2.0;
934 for (
int i = 0; i < conds.
Len(); i++) {
935 double cond = conds[i];
936 if (cond < min_cond) {
941 sweepcut.
cond = min_cond;
944 int end = min_ind + 1;
945 if (end >= conds.
Len() / 2) {
947 end = conds.
Len() + 1;
949 for (
int i = start; i < end; i++) {
950 cluster.
Add(rev_id_map[order[i]]);
968 double *resid =
new double[n];
970 int ncv =
MIN(
MAX(2 * nev, 20), n - 1);
972 double *V =
new double[ncv * n];
977 int *iparam =
new int[11];
985 int *ipntr =
new int[11];
987 double *workd =
new double[3 * n];
989 int lworkl = ncv * (ncv + 8);
990 double *workl =
new double[lworkl];
997 F77_NAME(
dsaupd)(&ido, &bmat, &n, &which[0], &nev, &tol, &resid[0], &ncv,
998 &V[0], &ldv, &iparam[0], &ipntr[0], &workd[0], &workl[0],
1002 double *load = &workd[ipntr[0] - 1];
1003 for (
int i = 0; i < n; i++) {
1004 result[i] = load[i];
1010 double *store = &workd[ipntr[1] - 1];
1011 for (
int i = 0; i < n; i++) {
1014 }
else if (ido == 99) {
1030 int *select =
new int[ncv];
1032 double *d =
new double[nev];
1036 F77_NAME(
dseupd)(&rvec, &howmny, select, &d[0], &V[0], &ldv, &sigmar, &bmat,
1037 &n, &which[0], &nev, &tol, &resid[0], &ncv, &V[0], &ldv,
1038 &iparam[0], &ipntr[0], &workd[0], &workl[0], &lworkl, &info);
1045 for (
int i = 0; i < nev; i++) {
1052 for (
int i = 0; i < nev; i++) {
1053 double eval = d_inds[i].Key;
1054 int ind = d_inds[i].Dat;
1057 for (
int j = ind * n; j < ind * n + n; j++) {
void F77_NAME() dsaupd(int *ido, char *bmat, int *n, char *which, int *nev, double *tol, double *resid, int *ncv, double *V, int *ldv, int *iparam, int *ipntr, double *workd, double *workl, int *lworkl, int *info)
void AdjustLabels(int kcurr, int klast, const TIntV &U)
Edge iterator. Only forward iteration (operator++) is supported.
static bool IsMotifM12(PNGraph graph, int center, int v, int w)
TIter EndI() const
Returns an iterator referring to the past-the-end element in the vector.
void FlushCliques(const TIntV &U)
TNodeI BegNI() const
Returns an iterator referring to the first node in the graph.
TEdgeI EndEI() const
Returns an iterator referring to the past-the-end edge in the graph.
static MotifType ParseMotifType(const TStr &motif)
static bool IsMotifM10(PNGraph graph, int center, int v, int w)
static bool IsMotifM2(PNGraph graph, int u, int v, int w)
static bool IsMotifM7(PNGraph graph, int u, int v, int w)
TNodeI GetNI(const int &NId) const
Returns an iterator referring to the node of ID NId in the graph.
static bool IsMotifM4(PNGraph graph, int u, int v, int w)
TEdgeI EndEI() const
Returns an iterator referring to the past-the-end edge in the graph.
int GetMxNId() const
Returns an ID that is larger than any node ID in the graph.
int AddNode(int NId=-1)
Adds a node of ID NId to the graph.
TSizeTy Len() const
Returns the number of elements in the vector.
TKeyDat< TInt, TFlt > TIntFltKd
Node iterator. Only forward iteration (operator++) is supported.
TEdgeI BegEI() const
Returns an iterator referring to the first edge in the graph.
static double Sqrt(const double &x)
static bool IsMotifM11(PNGraph graph, int center, int v, int w)
int GetNodes() const
Returns the number of nodes in the graph.
static void Normalize(TFltV &x)
static bool IsMotifM1(PNGraph graph, int u, int v, int w)
int GetDeg() const
Returns degree of the current node.
void SubgraphDegreeOrder(int k, const TIntV &U, TIntV &order)
static bool IsBidirEdge(PNGraph graph, int u, int v)
static bool IsMotifM13(PNGraph graph, int center, int v, int w)
static bool IsMotifM3(PNGraph graph, int u, int v, int w)
int GetOutDeg() const
Returns out-degree of the current node (returns same as value GetDeg() since the graph is undirected)...
void Clr(const bool &DoDel=true, const TSizeTy &NoDelLim=-1)
Clears the contents of the vector.
void Sort(const bool &Asc=true)
Sorts the elements of the vector.
Edge iterator. Only forward iteration (operator++) is supported.
static void Throw(const TStr &MsgStr)
void UpdateWeights(const TIntV &clique)
void PutAll(const TVal &Val)
Sets all elements of the vector to value Val.
bool IsEdge(const int &SrcNId, const int &DstNId, const bool &IsDir=true) const
Tests whether an edge from node IDs SrcNId to DstNId exists in the graph.
TNodeI GetNI(const int &NId) const
Returns an iterator referring to the node of ID NId in the graph.
static PUNGraph UnweightedGraphRepresentation(const WeightVH &weights)
bool IsNIdIn(const int &NId) const
TEdgeI BegEI() const
Returns an iterator referring to the first edge in the graph.
static void SpectralCut(const WeightVH &weights, TSweepCut &sweepcut, double tol=kDefaultTol, int maxiter=kMaxIter)
static PUNGraph New()
Static constructor that returns a pointer to the graph. Call: PUNGraph Graph = TUNGraph::New().
void SymeigsSmallest(const TSparseColMatrix &A, int nev, TFltV &evals, TFullColMatrix &evecs, double tol, int maxiter)
TVec< THash< TInt, TFlt > > WeightVH
TVec< TIntFltKdV > ColSpVV
static void IncrementWeight(int i, int j, WeightVH &weights)
static void MotifAdjacency(PNGraph graph, MotifType motif, WeightVH &weights)
static void WedgeMotifAdjacency(PNGraph graph, MotifType motif, WeightVH &weights)
void CliqueEnum(int k, const TIntV &U)
static void BifanMotifAdjacency(PNGraph graph, WeightVH &weights)
static bool IsMotifM9(PNGraph graph, int center, int v, int w)
int GetMxNId() const
Returns an ID that is larger than any node ID in the graph.
TVal * TIter
Random access iterator to TVal.
static bool IsMotifM6(PNGraph graph, int u, int v, int w)
static void TriangleMotifAdjacency(PNGraph graph, MotifType motif, WeightVH &weights)
void Multiply(const TFltVV &B, int ColId, TFltV &Result) const
static bool IsUnidirEdge(PNGraph graph, int u, int v)
TNodeI EndNI() const
Returns an iterator referring to the past-the-end node in the graph.
static void DegreeOrdering(PNGraph graph, TIntV &order)
PGraph GetKCore(const PGraph &Graph, const int &K)
int GetOutDeg() const
Returns out-degree of the current node.
TIter BegI() const
Returns an iterator pointing to the first element in the vector.
TVec< TVec< TIntV > > graph_
static double NFiedlerVector(const TSparseColMatrix &W, TFltV &fvec, double tol=kDefaultTol, int maxiter=kMaxIter)
void F77_NAME() dseupd(int *rvec, char *HowMny, int *select, double *d, double *Z, int *ldz, double *sigma, char *bmat, int *n, char *which, int *nev, double *tol, double *resid, int *ncv, double *V, int *ldv, int *iparam, int *ipntr, double *workd, double *workl, int *lworkl, int *info)
Node iterator. Only forward iteration (operator++) is supported.
TNodeI EndNI() const
Returns an iterator referring to the past-the-end node in the graph.
static void MapIdsToFirstN(const TIntV &ids, THash< TInt, TInt > &id_map, TIntV &rev_id_map)
int GetNbrNId(const int &NodeN) const
Returns ID of NodeN-th neighboring node.
bool IsNode(const int &NId) const
Tests whether ID NId is a node.
static void Sweep(const TSparseColMatrix &W, const TFltV &fvec, TFltV &conds, TIntV &order)
static bool IsMotifM5(PNGraph graph, int u, int v, int w)
static bool IsMotifM8(PNGraph graph, int center, int v, int w)
static void SemicliqueMotifAdjacency(PUNGraph graph, WeightVH &weights)
bool IsEdge(const int &SrcNId, const int &DstNId) const
Tests whether an edge between node IDs SrcNId and DstNId exists in the graph.
bool IsKey(const TKey &Key) const
TSizeTy Add()
Adds a new element at the end of the vector, after its current last element.
TNodeI BegNI() const
Returns an iterator referring to the first node in the graph.
void DelSelfEdges(const PGraph &Graph)
Removes all the self-edges from the graph.
void DelLast()
Removes the last element of the vector.
void Trunc(const TSizeTy &_Vals=-1)
Truncates the vector's length and capacity to _Vals elements.
static void CliqueMotifAdjacency(PUNGraph graph, int clique_size, WeightVH &weights)
void GetWccs(const PGraph &Graph, TCnComV &CnComV)
Returns all weakly connected components in a Graph.
int GetOutNId(const int &NodeN) const
Returns ID of NodeN-th out-node (the node the current node points to).
static bool IsNoEdge(PNGraph graph, int u, int v)
static void GetMotifCluster(PNGraph graph, MotifType motif, TSweepCut &sweepcut, double tol=kDefaultTol, int maxiter=kMaxIter)
static void EdgeMotifAdjacency(PNGraph graph, WeightVH &weights)