packages feed

algebraic-graphs-io-0.1.4.0: src/Algebra/Graph/IO/Datasets.hs

{-# options_ghc -Wno-unused-imports -Wno-type-defaults #-}
module Algebra.Graph.IO.Datasets where

import Algebra.Graph (Graph)
import Algebra.Graph.IO.GML (GMLGraph, gmlGraph, gmlGraphP)
import qualified Algebra.Graph.IO.SV as SV (tsvSink)
import Algebra.Graph.IO.Internal.Megaparsec (Parser, anyString)

-- conduit
import Conduit (MonadUnliftIO(..), MonadResource, runResourceT)
import Data.Conduit (runConduit, ConduitT, (.|), yield, await)
import qualified Data.Conduit.Combinators as C (print, sourceFile, sinkFile, map, mapM, foldM, mapWhile)
-- megaparsec
import Text.Megaparsec (parse)
import Text.Megaparsec.Error (errorBundlePretty)
import Text.Megaparsec.Char.Lexer (decimal)

import Data.Text.IO (readFile)

import Prelude hiding (readFile)

-- | "Les Miserables" dataset
--
-- from https://github.com/gephi/gephi/wiki/Datasets
lesMiserables :: IO (Graph Int)
lesMiserables = do
  t <- readFile "assets/lesmiserables.gml"
  case parse (gmlGraphP decimal decimal) "" t of
    Right gg -> pure $ gmlGraph gg
    Left e -> error $ errorBundlePretty e

-- | "Karate club" dataset
--
-- from https://github.com/gephi/gephi/wiki/Datasets
karateClub :: IO (Graph Int)
karateClub = do
  t <- readFile "assets/karate.gml"
  case parse (gmlGraphP decimal anyString) "" t of
    Right gg -> pure $ gmlGraph gg
    Left e -> error $ errorBundlePretty e

-- | Small test dataset
--
-- from https://graphchallenge.mit.edu/data-sets
blockModel50 :: IO (Graph Int)
blockModel50 = runResourceT $ runConduit $
  C.sourceFile "assets/simulated_blockmodel_graph_50_nodes.tsv" .|
  SV.tsvSink