Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
gargantext-graph
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
2
Issues
2
List
Board
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
gargantext
gargantext-graph
Commits
178eb573
Commit
178eb573
authored
Sep 22, 2021
by
Alp Mestanogullari
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fixes
parent
505cb059
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
100 additions
and
164 deletions
+100
-164
Main.hs
app/Main.hs
+10
-9
ProxemyOptim.hs
src/Graph/BAC/ProxemyOptim.hs
+50
-118
Import.hs
src/Graph/Tools/Import.hs
+17
-14
Main.hs
test/Main.hs
+23
-23
No files found.
app/Main.hs
View file @
178eb573
...
...
@@ -40,9 +40,8 @@ import qualified Data.IntMap.Strict as IntMap
import
qualified
Data.IntSet
as
IntSet
import
qualified
Data.Text
as
Text
setupEnv
::
Either
String
Int
->
IO
(
Dict
[
Text
],
Graph
()
()
)
setupEnv
(
Left
fp
)
=
getUnlabGraph
(
WithFile
fp
)
setupEnv
(
Right
n
)
=
getUnlabGraph
(
Random
n
)
setupEnv
::
FilePath
->
IO
(
Graph
[
Text
]
Double
)
setupEnv
fp
=
getGraph
(
WithFile
fp
)
main
::
IO
()
main
=
do
...
...
@@ -54,23 +53,25 @@ main = do
beta
=
case
readMaybe
betastr
of
Just
d
->
d
_
->
Prelude
.
error
"beta must be a Double"
setupEnv
(
Left
fpin
)
>>=
\
(
dico
,
~
g
)
->
do
let
(
clusts
,
score
)
=
withG
g
(
\
fg
->
clusteringOptim
3
Conf
fg
beta
gc
)
setupEnv
fpin
>>=
\
g
->
do
let
(
Clust
clusts
dico
score
)
=
withG
g
(
\
fg
->
clusteringOptim
3
fg
beta
gc
)
clusts'
=
Prelude
.
map
(
sort
.
Prelude
.
map
(
lkp
dico
)
.
IntSet
.
toList
)
$
sortBy
(
\
a
b
->
flipOrd
$
comparing
IntSet
.
size
a
b
)
$
Prelude
.
map
(
\
(
n
,
ns
)
->
IntSet
.
insert
n
ns
)
$
IntMap
.
toList
clusts
putStrLn
$
"#clusters: "
++
show
(
length
clusts'
)
$
IntMap
.
elems
clusts
putStrLn
$
"#clusters: "
++
show
(
IntMap
.
size
clusts
)
putStrLn
$
"max cluster size: "
++
show
(
length
(
clusts'
Prelude
.!!
0
))
putStrLn
$
"Clustering score: "
++
show
score
withFile
fpout
WriteMode
$
\
hndl
->
forM_
clusts'
$
\
clust
->
hPutStrLn
hndl
$
"len="
++
show
(
length
clust
)
++
" ["
++
intercalate
", "
[
"'"
++
Text
.
unpack
w
++
"'"
|
[
w
]
<-
clust
]
++
"]
\n
"
" ["
++
intercalate
", "
[
escapestr
w
|
[
w
]
<-
clust
]
++
"]
\n
"
where
flipOrd
LT
=
GT
flipOrd
GT
=
LT
flipOrd
EQ
=
EQ
lkp
dico
i
=
fromMaybe
(
Prelude
.
error
"Node not in dictionary?!"
)
$
IntMap
.
lookup
i
dico
escapestr
w
|
"'"
`
Text
.
isInfixOf
`
w
=
"
\"
"
++
Text
.
unpack
w
++
"
\"
"
|
otherwise
=
"'"
++
Text
.
unpack
w
++
"'"
src/Graph/BAC/ProxemyOptim.hs
View file @
178eb573
...
...
@@ -43,7 +43,7 @@ import GHC.TypeLits (KnownNat, Nat, SomeNat(SomeNat), type(+), natVal, sameNat,
import
Graph.FGL
import
Graph.Types
import
Prelude
(
String
,
readLn
,
error
,
id
)
import
Protolude
hiding
(
traceShow
,
sum
,
natVal
,
trace
)
import
Protolude
hiding
(
sum
,
natVal
)
import
qualified
Data.Graph.Inductive
as
DGI
import
qualified
Data.Graph.Inductive.PatriciaTree
as
DGIP
import
qualified
Data.List
as
List
...
...
@@ -62,46 +62,44 @@ import qualified Data.IntMap.Strict as Dict
import
qualified
Data.Vector.Mutable
as
MV
import
qualified
Data.Vector.Unboxed.Mutable
as
MVU
import
qualified
Data.IntSet
as
IntSet
import
Debug.Trace
import
qualified
Data.IntMap.Strict
as
IntMap
----------------------------------------------------------------
{-# INLINE clusteringOptim #-}
clusteringOptim
::
forall
n
a
b
.
KnownNat
n
=>
Length
->
Similarity
->
FiniteGraph
n
a
b
->
Double
-- beta
->
Bool
-- True = run GC, False = don't
->
(
Dict
IntSet
,
Double
)
clusteringOptim
l
s
fg
@
(
FiniteGraph
g
)
beta
gc
=
runClustering
gc
beta
adj'
prox
sorted_edges
where
!
adj'
=
symAdjacent
fg
True
!
tra'
=
symTransition
adj'
!
prox
=
proxemie
l
tra'
sorted_edges
=
sort_edges
(
natToInt
@
n
)
(
edges_confluence
l
fg
adj'
tra'
)
-- mc = matconf False adj' prox
-- md = matmod fg
-- !matq = case s of
-- Conf -> SimConf mc
-- Mod -> SimMod md
=>
Length
-- ^ length of the random walks
->
FiniteGraph
n
a
b
-- ^ graph to compute clusters for
->
Double
-- ^ beta
->
Bool
-- ^ True = run GC, False = don't
->
Clust
a
clusteringOptim
l
fg
@
(
FiniteGraph
g
)
beta
gc
=
case
runClustering
gc
beta
adj
prox
sorted_edges
of
(
clusts
,
d
)
->
Clust
clusts
idx
d
where
!
idx
=
Dict
.
fromList
(
DGI
.
labNodes
g
)
!
adj
=
graphMatrix
fg
True
!
tra
=
transition
adj
!
prox
=
proxemie
l
tra
sorted_edges
=
sort_edges
(
natToInt
@
n
)
(
edges_confluence
l
fg
adj
tra
)
symAdjacent
graphMatrix
::
forall
(
n
::
Nat
)
a
b
.
KnownNat
n
=>
FiniteGraph
n
a
b
->
Bool
->
SMatrix
.
Matrix
n
n
Double
symAdjacent
(
FiniteGraph
g
)
isReflexive
=
SMatrix
.
fromList
(
diag
++
triplets
)
where
triplets
=
[
(
i
,
j
,
1.0
)
|
i
<-
nodes
g
,
j
<-
neighbors
g
i
]
diag
=
if
isReflexive
then
[
(
i
,
i
,
1.0
)
|
i
<-
[
0
..
(
n
-
1
)]
]
else
[]
n
=
fromIntegral
$
natVal
(
Proxy
::
Proxy
n
)
symTransition
::
KnownNat
n
=>
SMatrix
.
Matrix
n
n
Double
->
SMatrix
.
Matrix
n
n
Double
symTransition
m
=
SMatrix
.
imap
graphMatrix
(
FiniteGraph
g
)
reflexive
=
adj
where
!
adj
=
SMatrix
.
fromList
es
es
=
diag
++
triplets
triplets
=
[
(
i
,
j
,
1.0
)
|
i
<-
nodes
g
,
j
<-
neighbors
g
i
]
diag
=
if
reflexive
then
[
(
i
,
i
,
1.0
)
|
i
<-
[
0
..
(
n
-
1
)]
]
else
[]
n
=
fromIntegral
$
natVal
(
Proxy
::
Proxy
n
)
transition
::
KnownNat
n
=>
SMatrix
.
Matrix
n
n
Double
->
SMatrix
.
Matrix
n
n
Double
transition
m
=
SMatrix
.
imap
(
\
i
j
_
->
1
/
fromIntegral
(
SMatrix
.
nnzCol
m
j
))
m
...
...
@@ -135,40 +133,14 @@ instance KnownNat n => Show (SimilarityMatrix n) where
show
(
SimMod
m
)
=
show
m
-----
adjacent
::
KnownNat
n
=>
FiniteGraph
n
a
b
->
IsReflexive
->
AdjacencyMatrix
n
adjacent
(
FiniteGraph
g
)
isReflexive
=
SMatrix
.
fromList
$
triplets
<>
diag
where
triplets
=
[
(
i
,
j
,
1.0
)
|
i
<-
nodes
g
,
j
<-
neighbors
g
i
,
i
/=
j
]
diag
=
case
isReflexive
of
True
->
[
(
n
,
n
,
1.0
)
|
n
<-
nodes
g
]
False
->
[]
transition
::
KnownNat
n
=>
AdjacencyMatrix
n
->
TransitionMatrix
n
transition
m
=
SMatrix
.
imap
(
\
i
j
_
->
1
/
fromIntegral
(
SMatrix
.
nnzCol
m
j
))
m
---
proxemie
::
KnownNat
n
=>
Length
->
SMatrix
.
Matrix
n
n
Double
->
ProxemyMatrix
n
proxemie
l
!
tm
=
trace
"proxemie"
$
case
l
<=
1
of
proxemie
l
!
tm
=
case
l
<=
1
of
True
->
tm
False
->
case
iterate
(
SMatrix
.
mul
tm
)
tm
Prelude
.!!
(
l
-
1
)
of
tm'
->
trace
"proxemie OK"
tm'
False
->
iterate
(
SMatrix
.
mul
tm
)
tm
Prelude
.!!
(
l
-
1
)
---------------------------------------------------------------
matconf
::
forall
n
.
KnownNat
n
...
...
@@ -176,7 +148,7 @@ matconf :: forall n. KnownNat n
->
SMatrix
.
Matrix
n
n
Double
->
ProxemyMatrix
n
->
ConfluenceMatrix
n
matconf
False
a
p
=
seq
a
$
seq
p
$
trace
"matconf"
confmat
matconf
False
a
p
=
seq
a
$
seq
p
$
confmat
where
vcount
=
natToInt
@
n
sumdeg
=
fromIntegral
(
SMatrix
.
nonZeros
a
)
...
...
@@ -192,7 +164,7 @@ matconf False a p = seq a $ seq p $ trace "matconf" confmat
conf
=
(
prox_y_x_length
-
prox_y_x_infini
)
/
(
prox_y_x_length
+
prox_y_x_infini
)
DMatrix
.
unsafeWriteMatrix
m
x
y
conf
DMatrix
.
unsafeWriteMatrix
m
y
x
conf
trace
"matconf OK"
$
return
m
return
m
matconf
True
_a
_p
=
panic
"MatConf True: TODO but not needed for now"
confAt
...
...
@@ -202,7 +174,7 @@ confAt
->
SMatrix
.
Matrix
n
n
Double
-- ^ adjacency
->
SMatrix
.
Matrix
n
n
Double
-- ^ proxemie
->
Int
->
Int
->
Double
confAt
beta
adj
prox
x
y
=
conf
confAt
beta
adj
prox
x
y
=
xy
where
deg_x
=
fromIntegral
(
SMatrix
.
nnzCol
adj
x
)
deg_y
=
fromIntegral
(
SMatrix
.
nnzCol
adj
y
)
sumdeg
=
fromIntegral
(
SMatrix
.
nonZeros
adj
)
...
...
@@ -219,29 +191,6 @@ confAt beta adj prox x y = conf
|
otherwise
=
conf
-
(
deg_x
-
1
)
*
(
deg_y
-
1
)
/
ecount
-
beta
*
(
1
-
conf
)
matmod
::
forall
n
a
b
.
KnownNat
n
=>
FiniteGraph
n
a
b
->
ModularityMatrix
n
matmod
fg
=
DMatrix
.
L
.
DMatrix
.
Dim
.
DMatrix
.
Dim
$
DMatrix
.
runSTMatrix
go
where
!
vcount
=
natToInt
@
n
!
a
=
adjacent
fg
False
nnz
=
SMatrix
.
nonZeros
a
go
::
forall
s
.
ST
s
(
DMatrix
.
STMatrix
s
Double
)
go
=
do
m
<-
DMatrix
.
newMatrix
0
vcount
vcount
forM_
[
0
..
(
vcount
-
1
)]
$
\
i
->
forM_
[
i
..
(
vcount
-
1
)]
$
\
j
->
do
let
!
v
=
if
SMatrix
.
at
a
(
i
,
j
)
>
0
then
1
else
0
!
v'
=
v
-
(
fromIntegral
(
SMatrix
.
nnzCol
a
i
)
*
fromIntegral
(
SMatrix
.
nnzCol
a
j
)
/
fromIntegral
(
2
*
nnz
)
)
DMatrix
.
unsafeWriteMatrix
m
i
j
v'
DMatrix
.
unsafeWriteMatrix
m
j
i
v'
return
m
---------------------------------------------------------------
type
UnsortedEdges
=
[(
Node
,
Node
,
Double
)]
type
SortedEdges
=
[(
Node
,
Node
,
Double
)]
...
...
@@ -255,14 +204,13 @@ edges_confluence :: forall n a b.
->
SMatrix
.
Matrix
n
n
Double
-- adjacency
->
SMatrix
.
Matrix
n
n
Double
-- transition
->
UnsortedEdges
edges_confluence
l
(
FiniteGraph
g
)
am
tm
=
trace
"edges_confluence"
$
map
f
(
edges
g
)
edges_confluence
l
(
FiniteGraph
g
)
am
tm
=
map
f
(
edges
g
)
where
vcount
=
natToInt
@
n
sumdeg_m2
=
fromIntegral
(
SMatrix
.
nonZeros
am
-
2
)
f
(
x
,
y
)
=
-- traceShow (x, y) $
f
(
x
,
y
)
=
let
!
deg_x_m1
=
fromIntegral
(
SMatrix
.
nnzCol
am
x
-
1
)
!
deg_y_m1
=
fromIntegral
(
SMatrix
.
nnzCol
am
y
-
1
)
v
=
SMatrix
.
asColumn
(
SVector
.
singleton
y
1
)
...
...
@@ -275,21 +223,10 @@ edges_confluence l (FiniteGraph g) am tm = trace "edges_confluence" $
conf
=
(
prox_y_x_length
-
prox_y_x_infini
)
/
(
prox_y_x_length
+
prox_y_x_infini
)
in
seq
conf
(
x
,
y
,
conf
)
pp_vec
dv
@
(
DMatrix
.
R
(
DMatrix
.
Dim
v
))
=
let
strs
=
map
show
(
VS
.
toList
v
)
maxl
=
maximum
(
map
length
strs
)
padr
m
s
=
s
++
replicate
(
m
-
length
s
)
' '
in
intercalate
"
\n
"
(
map
(
padr
maxl
)
strs
)
pp_mul
m
v
=
let
mats
=
Prelude
.
lines
$
SMatrix
.
pp
m
vecs
=
Prelude
.
lines
$
pp_vec
v
in
trace
((
"---
\n
"
++
)
.
Prelude
.
unlines
$
Prelude
.
zipWith
(
\
a
b
->
a
++
" | "
++
b
)
mats
vecs
++
[
"---"
])
(
SMatrix
.
mulV
m
v
)
sort_edges
::
Int
->
UnsortedEdges
->
SortedEdges
sort_edges
n
=
List
.
sortBy
(
\
a
b
->
confCompare
a
b
<>
comparing
xnpy
a
b
)
-- . List.filter (\(x,y,_) -> x < y)
where
third
::
forall
a
b
c
...
...
@@ -331,7 +268,6 @@ data MClustering s =
,
mindex
::
VU
.
MVector
s
Int
,
mscore
::
VU
.
MVector
s
Double
-- 1-entry array, total score
,
mnumcl
::
VU
.
MVector
s
Int
-- 1-entry array, #clusters
-- TODO: mode?
}
newMClustering
::
Int
->
ST
s
(
MClustering
s
)
...
...
@@ -375,7 +311,7 @@ clusteringStep beta adj prox mclust (x, y) = do
(
return
()
)
ys
where
f
x
y
=
2
*
confAt
beta
adj
prox
x
y
where
f
x
y
=
confAt
beta
adj
prox
x
y
clusteringCollector
::
forall
s
(
n
::
Nat
)
.
...
...
@@ -386,7 +322,7 @@ clusteringCollector
->
MClustering
s
->
ST
s
(
Dict
IntSet
,
Double
)
clusteringCollector
beta
adj
prox
mclust
=
do
nclust
<-
trace
"counting non empty clusters"
$
MV
.
foldl'
nclust
<-
MV
.
foldl'
(
\
n_acc
mpart
->
if
isNothing
mpart
then
n_acc
...
...
@@ -394,14 +330,14 @@ clusteringCollector beta adj prox mclust = do
)
0
(
mparts
mclust
)
newClusts
<-
trace
(
"creating new cluster vector of size "
++
show
nclust
)
$
MV
.
unsafeNew
nclust
newClusts
<-
MV
.
unsafeNew
nclust
let
go
new_i
_old_i
Nothing
=
return
new_i
go
new_i
old_i
(
Just
p
)
=
do
MV
.
unsafeWrite
newClusts
new_i
(
Just
p
)
return
(
new_i
+
1
)
MV
.
ifoldM'
go
0
(
mparts
mclust
)
mat_delta
<-
trace
"creating delta matrix"
$
DMatrix
.
newMatrix
(
negate
maxDouble
)
nclust
nclust
trace
"filling delta matrix"
$
forM_
[
0
..
(
nclust
-
1
)]
$
\
i
->
mat_delta
<-
DMatrix
.
newMatrix
(
negate
maxDouble
)
nclust
nclust
forM_
[
0
..
(
nclust
-
1
)]
$
\
i
->
forM_
[(
i
+
1
)
..
(
nclust
-
1
)]
$
\
j
->
do
DMatrix
.
unsafeWriteMatrix
mat_delta
i
j
0
part_i
<-
MV
.
unsafeRead
newClusts
i
...
...
@@ -409,7 +345,7 @@ clusteringCollector beta adj prox mclust = do
forPart
part_i
$
\
x
->
forPart
part_j
$
\
y
->
DMatrix
.
modifyMatrix
mat_delta
i
j
$
\
a
->
a
+
confAt
beta
adj
prox
x
y
delta0
<-
trace
"reading current score"
$
MVU
.
unsafeRead
(
mscore
mclust
)
0
delta0
<-
MVU
.
unsafeRead
(
mscore
mclust
)
0
let
clusts
=
IntSet
.
fromList
[
0
..
(
nclust
-
1
)]
argmaxRow
i
=
do
foldM
(
\
acc
@
(
max_j
,
!
max_v
)
j
->
do
...
...
@@ -444,11 +380,11 @@ clusteringCollector beta adj prox mclust = do
merges'
(
delta
+
delta'
)
else
return
(
cs
,
merges
,
delta
)
(
cs
,
merges
,
finalDelta
)
<-
trace
"cluster fusion"
$
fusionRound
clusts
IntMap
.
empty
delta0
(
cs
,
merges
,
finalDelta
)
<-
fusionRound
clusts
IntMap
.
empty
delta0
let
groups
=
[
(
i
,
maybe
[]
IntSet
.
toList
(
IntMap
.
lookup
i
merges
)
)
|
i
<-
IntSet
.
toList
cs
]
clustsDict
<-
trace
"preparing collector results"
.
fmap
IntMap
.
unions
.
forM
(
IntSet
.
toList
cs
)
$
\
i
->
clustsDict
<-
fmap
IntMap
.
unions
.
forM
(
IntSet
.
toList
cs
)
$
\
i
->
IntMap
.
singleton
i
.
maybe
IntSet
.
empty
partElems
<$>
MV
.
unsafeRead
newClusts
i
c
<-
foldGroups
groups
clustsDict
$
\
dict
(
i
,
js
)
->
do
sets_i
<-
traverse
(
fmap
(
maybe
IntSet
.
empty
partElems
)
.
MV
.
unsafeRead
newClusts
)
js
...
...
@@ -467,9 +403,9 @@ clusteringCollector beta adj prox mclust = do
forPart
(
Just
p
)
f
=
IntSet
.
foldr
(
\
i
acc
->
f
i
>>
acc
)
(
return
()
)
(
partElems
p
)
data
Clust
=
Clust
data
Clust
a
=
Clust
{
cparts
::
!
(
Dict
IntSet
)
,
cindex
::
!
(
VU
.
Vector
Int
)
,
cindex
::
!
(
Dict
a
)
,
cscore
::
{-# UNPACK #-}
!
Double
}
deriving
(
Show
,
Eq
)
...
...
@@ -481,11 +417,11 @@ runClustering
->
SMatrix
.
Matrix
n
n
Double
-- ^ proxemie
->
SortedEdges
->
(
Dict
IntSet
,
Double
)
runClustering
gc
beta
adj
prox
se
=
trace
"clustering starts"
$
runST
$
do
runClustering
gc
beta
adj
prox
se
=
runST
$
do
mclust
<-
newMClustering
n
forM_
se
$
\
(
x
,
y
,
_
)
->
clusteringStep
beta
adj
prox
mclust
(
x
,
y
)
if
gc
then
trace
"basic clusters done, running collector now"
$
clusteringCollector
beta
adj
prox
mclust
then
clusteringCollector
beta
adj
prox
mclust
else
do
cps
<-
V
.
unsafeFreeze
(
mparts
mclust
)
let
cps'
=
Dict
.
fromList
[
(
n
,
xs
)
...
...
@@ -495,12 +431,8 @@ runClustering gc beta adj prox se = trace "clustering starts" $ runST $ do
return
(
cps'
,
sc
)
where
n
=
fromIntegral
$
natVal
(
Proxy
::
Proxy
n
)
sestr
=
intercalate
"
\n
"
[
show
x
++
" "
++
show
y
++
" "
++
show
c
|
(
x
,
y
,
c
)
<-
se
]
-- the code below is unused for now
--
all
the code below is unused for now
data
Clustering
a
=
ClusteringIs
{
parts
::
!
(
Dict
(
Set
a
))
...
...
src/Graph/Tools/Import.hs
View file @
178eb573
...
...
@@ -10,6 +10,7 @@ Portability : POSIX
-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE NoImplicitPrelude #-}
...
...
@@ -39,31 +40,33 @@ import Data.Reflection
import
qualified
Data.IntMap.Strict
as
IntMap
------------------------------------------------------------------------
data
GetGraph
=
WithFile
{
filepath
::
FilePath
}
|
Random
Int
data
GetGraph
a
b
where
WithFile
::
{
filepath
::
FilePath
}
->
GetGraph
[
Text
]
Double
Random
::
Int
->
GetGraph
()
()
data
GraphData
=
LightGraph
{
lightGraph
::
Graph
()
()
}
|
LabelledGraph
{
labelledGraph
::
Graph
[
Text
]
Double
}
deriving
(
Show
)
data
GraphData
a
b
where
LightGraph
::
{
lightGraph
::
Graph
()
()
}
->
GraphData
()
()
LabelledGraph
::
{
labelledGraph
::
Graph
[
Text
]
Double
}
->
GraphData
[
Text
]
Double
getGraph
::
GetGraph
->
IO
GraphData
getGraph
(
Random
n
)
=
reifyNat
(
fromIntegral
n
)
$
\
(
pn
::
Proxy
n
)
->
getGraph
'
::
GetGraph
a
b
->
IO
(
GraphData
a
b
)
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
getGraph
'
(
WithFile
fp
)
=
do
g
<-
readFileGraph
CillexGraph
fp
pure
$
LabelledGraph
g
get
UnlabGraph
::
GetGraph
->
IO
(
Dict
[
Text
],
Graph
()
()
)
get
UnlabGraph
gg
=
getUnlabGraph'
<$>
getGraph
gg
get
Graph
::
GetGraph
a
b
->
IO
(
Graph
a
b
)
get
Graph
gg
=
toGraph'
<$>
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
)
toGraph'
::
GraphData
a
b
->
Graph
a
b
toGraph'
(
LightGraph
g
)
=
g
toGraph'
(
LabelledGraph
g
)
=
g
test/Main.hs
View file @
178eb573
...
...
@@ -24,33 +24,33 @@ import qualified Data.IntSet as IntSet
main
::
IO
()
main
=
hspec
$
do
describe
"Graph Toy first test"
$
do
let
edges_test
::
[(
Int
,
Int
)]
edges_test
=
[(
0
,
1
),(
0
,
2
),(
0
,
4
),(
0
,
5
),(
0
,
3
),(
0
,
6
)
,(
1
,
2
),(
1
,
3
),(
2
,
3
),(
4
,
5
),(
4
,
6
),(
5
,
6
)
,(
7
,
8
),(
7
,
3
),(
7
,
4
),(
8
,
2
),(
8
,
5
)
]
main
=
return
()
--
hspec $ do
--
describe "Graph Toy first test" $ do
--
let edges_test :: [(Int,Int)]
--
edges_test=[(0,1),(0,2),(0,4),(0,5),(0,3),(0,6)
--
,(1,2),(1,3),(2,3),(4,5),(4,6),(5,6)
--
,(7,8),(7,3),(7,4),(8,2),(8,5)
--
]
clustering_result
=
Clust
{
cparts
=
Dict
.
fromList
[
(
0
,
IntSet
.
fromList
[
0
,
4
,
5
,
6
])
,
(
1
,
IntSet
.
fromList
[
1
,
2
,
3
])
,
(
7
,
IntSet
.
fromList
[
7
,
8
])
]
,
cindex
=
VU
.
fromList
[
0
,
1
,
1
,
1
,
0
,
0
,
0
,
7
,
7
]
,
cscore
=
3.0558391780792453
}
--
clustering_result =
--
Clust
--
{ cparts = Dict.fromList
--
[ (0, IntSet.fromList [0,4,5,6])
--
, (1, IntSet.fromList [1,2,3])
--
, (7, IntSet.fromList [7,8])
--
]
-- , cindex = Dict.fromList [(0, 0)
, 1, 1, 1, 0, 0, 0, 7, 7]
--
, cscore = 3.0558391780792453
--
}
g
::
Graph
()
()
g
=
mkGraphUfromEdges
edges_test
--
g :: Graph () ()
--
g = mkGraphUfromEdges edges_test
result
=
withG
g
(
\
fg
->
identity
$
clusteringOptim
3
Conf
fg
beta
)
it
"Graph Toy test exact result"
$
do
result
`
shouldBe
`
clustering_result
-- result = withG g (\fg -> clusteringOptim 3
fg beta)
--
it "Graph Toy test exact result" $ do
--
result `shouldBe` clustering_result
where
beta
=
0.0
--
where beta = 0.0
{-
m <- randomAdjacency
describe "Random Matrix of fixed size (TODO dynamic size)" $ do
...
...
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