ANN  0.1.1.5
A library containing multiple neural network models written in C
graph.c
Go to the documentation of this file.
1 #include <stdlib.h>
2 #include <stdio.h>
6 
7 #include <graphviz/gvc.h>
8 #ifdef WITH_CGRAPH
9 #include <graphviz/cgraph.h>
10 #else
11 #include <graphviz/graph.h>
12 #endif
13 
14 #include "ANN/models/PCFNN/graph.h"
15 
16 
17 Agraph_t *PCFNN_GRAPH_create_graph(struct PCFNN_NETWORK *net, char *graph_name)
18 {
19  if (net == NULL || graph_name == NULL) return NULL;
20 
21  Agraph_t *g;
22  Agraph_t *layers[net->size];
23  Agnode_t **nodes[net->size];
24 
25 #ifdef WITH_CGRAPH
26  g = agopen(graph_name, Agdirected, NULL);
27 #else
28  aginit();
29  g = agopen(graph_name, AGDIGRAPH);
30 #endif
31 
32  if (g == NULL) return NULL;
33 
34  agsafeset(g, "charset", "UTF-8", "");
35  agsafeset(g, "rankdir", "LR", "");
36  agsafeset(g, "center", "true", "");
37  agsafeset(g, "ranksep", "5", "");
38 
39  for (size_t l = 0; l < net->size; ++l)
40  {
41  char lbuff[42];
42  sprintf(lbuff, "L%ld", net->layers[l]->index);
43  layers[l] = agsubg(g, lbuff, 1);
44  agsafeset(layers[l], "style", "filled", "");
45  agsafeset(layers[l], "bgcolor", "black", "");
46  agsafeset(layers[l], "label", lbuff, "");
47 
48  nodes[l] = malloc(sizeof(Agnode_t*) * net->layers[l]->size);
49  for (size_t n = 0; n < net->layers[l]->size; ++n)
50  {
51  char buff[42];
52  sprintf(buff, "L%ld_%ld", net->layers[l]->index, n);
53 #ifdef WITH_CGRAPH
54  nodes[l][n] = agnode(layers[l], buff, 1);
55 #else
56  nodes[l][n] = agnode(layers[l], buff);
57 #endif
58  agsafeset(nodes[l][n], "shape", "circle", "");
59  }
60  }
61 
62  for (size_t l = 0; l < net->size; ++l)
63  {
64  for (size_t k = 0; k < net->layers[l]->nblinks; ++k)
65  {
66  struct PCFNN_LAYER_LINK *link = net->layers[l]->links[k];
67  if (link != NULL && net->layers[l] == link->from)
68  {
69  for(size_t n = link->offset_to; n < link->size_to + link->offset_to; ++n)
70  {
71  for (size_t m = link->offset_from; m < link->size_from + link->offset_from; ++m)
72  {
73 #ifdef WITH_CGRAPH
74  agedge(g, nodes[link->from->index][m], nodes[link->to->index][n], NULL, 1);
75 #else
76  agedge(g, nodes[link->from->index][m], nodes[link->to->index][n]);
77 #endif
78  }
79  }
80  }
81  }
82  }
83 
84  for (size_t l = 0; l < net->size; ++l)
85  free(nodes[l]);
86  return g;
87 }
88 
89 
90 int PCFNN_GRAPH_create_graph_to_dot_file(struct PCFNN_NETWORK *net, char *graph_name, char *fout)
91 {
92  if (net == NULL || fout == NULL || graph_name == NULL) return -1;
93 
94  Agraph_t *g = PCFNN_GRAPH_create_graph(net, graph_name);
95  if (g == NULL) return -1;
96 
97  FILE *f = fopen(fout, "w+");
98  if (f != NULL) {
99  agwrite(g, f);
100  fclose(f);
101  agclose(g);
102  return 0;
103  } else {
104  agclose(g);
105  return -1;
106  }
107 }
108 
109 
110 int PCFNN_GRAPH_render_graph_to_stream(struct PCFNN_NETWORK *net, char *graph_name, char *format, FILE *fout)
111 {
112  if (net == NULL || graph_name == NULL || format == NULL || fout == NULL) return -1;
113 
114  Agraph_t *g = PCFNN_GRAPH_create_graph(net, graph_name);
115  if (g == NULL) return -1;
116 
117  GVC_t *gvc;
118  gvc = gvContext();
119  if (gvc == NULL) { agclose(g); return -1;}
120  gvLayout(gvc, g, "dot");
121 
122  gvRender (gvc, g, format, fout);
123 
124  gvFreeLayout(gvc, g);
125  agclose(g);
126  gvFreeContext(gvc);
127 
128  return 0;
129 }
130 
131 
132 int PCFNN_GRAPH_render_graph_to_file(struct PCFNN_NETWORK *net, char *graph_name, char *format, char *fout)
133 {
134  if (net == NULL || graph_name == NULL || format == NULL || fout == NULL) return -1;
135 
136  Agraph_t *g = PCFNN_GRAPH_create_graph(net, graph_name);
137  if (g == NULL) return -1;
138 
139  GVC_t *gvc;
140  gvc = gvContext();
141  if (gvc == NULL) { agclose(g); return -1; }
142  gvLayout(gvc, g, "dot");
143 
144  gvRenderFilename (gvc, g, format, fout);
145 
146  gvFreeLayout(gvc, g);
147  agclose(g);
148  gvFreeContext(gvc);
149 
150  return 0;
151 }
PCFNN_LAYER.
size_t size_to
Definition: layer.h:39
struct PCFNN_LAYER ** layers
Definition: network.h:29
Structure to represent a link between to PCFNN_LAYER.
Definition: layer.h:36
struct PCFNN_LAYER_LINK ** links
Definition: layer.h:58
size_t size
Definition: layer.h:55
struct PCFNN_LAYER * to
Definition: layer.h:38
size_t size
Definition: network.h:28
PCFNN_NEURON.
Agraph_t * PCFNN_GRAPH_create_graph(struct PCFNN_NETWORK *net, char *graph_name)
Generate a graph (with graphviz) from the given PCFNN_NETWORK.
Definition: graph.c:17
size_t size_from
Definition: layer.h:39
int PCFNN_GRAPH_render_graph_to_file(struct PCFNN_NETWORK *net, char *graph_name, char *format, char *fout)
Generate a graph (with graphviz) from the given PCFNN_NETWORK and render it to the given path fout wi...
Definition: graph.c:132
PCFNN_NETWORK.
size_t index
Definition: layer.h:54
int PCFNN_GRAPH_render_graph_to_stream(struct PCFNN_NETWORK *net, char *graph_name, char *format, FILE *fout)
Generate a graph (with graphviz) from the given PCFNN_NETWORK and render it to the given stream fout ...
Definition: graph.c:110
PCFNN_GRAPH.
int PCFNN_GRAPH_create_graph_to_dot_file(struct PCFNN_NETWORK *net, char *graph_name, char *fout)
Generate a graph (with graphviz) from the given PCFNN_NETWORK and write it to fout with the dot file ...
Definition: graph.c:90
size_t offset_from
Definition: layer.h:44
Network unit.
Definition: network.h:27
size_t nblinks
Definition: layer.h:57
struct PCFNN_LAYER * from
Definition: layer.h:38
size_t offset_to
Definition: layer.h:44