Commit 1987cba3 authored by Kai Zhang's avatar Kai Zhang

minor

parent 7fd6845d
...@@ -24,15 +24,20 @@ import IGraph ...@@ -24,15 +24,20 @@ import IGraph
-- | The normalized closeness centrality of a node is the average length of the -- | The normalized closeness centrality of a node is the average length of the
-- shortest path between the node and all other nodes in the graph. -- shortest path between the node and all other nodes in the graph.
closeness :: [Int] -- ^ vertices closeness :: Serialize e
=> [Int] -- ^ vertices
-> Graph d v e -> Graph d v e
-> Maybe [Double] -- ^ optional edge weights
-> Bool -- ^ whether to normalize the results -> Bool -- ^ whether to normalize the results
-> Maybe (e -> Double) -- ^ Function to get edge weights
-> [Double] -> [Double]
closeness nds gr ws normal = unsafePerformIO $ allocaVector $ \result -> closeness nds gr normal getEdgeW = unsafePerformIO $ allocaVector $ \result ->
withVerticesList nds $ \vs -> withListMaybe ws $ \ws' -> do withVerticesList nds $ \vs -> withListMaybe ws $ \ws' -> do
igraphCloseness (_graph gr) result vs IgraphOut ws' normal igraphCloseness (_graph gr) result vs IgraphOut ws' normal
toList result toList result
where
ws = case getEdgeW of
Nothing -> Nothing
Just f -> Just $ map (f . snd) $ labEdges gr
{#fun igraph_closeness as ^ {#fun igraph_closeness as ^
{ `IGraph' { `IGraph'
, castPtr `Ptr Vector' , castPtr `Ptr Vector'
...@@ -43,14 +48,19 @@ closeness nds gr ws normal = unsafePerformIO $ allocaVector $ \result -> ...@@ -43,14 +48,19 @@ closeness nds gr ws normal = unsafePerformIO $ allocaVector $ \result ->
-- | Betweenness centrality -- | Betweenness centrality
betweenness :: [Int] betweenness :: Serialize e
=> [Int]
-> Graph d v e -> Graph d v e
-> Maybe [Double] -> Maybe (e -> Double) -- ^ Function to get edge weights
-> [Double] -> [Double]
betweenness nds gr ws = unsafePerformIO $ allocaVector $ \result -> betweenness nds gr getEdgeW = unsafePerformIO $ allocaVector $ \result ->
withVerticesList nds $ \vs -> withListMaybe ws $ \ws' -> do withVerticesList nds $ \vs -> withListMaybe ws $ \ws' -> do
igraphBetweenness (_graph gr) result vs True ws' False igraphBetweenness (_graph gr) result vs True ws' False
toList result toList result
where
ws = case getEdgeW of
Nothing -> Nothing
Just f -> Just $ map (f . snd) $ labEdges gr
{#fun igraph_betweenness as ^ {#fun igraph_betweenness as ^
{ `IGraph' { `IGraph'
, castPtr `Ptr Vector' , castPtr `Ptr Vector'
...@@ -60,13 +70,18 @@ betweenness nds gr ws = unsafePerformIO $ allocaVector $ \result -> ...@@ -60,13 +70,18 @@ betweenness nds gr ws = unsafePerformIO $ allocaVector $ \result ->
, `Bool' } -> `CInt' void- #} , `Bool' } -> `CInt' void- #}
-- | Eigenvector centrality -- | Eigenvector centrality
eigenvectorCentrality :: Graph d v e eigenvectorCentrality :: Serialize e
-> Maybe [Double] => Graph d v e
-> Maybe (e -> Double) -- ^ Function to get edge weights
-> [Double] -> [Double]
eigenvectorCentrality gr ws = unsafePerformIO $ allocaArpackOpt $ \arparck -> eigenvectorCentrality gr getEdgeW = unsafePerformIO $ allocaArpackOpt $ \arparck ->
allocaVector $ \result -> withListMaybe ws $ \ws' -> do allocaVector $ \result -> withListMaybe ws $ \ws' -> do
igraphEigenvectorCentrality (_graph gr) result nullPtr True True ws' arparck igraphEigenvectorCentrality (_graph gr) result nullPtr True True ws' arparck
toList result toList result
where
ws = case getEdgeW of
Nothing -> Nothing
Just f -> Just $ map (f . snd) $ labEdges gr
{#fun igraph_eigenvector_centrality as ^ {#fun igraph_eigenvector_centrality as ^
{ `IGraph' { `IGraph'
, castPtr `Ptr Vector' , castPtr `Ptr Vector'
...@@ -77,18 +92,15 @@ eigenvectorCentrality gr ws = unsafePerformIO $ allocaArpackOpt $ \arparck -> ...@@ -77,18 +92,15 @@ eigenvectorCentrality gr ws = unsafePerformIO $ allocaArpackOpt $ \arparck ->
, castPtr `Ptr ArpackOpt' } -> `CInt' void- #} , castPtr `Ptr ArpackOpt' } -> `CInt' void- #}
-- | Google's PageRank algorithm, with option to -- | Google's PageRank algorithm, with option to
pagerank :: SingI d pagerank :: (SingI d, Serialize v, Serialize e)
=> Graph d v e => Graph d v e
-> Maybe [Double] -- ^ Node weights or reset probability. If provided,
-- the personalized PageRank will be used
-> Maybe [Double] -- ^ Edge weights
-> Double -- ^ damping factor, usually around 0.85 -> Double -- ^ damping factor, usually around 0.85
-> Maybe (v -> Double) -- ^ Node weights or reset probability. If provided,
-- the personalized PageRank will be used
-> Maybe (e -> Double) -- ^ Edge weights
-> [Double] -> [Double]
pagerank gr reset ws d pagerank gr d getNodeW getEdgeW
| n == 0 = [] | nNodes gr == 0 = []
| isJust ws && length (fromJust ws) /= m = error "incorrect length of edge weight vector"
| isJust reset && length (fromJust reset) /= n = error
"incorrect length of node weight vector"
| fmap (foldl' (+) 0) reset == Just 0 = error "sum of node weight vector must be non-zero" | fmap (foldl' (+) 0) reset == Just 0 = error "sum of node weight vector must be non-zero"
| otherwise = unsafePerformIO $ alloca $ \p -> allocaVector $ \result -> | otherwise = unsafePerformIO $ alloca $ \p -> allocaVector $ \result ->
withVerticesAll $ \vs -> withListMaybe ws $ \ws' -> do withVerticesAll $ \vs -> withListMaybe ws $ \ws' -> do
...@@ -100,9 +112,12 @@ pagerank gr reset ws d ...@@ -100,9 +112,12 @@ pagerank gr reset ws d
(isDirected gr) d reset'' ws' nullPtr (isDirected gr) d reset'' ws' nullPtr
toList result toList result
where where
n = nNodes gr reset = case getNodeW of
m = nEdges gr Nothing -> Nothing
Just f -> Just $ map (f . snd) $ labNodes gr
ws = case getEdgeW of
Nothing -> Nothing
Just f -> Just $ map (f . snd) $ labEdges gr
{#fun igraph_pagerank as ^ {#fun igraph_pagerank as ^
{ `IGraph' { `IGraph'
, `PagerankAlgo' , `PagerankAlgo'
...@@ -114,7 +129,6 @@ pagerank gr reset ws d ...@@ -114,7 +129,6 @@ pagerank gr reset ws d
, castPtr `Ptr Vector' , castPtr `Ptr Vector'
, id `Ptr ()' , id `Ptr ()'
} -> `CInt' void- #} } -> `CInt' void- #}
{#fun igraph_personalized_pagerank as ^ {#fun igraph_personalized_pagerank as ^
{ `IGraph' { `IGraph'
, `PagerankAlgo' , `PagerankAlgo'
......
...@@ -93,4 +93,4 @@ pagerankTest = testGroup "PageRank" ...@@ -93,4 +93,4 @@ pagerankTest = testGroup "PageRank"
gr = star 11 gr = star 11
ranks = [0.47,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05] ranks = [0.47,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05]
ranks' = map ((/100) . fromIntegral . round. (*100)) $ ranks' = map ((/100) . fromIntegral . round. (*100)) $
pagerank gr Nothing Nothing 0.85 pagerank gr 0.85 Nothing Nothing
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment