Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
haskell-gargantext
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
175
Issues
175
List
Board
Labels
Milestones
Merge Requests
10
Merge Requests
10
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-gargantext
Commits
1179d082
Commit
1179d082
authored
Mar 04, 2019
by
Quentin Lobbé
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add all the matching Childs/Parents mecanism
parent
38fc228b
Pipeline
#250
failed with stage
Changes
3
Pipelines
1
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
130 additions
and
60 deletions
+130
-60
Phylo.hs
src/Gargantext/Viz/Phylo.hs
+6
-0
Example.hs
src/Gargantext/Viz/Phylo/Example.hs
+101
-56
Tools.hs
src/Gargantext/Viz/Phylo/Tools.hs
+23
-4
No files found.
src/Gargantext/Viz/Phylo.hs
View file @
1179d082
...
...
@@ -178,6 +178,12 @@ data PhyloError = LevelDoesNotExist
|
LevelUnassigned
deriving
(
Show
)
data
Proximity
=
WeightedLogJaccard
|
Other
data
PairTo
=
Childs
|
Parents
-- | Lenses
makeLenses
''
P
hylo
makeLenses
''
P
hyloParam
...
...
src/Gargantext/Viz/Phylo/Example.hs
View file @
1179d082
...
...
@@ -30,7 +30,7 @@ module Gargantext.Viz.Phylo.Example where
import
Control.Lens
hiding
(
makeLenses
,
both
,
Level
)
import
Data.Bool
(
Bool
,
not
)
import
Data.List
(
concat
,
union
,
intersect
,
tails
,
tail
,
head
,
last
,
null
,
zip
,
sort
,
length
,
any
,
(
++
),
(
!!
),
nub
,
sortOn
,
reverse
)
import
Data.List
(
concat
,
union
,
intersect
,
tails
,
tail
,
head
,
last
,
null
,
zip
,
sort
,
length
,
any
,
(
++
),
(
!!
),
nub
,
sortOn
,
reverse
,
splitAt
,
take
)
import
Data.Map
(
Map
,
elems
,
member
,
adjust
,
singleton
,
(
!
),
keys
,
restrictKeys
,
mapWithKey
)
import
Data.Semigroup
(
Semigroup
)
import
Data.Set
(
Set
)
...
...
@@ -55,15 +55,110 @@ import qualified Data.Vector as Vector
------------------------------------------------------------------------
-- | STEP 1
2
| -- Incrementaly cluster the PhyloGroups n times, link them through the Periods and build level n of the Phylo
-- | STEP 1
3
| -- Incrementaly cluster the PhyloGroups n times, link them through the Periods and build level n of the Phylo
------------------------------------------------------------------------
-- | STEP 1
1
| -- Cluster the Fis
-- | STEP 1
2
| -- Cluster the Fis
------------------------------------------------------------------------
-- | STEP 10 | -- Link the PhyloGroups of level 1 through the Periods
-- | STEP 11 | -- Link the PhyloGroups of level 1 through the Periods
-- | To process the weightedLogJaccard between two PhyloGroups
weightedLogJaccard
::
PhyloGroup
->
PhyloGroup
->
(
PhyloGroupId
,
Double
)
weightedLogJaccard
group
group'
=
(
getGroupId
group'
,
1
)
-- | To apply the corresponding proximity function based on a given Proximity
getProximity
::
Proximity
->
PhyloGroup
->
PhyloGroup
->
(
PhyloGroupId
,
Double
)
getProximity
p
group
group'
=
case
p
of
WeightedLogJaccard
->
weightedLogJaccard
group
group'
Other
->
undefined
_
->
panic
(
"[ERR][Viz.Phylo.Example.getProximity] Proximity function not defined"
)
-- | To get the next or previous PhyloPeriod based on a given PhyloPeriodId
getNextPeriods
::
PairTo
->
PhyloPeriodId
->
[
PhyloPeriodId
]
->
[
PhyloPeriodId
]
getNextPeriods
to
id
l
=
case
to
of
Childs
->
(
tail
.
snd
)
next
Parents
->
(
reverse
.
fst
)
next
_
->
panic
(
"[ERR][Viz.Phylo.Example.getNextPeriods] PairTo type not defined"
)
where
--------------------------------------
next
::
([
PhyloPeriodId
],
[
PhyloPeriodId
])
next
=
splitAt
idx
l
--------------------------------------
idx
::
Int
idx
=
case
(
List
.
elemIndex
id
l
)
of
Nothing
->
panic
(
"[ERR][Viz.Phylo.Example.getNextPeriods] PhyloPeriodId not defined"
)
Just
i
->
i
--------------------------------------
-- | To find the best set (max = 2) of Childs/Parents candidates based on a given Proximity mesure until a maximum depth (max = Period + 5 units )
findBestCandidates
::
PairTo
->
Int
->
Int
->
Double
->
PhyloGroup
->
Phylo
->
[(
PhyloGroupId
,
Double
)]
findBestCandidates
to
depth
max
thr
group
p
|
depth
>
max
||
(
null
.
head
)
next
=
[]
|
(
not
.
null
)
best
=
take
2
best
|
otherwise
=
findBestCandidates
to
(
depth
+
1
)
max
thr
group
p
where
--------------------------------------
next
::
[
PhyloPeriodId
]
next
=
getNextPeriods
to
(
getGroupPeriod
group
)
(
getPhyloPeriods
p
)
--------------------------------------
candidates
::
[
PhyloGroup
]
candidates
=
getGroupsWithFilters
(
getGroupLevel
group
)
(
head
next
)
p
--------------------------------------
scores
::
[(
PhyloGroupId
,
Double
)]
scores
=
map
(
\
group'
->
getProximity
WeightedLogJaccard
group
group'
)
candidates
--------------------------------------
best
::
[(
PhyloGroupId
,
Double
)]
best
=
reverse
$
sortOn
snd
$
filter
(
\
(
id
,
s
)
->
s
>=
thr
)
scores
--------------------------------------
-- | To add a new list of Pointers into an existing Childs/Parents list of Pointers
makePair
::
PairTo
->
PhyloGroup
->
[(
PhyloGroupId
,
Double
)]
->
PhyloGroup
makePair
to
group
ids
=
case
to
of
Childs
->
over
(
phylo_groupPeriodChilds
)
addPointers
group
Parents
->
over
(
phylo_groupPeriodParents
)
addPointers
group
_
->
panic
(
"[ERR][Viz.Phylo.Example.makePair] PairTo type not defined"
)
where
--------------------------------------
addPointers
::
[
Pointer
]
->
[
Pointer
]
addPointers
l
=
nub
$
(
l
++
ids
)
--------------------------------------
-- | To pair all the Phylogroups of given PhyloLevel to their best Parents or Childs
pairGroupsToGroups
::
PairTo
->
Level
->
Double
->
Phylo
->
Phylo
pairGroupsToGroups
to
lvl
thr
p
=
alterPhyloGroupsWith
(
\
groups
->
map
(
\
group
->
let
--------------------------------------
candidates
::
[(
PhyloGroupId
,
Double
)]
candidates
=
findBestCandidates
to
1
5
thr
group
p
--------------------------------------
in
makePair
to
group
candidates
)
groups
)
getGroupLevel
(
getLevelValue
lvl
)
p
phyloWithPair_1_Childs
::
Phylo
phyloWithPair_1_Childs
=
pairGroupsToGroups
Childs
(
initLevel
1
Level_1
)
0.5
phyloLinked_0_1
phyloWithPair_1_Parents
::
Phylo
phyloWithPair_1_Parents
=
pairGroupsToGroups
Parents
(
initLevel
1
Level_1
)
0.5
phyloLinked_0_1
------------------------------------------------------------------------
-- | STEP 10 | -- Build the coocurency Matrix of the Phylo
-- | Are two PhyloGroups sharing at leats one Ngrams
...
...
@@ -112,59 +207,9 @@ fisToCooc m p = map (/docs)
cooc
=
Map
.
fromList
$
map
(
\
x
->
(
x
,
0
))
(
listToCombi
(
\
x
->
ngramsToIdx
x
p
)
fisNgrams
)
--------------------------------------
data
Proximity
=
WeightedLogJaccard
|
Other
data
Candidates
=
Childs
|
Parents
weightedLogJaccard
::
PhyloGroup
->
PhyloGroup
->
(
PhyloGroupId
,
Double
)
weightedLogJaccard
group
group'
=
(
getGroupId
group'
,
1
)
getProximity
::
Proximity
->
PhyloGroup
->
PhyloGroup
->
(
PhyloGroupId
,
Double
)
getProximity
p
group
group'
=
case
p
of
WeightedLogJaccard
->
weightedLogJaccard
group
group'
Other
->
undefined
_
->
panic
(
"[ERR][Viz.Phylo.Example.getProximity] Proximity function not defined"
)
getPhyloPeriods
::
Phylo
->
[
PhyloPeriodId
]
getPhyloPeriods
p
=
map
_phylo_periodId
$
view
(
phylo_periods
)
p
-- | Trouver un moyen de naviguer dans la liste des périodes next or prévious depuis getCandidates
-- | lié getCandidates à pair group
-- | faire rentrer de la récurence de profondeur 5 au plus dans pair group
-- | faire le jaccard
-- | faire les pointeurs
-- | faire l'amont de pair group
-- | faire le double sens
getCandidates
::
Candidates
->
PhyloGroup
->
Phylo
->
[
PhyloGroup
]
getCandidates
c
group
p
=
getGroupsWithFilters
(
getGroupLevel
group
)
prd
p
where
--------------------------------------
prd
=
case
c
of
Childs
->
getGroupPeriod
group
Parents
->
getGroupPeriod
group
_
->
panic
(
"[ERR][Viz.Phylo.Example.getCandidates] Candidates type not defined"
)
pairGroupToGroups
::
Double
->
PhyloGroup
->
[
PhyloGroup
]
->
PhyloGroup
pairGroupToGroups
thr
group
l
=
if
(
not
.
null
)
$
keepBest
thr
scores
then
group
else
group
where
--------------------------------------
scores
::
[(
PhyloGroupId
,
Double
)]
scores
=
map
(
\
group'
->
getProximity
WeightedLogJaccard
group
group'
)
l
--------------------------------------
keepBest
::
Double
->
[(
PhyloGroupId
,
Double
)]
->
[(
PhyloGroupId
,
Double
)]
keepBest
thr
l
=
reverse
$
sortOn
snd
$
filter
(
\
(
id
,
s
)
->
s
>=
thr
)
l
--------------------------------------
phylo
WithAppariement1
::
Phylo
phylo
WithAppariement1
=
phyloLinked_0_1
phylo
Cooc
::
Map
(
Int
,
Int
)
Double
phylo
Cooc
=
fisToCooc
phyloFisFiltered
phyloLinked_0_1
------------------------------------------------------------------------
...
...
src/Gargantext/Viz/Phylo/Tools.hs
View file @
1179d082
...
...
@@ -50,6 +50,19 @@ alterPhyloGroups f p = over ( phylo_periods
.
phylo_levelGroups
)
f
p
-- | To alter a sub list of PhyloGroups (filtered) following a given function
alterPhyloGroupsWith
::
Eq
a
=>
([
PhyloGroup
]
->
[
PhyloGroup
])
->
(
PhyloGroup
->
a
)
->
a
->
Phylo
->
Phylo
alterPhyloGroupsWith
f
f'
x
p
=
over
(
phylo_periods
.
traverse
.
phylo_periodLevels
.
traverse
.
phylo_levelGroups
)
(
f
.
subGroups
)
p
where
--------------------------------------
subGroups
::
[
PhyloGroup
]
->
[
PhyloGroup
]
subGroups
l
=
filterGroups
f'
x
l
--------------------------------------
-- | To alter each PhyloPeriod of a Phylo following a given function
alterPhyloPeriods
::
(
PhyloPeriod
->
PhyloPeriod
)
->
Phylo
->
Phylo
...
...
@@ -93,8 +106,8 @@ doesContainsOrd l l'
-- | To filter the PhyloGroup of a Phylo according to a function and a value
filterGroups
::
Eq
a
=>
(
PhyloGroup
->
a
)
->
a
->
Phylo
->
[
PhyloGroup
]
filterGroups
f
x
p
=
filter
(
\
g
->
(
f
g
)
==
x
)
(
getGroups
p
)
filterGroups
::
Eq
a
=>
(
PhyloGroup
->
a
)
->
a
->
[
PhyloGroup
]
->
[
PhyloGroup
]
filterGroups
f
x
l
=
filter
(
\
g
->
(
f
g
)
==
x
)
l
-- | To filter nested Sets of a
...
...
@@ -139,9 +152,9 @@ getGroups = view ( phylo_periods
-- | To get all the PhyloGroup of a Phylo with a given level and period
getGroupsWithFilters
::
Int
->
(
Date
,
Date
)
->
Phylo
->
[
PhyloGroup
]
getGroupsWithFilters
lvl
prd
p
=
(
filterGroups
getGroupLevel
lvl
p
)
getGroupsWithFilters
lvl
prd
p
=
(
filterGroups
getGroupLevel
lvl
(
getGroups
p
)
)
`
intersect
`
(
filterGroups
getGroupPeriod
prd
p
)
(
filterGroups
getGroupPeriod
prd
(
getGroups
p
)
)
-- | To get the index of an element of a Vector
...
...
@@ -187,6 +200,12 @@ getPhyloNgrams :: Phylo -> PhyloNgrams
getPhyloNgrams
=
_phylo_ngrams
-- | To get all the PhyloPeriodIds of a Phylo
getPhyloPeriods
::
Phylo
->
[
PhyloPeriodId
]
getPhyloPeriods
p
=
map
_phylo_periodId
$
view
(
phylo_periods
)
p
-- | To create a PhyloGroup in a Phylo out of a list of Ngrams and a set of parameters
initGroup
::
[
Ngrams
]
->
Text
->
Int
->
Int
->
Int
->
Int
->
Phylo
->
PhyloGroup
initGroup
ngrams
lbl
idx
lvl
from
to
p
=
PhyloGroup
...
...
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