18 template <
class PGraph> PGraph
LoadEdgeList(
const TStr& InFNm,
const int& SrcColId=0,
const int& DstColId=1);
20 template <
class PGraph> PGraph
LoadEdgeList(
const TStr& InFNm,
const int& SrcColId,
const int& DstColId,
const char& Separator);
24 template <
class PGraph> PGraph
LoadEdgeListStr(
const TStr& InFNm,
const int& SrcColId=0,
const int& DstColId=1);
52 template <
class PGraph>
void SavePajek(
const PGraph& Graph,
const TStr& OutFNm);
54 template <
class PGraph>
void SavePajek(
const PGraph& Graph,
const TStr& OutFNm,
const TIntStrH& NIdColorH);
70 template<
class PGraph>
void SaveGViz(
const PGraph& Graph,
const TStr& OutFNm,
const TStr& Desc,
const TIntStrH& NIdLabelH);
83 template <
class PGraph>
86 PGraph Graph = PGraph::TObj::New();
89 if (! Ss.
GetInt(SrcColId, SrcNId) || ! Ss.
GetInt(DstColId, DstNId)) {
continue; }
90 if (! Graph->IsNode(SrcNId)) { Graph->AddNode(SrcNId); }
91 if (! Graph->IsNode(DstNId)) { Graph->AddNode(DstNId); }
92 Graph->AddEdge(SrcNId, DstNId);
103 template <
class PGraph>
104 PGraph
LoadEdgeList(
const TStr& InFNm,
const int& SrcColId,
const int& DstColId,
const char& Separator) {
106 PGraph Graph = PGraph::TObj::New();
109 if (! Ss.
GetInt(SrcColId, SrcNId) || ! Ss.
GetInt(DstColId, DstNId)) {
continue; }
110 if (! Graph->IsNode(SrcNId)) { Graph->AddNode(SrcNId); }
111 if (! Graph->IsNode(DstNId)) { Graph->AddNode(DstNId); }
112 Graph->AddEdge(SrcNId, DstNId);
124 template <
class PGraph>
127 PGraph Graph = PGraph::TObj::New();
130 const int SrcNId = StrToNIdH.
AddKey(Ss[SrcColId]);
131 const int DstNId = StrToNIdH.
AddKey(Ss[DstColId]);
132 if (! Graph->IsNode(SrcNId)) { Graph->AddNode(SrcNId); }
133 if (! Graph->IsNode(DstNId)) { Graph->AddNode(DstNId); }
134 Graph->AddEdge(SrcNId, DstNId);
147 template <
class PGraph>
150 PGraph Graph = PGraph::TObj::New();
152 const int SrcNId = StrToNIdH.
AddKey(Ss[SrcColId]);
153 const int DstNId = StrToNIdH.
AddKey(Ss[DstColId]);
154 if (! Graph->IsNode(SrcNId)) { Graph->AddNode(SrcNId); }
155 if (! Graph->IsNode(DstNId)) { Graph->AddNode(DstNId); }
156 Graph->AddEdge(SrcNId, DstNId);
167 template <
class PGraph>
170 PGraph Graph = PGraph::TObj::New();
172 if (! Ss.
IsInt(0)) {
continue; }
173 const int SrcNId = Ss.
GetInt(0);
174 if (! Graph->IsNode(SrcNId)) { Graph->AddNode(SrcNId); }
175 for (
int dst = 1; dst < Ss.
Len(); dst++) {
176 const int DstNId = Ss.
GetInt(dst);
177 if (! Graph->IsNode(DstNId)) { Graph->AddNode(DstNId); }
178 Graph->AddEdge(SrcNId, DstNId);
191 template <
class PGraph>
194 PGraph Graph = PGraph::TObj::New();
196 const int SrcNId = StrToNIdH.
AddDatId(Ss[0]);
197 if (! Graph->IsNode(SrcNId)) { Graph->AddNode(SrcNId); }
198 for (
int dst = 1; dst < Ss.
Len(); dst++) {
199 const int DstNId = StrToNIdH.
AddDatId(Ss[dst]);
200 if (! Graph->IsNode(DstNId)) { Graph->AddNode(DstNId); }
201 Graph->AddEdge(SrcNId, DstNId);
208 template <
class PGraph>
210 PGraph Graph = PGraph::TObj::New();
212 while ((Ss.
Len()==0 || strstr(Ss[0],
"*vertices") == NULL) && ! Ss.
Eof()) {
215 bool EdgeList =
true;
216 EAssert(strstr(Ss[0],
"*vertices") != NULL);
219 if (Ss.
Len()>0 && Ss[0][0] ==
'%') {
continue; }
220 if (strstr(Ss[0],
"*arcslist")!=NULL || strstr(Ss[0],
"*edgeslist")!=NULL) { EdgeList=
false;
break; }
221 if (strstr(Ss[0],
"*arcs")!=NULL || strstr(Ss[0],
"*edges")!=NULL) {
break; }
222 Graph->AddNode(Ss.
GetInt(0));
226 if (Ss.
Len()>0 && Ss[0][0] ==
'%') {
continue; }
227 if (Ss.
Len()>0 && Ss[0][0] ==
'*') {
break; }
234 const int SrcNId = Ss.
GetInt(0);
235 for (
int i = 1; i < Ss.
Len(); i++) {
236 Graph->AddEdge(SrcNId, Ss.
GetInt(i)); }
242 template <
class PGraph>
244 FILE *F = fopen(OutFNm.
CStr(),
"wt");
246 else { fprintf(F,
"# Undirected graph (each unordered pair of nodes is saved once): %s\n", OutFNm.
CStr()); }
247 if (! Desc.
Empty()) { fprintf(F,
"# %s\n", Desc.
CStr()); }
248 fprintf(F,
"# Nodes: %d Edges: %d\n", Graph->GetNodes(), Graph->GetEdges());
250 else { fprintf(F,
"# NodeId\tNodeId\n"); }
251 for (
typename PGraph::TObj::TEdgeI ei = Graph->BegEI(); ei < Graph->EndEI(); ei++) {
252 fprintf(F,
"%d\t%d\n", ei.GetSrcNId(), ei.GetDstNId());
257 template <
class PGraph>
259 TIntH NIdToIdH(Graph->GetNodes(),
true);
260 FILE *F = fopen(OutFNm.
CStr(),
"wt");
261 fprintf(F,
"*Vertices %d\n", Graph->GetNodes());
263 for (
typename PGraph::TObj::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++, i++) {
264 fprintf(F,
"%d \"%d\" ic Red fos 10\n", i+1, NI.GetId());
265 NIdToIdH.
AddDat(NI.GetId(), i+1);
268 fprintf(F,
"*Arcs %d\n", Graph->GetEdges()); }
270 fprintf(F,
"*Edges %d\n", Graph->GetEdges());
272 for (
typename PGraph::TObj::TEdgeI EI = Graph->BegEI(); EI < Graph->EndEI(); EI++) {
273 const int SrcNId = NIdToIdH.GetDat(EI.GetSrcNId());
274 const int DstNId = NIdToIdH.GetDat(EI.GetDstNId());
275 fprintf(F,
"%d %d %d c Black\n", SrcNId, DstNId, 1);
282 template <
class PGraph>
284 TIntH NIdToIdH(Graph->GetNodes(),
true);
285 FILE *F = fopen(OutFNm.
CStr(),
"wt");
286 fprintf(F,
"*Vertices %d\n", Graph->GetNodes());
288 for (
typename PGraph::TObj::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++, i++) {
289 fprintf(F,
"%d \"%d\" ic %s fos 10\n", i+1, NI.GetId(),
290 NIdColorH.
IsKey(NI.GetId()) ? NIdColorH.
GetDat(NI.GetId()).CStr() :
"Red");
291 NIdToIdH.
AddDat(NI.GetId(), i+1);
294 fprintf(F,
"*Arcs %d\n", Graph->GetEdges()); }
296 fprintf(F,
"*Edges %d\n", Graph->GetEdges());
298 for (
typename PGraph::TObj::TEdgeI EI = Graph->BegEI(); EI < Graph->EndEI(); EI++) {
299 const int SrcNId = NIdToIdH.GetDat(EI.GetSrcNId());
300 const int DstNId = NIdToIdH.GetDat(EI.GetDstNId());
301 fprintf(F,
"%d %d %d c Black\n", SrcNId, DstNId, 1);
309 template <
class PGraph>
311 TIntH NIdToIdH(Graph->GetNodes(),
true);
312 FILE *F = fopen(OutFNm.
CStr(),
"wt");
313 fprintf(F,
"*Vertices %d\n", Graph->GetNodes());
315 for (
typename PGraph::TObj::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++, i++) {
316 fprintf(F,
"%d \"%s\" ic %s fos 10\n", i+1,
317 NIdLabelH.
IsKey(NI.GetId()) ? NIdLabelH.
GetDat(NI.GetId()).CStr() :
TStr::Fmt(
"%d", NI.GetId()).CStr(),
318 NIdColorH.
IsKey(NI.GetId()) ? NIdColorH.
GetDat(NI.GetId()).CStr() :
"Red");
319 NIdToIdH.
AddDat(NI.GetId(), i+1);
322 fprintf(F,
"*Arcs %d\n", Graph->GetEdges()); }
324 fprintf(F,
"*Edges %d\n", Graph->GetEdges());
326 for (
typename PGraph::TObj::TEdgeI EI = Graph->BegEI(); EI < Graph->EndEI(); EI++) {
327 const int SrcNId = NIdToIdH.GetDat(EI.GetSrcNId());
328 const int DstNId = NIdToIdH.GetDat(EI.GetDstNId());
329 fprintf(F,
"%d %d %d c Black\n", SrcNId, DstNId, 1);
338 template <
class PGraph>
341 TIntH NIdToIdH(Graph->GetNodes(),
true);
342 FILE *F = fopen(OutFNm.
CStr(),
"wt");
343 fprintf(F,
"*Vertices %d\n", Graph->GetNodes());
345 for (
typename PGraph::TObj::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++, i++) {
346 fprintf(F,
"%d \"%s\" ic %s fos 10\n", i+1,
347 NIdLabelH.
IsKey(NI.GetId()) ? NIdLabelH.
GetDat(NI.GetId()).CStr() :
TStr::Fmt(
"%d", NI.GetId()).CStr(),
348 NIdColorH.
IsKey(NI.GetId()) ? NIdColorH.
GetDat(NI.GetId()).CStr() :
"Red");
349 NIdToIdH.
AddDat(NI.GetId(), i+1);
352 fprintf(F,
"*Arcs %d\n", Graph->GetEdges()); }
354 fprintf(F,
"*Edges %d\n", Graph->GetEdges());
356 for (
typename PGraph::TObj::TEdgeI EI = Graph->BegEI(); EI < Graph->EndEI(); EI++) {
357 const int SrcNId = NIdToIdH.GetDat(EI.GetSrcNId());
358 const int DstNId = NIdToIdH.GetDat(EI.GetDstNId());
359 fprintf(F,
"%d %d 1 c %s\n", SrcNId, DstNId,
360 EIdColorH.
IsKey(EI.GetId()) ? EIdColorH.
GetDat(EI.GetId()).CStr() :
"Black");
366 template <
class PGraph>
368 FILE *F = fopen(OutFNm.
CStr(),
"wt");
369 TIntSet NIdSet(Graph->GetNodes());
370 for (
typename PGraph::TObj::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) {
371 NIdSet.
AddKey(NI.GetId());
373 for (
typename PGraph::TObj::TEdgeI EI = Graph->BegEI(); EI < Graph->EndEI(); EI++) {
374 const int Src = NIdSet.GetKeyId(EI.GetSrcNId())+1;
375 const int Dst = NIdSet.GetKeyId(EI.GetDstNId())+1;
376 fprintf(F,
"%d\t%d\t1\n", Src, Dst);
378 fprintf(F,
"%d\t%d\t1\n", Dst, Src);
384 template<
class PGraph>
387 FILE *F = fopen(OutFNm.
CStr(),
"wt");
388 if (! Desc.
Empty()) fprintf(F,
"/*****\n%s\n*****/\n\n", Desc.
CStr());
389 if (IsDir) { fprintf(F,
"digraph G {\n"); }
else { fprintf(F,
"graph G {\n"); }
390 fprintf(F,
" graph [splines=false overlap=false]\n");
393 fprintf(F,
" node [shape=ellipse, width=0.3, height=0.3%s]\n", NodeLabels?
"":
", label=\"\"");
396 for (
typename PGraph::TObj::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) {
397 if (NIdColorH.
IsKey(NI.GetId())) {
398 fprintf(F,
" %d [style=filled, fillcolor=\"%s\"];\n", NI.GetId(), NIdColorH.
GetDat(NI.GetId()).CStr()); }
400 fprintf(F,
" %d ;\n", NI.GetId());
404 for (
typename PGraph::TObj::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) {
405 if (NI.GetOutDeg()==0 && NI.GetInDeg()==0 && !NIdColorH.
IsKey(NI.GetId())) {
406 fprintf(F,
"%d;\n", NI.GetId()); }
408 for (
int e = 0; e < NI.GetOutDeg(); e++) {
409 if (! IsDir && NI.GetId() > NI.GetOutNId(e)) {
continue; }
410 fprintf(F,
" %d %s %d;\n", NI.GetId(), IsDir?
"->":
"--", NI.GetOutNId(e));
414 if (! Desc.
Empty()) {
415 fprintf(F,
" label = \"\\n%s\\n\";", Desc.
CStr());
416 fprintf(F,
" fontsize=24;\n");
422 template<
class PGraph>
424 const bool IsDir = Graph->HasFlag(
gfDirected);
425 FILE *F = fopen(OutFNm.
CStr(),
"wt");
426 if (! Desc.
Empty()) fprintf(F,
"/*****\n%s\n*****/\n\n", Desc.
CStr());
427 if (IsDir) { fprintf(F,
"digraph G {\n"); }
else { fprintf(F,
"graph G {\n"); }
428 fprintf(F,
" graph [splines=true overlap=false]\n");
429 fprintf(F,
" node [shape=ellipse, width=0.3, height=0.3]\n");
432 for (
typename PGraph::TObj::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) {
433 fprintf(F,
" %d [label=\"%s\"];\n", NI.GetId(), NIdLabelH.
GetDat(NI.GetId()).CStr());
436 for (
typename PGraph::TObj::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) {
437 if (NI.GetOutDeg()==0 && NI.GetInDeg()==0 && ! NIdLabelH.
IsKey(NI.GetId())) {
438 fprintf(F,
"%d;\n", NI.GetId()); }
440 for (
int e = 0; e < NI.GetOutDeg(); e++) {
441 if (! IsDir && NI.GetId() > NI.GetOutNId(e)) {
continue; }
442 fprintf(F,
" %d %s %d;\n", NI.GetId(), IsDir?
"->":
"--", NI.GetOutNId(e));
446 if (! Desc.
Empty()) {
447 fprintf(F,
" label = \"\\n%s\\n\";", Desc.
CStr());
448 fprintf(F,
" fontsize=24;\n");
void SavePajek(const PGraph &Graph, const TStr &OutFNm)
Saves a graph in a Pajek .NET format.
void SaveEdgeListNet(const PNEANet &Graph, const TStr &OutFNm, const TStr &Desc)
Saves a network into a text file. Each line encodes either an edge or a node, along with its attribut...
void SaveGViz(const PGraph &Graph, const TStr &OutFNm, const TStr &Desc=TStr(), const bool &NodeLabels=false, const TIntStrH &NIdColorH=TIntStrH())
Save a graph in GraphVizp .DOT format.
const TStr STR_TYPE_PREFIX
PGraph LoadConnListStr(const TStr &InFNm, TStrHash< TInt > &StrToNIdH)
Loads a (directed, undirected or multi) graph from a text file InFNm with 1 node and all its edges in...
void ToLc()
Transforms the current line to lower case.
PGraph LoadEdgeList(const TStr &InFNm, const int &SrcColId=0, const int &DstColId=1)
Loads a (directed, undirected or multi) graph from a text file InFNm with 1 edge per line (whitespace...
TDat & AddDatId(const char *Key)
bool GetInt(const int &FldN, int &Val) const
If the field FldN is an integer its value is returned in Val and the function returns true...
THash< TInt, TStr > TIntStrH
const TDat & GetDat(const TKey &Key) const
PGraph LoadPajek(const TStr &InFNm)
Loads a (directed, undirected or multi) graph from Pajek .PAJ format file.
PGraph LoadConnList(const TStr &InFNm)
Loads a (directed, undirected or multi) graph from a text file InFNm with 1 node and all its edges in...
TVec< PNGraph > LoadDyNetGraphV(const TStr &FNm)
For more info see ORA Network Analysis Data (http://www.casos.cs.cmu.edu/computational_tools/data2.php)
have explicit edges (multigraph): TNEGraph, TNodeEdgeNet
const TStr FLT_TYPE_PREFIX
bool Eof() const
Checks for end of file.
#define HasGraphFlag(TGraph, Flag)
For quick testing of the properties of the graph/network object (see TGraphFlag). ...
PNEANet LoadEdgeListNet(const TStr &InFNm, const char &Separator)
Loads a network from the text file InFNm with 1 node/edge per line ('Separator' separated columns...
Whitespace (space or tab) separated.
PGraph LoadEdgeListStr(const TStr &InFNm, const int &SrcColId=0, const int &DstColId=1)
Loads a (directed, undirected or multi) graph from a text file InFNm with 1 edge per line (whitespace...
int AddKey(const TKey &Key)
int Len() const
Returns the number of fields in the current line.
void SaveEdgeList(const PGraph &Graph, const TStr &OutFNm, const TStr &Desc=TStr())
Saves a graph into a text file. Each line contains two columns and encodes a single edge:
int AddKey(const char *Key)
directed graph (TNGraph, TNEGraph), else graph is undirected TUNGraph
static TStr Fmt(const char *FmtStr,...)
bool Next()
Loads next line from the input file.
PNGraph LoadDyNet(const TStr &FNm)
For more info see ORA Network Analysis Data (http://www.casos.cs.cmu.edu/computational_tools/data2.php)
const TStr INT_TYPE_PREFIX
bool IsKey(const TKey &Key) const
void SaveMatlabSparseMtx(const PGraph &Graph, const TStr &OutFNm)
Saves a graph in a MATLAB sparse matrix format.
bool IsInt(const int &FldN) const
Checks whether fields FldN is an integer.
TDat & AddDat(const TKey &Key)
Vector is a sequence TVal objects representing an array that can change in size.