Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
H
haskell-infomap
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
gargantext
haskell-infomap
Commits
76b795c1
Commit
76b795c1
authored
3 years ago
by
Alp Mestanogullari
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add ability to extract the resulting clustering from infomap, might be useful
parent
38cd70a2
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
113 additions
and
21 deletions
+113
-21
wrapper.cpp
cbits/wrapper.cpp
+20
-3
hsinfomap.cabal
hsinfomap.cabal
+3
-1
Infomap.hs
src/Data/Graph/Infomap.hs
+37
-0
Internal.hs
src/Data/Graph/Infomap/Internal.hs
+53
-17
No files found.
cbits/wrapper.cpp
View file @
76b795c1
...
...
@@ -5,6 +5,10 @@ typedef infomap::InfomapWrapper IW;
extern
"C"
{
struct
network
;
struct
cluster_node
{
unsigned
int
node
,
cluster_id
;
};
network
*
network_create
(
const
char
*
cfgstr
)
{
IW
*
iw
=
new
infomap
::
InfomapWrapper
(
cfgstr
);
return
reinterpret_cast
<
network
*>
(
iw
);
...
...
@@ -13,15 +17,28 @@ extern "C" {
delete
reinterpret_cast
<
IW
*>
(
n
);
}
void
add_link
(
network
*
n
,
unsigned
int
i
,
unsigned
int
j
)
{
reinterpret_cast
<
IW
*>
(
n
)
->
addLink
(
i
,
j
);
void
add_link
(
network
*
n
,
unsigned
int
i
,
unsigned
int
j
,
double
w
)
{
reinterpret_cast
<
IW
*>
(
n
)
->
addLink
(
i
,
j
,
w
);
}
void
run
(
network
*
n
)
{
reinterpret_cast
<
IW
*>
(
n
)
->
run
();
}
double
get
C
odelength
(
network
*
n
)
{
double
get
_c
odelength
(
network
*
n
)
{
return
reinterpret_cast
<
IW
*>
(
n
)
->
codelength
();
}
unsigned
int
get_num_nodes
(
network
*
n
)
{
return
reinterpret_cast
<
IW
*>
(
n
)
->
network
().
numNodes
();
}
void
write_modules
(
network
*
n
,
cluster_node
*
nodes
)
{
auto
modules
=
reinterpret_cast
<
IW
*>
(
n
)
->
getModules
();
int
i
=
0
;
for
(
auto
node
:
modules
)
{
nodes
[
i
]
=
{
node
.
first
,
node
.
second
};
i
++
;
}
}
};
This diff is collapsed.
Click to expand it.
hsinfomap.cabal
View file @
76b795c1
...
...
@@ -26,11 +26,13 @@ extra-source-files: CHANGELOG.md
library
-- Modules included in this executable, other than Main.
exposed-modules:
Data.Graph.Infomap
Data.Graph.Infomap.Internal
-- LANGUAGE extensions used by modules in this package.
-- other-extensions:
build-depends: base >=4.13
build-depends: base >=4.13,
containers
hs-source-dirs: src
include-dirs: cbits/infomap
cxx-options: -std=c++14 -O3
...
...
This diff is collapsed.
Click to expand it.
src/Data/Graph/Infomap.hs
0 → 100644
View file @
76b795c1
module
Data.Graph.Infomap
where
import
Data.Graph.Infomap.Internal
import
Data.Map
import
Foreign.C.Types
import
qualified
Data.Map
as
Map
infomap
::
NetworkCfg
->
Map
(
Int
,
Int
)
Double
->
IO
[
CNode
]
infomap
cfg
edges
=
withNetwork
cfg
$
\
n
->
do
addLinks
n
edges
run
n
getModules
n
where
addLinks
n
=
Map
.
foldrWithKey
(
go
n
)
(
return
()
)
go
n
(
i
,
j
)
w
act
=
addLink
n
(
fromIntegral
i
)
(
fromIntegral
j
)
(
CDouble
w
)
>>
act
testHigh
=
infomap
"--silent --two-level -N2"
testmap
where
testmap
=
Map
.
fromList
[
((
0
,
1
),
1.0
)
,
((
0
,
2
),
1.0
)
,
((
0
,
3
),
1.0
)
,
((
1
,
0
),
1.0
)
,
((
1
,
2
),
1.0
)
,
((
2
,
1
),
1.0
)
,
((
2
,
0
),
1.0
)
,
((
3
,
0
),
1.0
)
,
((
3
,
4
),
1.0
)
,
((
3
,
5
),
1.0
)
,
((
4
,
3
),
1.0
)
,
((
4
,
5
),
1.0
)
,
((
5
,
4
),
1.0
)
,
((
5
,
3
),
1.0
)
]
This diff is collapsed.
Click to expand it.
src/Data/Graph/Infomap/Internal.hs
View file @
76b795c1
...
...
@@ -3,10 +3,29 @@ module Data.Graph.Infomap.Internal where
import
Control.Exception
import
Foreign.C.String
import
Foreign.C.Types
import
Foreign.Marshal.Array
import
Foreign.Ptr
import
Foreign.Storable
newtype
Network
=
Network
(
Ptr
Network
)
-- node id, cluster id
data
CNode
=
CNode
{
nodeId
::
CUInt
,
clusId
::
CUInt
}
deriving
Show
instance
Storable
CNode
where
sizeOf
_
=
2
*
sizeOf
(
undefined
::
CUInt
)
alignment
_
=
alignment
(
undefined
::
CUInt
)
peek
ptr
=
do
i
<-
peek
(
castPtr
ptr
)
c
<-
peekByteOff
ptr
(
sizeOf
i
)
return
(
CNode
i
c
)
poke
ptr
(
CNode
i
c
)
=
do
poke
(
castPtr
ptr
)
i
pokeByteOff
ptr
(
sizeOf
i
)
c
foreign
import
ccall
unsafe
"network_create"
createNetwork
::
CString
->
IO
Network
...
...
@@ -14,36 +33,53 @@ foreign import ccall unsafe "network_destroy" destroyNetwork
::
Network
->
IO
()
foreign
import
ccall
unsafe
"add_link"
addLink
::
Network
->
CUInt
->
CUInt
->
IO
()
::
Network
->
CUInt
->
CUInt
->
CDouble
->
IO
()
foreign
import
ccall
unsafe
"run"
run
::
Network
->
IO
()
foreign
import
ccall
unsafe
"get
C
odelength"
getCodelength
foreign
import
ccall
unsafe
"get
_c
odelength"
getCodelength
::
Network
->
IO
CDouble
foreign
import
ccall
unsafe
"get_num_nodes"
getNumNodes
::
Network
->
IO
CUInt
foreign
import
ccall
unsafe
"write_modules"
writeModules
::
Network
->
Ptr
CNode
->
IO
()
type
NetworkCfg
=
String
getModules
::
Network
->
IO
[
CNode
]
getModules
n
=
do
len
<-
fromIntegral
<$>
getNumNodes
n
allocaArray
len
$
\
ptr
->
do
writeModules
n
ptr
peekArray
len
ptr
withNetwork
::
NetworkCfg
->
(
Network
->
IO
a
)
->
IO
a
withNetwork
cfgstr
f
=
withCString
cfgstr
$
\
cfgcstr
->
bracket
(
createNetwork
cfgcstr
)
destroyNetwork
f
test
::
IO
()
test
=
withNetwork
"--two-level -N2"
$
\
n
->
do
addLink
n
0
1
addLink
n
0
2
addLink
n
0
3
addLink
n
1
0
addLink
n
1
2
addLink
n
2
1
addLink
n
2
0
addLink
n
3
0
addLink
n
3
4
addLink
n
3
5
addLink
n
4
3
addLink
n
4
5
addLink
n
5
4
addLink
n
5
3
test
=
withNetwork
"--silent --two-level -N2"
$
\
n
->
do
addLink
n
0
1
1.0
addLink
n
0
2
1.0
addLink
n
0
3
1.0
addLink
n
1
0
1.0
addLink
n
1
2
1.0
addLink
n
2
1
1.0
addLink
n
2
0
1.0
addLink
n
3
0
1.0
addLink
n
3
4
1.0
addLink
n
3
5
1.0
addLink
n
4
3
1.0
addLink
n
4
5
1.0
addLink
n
5
4
1.0
addLink
n
5
3
1.0
sz
<-
getNumNodes
n
putStrLn
$
"#nodes: "
++
show
sz
run
n
codelen
<-
getCodelength
n
putStrLn
$
"codelength: "
++
show
codelen
modules
<-
getModules
n
putStrLn
$
"modules: "
++
show
modules
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment