2 Module : Gargantext.Viz.Phylo.Tools
3 Description : Phylomemy Tools to build/manage it
4 Copyright : (c) CNRS, 2017-Present
5 License : AGPL + CECILL v3
6 Maintainer : team@gargantext.org
7 Stability : experimental
13 {-# LANGUAGE FlexibleContexts #-}
14 {-# LANGUAGE NoImplicitPrelude #-}
15 {-# LANGUAGE OverloadedStrings #-}
16 {-# LANGUAGE RankNTypes #-}
17 {-# LANGUAGE ViewPatterns #-}
19 module Gargantext.Viz.Phylo.Tools
22 import Control.Lens hiding (both, Level, Empty)
23 import Data.List (filter, intersect, (++), sort, null, tail, last, tails, delete, nub, sortOn, nubBy)
24 import Data.Maybe (mapMaybe,fromMaybe)
25 import Data.Map (Map, mapKeys, member, (!))
27 import Data.Text (Text,toLower,unwords)
28 import Data.Tuple.Extra
29 import Data.Vector (Vector,elemIndex)
30 import Gargantext.Prelude
31 import Gargantext.Viz.Phylo
32 import qualified Data.Map as Map
33 import qualified Data.Set as Set
34 import qualified Data.Vector as Vector
42 -- | Define a default value
43 def :: a -> Maybe a -> a
47 -- | Does a List of Sets contains at least one Set of an other List
48 doesAnySetContains :: Eq a => Set a -> [Set a] -> [Set a] -> Bool
49 doesAnySetContains h l l' = any (\c -> doesContains (Set.toList c) (Set.toList h)) (l' ++ l)
52 -- | Does a list of A contains an other list of A
53 doesContains :: Eq a => [a] -> [a] -> Bool
56 | length l' > length l = False
57 | elem (head' "doesContains" l') l = doesContains l (tail l')
61 -- | Does a list of ordered A contains an other list of ordered A
62 doesContainsOrd :: Eq a => Ord a => [a] -> [a] -> Bool
65 | last l < (head' "doesContainsOrd" l') = False
66 | (head' "doesContainsOrd" l') `elem` l = True
67 | otherwise = doesContainsOrd l (tail l')
70 -- | To filter nested Sets of a
71 filterNestedSets :: Eq a => Set a -> [Set a] -> [Set a] -> [Set a]
72 filterNestedSets h l l'
73 | null l = if doesAnySetContains h l l'
76 | doesAnySetContains h l l' = filterNestedSets (head' "filterNestedSets1" l) (tail l) l'
77 | otherwise = filterNestedSets (head' "filterNestedSets2" l) (tail l) (h : l')
81 -- | To get the good pair of keys (x,y) or (y,x) in a given Map (a,b) c
82 getKeyPair :: (Int,Int) -> Map (Int,Int) a -> (Int,Int)
83 getKeyPair (x,y) m = case findPair (x,y) m of
84 Nothing -> panic "[ERR][Viz.Phylo.Example.getKeyPair] Nothing"
87 --------------------------------------
88 findPair :: (Int,Int) -> Map (Int,Int) a -> Maybe (Int,Int)
90 | member (x',y') m' = Just (x',y')
91 | member (y',x') m' = Just (y',x')
93 --------------------------------------
96 -- | To filter Fis with small Support but by keeping non empty Periods
97 keepFilled :: (Int -> [a] -> [a]) -> Int -> [a] -> [a]
98 keepFilled f thr l = if (null $ f thr l) && (not $ null l)
99 then keepFilled f (thr - 1) l
103 -- | To get all combinations of a list
104 listToDirectedCombi :: Eq a => [a] -> [(a,a)]
105 listToDirectedCombi l = [(x,y) | x <- l, y <- l, x /= y]
108 -- | To get all combinations of a list and apply a function to the resulting list of pairs
109 listToDirectedCombiWith :: Eq a => forall b. (a -> b) -> [a] -> [(b,b)]
110 listToDirectedCombiWith f l = [(f x,f y) | x <- l, y <- l, x /= y]
113 -- | To get the sequential combinations of an order list
114 listToSequentialCombi :: Eq a => [a] -> [(a,a)]
115 listToSequentialCombi l = nubBy (\x y -> fst x == fst y) $ listToUnDirectedCombi l
118 -- | To get all combinations of a list with no repetition
119 listToUnDirectedCombi :: [a] -> [(a,a)]
120 listToUnDirectedCombi l = [ (x,y) | (x:rest) <- tails l, y <- rest ]
123 -- | To get all combinations of a list with no repetition and apply a function to the resulting list of pairs
124 listToUnDirectedCombiWith :: forall a b. (a -> b) -> [a] -> [(b,b)]
125 listToUnDirectedCombiWith f l = [ (f x, f y) | (x:rest) <- tails l, y <- rest ]
128 -- | To transform a list of Ngrams Indexes into a Label
129 ngramsToLabel :: Vector Ngrams -> [Int] -> Text
130 ngramsToLabel ngrams l = unwords $ ngramsToText ngrams l
133 -- | To transform a list of Ngrams Indexes into a list of Text
134 ngramsToText :: Vector Ngrams -> [Int] -> [Text]
135 ngramsToText ngrams l = map (\idx -> ngrams Vector.! idx) l
138 -- | To unify the keys (x,y) that Map 1 share with Map 2 such as: (x,y) <=> (y,x)
139 unifySharedKeys :: Eq a => Ord a => Map (a,a) b -> Map (a,a) b -> Map (a,a) b
140 unifySharedKeys m1 m2 = mapKeys (\(x,y) -> if member (y,x) m2
149 -- | An analyzer ingests a Ngrams and generates a modified version of it
150 phyloAnalyzer :: Ngrams -> Ngrams
151 phyloAnalyzer n = toLower n
153 -- | To init the foundation roots of the Phylo as a Vector of Ngrams
154 initFoundationsRoots :: [Ngrams] -> Vector Ngrams
155 initFoundationsRoots l = Vector.fromList $ map phyloAnalyzer l
157 -- | To init the base of a Phylo from a List of Periods and Foundations
158 initPhyloBase :: [(Date, Date)] -> PhyloFoundations -> PhyloParam -> Phylo
159 initPhyloBase pds fds prm = Phylo ((fst . (head' "initPhyloBase")) pds, (snd . last) pds) fds (map (\pd -> initPhyloPeriod pd []) pds) prm
161 -- | To init the param of a Phylo
162 initPhyloParam :: Maybe Text -> Maybe Software -> Maybe PhyloQueryBuild -> PhyloParam
163 initPhyloParam (def defaultPhyloVersion -> v) (def defaultSoftware -> s) (def defaultQueryBuild -> q) = PhyloParam v s q
165 -- | To get the last computed Level in a Phylo
166 getLastLevel :: Phylo -> Level
167 getLastLevel p = (last . sort)
168 $ map (snd . getPhyloLevelId)
169 $ view ( phylo_periods
171 . phylo_periodLevels ) p
178 -- | To get the foundations of a Phylo
179 getFoundations :: Phylo -> PhyloFoundations
180 getFoundations = _phylo_foundations
182 -- | To get the foundations roots of a Phylo
183 getFoundationsRoots :: Phylo -> Vector Ngrams
184 getFoundationsRoots p = (getFoundations p) ^. phylo_foundationsRoots
186 -- | To get the Index of a Ngrams in the foundationsRoots of a Phylo
187 getIdxInRoots :: Ngrams -> Phylo -> Int
188 getIdxInRoots n p = case (elemIndex n (getFoundationsRoots p)) of
189 Nothing -> panic "[ERR][Viz.Phylo.Tools.getIdxInRoots] Ngrams not in foundationsRoots"
197 -- | To alter a PhyloGroup matching a given Level
198 alterGroupWithLevel :: (PhyloGroup -> PhyloGroup) -> Level -> Phylo -> Phylo
199 alterGroupWithLevel f lvl p = over ( phylo_periods
205 ) (\g -> if getGroupLevel g == lvl
210 -- | To alter each list of PhyloGroups following a given function
211 alterPhyloGroups :: ([PhyloGroup] -> [PhyloGroup]) -> Phylo -> Phylo
212 alterPhyloGroups f p = over ( phylo_periods
220 -- | To filter the PhyloGroup of a Phylo according to a function and a value
221 filterGroups :: Eq a => (PhyloGroup -> a) -> a -> [PhyloGroup] -> [PhyloGroup]
222 filterGroups f x l = filter (\g -> (f g) == x) l
225 -- | To maybe get the PhyloBranchId of a PhyloGroup
226 getGroupBranchId :: PhyloGroup -> Maybe PhyloBranchId
227 getGroupBranchId = _phylo_groupBranchId
230 -- | To get the PhyloGroups Childs of a PhyloGroup
231 getGroupChilds :: PhyloGroup -> Phylo -> [PhyloGroup]
232 getGroupChilds g p = getGroupsFromIds (getGroupPeriodChildsId g) p
235 -- | To get the id of a PhyloGroup
236 getGroupId :: PhyloGroup -> PhyloGroupId
237 getGroupId = _phylo_groupId
240 -- | To get the Cooc Matrix of a PhyloGroup
241 getGroupCooc :: PhyloGroup -> Map (Int,Int) Double
242 getGroupCooc = _phylo_groupCooc
245 -- | To get the level out of the id of a PhyloGroup
246 getGroupLevel :: PhyloGroup -> Int
247 getGroupLevel = snd . fst . getGroupId
250 -- | To get the level child pointers of a PhyloGroup
251 getGroupLevelChilds :: PhyloGroup -> [Pointer]
252 getGroupLevelChilds = _phylo_groupLevelChilds
255 -- | To get the PhyloGroups Level Childs Ids of a PhyloGroup
256 getGroupLevelChildsId :: PhyloGroup -> [PhyloGroupId]
257 getGroupLevelChildsId g = map fst $ getGroupLevelChilds g
260 -- | To get the level parent pointers of a PhyloGroup
261 getGroupLevelParents :: PhyloGroup -> [Pointer]
262 getGroupLevelParents = _phylo_groupLevelParents
265 -- | To get the PhyloGroups Level Parents Ids of a PhyloGroup
266 getGroupLevelParentsId :: PhyloGroup -> [PhyloGroupId]
267 getGroupLevelParentsId g = map fst $ getGroupLevelParents g
269 -- | To get the Meta value of a PhyloGroup
270 getGroupMeta :: Text -> PhyloGroup -> Double
271 getGroupMeta k g = (g ^. phylo_groupMeta) ! k
274 -- | To get the Ngrams of a PhyloGroup
275 getGroupNgrams :: PhyloGroup -> [Int]
276 getGroupNgrams = _phylo_groupNgrams
279 -- | To get the list of pairs (Childs & Parents) of a PhyloGroup
280 getGroupPairs :: PhyloGroup -> Phylo -> [PhyloGroup]
281 getGroupPairs g p = (getGroupChilds g p) ++ (getGroupParents g p)
284 -- | To get the PhyloGroups Parents of a PhyloGroup
285 getGroupParents :: PhyloGroup -> Phylo -> [PhyloGroup]
286 getGroupParents g p = getGroupsFromIds (getGroupPeriodParentsId g) p
289 -- | To get the period out of the id of a PhyloGroup
290 getGroupPeriod :: PhyloGroup -> (Date,Date)
291 getGroupPeriod = fst . fst . getGroupId
294 -- | To get the period child pointers of a PhyloGroup
295 getGroupPeriodChilds :: PhyloGroup -> [Pointer]
296 getGroupPeriodChilds = _phylo_groupPeriodChilds
299 -- | To get the PhyloGroups Period Parents Ids of a PhyloGroup
300 getGroupPeriodChildsId :: PhyloGroup -> [PhyloGroupId]
301 getGroupPeriodChildsId g = map fst $ getGroupPeriodChilds g
304 -- | To get the period parent pointers of a PhyloGroup
305 getGroupPeriodParents :: PhyloGroup -> [Pointer]
306 getGroupPeriodParents = _phylo_groupPeriodParents
309 -- | To get the PhyloGroups Period Parents Ids of a PhyloGroup
310 getGroupPeriodParentsId :: PhyloGroup -> [PhyloGroupId]
311 getGroupPeriodParentsId g = map fst $ getGroupPeriodParents g
314 -- | To get the pointers of a given Phylogroup
315 getGroupPointers :: EdgeType -> Filiation -> PhyloGroup -> [Pointer]
316 getGroupPointers t f g = case t of
317 PeriodEdge -> case f of
318 Ascendant -> getGroupPeriodParents g
319 Descendant -> getGroupPeriodChilds g
320 _ -> panic "[ERR][Viz.Phylo.Tools.getGroupPointers] wrong filiation"
321 LevelEdge -> case f of
322 Ascendant -> getGroupLevelParents g
323 Descendant -> getGroupLevelChilds g
324 _ -> panic "[ERR][Viz.Phylo.Tools.getGroupPointers] wrong filiation"
327 -- | To get the roots labels of a list of group ngrams
328 getGroupText :: PhyloGroup -> Phylo -> [Text]
329 getGroupText g p = ngramsToText (getFoundationsRoots p) (getGroupNgrams g)
332 -- | To get all the PhyloGroup of a Phylo
333 getGroups :: Phylo -> [PhyloGroup]
334 getGroups = view ( phylo_periods
342 -- | To get all PhyloGroups matching a list of PhyloGroupIds in a Phylo
343 getGroupsFromIds :: [PhyloGroupId] -> Phylo -> [PhyloGroup]
344 getGroupsFromIds ids p = filter (\g -> elem (getGroupId g) ids) $ getGroups p
347 -- | To get the corresponding list of PhyloGroups from a list of PhyloNodes
348 getGroupsFromNodes :: [PhyloNode] -> Phylo -> [PhyloGroup]
349 getGroupsFromNodes ns p = getGroupsFromIds (map getNodeId ns) p
352 -- | To get all the PhyloGroup of a Phylo with a given level and period
353 getGroupsWithFilters :: Int -> (Date,Date) -> Phylo -> [PhyloGroup]
354 getGroupsWithFilters lvl prd p = (getGroupsWithLevel lvl p)
356 (getGroupsWithPeriod prd p)
359 -- | To get all the PhyloGroup of a Phylo with a given Level
360 getGroupsWithLevel :: Int -> Phylo -> [PhyloGroup]
361 getGroupsWithLevel lvl p = filterGroups getGroupLevel lvl (getGroups p)
364 -- | To get all the PhyloGroup of a Phylo with a given Period
365 getGroupsWithPeriod :: (Date,Date) -> Phylo -> [PhyloGroup]
366 getGroupsWithPeriod prd p = filterGroups getGroupPeriod prd (getGroups p)
369 -- | To create a PhyloGroup in a Phylo out of a list of Ngrams and a set of parameters
370 initGroup :: [Ngrams] -> Text -> Int -> Int -> Int -> Int -> Phylo -> PhyloGroup
371 initGroup ngrams lbl idx lvl from' to' p = PhyloGroup
372 (((from', to'), lvl), idx)
374 (sort $ map (\x -> getIdxInRoots x p) ngrams)
381 ---------------------
382 -- | PhyloPeriod | --
383 ---------------------
386 -- | To alter each PhyloPeriod of a Phylo following a given function
387 alterPhyloPeriods :: (PhyloPeriod -> PhyloPeriod) -> Phylo -> Phylo
388 alterPhyloPeriods f p = over ( phylo_periods
392 -- | To append a list of PhyloPeriod to a Phylo
393 appendToPhyloPeriods :: [PhyloPeriod] -> Phylo -> Phylo
394 appendToPhyloPeriods l p = over (phylo_periods) (++ l) p
397 -- | To get all the PhyloPeriodIds of a Phylo
398 getPhyloPeriods :: Phylo -> [PhyloPeriodId]
399 getPhyloPeriods p = map _phylo_periodId
400 $ view (phylo_periods) p
403 -- | To get the id of a given PhyloPeriod
404 getPhyloPeriodId :: PhyloPeriod -> PhyloPeriodId
405 getPhyloPeriodId prd = _phylo_periodId prd
408 -- | To create a PhyloPeriod
409 initPhyloPeriod :: PhyloPeriodId -> [PhyloLevel] -> PhyloPeriod
410 initPhyloPeriod id l = PhyloPeriod id l
418 -- | To alter a list of PhyloLevels following a given function
419 alterPhyloLevels :: ([PhyloLevel] -> [PhyloLevel]) -> Phylo -> Phylo
420 alterPhyloLevels f p = over ( phylo_periods
422 . phylo_periodLevels) f p
425 -- | To get the PhylolevelId of a given PhyloLevel
426 getPhyloLevelId :: PhyloLevel -> PhyloLevelId
427 getPhyloLevelId = _phylo_levelId
430 -- | To get all the Phylolevels of a given PhyloPeriod
431 getPhyloLevels :: PhyloPeriod -> [PhyloLevel]
432 getPhyloLevels = view (phylo_periodLevels)
435 -- | To create a PhyloLevel
436 initPhyloLevel :: PhyloLevelId -> [PhyloGroup] -> PhyloLevel
437 initPhyloLevel id groups = PhyloLevel id groups
440 -- | To set the LevelId of a PhyloLevel and of all its PhyloGroups
441 setPhyloLevelId :: Int -> PhyloLevel -> PhyloLevel
442 setPhyloLevelId lvl' (PhyloLevel (id, _lvl) groups)
443 = PhyloLevel (id, lvl') groups'
445 groups' = over (traverse . phylo_groupId)
446 (\((period, _lvl), idx) -> ((period, lvl'), idx))
455 -- | To get the clique of a PhyloFis
456 getClique :: PhyloFis -> Clique
457 getClique = _phyloFis_clique
459 -- | To get the metrics of a PhyloFis
460 getFisMetrics :: PhyloFis -> Map (Int,Int) (Map Text [Double])
461 getFisMetrics = _phyloFis_metrics
463 -- | To get the support of a PhyloFis
464 getSupport :: PhyloFis -> Support
465 getSupport = _phyloFis_support
468 ----------------------------
469 -- | PhyloNodes & Edges | --
470 ----------------------------
473 -- | To filter some GroupEdges with a given threshold
474 filterGroupEdges :: Double -> [GroupEdge] -> [GroupEdge]
475 filterGroupEdges thr edges = filter (\((_s,_t),w) -> w > thr) edges
478 -- | To get the neighbours (directed/undirected) of a PhyloGroup from a list of GroupEdges
479 getNeighbours :: Bool -> PhyloGroup -> [GroupEdge] -> [PhyloGroup]
480 getNeighbours directed g e = case directed of
481 True -> map (\((_s,t),_w) -> t)
482 $ filter (\((s,_t),_w) -> s == g) e
483 False -> map (\((s,t),_w) -> (head' "getNeighbours") $ delete g $ nub [s,t,g])
484 $ filter (\((s,t),_w) -> s == g || t == g) e
487 -- | To get the PhyloBranchId of PhyloNode if it exists
488 getNodeBranchId :: PhyloNode -> PhyloBranchId
489 getNodeBranchId n = case n ^. pn_bid of
490 Nothing -> panic "[ERR][Viz.Phylo.Tools.getNodeBranchId] branchId not found"
494 -- | To get the PhyloGroupId of a PhyloNode
495 getNodeId :: PhyloNode -> PhyloGroupId
496 getNodeId n = n ^. pn_id
499 -- | To get the Level of a PhyloNode
500 getNodeLevel :: PhyloNode -> Level
501 getNodeLevel n = (snd . fst) $ getNodeId n
504 -- | To get the Parent Node of a PhyloNode in a PhyloView
505 getNodeParent :: PhyloNode -> PhyloView -> [PhyloNode]
506 getNodeParent n v = filter (\n' -> elem (getNodeId n') (getNodeParentsId n))
510 -- | To get the Parent Node id of a PhyloNode if it exists
511 getNodeParentsId :: PhyloNode -> [PhyloGroupId]
512 getNodeParentsId n = case n ^. pn_parents of
513 Nothing -> panic "[ERR][Viz.Phylo.Tools.getNodeParentsId] node parent not found"
517 -- | To get a list of PhyloNodes grouped by PhyloBranch in a PhyloView
518 getNodesByBranches :: PhyloView -> [(PhyloBranchId,[PhyloNode])]
519 getNodesByBranches v = zip bIds $ map (\id -> filter (\n -> (getNodeBranchId n) == id)
520 $ getNodesInBranches v ) bIds
522 --------------------------------------
523 bIds :: [PhyloBranchId]
524 bIds = getViewBranchIds v
525 --------------------------------------
528 -- | To get a list of PhyloNodes owned by any PhyloBranches in a PhyloView
529 getNodesInBranches :: PhyloView -> [PhyloNode]
530 getNodesInBranches v = filter (\n -> isJust $ n ^. pn_bid)
534 -- | To get the PhyloGroupId of the Source of a PhyloEdge
535 getSourceId :: PhyloEdge -> PhyloGroupId
536 getSourceId e = e ^. pe_source
539 -- | To get the PhyloGroupId of the Target of a PhyloEdge
540 getTargetId :: PhyloEdge -> PhyloGroupId
541 getTargetId e = e ^. pe_target
544 ---------------------
545 -- | PhyloBranch | --
546 ---------------------
549 -- | To get the PhyloBranchId of a PhyloBranch
550 getBranchId :: PhyloBranch -> PhyloBranchId
551 getBranchId b = b ^. pb_id
553 -- | To get a list of PhyloBranchIds
554 getBranchIds :: Phylo -> [PhyloBranchId]
555 getBranchIds p = sortOn snd
557 $ mapMaybe getGroupBranchId
561 -- | To get a list of PhyloBranchIds given a Level in a Phylo
562 getBranchIdsWith :: Level -> Phylo -> [PhyloBranchId]
563 getBranchIdsWith lvl p = sortOn snd
564 $ mapMaybe getGroupBranchId
565 $ getGroupsWithLevel lvl p
568 -- | To get the Meta value of a PhyloBranch
569 getBranchMeta :: Text -> PhyloBranch -> [Double]
570 getBranchMeta k b = (b ^. pb_metrics) ! k
573 -- | To get all the PhyloBranchIds of a PhyloView
574 getViewBranchIds :: PhyloView -> [PhyloBranchId]
575 getViewBranchIds v = map getBranchId $ v ^. pv_branches
578 -- | To get a list of PhyloGroup sharing the same PhyloBranchId
579 getGroupsByBranches :: Phylo -> [(PhyloBranchId,[PhyloGroup])]
580 getGroupsByBranches p = zip (getBranchIds p)
581 $ map (\id -> filter (\g -> (fromJust $ getGroupBranchId g) == id)
582 $ getGroupsInBranches p)
586 -- | To get the sublist of all the PhyloGroups linked to a branch
587 getGroupsInBranches :: Phylo -> [PhyloGroup]
588 getGroupsInBranches p = filter (\g -> isJust $ g ^. phylo_groupBranchId)
592 --------------------------------
593 -- | PhyloQuery & QueryView | --
594 --------------------------------
597 -- | To filter PhyloView's Branches by level
598 filterBranchesByLevel :: Level -> PhyloView -> [PhyloBranch]
599 filterBranchesByLevel lvl pv = filter (\pb -> lvl == (fst $ pb ^. pb_id))
603 -- | To filter PhyloView's Edges by level
604 filterEdgesByLevel :: Level -> [PhyloEdge] -> [PhyloEdge]
605 filterEdgesByLevel lvl pes = filter (\pe -> (lvl == ((snd . fst) $ pe ^. pe_source))
606 && (lvl == ((snd . fst) $ pe ^. pe_target))) pes
609 -- | To filter PhyloView's Edges by type
610 filterEdgesByType :: EdgeType -> [PhyloEdge] -> [PhyloEdge]
611 filterEdgesByType t pes = filter (\pe -> t == (pe ^. pe_type)) pes
614 -- | To filter PhyloView's Nodes by the oldest Period
615 filterNodesByFirstPeriod :: [PhyloNode] -> [PhyloNode]
616 filterNodesByFirstPeriod pns = filter (\pn -> fstPrd == ((fst . fst) $ pn ^. pn_id)) pns
618 --------------------------------------
619 fstPrd :: (Date,Date)
620 fstPrd = (head' "filterNodesByFirstPeriod")
622 $ map (\pn -> (fst . fst) $ pn ^. pn_id) pns
623 --------------------------------------
626 -- | To filter PhyloView's Nodes by Branch
627 filterNodesByBranch :: PhyloBranchId -> [PhyloNode] -> [PhyloNode]
628 filterNodesByBranch bId pns = filter (\pn -> if isJust $ pn ^. pn_bid
629 then if bId == (fromJust $ pn ^. pn_bid)
635 -- | To filter PhyloView's Nodes by level
636 filterNodesByLevel :: Level -> [PhyloNode] -> [PhyloNode]
637 filterNodesByLevel lvl pns = filter (\pn -> lvl == ((snd . fst) $ pn ^. pn_id)) pns
640 -- | To filter PhyloView's Nodes by Period
641 filterNodesByPeriod :: PhyloPeriodId -> [PhyloNode] -> [PhyloNode]
642 filterNodesByPeriod prd pns = filter (\pn -> prd == ((fst . fst) $ pn ^. pn_id)) pns
645 -- | To get the first clustering method to apply to get the contextual units of a Phylo
646 getContextualUnit :: PhyloQueryBuild -> Cluster
647 getContextualUnit q = q ^. q_contextualUnit
650 -- | To get the metrics to apply to contextual units
651 getContextualUnitMetrics :: PhyloQueryBuild -> [Metric]
652 getContextualUnitMetrics q = q ^. q_contextualUnitMetrics
655 -- | To get the filters to apply to contextual units
656 getContextualUnitFilters :: PhyloQueryBuild -> [Filter]
657 getContextualUnitFilters q = q ^. q_contextualUnitFilters
660 -- | To get the cluster methods to apply to the Nths levels of a Phylo
661 getNthCluster :: PhyloQueryBuild -> Cluster
662 getNthCluster q = q ^. q_nthCluster
665 -- | To get the Sup Level of a reconstruction of a Phylo from a PhyloQuery
666 getNthLevel :: PhyloQueryBuild -> Level
667 getNthLevel q = q ^. q_nthLevel
670 -- | To get the Grain of the PhyloPeriods from a PhyloQuery
671 getPeriodGrain :: PhyloQueryBuild -> Int
672 getPeriodGrain q = q ^. q_periodGrain
675 -- | To get the intertemporal matching strategy to apply to a Phylo from a PhyloQuery
676 getInterTemporalMatching :: PhyloQueryBuild -> Proximity
677 getInterTemporalMatching q = q ^. q_interTemporalMatching
680 -- | To get the Steps of the PhyloPeriods from a PhyloQuery
681 getPeriodSteps :: PhyloQueryBuild -> Int
682 getPeriodSteps q = q ^. q_periodSteps
685 --------------------------------------------------
686 -- | PhyloQueryBuild & PhyloQueryView Constructors | --
687 --------------------------------------------------
689 -- | To get the threshold of a Proximity
690 getThreshold :: Proximity -> Double
691 getThreshold prox = case prox of
692 WeightedLogJaccard (WLJParams thr _) -> thr
693 Hamming (HammingParams thr) -> thr
694 Filiation -> panic "[ERR][Viz.Phylo.Tools.getThreshold] Filiation"
697 -- | To get the Proximity associated to a given Clustering method
698 getProximity :: Cluster -> Proximity
699 getProximity cluster = case cluster of
700 Louvain (LouvainParams proxi) -> proxi
701 RelatedComponents (RCParams proxi) -> proxi
702 _ -> panic "[ERR][Viz.Phylo.Tools.getProximity] this cluster has no associated Proximity"
705 -- | To initialize all the Cluster / Proximity with their default parameters
706 initFis :: Maybe Bool -> Maybe Support -> Maybe Int -> FisParams
707 initFis (def True -> kmf) (def 1 -> min') (def 1 -> thr) = FisParams kmf min' thr
709 initHamming :: Maybe Double -> HammingParams
710 initHamming (def 0.01 -> sens) = HammingParams sens
712 initSmallBranch' :: Maybe Int -> Maybe Int -> Maybe Int -> SBParams
713 initSmallBranch' (def 2 -> periodsInf) (def 2 -> periodsSup) (def 1 -> minNodes) = SBParams periodsInf periodsSup minNodes
715 initSmallBranch :: Maybe Int -> Maybe Int -> Maybe Int -> SBParams
716 initSmallBranch (def 0 -> periodsInf) (def 0 -> periodsSup) (def 1 -> minNodes) = SBParams periodsInf periodsSup minNodes
718 initLouvain :: Maybe Proximity -> LouvainParams
719 initLouvain (def defaultWeightedLogJaccard -> proxi) = LouvainParams proxi
721 initRelatedComponents :: Maybe Proximity -> RCParams
722 initRelatedComponents (def Filiation -> proxi) = RCParams proxi
724 initWeightedLogJaccard :: Maybe Double -> Maybe Double -> WLJParams
725 initWeightedLogJaccard (def 0 -> thr) (def 0.01 -> sens) = WLJParams thr sens
728 -- | To initialize a PhyloQueryBuild from given and default parameters
729 initPhyloQueryBuild :: Text -> Text -> Maybe Int -> Maybe Int -> Maybe Cluster -> Maybe [Metric] -> Maybe [Filter] -> Maybe Proximity -> Maybe Level -> Maybe Cluster -> PhyloQueryBuild
730 initPhyloQueryBuild name desc (def 5 -> grain) (def 3 -> steps) (def defaultFis -> cluster) (def [] -> metrics) (def [] -> filters)
731 (def defaultWeightedLogJaccard -> matching') (def 2 -> nthLevel) (def defaultRelatedComponents -> nthCluster) =
732 PhyloQueryBuild name desc grain steps cluster metrics filters matching' nthLevel nthCluster
736 -- | To initialize a PhyloQueryView default parameters
737 initPhyloQueryView :: Maybe Level -> Maybe Filiation -> Maybe Bool -> Maybe Level -> Maybe [Metric] -> Maybe [Filter] -> Maybe [Tagger] -> Maybe (Sort, Order) -> Maybe ExportMode -> Maybe DisplayMode -> Maybe Bool -> PhyloQueryView
738 initPhyloQueryView (def 2 -> lvl) (def Descendant -> f) (def False -> c) (def 1 -> d) (def [] -> ms) (def [] -> fs) (def [] -> ts) s (def Json -> em) (def Flat -> dm) (def True -> v) =
739 PhyloQueryView lvl f c d ms fs ts s em dm v
742 -- | To define some obvious boolean getters
743 shouldKeepMinorFis :: FisParams -> Bool
744 shouldKeepMinorFis = _fis_keepMinorFis
746 ----------------------------
747 -- | Default ressources | --
748 ----------------------------
752 defaultFis :: Cluster
753 defaultFis = Fis (initFis Nothing Nothing Nothing)
755 defaultLouvain :: Cluster
756 defaultLouvain = Louvain (initLouvain Nothing)
758 defaultRelatedComponents :: Cluster
759 defaultRelatedComponents = RelatedComponents (initRelatedComponents Nothing)
763 defaultSmallBranch :: Filter
764 defaultSmallBranch = SmallBranch (initSmallBranch Nothing Nothing Nothing)
768 defaultPhyloParam :: PhyloParam
769 defaultPhyloParam = initPhyloParam Nothing Nothing Nothing
773 defaultHamming :: Proximity
774 defaultHamming = Hamming (initHamming Nothing)
776 defaultWeightedLogJaccard :: Proximity
777 defaultWeightedLogJaccard = WeightedLogJaccard (initWeightedLogJaccard Nothing Nothing)
781 defaultQueryBuild :: PhyloQueryBuild
782 defaultQueryBuild = initPhyloQueryBuild "Cesar et Cleôpatre" "An example of Phylomemy (french without accent)"
783 Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing
785 defaultQueryView :: PhyloQueryView
786 defaultQueryView = initPhyloQueryView Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing
790 defaultSoftware :: Software
791 defaultSoftware = Software "Gargantext" "v4"
795 defaultPhyloVersion :: Text
796 defaultPhyloVersion = "v1"