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();
90 if (! Ss.
GetInt(SrcColId, SrcNId) || ! Ss.
GetInt(DstColId, DstNId)) {
continue; }
91 if (! Graph->IsNode(SrcNId)) { Graph->AddNode(SrcNId); }
92 if (! Graph->IsNode(DstNId)) { Graph->AddNode(DstNId); }
93 Graph->AddEdge(SrcNId, DstNId);
104 template <
class PGraph>
105 PGraph
LoadEdgeList(
const TStr& InFNm,
const int& SrcColId,
const int& DstColId,
const char& Separator) {
107 PGraph Graph = PGraph::TObj::New();
110 if (! Ss.
GetInt(SrcColId, SrcNId) || ! Ss.
GetInt(DstColId, DstNId)) {
continue; }
111 if (! Graph->IsNode(SrcNId)) { Graph->AddNode(SrcNId); }
112 if (! Graph->IsNode(DstNId)) { Graph->AddNode(DstNId); }
113 Graph->AddEdge(SrcNId, DstNId);
125 template <
class PGraph>
128 PGraph Graph = PGraph::TObj::New();
131 const int SrcNId = StrToNIdH.
AddKey(Ss[SrcColId]);
132 const int DstNId = StrToNIdH.
AddKey(Ss[DstColId]);
133 if (! Graph->IsNode(SrcNId)) { Graph->AddNode(SrcNId); }
134 if (! Graph->IsNode(DstNId)) { Graph->AddNode(DstNId); }
135 Graph->AddEdge(SrcNId, DstNId);
148 template <
class PGraph>
151 PGraph Graph = PGraph::TObj::New();
153 const int SrcNId = StrToNIdH.
AddKey(Ss[SrcColId]);
154 const int DstNId = StrToNIdH.
AddKey(Ss[DstColId]);
155 if (! Graph->IsNode(SrcNId)) { Graph->AddNode(SrcNId); }
156 if (! Graph->IsNode(DstNId)) { Graph->AddNode(DstNId); }
157 Graph->AddEdge(SrcNId, DstNId);
168 template <
class PGraph>
171 PGraph Graph = PGraph::TObj::New();
173 if (! Ss.
IsInt(0)) {
continue; }
174 const int SrcNId = Ss.
GetInt(0);
175 if (! Graph->IsNode(SrcNId)) { Graph->AddNode(SrcNId); }
176 for (
int dst = 1; dst < Ss.
Len(); dst++) {
177 const int DstNId = Ss.
GetInt(dst);
178 if (! Graph->IsNode(DstNId)) { Graph->AddNode(DstNId); }
179 Graph->AddEdge(SrcNId, DstNId);
192 template <
class PGraph>
195 PGraph Graph = PGraph::TObj::New();
197 const int SrcNId = StrToNIdH.
AddDatId(Ss[0]);
198 if (! Graph->IsNode(SrcNId)) { Graph->AddNode(SrcNId); }
199 for (
int dst = 1; dst < Ss.
Len(); dst++) {
200 const int DstNId = StrToNIdH.
AddDatId(Ss[dst]);
201 if (! Graph->IsNode(DstNId)) { Graph->AddNode(DstNId); }
202 Graph->AddEdge(SrcNId, DstNId);
209 template <
class PGraph>
211 PGraph Graph = PGraph::TObj::New();
213 while ((Ss.
Len()==0 || strstr(Ss[0],
"*vertices") == NULL) && ! Ss.
Eof()) {
216 bool EdgeList =
true;
217 EAssert(strstr(Ss[0],
"*vertices") != NULL);
220 if (Ss.
Len()>0 && Ss[0][0] ==
'%') {
continue; }
221 if (strstr(Ss[0],
"*arcslist")!=NULL || strstr(Ss[0],
"*edgeslist")!=NULL) { EdgeList=
false;
break; }
222 if (strstr(Ss[0],
"*arcs")!=NULL || strstr(Ss[0],
"*edges")!=NULL) {
break; }
223 Graph->AddNode(Ss.
GetInt(0));
227 if (Ss.
Len()>0 && Ss[0][0] ==
'%') {
continue; }
228 if (Ss.
Len()>0 && Ss[0][0] ==
'*') {
break; }
236 const int SrcNId = Ss.
GetInt(0);
237 for (
int i = 1; i < Ss.
Len(); i++) {
238 Graph->AddEdge(SrcNId, Ss.
GetInt(i)); }
244 template <
class PGraph>
246 FILE *F = fopen(OutFNm.
CStr(),
"wt");
248 else { fprintf(F,
"# Undirected graph (each unordered pair of nodes is saved once): %s\n", OutFNm.
CStr()); }
249 if (! Desc.
Empty()) { fprintf(F,
"# %s\n", Desc.
CStr()); }
250 fprintf(F,
"# Nodes: %d Edges: %d\n", Graph->GetNodes(), Graph->GetEdges());
252 else { fprintf(F,
"# NodeId\tNodeId\n"); }
253 for (
typename PGraph::TObj::TEdgeI ei = Graph->BegEI(); ei < Graph->EndEI(); ei++) {
254 fprintf(F,
"%d\t%d\n", ei.GetSrcNId(), ei.GetDstNId());
259 template <
class PGraph>
261 TIntH NIdToIdH(Graph->GetNodes(),
true);
262 FILE *F = fopen(OutFNm.
CStr(),
"wt");
263 fprintf(F,
"*Vertices %d\n", Graph->GetNodes());
265 for (
typename PGraph::TObj::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++, i++) {
266 fprintf(F,
"%d \"%d\" ic Red fos 10\n", i+1, NI.GetId());
267 NIdToIdH.
AddDat(NI.GetId(), i+1);
270 fprintf(F,
"*Arcs %d\n", Graph->GetEdges()); }
272 fprintf(F,
"*Edges %d\n", Graph->GetEdges());
274 for (
typename PGraph::TObj::TEdgeI EI = Graph->BegEI(); EI < Graph->EndEI(); EI++) {
275 const int SrcNId = NIdToIdH.GetDat(EI.GetSrcNId());
276 const int DstNId = NIdToIdH.GetDat(EI.GetDstNId());
277 fprintf(F,
"%d %d %d c Black\n", SrcNId, DstNId, 1);
284 template <
class PGraph>
286 TIntH NIdToIdH(Graph->GetNodes(),
true);
287 FILE *F = fopen(OutFNm.
CStr(),
"wt");
288 fprintf(F,
"*Vertices %d\n", Graph->GetNodes());
290 for (
typename PGraph::TObj::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++, i++) {
291 fprintf(F,
"%d \"%d\" ic %s fos 10\n", i+1, NI.GetId(),
292 NIdColorH.
IsKey(NI.GetId()) ? NIdColorH.
GetDat(NI.GetId()).CStr() :
"Red");
293 NIdToIdH.
AddDat(NI.GetId(), i+1);
296 fprintf(F,
"*Arcs %d\n", Graph->GetEdges()); }
298 fprintf(F,
"*Edges %d\n", Graph->GetEdges());
300 for (
typename PGraph::TObj::TEdgeI EI = Graph->BegEI(); EI < Graph->EndEI(); EI++) {
301 const int SrcNId = NIdToIdH.GetDat(EI.GetSrcNId());
302 const int DstNId = NIdToIdH.GetDat(EI.GetDstNId());
303 fprintf(F,
"%d %d %d c Black\n", SrcNId, DstNId, 1);
311 template <
class PGraph>
313 TIntH NIdToIdH(Graph->GetNodes(),
true);
314 FILE *F = fopen(OutFNm.
CStr(),
"wt");
315 fprintf(F,
"*Vertices %d\n", Graph->GetNodes());
317 for (
typename PGraph::TObj::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++, i++) {
318 fprintf(F,
"%d \"%s\" ic %s fos 10\n", i+1,
319 NIdLabelH.
IsKey(NI.GetId()) ? NIdLabelH.
GetDat(NI.GetId()).CStr() :
TStr::Fmt(
"%d", NI.GetId()).CStr(),
320 NIdColorH.
IsKey(NI.GetId()) ? NIdColorH.
GetDat(NI.GetId()).CStr() :
"Red");
321 NIdToIdH.
AddDat(NI.GetId(), i+1);
324 fprintf(F,
"*Arcs %d\n", Graph->GetEdges()); }
326 fprintf(F,
"*Edges %d\n", Graph->GetEdges());
328 for (
typename PGraph::TObj::TEdgeI EI = Graph->BegEI(); EI < Graph->EndEI(); EI++) {
329 const int SrcNId = NIdToIdH.GetDat(EI.GetSrcNId());
330 const int DstNId = NIdToIdH.GetDat(EI.GetDstNId());
331 fprintf(F,
"%d %d %d c Black\n", SrcNId, DstNId, 1);
340 template <
class PGraph>
343 TIntH NIdToIdH(Graph->GetNodes(),
true);
344 FILE *F = fopen(OutFNm.
CStr(),
"wt");
345 fprintf(F,
"*Vertices %d\n", Graph->GetNodes());
347 for (
typename PGraph::TObj::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++, i++) {
348 fprintf(F,
"%d \"%s\" ic %s fos 10\n", i+1,
349 NIdLabelH.
IsKey(NI.GetId()) ? NIdLabelH.
GetDat(NI.GetId()).CStr() :
TStr::Fmt(
"%d", NI.GetId()).CStr(),
350 NIdColorH.
IsKey(NI.GetId()) ? NIdColorH.
GetDat(NI.GetId()).CStr() :
"Red");
351 NIdToIdH.
AddDat(NI.GetId(), i+1);
354 fprintf(F,
"*Arcs %d\n", Graph->GetEdges()); }
356 fprintf(F,
"*Edges %d\n", Graph->GetEdges());
358 for (
typename PGraph::TObj::TEdgeI EI = Graph->BegEI(); EI < Graph->EndEI(); EI++) {
359 const int SrcNId = NIdToIdH.GetDat(EI.GetSrcNId());
360 const int DstNId = NIdToIdH.GetDat(EI.GetDstNId());
361 fprintf(F,
"%d %d 1 c %s\n", SrcNId, DstNId,
362 EIdColorH.
IsKey(EI.GetId()) ? EIdColorH.
GetDat(EI.GetId()).CStr() :
"Black");
368 template <
class PGraph>
370 FILE *F = fopen(OutFNm.
CStr(),
"wt");
371 TIntSet NIdSet(Graph->GetNodes());
372 for (
typename PGraph::TObj::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) {
373 NIdSet.
AddKey(NI.GetId());
375 for (
typename PGraph::TObj::TEdgeI EI = Graph->BegEI(); EI < Graph->EndEI(); EI++) {
376 const int Src = NIdSet.GetKeyId(EI.GetSrcNId())+1;
377 const int Dst = NIdSet.GetKeyId(EI.GetDstNId())+1;
378 fprintf(F,
"%d\t%d\t1\n", Src, Dst);
380 fprintf(F,
"%d\t%d\t1\n", Dst, Src);
386 template<
class PGraph>
389 FILE *F = fopen(OutFNm.
CStr(),
"wt");
390 if (! Desc.
Empty()) fprintf(F,
"/*****\n%s\n*****/\n\n", Desc.
CStr());
391 if (IsDir) { fprintf(F,
"digraph G {\n"); }
else { fprintf(F,
"graph G {\n"); }
392 fprintf(F,
" graph [splines=false overlap=false]\n");
395 fprintf(F,
" node [shape=ellipse, width=0.3, height=0.3%s]\n", NodeLabels?
"":
", label=\"\"");
398 for (
typename PGraph::TObj::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) {
399 if (NIdColorH.
IsKey(NI.GetId())) {
400 fprintf(F,
" %d [style=filled, fillcolor=\"%s\"];\n", NI.GetId(), NIdColorH.
GetDat(NI.GetId()).CStr()); }
402 fprintf(F,
" %d ;\n", NI.GetId());
406 for (
typename PGraph::TObj::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) {
407 if (NI.GetOutDeg()==0 && NI.GetInDeg()==0 && !NIdColorH.
IsKey(NI.GetId())) {
408 fprintf(F,
"%d;\n", NI.GetId()); }
410 for (
int e = 0; e < NI.GetOutDeg(); e++) {
411 if (! IsDir && NI.GetId() > NI.GetOutNId(e)) {
continue; }
412 fprintf(F,
" %d %s %d;\n", NI.GetId(), IsDir?
"->":
"--", NI.GetOutNId(e));
416 if (! Desc.
Empty()) {
417 fprintf(F,
" label = \"\\n%s\\n\";", Desc.
CStr());
418 fprintf(F,
" fontsize=24;\n");
424 template<
class PGraph>
426 const bool IsDir = Graph->HasFlag(
gfDirected);
427 FILE *F = fopen(OutFNm.
CStr(),
"wt");
428 if (! Desc.
Empty()) fprintf(F,
"/*****\n%s\n*****/\n\n", Desc.
CStr());
429 if (IsDir) { fprintf(F,
"digraph G {\n"); }
else { fprintf(F,
"graph G {\n"); }
430 fprintf(F,
" graph [splines=true overlap=false]\n");
431 fprintf(F,
" node [shape=ellipse, width=0.3, height=0.3]\n");
434 for (
typename PGraph::TObj::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) {
435 fprintf(F,
" %d [label=\"%s\"];\n", NI.GetId(), NIdLabelH.
GetDat(NI.GetId()).CStr());
438 for (
typename PGraph::TObj::TNodeI NI = Graph->BegNI(); NI < Graph->EndNI(); NI++) {
439 if (NI.GetOutDeg()==0 && NI.GetInDeg()==0 && ! NIdLabelH.
IsKey(NI.GetId())) {
440 fprintf(F,
"%d;\n", NI.GetId()); }
442 for (
int e = 0; e < NI.GetOutDeg(); e++) {
443 if (! IsDir && NI.GetId() > NI.GetOutNId(e)) {
continue; }
444 fprintf(F,
" %d %s %d;\n", NI.GetId(), IsDir?
"->":
"--", NI.GetOutNId(e));
448 if (! Desc.
Empty()) {
449 fprintf(F,
" label = \"\\n%s\\n\";", Desc.
CStr());
450 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.