Module: GDF

Defined in:
lib/graphs/gdf.rb

Overview

GDF-related functions see guess.wikispot.org/The_GUESS_.gdf_format

Constant Summary collapse

NODEDEF =

Node fields definition

'nodedef>'
EDGEDEF =

Edge fields definition

'edgedef>'
PREDEFINED_NODE_PROPS =

Non-string predefined node properties

{
  'x' => 'float',
  'y' => 'float',
  'visible' => 'boolean',
  'fixed' => 'boolean',
  'style' => 'int',
  'width' => 'float',
  'height' => 'float'
}
PREDEFINED_EDGE_PROPS =

Non-string predefined edge properties

{
  'visible' => 'boolean',
  'weight' => 'float',
  'width' => 'float',
  'directed' => 'boolean',
  'labelvisible' => 'boolean'
}

Class Method Summary collapse

Class Method Details

.load(filename) ⇒ Object

Loads a GDF file and return a new Graph object

Parameters:

  • filename (String)

    a valid filename

See Also:



62
63
64
# File 'lib/graphs/gdf.rb', line 62

def self.load(filename)
    self.parse(File.read(filename))
end

.parse(content) ⇒ Object

Parse some GDF text and return a new Graph object

Parameters:

  • content (String)

    a valid GDF String

See Also:



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/graphs/gdf.rb', line 70

def self.parse(content)

    if (content.nil? || content.length == 0)
        return Graph.new([],[])
    end

    fields_split = /[\t ]*,[\t ]*/

    nodedef_len, edgedef_len = NODEDEF.length, EDGEDEF.length

    current_def = nil

    nodes, edges = [], []
    current_set = nil

    content.each_line do |line|
      line.strip!
      is_nodedef = line.start_with? NODEDEF
      is_edgedef = !is_nodedef && line.start_with?(EDGEDEF)

      if is_nodedef || is_edgedef
        line.slice!(0, is_nodedef ? nodedef_len : edgedef_len)
        line.strip!
        defaults = is_nodedef ? PREDEFINED_NODE_PROPS : PREDEFINED_EDGE_PROPS
        current_def = line.split(fields_split).map do |l|
          read_def(l, defaults)
        end

        current_set = is_nodedef ? nodes : edges
      else
        el = {}
        fields = line.parse_csv || [nil]
        fields.zip(current_def).each do |val,label_type|
          label, type, default = label_type
          el[label] = parse_field(val, type, default)
        end
        current_set << el
      end
    end

    Graph.new(nodes, edges)
end

.unparse(graph, opts = nil) ⇒ String

Return a GDF String which describe the given Graph

Parameters:

  • graph (Graph)
  • opts (Hash) (defaults to: nil)

    A customizable set of options

Returns:

  • (String)

See Also:



118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# File 'lib/graphs/gdf.rb', line 118

def self.unparse(graph, opts=nil)
    # nodes
    gdf_s = NODEDEF

    if (graph.nodes.length == 0)
        return gdf_s
    end

    keys = graph.nodes[0].keys
    nodedef = keys.map { |k| [k, self.get_type(graph.nodes[0][k], opts)] }

    gdf_s += (nodedef.map {|nd| nd.join(' ')}).join(',') + "\n"

    graph.nodes.each do |n|
        gdf_s += n.values.to_csv
    end

    # edges
    gdf_s += EDGEDEF

    return gdf_s if graph.edges.empty?

    keys = graph.edges[0].keys
    edgedef = keys.map { |k| [k, self.get_type(graph.edges[0][k], opts)] }

    gdf_s += (edgedef.map {|ed| ed.join(' ')}).join(',') + "\n"

    graph.edges.each do |e|
        gdf_s += e.values.to_csv
    end

    gdf_s
end