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
Show 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
...
@@ -40,9 +40,8 @@ import qualified Data.IntMap.Strict as IntMap
import
qualified
Data.IntSet
as
IntSet
import
qualified
Data.IntSet
as
IntSet
import
qualified
Data.Text
as
Text
import
qualified
Data.Text
as
Text
setupEnv
::
Either
String
Int
->
IO
(
Dict
[
Text
],
Graph
()
()
)
setupEnv
::
FilePath
->
IO
(
Graph
[
Text
]
Double
)
setupEnv
(
Left
fp
)
=
getUnlabGraph
(
WithFile
fp
)
setupEnv
fp
=
getGraph
(
WithFile
fp
)
setupEnv
(
Right
n
)
=
getUnlabGraph
(
Random
n
)
main
::
IO
()
main
::
IO
()
main
=
do
main
=
do
...
@@ -54,23 +53,25 @@ main = do
...
@@ -54,23 +53,25 @@ main = do
beta
=
case
readMaybe
betastr
of
beta
=
case
readMaybe
betastr
of
Just
d
->
d
Just
d
->
d
_
->
Prelude
.
error
"beta must be a Double"
_
->
Prelude
.
error
"beta must be a Double"
setupEnv
(
Left
fpin
)
>>=
\
(
dico
,
~
g
)
->
do
setupEnv
fpin
>>=
\
g
->
do
let
(
clusts
,
score
)
=
withG
g
(
\
fg
->
clusteringOptim
3
Conf
fg
beta
gc
)
let
(
Clust
clusts
dico
score
)
=
withG
g
(
\
fg
->
clusteringOptim
3
fg
beta
gc
)
clusts'
=
Prelude
.
map
(
sort
.
Prelude
.
map
(
lkp
dico
)
.
IntSet
.
toList
)
clusts'
=
Prelude
.
map
(
sort
.
Prelude
.
map
(
lkp
dico
)
.
IntSet
.
toList
)
$
sortBy
(
\
a
b
->
flipOrd
$
comparing
IntSet
.
size
a
b
)
$
sortBy
(
\
a
b
->
flipOrd
$
comparing
IntSet
.
size
a
b
)
$
Prelude
.
map
(
\
(
n
,
ns
)
->
IntSet
.
insert
n
ns
)
$
IntMap
.
elems
clusts
$
IntMap
.
toList
clusts
putStrLn
$
"#clusters: "
++
show
(
IntMap
.
size
clusts
)
putStrLn
$
"#clusters: "
++
show
(
length
clusts'
)
putStrLn
$
"max cluster size: "
++
show
(
length
(
clusts'
Prelude
.!!
0
))
putStrLn
$
"max cluster size: "
++
show
(
length
(
clusts'
Prelude
.!!
0
))
putStrLn
$
"Clustering score: "
++
show
score
putStrLn
$
"Clustering score: "
++
show
score
withFile
fpout
WriteMode
$
\
hndl
->
withFile
fpout
WriteMode
$
\
hndl
->
forM_
clusts'
$
\
clust
->
forM_
clusts'
$
\
clust
->
hPutStrLn
hndl
$
hPutStrLn
hndl
$
"len="
++
show
(
length
clust
)
++
"len="
++
show
(
length
clust
)
++
" ["
++
intercalate
", "
[
"'"
++
Text
.
unpack
w
++
"'"
|
[
w
]
<-
clust
]
++
"]
\n
"
" ["
++
intercalate
", "
[
escapestr
w
|
[
w
]
<-
clust
]
++
"]
\n
"
where
flipOrd
LT
=
GT
where
flipOrd
LT
=
GT
flipOrd
GT
=
LT
flipOrd
GT
=
LT
flipOrd
EQ
=
EQ
flipOrd
EQ
=
EQ
lkp
dico
i
=
fromMaybe
(
Prelude
.
error
"Node not in dictionary?!"
)
$
lkp
dico
i
=
fromMaybe
(
Prelude
.
error
"Node not in dictionary?!"
)
$
IntMap
.
lookup
i
dico
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,
...
@@ -43,7 +43,7 @@ import GHC.TypeLits (KnownNat, Nat, SomeNat(SomeNat), type(+), natVal, sameNat,
import
Graph.FGL
import
Graph.FGL
import
Graph.Types
import
Graph.Types
import
Prelude
(
String
,
readLn
,
error
,
id
)
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
as
DGI
import
qualified
Data.Graph.Inductive.PatriciaTree
as
DGIP
import
qualified
Data.Graph.Inductive.PatriciaTree
as
DGIP
import
qualified
Data.List
as
List
import
qualified
Data.List
as
List
...
@@ -62,46 +62,44 @@ import qualified Data.IntMap.Strict as Dict
...
@@ -62,46 +62,44 @@ import qualified Data.IntMap.Strict as Dict
import
qualified
Data.Vector.Mutable
as
MV
import
qualified
Data.Vector.Mutable
as
MV
import
qualified
Data.Vector.Unboxed.Mutable
as
MVU
import
qualified
Data.Vector.Unboxed.Mutable
as
MVU
import
qualified
Data.IntSet
as
IntSet
import
qualified
Data.IntSet
as
IntSet
import
Debug.Trace
import
qualified
Data.IntMap.Strict
as
IntMap
import
qualified
Data.IntMap.Strict
as
IntMap
----------------------------------------------------------------
----------------------------------------------------------------
{-# INLINE clusteringOptim #-}
{-# INLINE clusteringOptim #-}
clusteringOptim
::
forall
n
a
b
.
KnownNat
n
clusteringOptim
::
forall
n
a
b
.
KnownNat
n
=>
Length
=>
Length
-- ^ length of the random walks
->
Similarity
->
FiniteGraph
n
a
b
-- ^ graph to compute clusters for
->
FiniteGraph
n
a
b
->
Double
-- ^ beta
->
Double
-- beta
->
Bool
-- ^ True = run GC, False = don't
->
Bool
-- True = run GC, False = don't
->
Clust
a
->
(
Dict
IntSet
,
Double
)
clusteringOptim
l
fg
@
(
FiniteGraph
g
)
beta
gc
=
clusteringOptim
l
s
fg
@
(
FiniteGraph
g
)
beta
gc
=
runClustering
gc
beta
adj'
prox
sorted_edges
case
runClustering
gc
beta
adj
prox
sorted_edges
of
(
clusts
,
d
)
->
Clust
clusts
idx
d
where
where
!
adj'
=
symAdjacent
fg
True
!
idx
=
Dict
.
fromList
(
DGI
.
labNodes
g
)
!
tra'
=
symTransition
adj'
!
adj
=
graphMatrix
fg
True
!
prox
=
proxemie
l
tra'
!
tra
=
transition
adj
sorted_edges
=
sort_edges
(
natToInt
@
n
)
(
edges_confluence
l
fg
adj'
tra'
)
!
prox
=
proxemie
l
tra
sorted_edges
=
sort_edges
(
natToInt
@
n
)
(
edges_confluence
l
fg
adj
tra
)
-- mc = matconf False adj' prox
graphMatrix
-- md = matmod fg
-- !matq = case s of
-- Conf -> SimConf mc
-- Mod -> SimMod md
symAdjacent
::
forall
(
n
::
Nat
)
a
b
.
::
forall
(
n
::
Nat
)
a
b
.
KnownNat
n
KnownNat
n
=>
FiniteGraph
n
a
b
->
Bool
->
SMatrix
.
Matrix
n
n
Double
=>
FiniteGraph
n
a
b
->
Bool
->
SMatrix
.
Matrix
n
n
Double
symAdjacent
(
FiniteGraph
g
)
isReflexive
=
SMatrix
.
fromList
(
diag
++
triplets
)
graphMatrix
(
FiniteGraph
g
)
reflexive
=
adj
where
triplets
=
[
(
i
,
j
,
1.0
)
|
i
<-
nodes
g
,
j
<-
neighbors
g
i
]
where
diag
=
if
isReflexive
!
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
)]
]
then
[
(
i
,
i
,
1.0
)
|
i
<-
[
0
..
(
n
-
1
)]
]
else
[]
else
[]
n
=
fromIntegral
$
natVal
(
Proxy
::
Proxy
n
)
n
=
fromIntegral
$
natVal
(
Proxy
::
Proxy
n
)
symTransition
::
KnownNat
n
=>
SMatrix
.
Matrix
n
n
Double
->
SMatrix
.
Matrix
n
n
Double
transition
symTransition
m
=
SMatrix
.
imap
::
KnownNat
n
=>
SMatrix
.
Matrix
n
n
Double
->
SMatrix
.
Matrix
n
n
Double
transition
m
=
SMatrix
.
imap
(
\
i
j
_
->
1
/
fromIntegral
(
SMatrix
.
nnzCol
m
j
))
(
\
i
j
_
->
1
/
fromIntegral
(
SMatrix
.
nnzCol
m
j
))
m
m
...
@@ -135,40 +133,14 @@ instance KnownNat n => Show (SimilarityMatrix n) where
...
@@ -135,40 +133,14 @@ instance KnownNat n => Show (SimilarityMatrix n) where
show
(
SimMod
m
)
=
show
m
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
proxemie
::
KnownNat
n
=>
Length
=>
Length
->
SMatrix
.
Matrix
n
n
Double
->
SMatrix
.
Matrix
n
n
Double
->
ProxemyMatrix
n
->
ProxemyMatrix
n
proxemie
l
!
tm
=
trace
"proxemie"
$
case
l
<=
1
of
proxemie
l
!
tm
=
case
l
<=
1
of
True
->
tm
True
->
tm
False
->
case
iterate
(
SMatrix
.
mul
tm
)
tm
Prelude
.!!
(
l
-
1
)
of
False
->
iterate
(
SMatrix
.
mul
tm
)
tm
Prelude
.!!
(
l
-
1
)
tm'
->
trace
"proxemie OK"
tm'
---------------------------------------------------------------
---------------------------------------------------------------
matconf
::
forall
n
.
KnownNat
n
matconf
::
forall
n
.
KnownNat
n
...
@@ -176,7 +148,7 @@ matconf :: forall n. KnownNat n
...
@@ -176,7 +148,7 @@ matconf :: forall n. KnownNat n
->
SMatrix
.
Matrix
n
n
Double
->
SMatrix
.
Matrix
n
n
Double
->
ProxemyMatrix
n
->
ProxemyMatrix
n
->
ConfluenceMatrix
n
->
ConfluenceMatrix
n
matconf
False
a
p
=
seq
a
$
seq
p
$
trace
"matconf"
confmat
matconf
False
a
p
=
seq
a
$
seq
p
$
confmat
where
where
vcount
=
natToInt
@
n
vcount
=
natToInt
@
n
sumdeg
=
fromIntegral
(
SMatrix
.
nonZeros
a
)
sumdeg
=
fromIntegral
(
SMatrix
.
nonZeros
a
)
...
@@ -192,7 +164,7 @@ matconf False a p = seq a $ seq p $ trace "matconf" confmat
...
@@ -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
)
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
x
y
conf
DMatrix
.
unsafeWriteMatrix
m
y
x
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"
matconf
True
_a
_p
=
panic
"MatConf True: TODO but not needed for now"
confAt
confAt
...
@@ -202,7 +174,7 @@ confAt
...
@@ -202,7 +174,7 @@ confAt
->
SMatrix
.
Matrix
n
n
Double
-- ^ adjacency
->
SMatrix
.
Matrix
n
n
Double
-- ^ adjacency
->
SMatrix
.
Matrix
n
n
Double
-- ^ proxemie
->
SMatrix
.
Matrix
n
n
Double
-- ^ proxemie
->
Int
->
Int
->
Double
->
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
)
where
deg_x
=
fromIntegral
(
SMatrix
.
nnzCol
adj
x
)
deg_y
=
fromIntegral
(
SMatrix
.
nnzCol
adj
y
)
deg_y
=
fromIntegral
(
SMatrix
.
nnzCol
adj
y
)
sumdeg
=
fromIntegral
(
SMatrix
.
nonZeros
adj
)
sumdeg
=
fromIntegral
(
SMatrix
.
nonZeros
adj
)
...
@@ -219,29 +191,6 @@ confAt beta adj prox x y = conf
...
@@ -219,29 +191,6 @@ confAt beta adj prox x y = conf
|
otherwise
=
|
otherwise
=
conf
-
(
deg_x
-
1
)
*
(
deg_y
-
1
)
/
ecount
-
beta
*
(
1
-
conf
)
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
UnsortedEdges
=
[(
Node
,
Node
,
Double
)]
type
SortedEdges
=
[(
Node
,
Node
,
Double
)]
type
SortedEdges
=
[(
Node
,
Node
,
Double
)]
...
@@ -255,14 +204,13 @@ edges_confluence :: forall n a b.
...
@@ -255,14 +204,13 @@ edges_confluence :: forall n a b.
->
SMatrix
.
Matrix
n
n
Double
-- adjacency
->
SMatrix
.
Matrix
n
n
Double
-- adjacency
->
SMatrix
.
Matrix
n
n
Double
-- transition
->
SMatrix
.
Matrix
n
n
Double
-- transition
->
UnsortedEdges
->
UnsortedEdges
edges_confluence
l
(
FiniteGraph
g
)
am
tm
=
trace
"edges_confluence"
$
edges_confluence
l
(
FiniteGraph
g
)
am
tm
=
map
f
(
edges
g
)
map
f
(
edges
g
)
where
where
vcount
=
natToInt
@
n
vcount
=
natToInt
@
n
sumdeg_m2
=
fromIntegral
(
SMatrix
.
nonZeros
am
-
2
)
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
)
let
!
deg_x_m1
=
fromIntegral
(
SMatrix
.
nnzCol
am
x
-
1
)
!
deg_y_m1
=
fromIntegral
(
SMatrix
.
nnzCol
am
y
-
1
)
!
deg_y_m1
=
fromIntegral
(
SMatrix
.
nnzCol
am
y
-
1
)
v
=
SMatrix
.
asColumn
(
SVector
.
singleton
y
1
)
v
=
SMatrix
.
asColumn
(
SVector
.
singleton
y
1
)
...
@@ -275,21 +223,10 @@ edges_confluence l (FiniteGraph g) am tm = trace "edges_confluence" $
...
@@ -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
)
conf
=
(
prox_y_x_length
-
prox_y_x_infini
)
/
(
prox_y_x_length
+
prox_y_x_infini
)
in
seq
conf
(
x
,
y
,
conf
)
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
sort_edges
::
Int
->
UnsortedEdges
->
UnsortedEdges
->
SortedEdges
->
SortedEdges
sort_edges
n
=
List
.
sortBy
(
\
a
b
->
confCompare
a
b
<>
comparing
xnpy
a
b
)
sort_edges
n
=
List
.
sortBy
(
\
a
b
->
confCompare
a
b
<>
comparing
xnpy
a
b
)
-- . List.filter (\(x,y,_) -> x < y)
where
where
third
third
::
forall
a
b
c
::
forall
a
b
c
...
@@ -331,7 +268,6 @@ data MClustering s =
...
@@ -331,7 +268,6 @@ data MClustering s =
,
mindex
::
VU
.
MVector
s
Int
,
mindex
::
VU
.
MVector
s
Int
,
mscore
::
VU
.
MVector
s
Double
-- 1-entry array, total score
,
mscore
::
VU
.
MVector
s
Double
-- 1-entry array, total score
,
mnumcl
::
VU
.
MVector
s
Int
-- 1-entry array, #clusters
,
mnumcl
::
VU
.
MVector
s
Int
-- 1-entry array, #clusters
-- TODO: mode?
}
}
newMClustering
::
Int
->
ST
s
(
MClustering
s
)
newMClustering
::
Int
->
ST
s
(
MClustering
s
)
...
@@ -375,7 +311,7 @@ clusteringStep beta adj prox mclust (x, y) = do
...
@@ -375,7 +311,7 @@ clusteringStep beta adj prox mclust (x, y) = do
(
return
()
)
(
return
()
)
ys
ys
where
f
x
y
=
2
*
confAt
beta
adj
prox
x
y
where
f
x
y
=
confAt
beta
adj
prox
x
y
clusteringCollector
clusteringCollector
::
forall
s
(
n
::
Nat
)
.
::
forall
s
(
n
::
Nat
)
.
...
@@ -386,7 +322,7 @@ clusteringCollector
...
@@ -386,7 +322,7 @@ clusteringCollector
->
MClustering
s
->
MClustering
s
->
ST
s
(
Dict
IntSet
,
Double
)
->
ST
s
(
Dict
IntSet
,
Double
)
clusteringCollector
beta
adj
prox
mclust
=
do
clusteringCollector
beta
adj
prox
mclust
=
do
nclust
<-
trace
"counting non empty clusters"
$
MV
.
foldl'
nclust
<-
MV
.
foldl'
(
\
n_acc
mpart
->
(
\
n_acc
mpart
->
if
isNothing
mpart
if
isNothing
mpart
then
n_acc
then
n_acc
...
@@ -394,14 +330,14 @@ clusteringCollector beta adj prox mclust = do
...
@@ -394,14 +330,14 @@ clusteringCollector beta adj prox mclust = do
)
)
0
0
(
mparts
mclust
)
(
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
let
go
new_i
_old_i
Nothing
=
return
new_i
go
new_i
old_i
(
Just
p
)
=
do
go
new_i
old_i
(
Just
p
)
=
do
MV
.
unsafeWrite
newClusts
new_i
(
Just
p
)
MV
.
unsafeWrite
newClusts
new_i
(
Just
p
)
return
(
new_i
+
1
)
return
(
new_i
+
1
)
MV
.
ifoldM'
go
0
(
mparts
mclust
)
MV
.
ifoldM'
go
0
(
mparts
mclust
)
mat_delta
<-
trace
"creating delta matrix"
$
DMatrix
.
newMatrix
(
negate
maxDouble
)
nclust
nclust
mat_delta
<-
DMatrix
.
newMatrix
(
negate
maxDouble
)
nclust
nclust
trace
"filling delta matrix"
$
forM_
[
0
..
(
nclust
-
1
)]
$
\
i
->
forM_
[
0
..
(
nclust
-
1
)]
$
\
i
->
forM_
[(
i
+
1
)
..
(
nclust
-
1
)]
$
\
j
->
do
forM_
[(
i
+
1
)
..
(
nclust
-
1
)]
$
\
j
->
do
DMatrix
.
unsafeWriteMatrix
mat_delta
i
j
0
DMatrix
.
unsafeWriteMatrix
mat_delta
i
j
0
part_i
<-
MV
.
unsafeRead
newClusts
i
part_i
<-
MV
.
unsafeRead
newClusts
i
...
@@ -409,7 +345,7 @@ clusteringCollector beta adj prox mclust = do
...
@@ -409,7 +345,7 @@ clusteringCollector beta adj prox mclust = do
forPart
part_i
$
\
x
->
forPart
part_i
$
\
x
->
forPart
part_j
$
\
y
->
forPart
part_j
$
\
y
->
DMatrix
.
modifyMatrix
mat_delta
i
j
$
\
a
->
a
+
confAt
beta
adj
prox
x
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
)]
let
clusts
=
IntSet
.
fromList
[
0
..
(
nclust
-
1
)]
argmaxRow
i
=
do
argmaxRow
i
=
do
foldM
(
\
acc
@
(
max_j
,
!
max_v
)
j
->
do
foldM
(
\
acc
@
(
max_j
,
!
max_v
)
j
->
do
...
@@ -444,11 +380,11 @@ clusteringCollector beta adj prox mclust = do
...
@@ -444,11 +380,11 @@ clusteringCollector beta adj prox mclust = do
merges'
merges'
(
delta
+
delta'
)
(
delta
+
delta'
)
else
return
(
cs
,
merges
,
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
)
)
let
groups
=
[
(
i
,
maybe
[]
IntSet
.
toList
(
IntMap
.
lookup
i
merges
)
)
|
i
<-
IntSet
.
toList
cs
|
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
IntMap
.
singleton
i
.
maybe
IntSet
.
empty
partElems
<$>
MV
.
unsafeRead
newClusts
i
c
<-
foldGroups
groups
clustsDict
$
\
dict
(
i
,
js
)
->
do
c
<-
foldGroups
groups
clustsDict
$
\
dict
(
i
,
js
)
->
do
sets_i
<-
traverse
(
fmap
(
maybe
IntSet
.
empty
partElems
)
.
MV
.
unsafeRead
newClusts
)
js
sets_i
<-
traverse
(
fmap
(
maybe
IntSet
.
empty
partElems
)
.
MV
.
unsafeRead
newClusts
)
js
...
@@ -467,9 +403,9 @@ clusteringCollector beta adj prox mclust = do
...
@@ -467,9 +403,9 @@ clusteringCollector beta adj prox mclust = do
forPart
(
Just
p
)
f
=
forPart
(
Just
p
)
f
=
IntSet
.
foldr
(
\
i
acc
->
f
i
>>
acc
)
(
return
()
)
(
partElems
p
)
IntSet
.
foldr
(
\
i
acc
->
f
i
>>
acc
)
(
return
()
)
(
partElems
p
)
data
Clust
=
Clust
data
Clust
a
=
Clust
{
cparts
::
!
(
Dict
IntSet
)
{
cparts
::
!
(
Dict
IntSet
)
,
cindex
::
!
(
VU
.
Vector
Int
)
,
cindex
::
!
(
Dict
a
)
,
cscore
::
{-# UNPACK #-}
!
Double
,
cscore
::
{-# UNPACK #-}
!
Double
}
deriving
(
Show
,
Eq
)
}
deriving
(
Show
,
Eq
)
...
@@ -481,11 +417,11 @@ runClustering
...
@@ -481,11 +417,11 @@ runClustering
->
SMatrix
.
Matrix
n
n
Double
-- ^ proxemie
->
SMatrix
.
Matrix
n
n
Double
-- ^ proxemie
->
SortedEdges
->
SortedEdges
->
(
Dict
IntSet
,
Double
)
->
(
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
mclust
<-
newMClustering
n
forM_
se
$
\
(
x
,
y
,
_
)
->
clusteringStep
beta
adj
prox
mclust
(
x
,
y
)
forM_
se
$
\
(
x
,
y
,
_
)
->
clusteringStep
beta
adj
prox
mclust
(
x
,
y
)
if
gc
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
)
else
do
cps
<-
V
.
unsafeFreeze
(
mparts
mclust
)
let
cps'
=
Dict
.
fromList
let
cps'
=
Dict
.
fromList
[
(
n
,
xs
)
[
(
n
,
xs
)
...
@@ -495,12 +431,8 @@ runClustering gc beta adj prox se = trace "clustering starts" $ runST $ do
...
@@ -495,12 +431,8 @@ runClustering gc beta adj prox se = trace "clustering starts" $ runST $ do
return
(
cps'
,
sc
)
return
(
cps'
,
sc
)
where
n
=
fromIntegral
$
natVal
(
Proxy
::
Proxy
n
)
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
data
Clustering
a
=
ClusteringIs
{
parts
::
!
(
Dict
(
Set
a
))
=
ClusteringIs
{
parts
::
!
(
Dict
(
Set
a
))
...
...
src/Graph/Tools/Import.hs
View file @
178eb573
...
@@ -10,6 +10,7 @@ Portability : POSIX
...
@@ -10,6 +10,7 @@ Portability : POSIX
-}
-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE NoImplicitPrelude #-}
...
@@ -39,31 +40,33 @@ import Data.Reflection
...
@@ -39,31 +40,33 @@ import Data.Reflection
import
qualified
Data.IntMap.Strict
as
IntMap
import
qualified
Data.IntMap.Strict
as
IntMap
------------------------------------------------------------------------
------------------------------------------------------------------------
data
GetGraph
=
WithFile
{
filepath
::
FilePath
}
data
GetGraph
a
b
where
|
Random
Int
WithFile
::
{
filepath
::
FilePath
}
->
GetGraph
[
Text
]
Double
Random
::
Int
->
GetGraph
()
()
data
GraphData
=
LightGraph
{
lightGraph
::
Graph
()
()
}
data
GraphData
a
b
where
|
LabelledGraph
{
labelledGraph
::
Graph
[
Text
]
Double
}
LightGraph
deriving
(
Show
)
::
{
lightGraph
::
Graph
()
()
}
->
GraphData
()
()
LabelledGraph
::
{
labelledGraph
::
Graph
[
Text
]
Double
}
->
GraphData
[
Text
]
Double
getGraph
::
GetGraph
->
IO
GraphData
getGraph
'
::
GetGraph
a
b
->
IO
(
GraphData
a
b
)
getGraph
(
Random
n
)
=
reifyNat
(
fromIntegral
n
)
$
\
(
pn
::
Proxy
n
)
->
getGraph
'
(
Random
n
)
=
reifyNat
(
fromIntegral
n
)
$
\
(
pn
::
Proxy
n
)
->
randomAdjacency
@
n
randomAdjacency
@
n
>>=
\
m
->
pure
$
LightGraph
>>=
\
m
->
pure
$
LightGraph
$
mkGraphUfromEdges
$
mkGraphUfromEdges
$
List
.
map
(
\
(
x
,
y
,
_
)
->
(
x
,
y
))
$
List
.
map
(
\
(
x
,
y
,
_
)
->
(
x
,
y
))
$
SMatrix
.
toList
m
$
SMatrix
.
toList
m
getGraph
(
WithFile
fp
)
=
do
getGraph
'
(
WithFile
fp
)
=
do
g
<-
readFileGraph
CillexGraph
fp
g
<-
readFileGraph
CillexGraph
fp
pure
$
LabelledGraph
g
pure
$
LabelledGraph
g
get
UnlabGraph
::
GetGraph
->
IO
(
Dict
[
Text
],
Graph
()
()
)
get
Graph
::
GetGraph
a
b
->
IO
(
Graph
a
b
)
get
UnlabGraph
gg
=
getUnlabGraph'
<$>
getGraph
gg
get
Graph
gg
=
toGraph'
<$>
getGraph'
gg
getUnlabGraph'
::
GraphData
->
(
Dict
[
Text
],
Graph
()
()
)
toGraph'
::
GraphData
a
b
->
Graph
a
b
getUnlabGraph'
(
LightGraph
g
)
=
(
Dict
.
empty
,
g
)
toGraph'
(
LightGraph
g
)
=
g
getUnlabGraph'
(
LabelledGraph
g
)
=
(
dico
,
Graph
.
unlab
g
)
toGraph'
(
LabelledGraph
g
)
=
g
where
dico
=
IntMap
.
fromList
(
Graph
.
labNodes
g
)
test/Main.hs
View file @
178eb573
...
@@ -24,33 +24,33 @@ import qualified Data.IntSet as IntSet
...
@@ -24,33 +24,33 @@ import qualified Data.IntSet as IntSet
main
::
IO
()
main
::
IO
()
main
=
hspec
$
do
main
=
return
()
--
hspec $ do
describe
"Graph Toy first test"
$
do
--
describe "Graph Toy first test" $ do
let
edges_test
::
[(
Int
,
Int
)]
--
let edges_test :: [(Int,Int)]
edges_test
=
[(
0
,
1
),(
0
,
2
),(
0
,
4
),(
0
,
5
),(
0
,
3
),(
0
,
6
)
--
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
)
--
,(1,2),(1,3),(2,3),(4,5),(4,6),(5,6)
,(
7
,
8
),(
7
,
3
),(
7
,
4
),(
8
,
2
),(
8
,
5
)
--
,(7,8),(7,3),(7,4),(8,2),(8,5)
]
--
]
clustering_result
=
--
clustering_result =
Clust
--
Clust
{
cparts
=
Dict
.
fromList
--
{ cparts = Dict.fromList
[
(
0
,
IntSet
.
fromList
[
0
,
4
,
5
,
6
])
--
[ (0, IntSet.fromList [0,4,5,6])
,
(
1
,
IntSet
.
fromList
[
1
,
2
,
3
])
--
, (1, IntSet.fromList [1,2,3])
,
(
7
,
IntSet
.
fromList
[
7
,
8
])
--
, (7, IntSet.fromList [7,8])
]
--
]
,
cindex
=
VU
.
fromList
[
0
,
1
,
1
,
1
,
0
,
0
,
0
,
7
,
7
]
-- , cindex = Dict.fromList [(0, 0)
, 1, 1, 1, 0, 0, 0, 7, 7]
,
cscore
=
3.0558391780792453
--
, cscore = 3.0558391780792453
}
--
}
g
::
Graph
()
()
--
g :: Graph () ()
g
=
mkGraphUfromEdges
edges_test
--
g = mkGraphUfromEdges edges_test
result
=
withG
g
(
\
fg
->
identity
$
clusteringOptim
3
Conf
fg
beta
)
-- result = withG g (\fg -> clusteringOptim 3
fg beta)
it
"Graph Toy test exact result"
$
do
--
it "Graph Toy test exact result" $ do
result
`
shouldBe
`
clustering_result
--
result `shouldBe` clustering_result
where
beta
=
0.0
--
where beta = 0.0
{-
{-
m <- randomAdjacency
m <- randomAdjacency
describe "Random Matrix of fixed size (TODO dynamic size)" $ do
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