7     printf(
"%d: [", HI.GetKey()());
 
    9     for (
int i = 0; i < Feature.
Len(); ++i) {
 
   13       printf(
"%f", Feature[i]());
 
   43     NthFeature.
Add(HI.GetDat()[N]);
 
   51   printf(
"finish neighborhood features\n");
 
   53   printf(
"finish recursive features\n");
 
   59   printf(
"finish local features\n");
 
   61   printf(
"finish egonet features\n");
 
   65   int SimilarityThreshold = 0;
 
   66   TIntFtrH RetainedFeatures = Features;
 
   75     ++SimilarityThreshold;
 
   76     printf(
"recursion %d: ", SimilarityThreshold);
 
   83     Features.
GetDat(
TInt(NI.GetId())).Add(NI.GetInDeg());
 
   92     Features.
GetDat(NId).Add(Egonet->GetEdges());
 
   93     Features.
GetDat(NId).Add(ArndEdges);
 
  100   if (0 == NumCurrFeatures) {
 
  104   for (
int i = 0; i < NumCurrFeatures; ++i) {
 
  107       for (
int j = 0; j < NI.GetInDeg(); ++j) {
 
  108         int NbrNId = NI.GetInNId(j);
 
  109         Sum += CurrFeatures.
GetDat(NbrNId)[i]();
 
  111       NewFeatures.
GetDat(NI.GetId()).Add(Sum);
 
  112       NewFeatures.
GetDat(NI.GetId()).Add(0 == NI.GetInDeg()?
 
  113           0 : (float(Sum) / NI.GetInDeg()));
 
  120     const TIntFtrH& NewFeatures, 
const int SimilarityThreshold) {
 
  124   const float BinFraction = 0.5;
 
  127       SimilarityThreshold);
 
  134       HI < SrcFeatures.
EndI();
 
  138       DstFeatures.
GetDat(HI.GetKey()).Add(Feature[ColIdx]);
 
  140       for (
int i = 0; i < Feature.
Len(); ++i) {
 
  141         DstFeatures.
GetDat(HI.GetKey()).Add(Feature[i]);
 
  148     const float BinFraction) {
 
  151   for (
int i = 0; i < NumFeatures; ++i) {
 
  155   return LogBinFeatures;
 
  159     const int SimilarityThreshold) {
 
  162   for (
int i = 0; i < NumFeatures; ++i) {
 
  163     FeatureGraph->AddNode(i);
 
  165   for (
int i = 0; i < NumFeatures; ++i) {
 
  167     for (
int j = i + 1; j < NumFeatures; ++j) {
 
  170           !FeatureGraph->IsEdge(i, j)) {
 
  171         FeatureGraph->AddEdge(i, j);
 
  183   for (
int i = 0; i < Wcc.
Len(); ++i) {
 
  184     RetainedIdx.
Add(Wcc[i][0]);
 
  190   for (
int i = 0; i < RetainedIdx.
Len(); ++i) {
 
  191     const int IdxNewFeatures = RetainedIdx[i] - StartIdxNewFeatures;
 
  192     if (IdxNewFeatures >= 0) {
 
  196   return RetainedFeatures;
 
  202     F.
AddDat(HI.GetKey(), HI.GetDat()[Idx]);
 
  207     SortedNId.
Add(HI.GetKey());
 
  214   int NumNodes = LogBinFeatures.
Len();
 
  217   while (NumAssigned < NumNodes) {
 
  218     int NumToAssign = ceil(BinFraction * (NumNodes - NumAssigned));
 
  219     for (
int i = NumAssigned; i < NumAssigned + NumToAssign; ++i) {
 
  220       int NId = SortedNId[i];
 
  221       LogBinFeatures.
GetDat(NId).Add(BinValue);
 
  223     NumAssigned += NumToAssign;
 
  229     const int SimilarityThreshold) {
 
  231   for (
int i = 0; i < F1.
Len(); ++i) {
 
  232     if (
TFlt::Abs(F1[i] - F2[i]) > SimilarityThreshold) {
 
  241   const int NumNodes = Features.
Len();
 
  243   TFltVV FeaturesMtx(NumNodes, NumFeatures);
 
  245     int i = 
GetMtxIdx(HI.GetKey(), NodeIdMtxIdxH);
 
  246     for (
int j = 0; j < NumFeatures; ++j) {
 
  247       FeaturesMtx(i, j) = HI.GetDat()[j];
 
  257   for (
int i = 0; i < XDim; ++i) {
 
  259     for (
int j = 0; j < YDim; ++j) {
 
  263       printf(
"%f", Matrix(i, j)());
 
  272   TFltVV Matrix(XDim, YDim);
 
  273   for (
int i = 0; i < XDim; ++i) {
 
  274     for (
int j = 0; j < YDim; ++j) {
 
  275       Matrix(i, j) = (double)Seed / 10007;
 
  276       Seed = (Seed * 1871) % 10007;
 
  288   double Cost = 100, NewCost = 0;
 
  293   TFltVV NewW(NumNodes, NumRoles);
 
  294   TFltVV NewH(NumRoles, NumFeatures);
 
  295   TFltVV Product(NumNodes, NumFeatures);
 
  297   TFltVV *PW = &W, *PH = &H, *PNewW = &NewW, *PNewH = &NewH, *Tmp;
 
  299   while (
TFlt::Abs((NewCost - Cost)/Cost) > Threshold) {
 
  304     for (
int i = 0; i < NumNodes; i++) {
 
  305       for (
int j = 0; j < NumFeatures; j++) {
 
  306         NewCost += V(i, j) * 
TMath::Log(Product(i, j)) - Product(i, j);
 
  310     for (
int i = 0; i < NumNodes; i++) {
 
  311       for (
int a = 0; a < NumRoles; a++) {
 
  313         for (
int u = 0; u < NumFeatures; ++u) {
 
  315             SumU += V(i, u) / Product(i, u) * PH->
At(a, u);
 
  318         PNewW->At(i, a) = PW->
At(i, a) * SumU;
 
  321     for (
int i = 0; i < NumRoles; i++) {
 
  324     for (
int i = 0; i < NumNodes; i++) {
 
  325       for (
int j = 0; j < NumRoles; j++) {
 
  326         Sum[j] += PNewW->At(i, j);
 
  329     for (
int i = 0; i < NumNodes; i++) {
 
  330       for (
int j = 0; j < NumRoles; j++) {
 
  331         PNewW->At(i, j) /= Sum[j];
 
  335     for (
int a = 0; a < NumRoles; a++) {
 
  336       for (
int u = 0; u < NumFeatures; u++) {
 
  338         for (
int i = 0; i < NumNodes; ++i) {
 
  340             SumI += PW->
At(i, a) * V(i, u) / Product(i, u);
 
  343         PNewH->At(a, u) = PH->At(a, u) * SumI;
 
  347     Tmp = PW; PW = PNewW; PNewW = Tmp;
 
  348     Tmp = PH; PH = PNewH; PNewH = Tmp;
 
  359   for (
int i = 0; i < V.
GetXDim(); ++i) {
 
  360     for (
int j = 0; j < V.
GetYDim(); ++j) {
 
  361       TFlt ValueV = V(i, j);
 
  362       TFlt ValueGF = GF(i, j);
 
  366         E += ValueV * 
TMath::Log(ValueV / ValueGF) - ValueV + ValueGF;
 
  377     H.
AddDat(HI.GetKey(), Idx);
 
  384   return NodeIdMtxIdxH.
GetDat(NodeId)();
 
  389       HI < NodeIdMtxIdxH.
EndI();
 
  391     if (HI.GetDat() == MtxId) {
 
  392       return HI.GetKey()();
 
  400   for (
int i = 0; i < G.
GetXDim(); i++) {
 
  403     for (
int j = 0; j < G.
GetYDim(); j ++) {
 
  409     int NodeId = 
GetNodeId(i, NodeIdMtxIdxH);
 
  410     Roles.
AddDat(NodeId, Role);
 
  416   TStr RoleToColor[10] = { 
"white", 
"black", 
"red", 
"green", 
"blue",
 
  417       "yellow", 
"gold", 
"cyan", 
"magenta", 
"brown" };
 
  420     Color.
AddDat(HI.GetKey(), RoleToColor[HI.GetDat()].
CStr());
 
  426   printf(
"--roles (node ID: role ID)--\n");
 
  429     printf(
"(%d: %d)\n", HI.GetKey()(), HI.GetDat()());
 
  436   Fp = fopen(Path.
CStr(), 
"w");
 
  439   for (
int i = 0; i < XDim; ++i) {
 
  440     for (
int j = 0; j < YDim; ++j) {
 
  444       fprintf(Fp, 
"%f", Matrix(i, j)());
 
  453   Fp = fopen(Path.
CStr(), 
"w");
 
  454   fprintf(Fp, 
"# mappings from the feature line numbers to node IDs\n");
 
  455   for (
int i = 0; i < NodeIdMtxIdxH.
Len(); i++) {
 
  456     int NodeId = 
GetNodeId(i, NodeIdMtxIdxH);
 
  457     fprintf(Fp, 
"%d %d\n", i, NodeId);
 
  464   Fp = fopen(Path.
CStr(), 
"w");
 
  465   fprintf(Fp, 
"--roles (node ID role ID)--\n\n");
 
  467     fprintf(Fp, 
"%d\t%d\n", HI.GetKey()(), HI.GetDat()());
 
void DrawGViz(const PGraph &Graph, const TGVizLayout &Layout, const TStr &PltFNm, const TStr &Desc=TStr(), const bool &NodeLabels=false, const TIntStrH &NIdColorH=TIntStrH())
Draws a given Graph using a selected GraphViz Layout engine with nodes colored. 
 
int GetNumFeatures(const TIntFtrH &Features)
Gets number of features from the node-feature mapping. 
 
TIntFtrH SummarizeConnectedComponents(const PUNGraph FeatureGraph, const TIntFtrH &Features, const TIntFtrH &NewFeatures)
Summarizes s-friend graph and return retained features. 
 
void AddLocalFeatures(const PUNGraph Graph, TIntFtrH &Features)
Adds local features to the node-feature mapping. 
 
TSizeTy Len() const 
Returns the number of elements in the vector. 
 
Node iterator. Only forward iteration (operator++) is supported. 
 
TIntIntH FindRoles(const TFltVV &G, const TIntIntH &NodeIdMtxIdxH)
Gets matrix index of the node ID. 
 
void PlotRoles(const PUNGraph Graph, const TIntIntH &Roles)
Plots found roles on a picture (.png). 
 
TIntFtrH CreateEmptyFeatures(const PUNGraph Graph)
Creates an empty node-feature mapping of all nodes in the given graph. 
 
const TDat & GetDat(const TKey &Key) const 
 
void CalcNonNegativeFactorization(const TFltVV &V, const int NumRoles, TFltVV &W, TFltVV &H, const double Threshold)
Performs non-negative factorization V = WH. 2nd dim of W == number of roles. 
 
int GetMtxIdx(const TInt NodeId, const TIntIntH &NodeIdMtxIdxH)
Gets matrix index of the node ID. 
 
TIntFtrH PruneRecursiveFeatures(const PUNGraph Graph, const TIntFtrH &Features, const TIntFtrH &NewFeatures, const int SimilarityThreshold)
Prunes recursive features. 
 
TFltVV ConvertFeatureToMatrix(const TIntFtrH &Features, const TIntIntH &NodeIdMtxIdxH)
Converts node-feature mapping to matrix. (i, j): i-th node, j-th feature. 
 
TIntFtrH ExtractFeatures(const PUNGraph Graph)
Performs feature extraction, the first step of RolX. 
 
const TDat & GetDat() const 
 
void PrintRoles(const TIntIntH &Roles)
Prints found roles on stdout. 
 
void Sort(const bool &Asc=true)
Sorts the elements of the vector. 
 
TFtr GetNthFeature(const TIntFtrH &Features, const int N)
Gets the n-th feature of all nodes. 
 
const TVal & GetDat(const TVal &Val) const 
Returns reference to the first occurrence of element Val. 
 
void AddRecursiveFeatures(const PUNGraph Graph, TIntFtrH &Features)
Adds recursive features to the node-feature mapping. 
 
TIntFtrH GenerateRecursiveFeatures(const PUNGraph Graph, const TIntFtrH &CurrFeatures)
Generates recursive features out of current features. 
 
bool FltIsZero(const TFlt Number)
Whether the float is zero. 
 
void AddNeighborhoodFeatures(const PUNGraph Graph, TIntFtrH &Features)
Adds neighborhood features (local + egonet) to the node-feature mapping. 
 
int GetNodeId(const TInt MtxId, const TIntIntH &NodeIdMtxIdxH)
 
void AssignBinValue(const TVec< TInt > &SortedNId, const float BinFraction, TIntFtrH &LogBinFeatures)
Assigns logarithmic binning value to features. 
 
bool IsSimilarFeature(const TFtr &F1, const TFtr &F2, const int SimilarityThreshold)
Whether the two features are similar, given similarity threshold. 
 
TIntIntH CreateNodeIdMtxIdxHash(const TIntFtrH &Features)
Creates the mapping of . 
 
void PrintMatrix(const TFltVV &Matrix)
Prints feature matrix to stdout. 
 
static void Multiply(const TFltVV &A, const TFltV &x, TFltV &y)
 
static double Abs(const double &Flt)
 
void PrintFeatures(const TIntFtrH &Features)
Prints all nodes' feature. 
 
void FPrintMatrix(const TFltVV &Matrix, const TStr &Path)
Prints feature matrix to file. 
 
TFltVV CreateRandMatrix(const int XDim, const int YDim)
Creates a random matrix with specified dimension. 
 
TFlt CalcDescriptionLength(const TFltVV &V, const TFltVV &G, const TFltVV &F)
Calculates the description length L = M + E. 
 
PUNGraph GetEgonet(const PUNGraph &Graph, const int CtrNId, int &ArndEdges)
Returns the egonet of node CtrNId as center in undirected graph Graph. And returns number of edges ar...
 
void AddEgonetFeatures(const PUNGraph Graph, TIntFtrH &Features)
Adds egonet features to the node-feature mapping. 
 
void FPrintNodeMappings(const TIntIntH &NodeIdMtxIdxH, const TStr &Path)
Prints node mappings to file, feature line -> node ID. 
 
static double Log(const double &Val)
 
TVec< TFlt > TFtr
Feature of a node. 
 
TVec< TInt > GetNIdSorted(const TIntFtrH &Features, const int Idx)
Sorts the Idx-th feature, return the list of corresponding node ID. 
 
void AppendFeatures(TIntFtrH &DstFeatures, const TIntFtrH &SrcFeatures, const int ColIdx)
Appends all src features to dst features. 
 
TSizeTy Add()
Adds a new element at the end of the vector, after its current last element. 
 
void FPrintRoles(const TIntIntH &Roles, const TStr &Path)
Prints found roles to file. 
 
TDat & AddDat(const TKey &Key)
 
void GetWccs(const PGraph &Graph, TCnComV &CnComV)
Returns all weakly connected components in a Graph. 
 
PUNGraph BuildFeatureGraph(const TIntFtrH &LogBinFeatures, const int SimilarityThreshold)
Builds s-friend graph given similarity threshold. 
 
const TVal & At(const TSizeTy &X, const TSizeTy &Y) const 
 
TIntFtrH CalcVerticalLogBinning(const TIntFtrH &Features, const float BinFraction)
Calculates vertical logarithmic binning features from the given features. 
 
void SortByDat(const bool &Asc=true)