SimpleHypergraphs.jl — загрузка гиперграфа из текстового файла

#julia #network-analysis #hypergraph

Вопрос:

Я использую библиотеку SimpleHypergraphs.jl и пытаюсь построить гиперграф из текстового файла, такого как csv.

Например, я хотел бы загрузить гиперграф из csv-файла, как это:

 0.0, 7.0, 0.0, 0.0
1.3, 2.8, 4.5, 0.0
0.0, 1.3, 3.1, 4.2
1.2, 0.0, 5.6, 5.0
 
 using SimpleHypergraphs
using CSV

df = CSV.read("edge_weights.csv", DataFrame)
m = Matrix{Float64}(df)
h = Hypergraph(m)
 

Я получаю следующую ошибку:
«ОШИБКА: Ошибка метода: нет метода, соответствующего гиперграфу(::Матрица{Float64})»

Я новичок в Джулии, и я был бы очень признателен за пример того, как я мог бы этого добиться. Спасибо!

Ответ №1:

Матрица, передаваемая в качестве Hypergraph конструктора, должна иметь элементы типа Union{Nothing, T} , где T есть некоторый числовой тип (например Matrix{Union{Float64,Nothing}} , а не просто быть a Matrix{Float64} .

В SimpleHypegraphs.jl мы используем nothing (а не 0 ) для представления того, что вершина не принадлежит гиперребру, поскольку во многих алгоритмах/приложениях гиперграфа вершина может принадлежать гиперребру с нулевым весом.

Следовательно, вы могли бы прочитать свой файл со следующим кодом (для воспроизводимости я поместил содержимое файла в текстовую переменную).:

 using DataFrames, CSV, SimpleHypergraphs

txt = """0.0, 7.0, 0.0, 0.0
1.3, 2.8, 4.5, 0.0
0.0, 1.3, 3.1, 4.2
1.2, 0.0, 5.6, 5.0"""

df = CSV.read(IOBuffer(txt), DataFrame;header=0)

mat = Matrix{Union{Float64,Nothing}}(df)
 

Теперь эту матрицу можно легко использовать в качестве Hypergraph конструктора.

 julia> h1 = Hypergraph(mat)
4×4 Hypergraph{Float64, Nothing, Nothing, Dict{Int64, Float64}}:
 0.0  7.0  0.0  0.0
 1.3  2.8  4.5  0.0
 0.0  1.3  3.1  4.2
 1.2  0.0  5.6  5.0
 

Однако это может быть не совсем то, что вам нужно, потому что нули ( 0.0 ) представляют ситуацию, когда вершины принадлежат гиперэджам с нулевым весом:

 draw(h1, HyperNetX)
 

введите описание изображения здесь

Следовательно, вы можете на самом деле захотеть преобразовать нули в nothing s, чтобы представить ситуацию, когда вершины не принадлежат гиперэджам:

 h2 = Hypergraph(replace(mat, 0 => nothing))
 

Теперь ты получаешь то, что хотел:

 draw(h2, HyperNetX)
 

введите описание изображения здесь