Import.hs 2.1 KB
{-# LANGUAGE TypeApplications #-}
{-| Module      : Graph.Tools
Description :
Copyright   : (c) CNRS, Alexandre Delanoë
License     : AGPL + CECILL v3
Maintainer  : alexandre+dev@delanoe.org
Stability   : experimental
Portability : POSIX


-}

{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE InstanceSigs    #-}
{-# LANGUAGE NoImplicitPrelude       #-}


{-# LANGUAGE ScopedTypeVariables #-}
module Graph.Tools.Import where

import Data.Csv
import Data.Text (pack, splitOn, unpack)
import Data.Vector hiding (map, uniq)
import Prelude (read)
import Protolude
import Graph.Types
import Graph.Tools.Random
import Graph.Tools.CSV
import Graph.FGL
import qualified Data.Matrix.Sparse.Static as SMatrix
import qualified Data.IntMap          as Dict
import qualified Data.Map             as Map
import qualified Data.ByteString.Lazy as BL
import qualified Data.Graph.Inductive as Graph
import qualified Data.List            as List
import qualified Data.Set             as Set
import qualified Data.Vector          as Vector
import Data.Reflection
import qualified Data.IntMap.Strict as IntMap

------------------------------------------------------------------------
data GetGraph = WithFile { filepath :: FilePath }
              | Random Int

data GraphData = LightGraph    { lightGraph :: Graph () () }
               | LabelledGraph { labelledGraph :: Graph [Text] Double }
    deriving (Show)


getGraph :: GetGraph -> IO GraphData
getGraph (Random n) = reifyNat (fromIntegral n) $ \(pn :: Proxy n) ->
  randomAdjacency @n
                >>= \m -> pure $ LightGraph
                               $ mkGraphUfromEdges
                               $ List.map (\(x,y,_) -> (x,y))
                               $ SMatrix.toList m

getGraph (WithFile fp) = do
  g <- readFileGraph CillexGraph fp
  pure $ LabelledGraph g


getUnlabGraph :: GetGraph -> IO (Dict [Text], Graph () ())
getUnlabGraph gg = getUnlabGraph' <$> getGraph gg

getUnlabGraph' :: GraphData -> (Dict [Text], Graph () ())
getUnlabGraph' (LightGraph    g) = (Dict.empty, g)
getUnlabGraph' (LabelledGraph g) = (dico, Graph.unlab g)
  where dico = IntMap.fromList (Graph.labNodes g)