{-# language DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
{-# options_ghc -Wno-unused-imports -Wno-unused-top-binds #-}
module Algebra.Graph.IO.Datasets.LINQS.Citeseer (
stash
, sourceCiteseerGraphEdges, loadCiteseerGraph
,CiteSeerDoc(..)) where
import Control.Applicative (Alternative(..))
import Control.Monad (when, foldM)
import Control.Monad.IO.Class (MonadIO(..))
import GHC.Generics (Generic(..))
import GHC.Int (Int16)
import Data.Functor (($>))
import qualified Algebra.Graph as G (Graph, empty, overlay, edge)
import Data.Binary (Binary(..), encode, decode, encodeFile, decodeFileOrFail)
import qualified Data.Conduit.Serialization.Binary as CB (conduitDecode, conduitEncode, ParseError(..))
import Data.ByteString (ByteString)
import Data.ByteString.Char8 (unpack)
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, foldMap, foldl, foldMapM, mapWhile)
import Data.Sequence (Seq, (|>))
import qualified Data.Map as M (Map, singleton, lookup)
import System.Directory (createDirectoryIfMissing)
import Control.Monad.Catch (MonadThrow(..))
import System.FilePath ((</>), takeFileName, takeExtension)
import Network.HTTP.Simple (httpSource, getResponseBody, Response, Request, parseRequest, setRequestMethod)
import Text.Megaparsec (parse, parseTest, (<?>))
import Text.Megaparsec.Char (char)
import Text.Megaparsec.Char.Lexer (decimal)
import Text.Megaparsec.Error (errorBundlePretty)
import Control.Monad.Combinators (count)
import Control.Monad.Primitive (PrimMonad(..))
import Data.Conduit.Tar (Header(..), untarChunks, TarChunk, withEntries, FileInfo, filePath, withFileInfo, headerFileType, FileType(..), headerFilePath)
import qualified Data.Text as T (Text, unwords)
import qualified Data.Text.IO as T (readFile)
import Algebra.Graph.IO.Internal.Conduit (fetch, unTarGz)
import Algebra.Graph.IO.Internal.Megaparsec (Parser, ParseE, symbol, lexeme, alphaNum)
import Algebra.Graph.IO.SV (parseTSV)
import qualified Algebra.Graph.IO.Datasets.LINQS as DL (stash, sourceGraphEdges, loadGraph, restoreContent, CitesRow(..), ContentRow(..))
stash :: FilePath
-> IO ()
stash :: FilePath -> IO ()
stash FilePath
fp = FilePath -> FilePath -> Int -> Parser CiteSeerDoc -> IO ()
forall c.
Binary c =>
FilePath -> FilePath -> Int -> Parser c -> IO ()
DL.stash FilePath
fp FilePath
"http://www.cs.umd.edu/~sen/lbc-proj/data/citeseer.tgz" Int
3703 Parser CiteSeerDoc
docClassP
sourceCiteseerGraphEdges :: (MonadResource m, MonadThrow m) =>
FilePath
-> M.Map String (Int16, Seq Int16, CiteSeerDoc)
-> ConduitT i (Maybe (G.Graph (DL.ContentRow Int16 CiteSeerDoc))) m ()
sourceCiteseerGraphEdges :: FilePath
-> Map FilePath (Int16, Seq Int16, CiteSeerDoc)
-> ConduitT i (Maybe (Graph (ContentRow Int16 CiteSeerDoc))) m ()
sourceCiteseerGraphEdges = FilePath
-> Map FilePath (Int16, Seq Int16, CiteSeerDoc)
-> ConduitT i (Maybe (Graph (ContentRow Int16 CiteSeerDoc))) m ()
forall (m :: * -> *) c i.
(MonadResource m, MonadThrow m) =>
FilePath
-> Map FilePath (Int16, Seq Int16, c)
-> ConduitT i (Maybe (Graph (ContentRow Int16 c))) m ()
DL.sourceGraphEdges
loadCiteseerGraph ::
FilePath
-> IO (G.Graph (DL.ContentRow Int16 CiteSeerDoc))
loadCiteseerGraph :: FilePath -> IO (Graph (ContentRow Int16 CiteSeerDoc))
loadCiteseerGraph = FilePath -> IO (Graph (ContentRow Int16 CiteSeerDoc))
forall c. Binary c => FilePath -> IO (Graph (ContentRow Int16 c))
DL.loadGraph
data CiteSeerDoc = Agents | AI | DB | IR | ML | HCI deriving (CiteSeerDoc -> CiteSeerDoc -> Bool
(CiteSeerDoc -> CiteSeerDoc -> Bool)
-> (CiteSeerDoc -> CiteSeerDoc -> Bool) -> Eq CiteSeerDoc
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CiteSeerDoc -> CiteSeerDoc -> Bool
$c/= :: CiteSeerDoc -> CiteSeerDoc -> Bool
== :: CiteSeerDoc -> CiteSeerDoc -> Bool
$c== :: CiteSeerDoc -> CiteSeerDoc -> Bool
Eq, Eq CiteSeerDoc
Eq CiteSeerDoc
-> (CiteSeerDoc -> CiteSeerDoc -> Ordering)
-> (CiteSeerDoc -> CiteSeerDoc -> Bool)
-> (CiteSeerDoc -> CiteSeerDoc -> Bool)
-> (CiteSeerDoc -> CiteSeerDoc -> Bool)
-> (CiteSeerDoc -> CiteSeerDoc -> Bool)
-> (CiteSeerDoc -> CiteSeerDoc -> CiteSeerDoc)
-> (CiteSeerDoc -> CiteSeerDoc -> CiteSeerDoc)
-> Ord CiteSeerDoc
CiteSeerDoc -> CiteSeerDoc -> Bool
CiteSeerDoc -> CiteSeerDoc -> Ordering
CiteSeerDoc -> CiteSeerDoc -> CiteSeerDoc
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: CiteSeerDoc -> CiteSeerDoc -> CiteSeerDoc
$cmin :: CiteSeerDoc -> CiteSeerDoc -> CiteSeerDoc
max :: CiteSeerDoc -> CiteSeerDoc -> CiteSeerDoc
$cmax :: CiteSeerDoc -> CiteSeerDoc -> CiteSeerDoc
>= :: CiteSeerDoc -> CiteSeerDoc -> Bool
$c>= :: CiteSeerDoc -> CiteSeerDoc -> Bool
> :: CiteSeerDoc -> CiteSeerDoc -> Bool
$c> :: CiteSeerDoc -> CiteSeerDoc -> Bool
<= :: CiteSeerDoc -> CiteSeerDoc -> Bool
$c<= :: CiteSeerDoc -> CiteSeerDoc -> Bool
< :: CiteSeerDoc -> CiteSeerDoc -> Bool
$c< :: CiteSeerDoc -> CiteSeerDoc -> Bool
compare :: CiteSeerDoc -> CiteSeerDoc -> Ordering
$ccompare :: CiteSeerDoc -> CiteSeerDoc -> Ordering
$cp1Ord :: Eq CiteSeerDoc
Ord, Int -> CiteSeerDoc
CiteSeerDoc -> Int
CiteSeerDoc -> [CiteSeerDoc]
CiteSeerDoc -> CiteSeerDoc
CiteSeerDoc -> CiteSeerDoc -> [CiteSeerDoc]
CiteSeerDoc -> CiteSeerDoc -> CiteSeerDoc -> [CiteSeerDoc]
(CiteSeerDoc -> CiteSeerDoc)
-> (CiteSeerDoc -> CiteSeerDoc)
-> (Int -> CiteSeerDoc)
-> (CiteSeerDoc -> Int)
-> (CiteSeerDoc -> [CiteSeerDoc])
-> (CiteSeerDoc -> CiteSeerDoc -> [CiteSeerDoc])
-> (CiteSeerDoc -> CiteSeerDoc -> [CiteSeerDoc])
-> (CiteSeerDoc -> CiteSeerDoc -> CiteSeerDoc -> [CiteSeerDoc])
-> Enum CiteSeerDoc
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: CiteSeerDoc -> CiteSeerDoc -> CiteSeerDoc -> [CiteSeerDoc]
$cenumFromThenTo :: CiteSeerDoc -> CiteSeerDoc -> CiteSeerDoc -> [CiteSeerDoc]
enumFromTo :: CiteSeerDoc -> CiteSeerDoc -> [CiteSeerDoc]
$cenumFromTo :: CiteSeerDoc -> CiteSeerDoc -> [CiteSeerDoc]
enumFromThen :: CiteSeerDoc -> CiteSeerDoc -> [CiteSeerDoc]
$cenumFromThen :: CiteSeerDoc -> CiteSeerDoc -> [CiteSeerDoc]
enumFrom :: CiteSeerDoc -> [CiteSeerDoc]
$cenumFrom :: CiteSeerDoc -> [CiteSeerDoc]
fromEnum :: CiteSeerDoc -> Int
$cfromEnum :: CiteSeerDoc -> Int
toEnum :: Int -> CiteSeerDoc
$ctoEnum :: Int -> CiteSeerDoc
pred :: CiteSeerDoc -> CiteSeerDoc
$cpred :: CiteSeerDoc -> CiteSeerDoc
succ :: CiteSeerDoc -> CiteSeerDoc
$csucc :: CiteSeerDoc -> CiteSeerDoc
Enum, Int -> CiteSeerDoc -> ShowS
[CiteSeerDoc] -> ShowS
CiteSeerDoc -> FilePath
(Int -> CiteSeerDoc -> ShowS)
-> (CiteSeerDoc -> FilePath)
-> ([CiteSeerDoc] -> ShowS)
-> Show CiteSeerDoc
forall a.
(Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a
showList :: [CiteSeerDoc] -> ShowS
$cshowList :: [CiteSeerDoc] -> ShowS
show :: CiteSeerDoc -> FilePath
$cshow :: CiteSeerDoc -> FilePath
showsPrec :: Int -> CiteSeerDoc -> ShowS
$cshowsPrec :: Int -> CiteSeerDoc -> ShowS
Show, (forall x. CiteSeerDoc -> Rep CiteSeerDoc x)
-> (forall x. Rep CiteSeerDoc x -> CiteSeerDoc)
-> Generic CiteSeerDoc
forall x. Rep CiteSeerDoc x -> CiteSeerDoc
forall x. CiteSeerDoc -> Rep CiteSeerDoc x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CiteSeerDoc x -> CiteSeerDoc
$cfrom :: forall x. CiteSeerDoc -> Rep CiteSeerDoc x
Generic, Get CiteSeerDoc
[CiteSeerDoc] -> Put
CiteSeerDoc -> Put
(CiteSeerDoc -> Put)
-> Get CiteSeerDoc -> ([CiteSeerDoc] -> Put) -> Binary CiteSeerDoc
forall t. (t -> Put) -> Get t -> ([t] -> Put) -> Binary t
putList :: [CiteSeerDoc] -> Put
$cputList :: [CiteSeerDoc] -> Put
get :: Get CiteSeerDoc
$cget :: Get CiteSeerDoc
put :: CiteSeerDoc -> Put
$cput :: CiteSeerDoc -> Put
Binary)
docClassP :: Parser CiteSeerDoc
docClassP :: Parser CiteSeerDoc
docClassP =
(Text -> Parser Text
symbol Text
"Agents" Parser Text -> CiteSeerDoc -> Parser CiteSeerDoc
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> CiteSeerDoc
Agents) Parser CiteSeerDoc -> Parser CiteSeerDoc -> Parser CiteSeerDoc
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
(Text -> Parser Text
symbol Text
"AI" Parser Text -> CiteSeerDoc -> Parser CiteSeerDoc
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> CiteSeerDoc
AI) Parser CiteSeerDoc -> Parser CiteSeerDoc -> Parser CiteSeerDoc
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
(Text -> Parser Text
symbol Text
"DB" Parser Text -> CiteSeerDoc -> Parser CiteSeerDoc
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> CiteSeerDoc
DB) Parser CiteSeerDoc -> Parser CiteSeerDoc -> Parser CiteSeerDoc
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
(Text -> Parser Text
symbol Text
"IR" Parser Text -> CiteSeerDoc -> Parser CiteSeerDoc
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> CiteSeerDoc
IR) Parser CiteSeerDoc -> Parser CiteSeerDoc -> Parser CiteSeerDoc
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
(Text -> Parser Text
symbol Text
"ML" Parser Text -> CiteSeerDoc -> Parser CiteSeerDoc
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> CiteSeerDoc
ML) Parser CiteSeerDoc -> Parser CiteSeerDoc -> Parser CiteSeerDoc
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|>
(Text -> Parser Text
symbol Text
"HCI" Parser Text -> CiteSeerDoc -> Parser CiteSeerDoc
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> CiteSeerDoc
HCI)