Commit b605fa3d authored by Alexandre Delanoë's avatar Alexandre Delanoë

[GRAPH FLOW] needs some parameterization.

parent f1e910bf
...@@ -894,23 +894,6 @@ getNgramsTableMap nodeId ngramsType = do ...@@ -894,23 +894,6 @@ getNgramsTableMap nodeId ngramsType = do
pure $ Versioned (repo ^. r_version) pure $ Versioned (repo ^. r_version)
(repo ^. r_state . at ngramsType . _Just . at nodeId . _Just) (repo ^. r_state . at ngramsType . _Just . at nodeId . _Just)
-- UNUSED
_getListNgrams :: RepoCmdM env err m
=> [NodeId] -> NgramsType -> m (Versioned ListNgrams)
_getListNgrams nodeIds ngramsType = do
v <- view repoVar
repo <- liftIO $ readMVar v
let
ngramsMap = repo ^. r_state . at ngramsType . _Just
ngrams =
Map.unionsWith mergeNgramsElement
[ ngramsMap ^. at nodeId . _Just | nodeId <- nodeIds ]
pure $ Versioned (repo ^. r_version)
$ NgramsTable (ngramsElementFromRepo <$> Map.toList ngrams)
type MinSize = Int type MinSize = Int
type MaxSize = Int type MaxSize = Int
......
{-|
Module : Gargantext.API.Ngrams.Tools
Description : Tools to manage Ngrams Elements (from the API)
Copyright : (c) CNRS, 2017-Present
License : AGPL + CECILL v3
Maintainer : team@gargantext.org
Stability : experimental
Portability : POSIX
-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
module Gargantext.API.Ngrams.Tools
where
import Control.Concurrent
import Control.Lens (_Just, (^.), at, view)
import Control.Monad.Reader
import Data.Map.Strict (Map)
import Data.Set (Set)
import Data.Text (Text)
import Data.Validity
import Gargantext.API.Ngrams
import Gargantext.Core.Types (ListType(..), NodeId, ListId)
import Gargantext.Database.Schema.Ngrams (NgramsType)
import Gargantext.Prelude
import qualified Data.Map.Strict as Map
import qualified Data.Set as Set
type RootTerm = Text
getListNgrams :: RepoCmdM env err m
=> [ListId] -> NgramsType
-> m (Map Text (ListType, (Maybe Text)))
getListNgrams nodeIds ngramsType = do
v <- view repoVar
repo <- liftIO $ readMVar v
let
ngramsMap = repo ^. r_state . at ngramsType . _Just
ngrams = Map.unionsWith mergeNgramsElement
[ ngramsMap ^. at nodeId . _Just | nodeId <- nodeIds ]
mapTermListRoot = Map.fromList
[(t, (_nre_list nre, _nre_root nre))
| (t, nre) <- Map.toList ngrams
]
pure mapTermListRoot
filterListWithRoot :: ListType -> Map Text (ListType, Maybe Text)
-> Map Text (Maybe RootTerm)
filterListWithRoot lt m = Map.fromList
$ map (\(t,(_,r)) -> (t,r))
$ filter isGraphTerm (Map.toList m)
where
isGraphTerm (_t,(l, maybeRoot)) = case maybeRoot of
Nothing -> l == lt
Just r -> case Map.lookup r m of
Nothing -> panic $ "Garg.API.Ngrams.Tools: filterWithRoot, unknown key: " <> r
Just (l',_) -> l' == lt
groupNodesByNgrams :: Map Text (Maybe RootTerm)
-> Map Text (Set NodeId)
-> Map Text (Set NodeId)
groupNodesByNgrams syn occs = Map.fromListWith (<>) occs'
where
occs' = map toSyn (Map.toList occs)
toSyn (t,ns) = case Map.lookup t syn of
Nothing -> panic $ "Garg.API.Ngrams.Tools: groupNodesByNgrams, unknown key: " <> t
Just r -> case r of
Nothing -> (t, ns)
Just r' -> (r',ns)
getCoocByNgrams :: Map Text (Set NodeId) -> Map (Text, Text) Int
getCoocByNgrams m =
Map.fromList [((t1,t2)
,maybe 0 Set.size $ Set.intersection
<$> Map.lookup t1 m
<*> Map.lookup t2 m
) | (t1,t2) <- listToCombi identity $ Map.keys m
]
...@@ -10,7 +10,7 @@ Portability : POSIX ...@@ -10,7 +10,7 @@ Portability : POSIX
Node API Node API
-} -}
{-# OPTIONS_GHC -fno-warn-name-shadowing -fno-warn-orphans #-} {-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE DataKinds #-} {-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DeriveGeneric #-}
...@@ -21,7 +21,6 @@ Node API ...@@ -21,7 +21,6 @@ Node API
{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeOperators #-} {-# LANGUAGE TypeOperators #-}
-------------------------------------------------------------------
module Gargantext.API.Node module Gargantext.API.Node
( module Gargantext.API.Node ( module Gargantext.API.Node
, HyperdataAny(..) , HyperdataAny(..)
...@@ -32,47 +31,41 @@ module Gargantext.API.Node ...@@ -32,47 +31,41 @@ module Gargantext.API.Node
, HyperdataDocument(..) , HyperdataDocument(..)
, HyperdataDocumentV3(..) , HyperdataDocumentV3(..)
) where ) where
-------------------------------------------------------------------
import Control.Lens (prism', set) import Control.Lens (prism', set)
import Control.Monad.IO.Class (liftIO)
import Control.Monad ((>>)) import Control.Monad ((>>))
--import System.IO (putStrLn, readFile) import Control.Monad.IO.Class (liftIO)
import qualified Data.Map as Map
import Data.Aeson (FromJSON, ToJSON) import Data.Aeson (FromJSON, ToJSON)
import Data.Text (Text())
import Data.Swagger import Data.Swagger
import Data.Text (Text())
import Data.Time (UTCTime) import Data.Time (UTCTime)
import Debug.Trace (trace)
import GHC.Generics (Generic) import GHC.Generics (Generic)
import Servant
import Gargantext.API.Ngrams (TabType(..), TableNgramsApi, TableNgramsApiGet, tableNgramsPatch, getTableNgrams, HasRepo) import Gargantext.API.Ngrams (TabType(..), TableNgramsApi, TableNgramsApiGet, tableNgramsPatch, getTableNgrams, HasRepo)
import Gargantext.Prelude import Gargantext.API.Ngrams.Tools
import Gargantext.Database.Types.Node import Gargantext.API.Search ( SearchAPI, searchIn, SearchInQuery)
import Gargantext.Database.Utils -- (Cmd, CmdM) import Gargantext.Core.Types (Offset, Limit, ListType(..))
import Gargantext.Database.Schema.Node ( getNodesWithParentId, getNode, deleteNode, deleteNodes, mkNodeWithParent, JSONB, NodeError(..), HasNodeError(..)) import Gargantext.Core.Types.Main (Tree, NodeTree)
import Gargantext.Database.Node.Children (getChildren)
import qualified Gargantext.Database.Node.Update as U (update, Update(..))
import Gargantext.Database.Facet (FacetDoc , runViewDocuments, OrderBy(..),FacetChart,runViewAuthorsDoc) import Gargantext.Database.Facet (FacetDoc , runViewDocuments, OrderBy(..),FacetChart,runViewAuthorsDoc)
import Gargantext.Database.Tree (treeDB, HasTreeError(..), TreeError(..)) import Gargantext.Database.Metrics.NgramsByNode (getNodesByNgramsOnlyUser)
import Gargantext.Database.Metrics.Count (getNgramsByNode) import Gargantext.Database.Node.Children (getChildren)
import Gargantext.Database.Schema.Ngrams (NgramsType(..))
import Gargantext.Database.Schema.Node ( getNodesWithParentId, getNode, deleteNode, deleteNodes, mkNodeWithParent, JSONB, NodeError(..), HasNodeError(..))
import Gargantext.Database.Schema.Node (defaultList) import Gargantext.Database.Schema.Node (defaultList)
import Gargantext.Database.Schema.NodeNode (nodesToFavorite, nodesToTrash) import Gargantext.Database.Schema.NodeNode (nodesToFavorite, nodesToTrash)
import Gargantext.Database.Schema.Ngrams (NgramsType(..)) import Gargantext.Database.Tree (treeDB, HasTreeError(..), TreeError(..))
import Gargantext.API.Search ( SearchAPI, searchIn, SearchInQuery) import Gargantext.Database.Types.Node
import Gargantext.Text.Metrics.Count (coocOn) import Gargantext.Database.Types.Node (CorpusId, ContactId)
-- Graph import Gargantext.Database.Utils -- (Cmd, CmdM)
import Gargantext.Prelude
import Gargantext.Text.Flow (cooc2graph) import Gargantext.Text.Flow (cooc2graph)
import Gargantext.Viz.Graph hiding (Node)-- (Graph(_graph_metadata),LegendField(..), GraphMetadata(..),readGraphFromJson,defaultGraph) import Gargantext.Viz.Graph hiding (Node)-- (Graph(_graph_metadata),LegendField(..), GraphMetadata(..),readGraphFromJson,defaultGraph)
-- import Gargantext.Core (Lang(..)) import Servant
import Gargantext.Core.Types (Offset, Limit)
import Gargantext.Core.Types.Main (Tree, NodeTree)
import Gargantext.Database.Types.Node (CorpusId, ContactId)
-- import Gargantext.Text.Terms (TermType(..))
import Test.QuickCheck (elements) import Test.QuickCheck (elements)
import Test.QuickCheck.Arbitrary (Arbitrary, arbitrary) import Test.QuickCheck.Arbitrary (Arbitrary, arbitrary)
import qualified Data.Map as Map
import qualified Gargantext.Database.Node.Update as U (update, Update(..))
type GargServer api = type GargServer api =
forall env m. forall env m.
...@@ -281,7 +274,6 @@ type GraphAPI = Get '[JSON] Graph ...@@ -281,7 +274,6 @@ type GraphAPI = Get '[JSON] Graph
graphAPI :: NodeId -> GargServer GraphAPI graphAPI :: NodeId -> GargServer GraphAPI
graphAPI nId = do graphAPI nId = do
nodeGraph <- getNode nId HyperdataGraph nodeGraph <- getNode nId HyperdataGraph
let metadata = GraphMetadata "Title" [maybe 0 identity $ _node_parentId nodeGraph] let metadata = GraphMetadata "Title" [maybe 0 identity $ _node_parentId nodeGraph]
...@@ -290,17 +282,16 @@ graphAPI nId = do ...@@ -290,17 +282,16 @@ graphAPI nId = do
] ]
-- (map (\n -> LegendField n "#FFFFFF" (pack $ show n)) [1..10]) -- (map (\n -> LegendField n "#FFFFFF" (pack $ show n)) [1..10])
let cId = maybe (panic "no parentId") identity $ _node_parentId nodeGraph let cId = maybe (panic "no parentId") identity $ _node_parentId nodeGraph
_lId <- defaultList cId lId <- defaultList cId
-- lId' <- listsWith masterUser
--myCooc <- getCoocByDocDev cId lId -- (lid' <> [lId]) ngs <- filterListWithRoot GraphTerm <$> getListNgrams [lId] NgramsTerms
myCooc <- Map.filter (>2) <$> coocOn identity <$> getNgramsByNode cId NgramsTerms
liftIO $ set graph_metadata (Just metadata) <$> cooc2graph myCooc myCooc <- Map.filter (>1) <$> getCoocByNgrams
<$> groupNodesByNgrams ngs
-- <$> maybe defaultGraph identity <$> getNodesByNgramsOnlyUser cId NgramsTerms (Map.keys ngs)
-- <$> readGraphFromJson "purescript-gargantext/dist/examples/imtNew.json"
-- t <- textFlow (Mono EN) (Contexts contextText) liftIO $ trace (show myCooc) $ set graph_metadata (Just metadata) <$> cooc2graph myCooc
-- liftIO $ liftIO $ pure $ maybe t identity maybeGraph
-- TODO what do we get about the node? to replace contextText
instance HasNodeError ServantErr where instance HasNodeError ServantErr where
_NodeError = prism' mk (const Nothing) -- $ panic "HasNodeError ServantErr: not a prism") _NodeError = prism' mk (const Nothing) -- $ panic "HasNodeError ServantErr: not a prism")
...@@ -337,7 +328,7 @@ treeAPI = treeDB ...@@ -337,7 +328,7 @@ treeAPI = treeDB
------------------------------------------------------------------------ ------------------------------------------------------------------------
-- | Check if the name is less than 255 char -- | Check if the name is less than 255 char
rename :: NodeId -> RenameNode -> Cmd err [Int] rename :: NodeId -> RenameNode -> Cmd err [Int]
rename nId (RenameNode name) = U.update (U.Rename nId name) rename nId (RenameNode name') = U.update (U.Rename nId name')
getTable :: NodeId -> Maybe TabType getTable :: NodeId -> Maybe TabType
-> Maybe Offset -> Maybe Limit -> Maybe Offset -> Maybe Limit
...@@ -361,7 +352,7 @@ getChart :: NodeId -> Maybe UTCTime -> Maybe UTCTime ...@@ -361,7 +352,7 @@ getChart :: NodeId -> Maybe UTCTime -> Maybe UTCTime
getChart _ _ _ = undefined -- TODO getChart _ _ _ = undefined -- TODO
postNode :: HasNodeError err => UserId -> NodeId -> PostNode -> Cmd err [NodeId] postNode :: HasNodeError err => UserId -> NodeId -> PostNode -> Cmd err [NodeId]
postNode uId pId (PostNode name nt) = mkNodeWithParent nt (Just pId) uId name postNode uId pId (PostNode nodeName nt) = mkNodeWithParent nt (Just pId) uId nodeName
putNode :: NodeId -> Cmd err Int putNode :: NodeId -> Cmd err Int
putNode = undefined -- TODO putNode = undefined -- TODO
......
...@@ -137,18 +137,6 @@ getOccByNgramsOnly :: CorpusId -> NgramsType -> [Text] ...@@ -137,18 +137,6 @@ getOccByNgramsOnly :: CorpusId -> NgramsType -> [Text]
getOccByNgramsOnly cId nt ngs = Map.map Set.size getOccByNgramsOnly cId nt ngs = Map.map Set.size
<$> getNodesByNgramsOnlyUser cId nt ngs <$> getNodesByNgramsOnlyUser cId nt ngs
-- TODO add groups
getCoocByNgramsOnly :: CorpusId -> NgramsType -> [Text]
-> Cmd err (Map (Text,Text) Int)
getCoocByNgramsOnly cId nt ngs = do
ngs' <- getNodesByNgramsOnlyUser cId nt ngs
pure $ Map.fromList [( (t1,t2)
, maybe 0 Set.size $ Set.intersection
<$> Map.lookup t1 ngs'
<*> Map.lookup t2 ngs'
)
| (t1,t2) <- listToCombi identity $ Map.keys ngs']
getNodesByNgramsOnlyUser :: CorpusId -> NgramsType -> [Text] -> Cmd err (Map Text (Set NodeId)) getNodesByNgramsOnlyUser :: CorpusId -> NgramsType -> [Text] -> Cmd err (Map Text (Set NodeId))
getNodesByNgramsOnlyUser cId nt ngs = fromListWith (<>) <$> map (\(n,t) -> (t, Set.singleton n)) getNodesByNgramsOnlyUser cId nt ngs = fromListWith (<>) <$> map (\(n,t) -> (t, Set.singleton n))
<$> selectNgramsOnlyByNodeUser cId nt ngs <$> selectNgramsOnlyByNodeUser cId nt ngs
......
...@@ -36,7 +36,7 @@ import Gargantext.Core.Types (CorpusId) ...@@ -36,7 +36,7 @@ import Gargantext.Core.Types (CorpusId)
--import Gargantext.Database.Types.Node --import Gargantext.Database.Types.Node
import Gargantext.Prelude import Gargantext.Prelude
--import Gargantext.Text.Context (splitBy, SplitContext(Sentences)) --import Gargantext.Text.Context (splitBy, SplitContext(Sentences))
import Gargantext.Text.Metrics (filterCooc, FilterConfig(..), Clusters(..), SampleBins(..), DefaultValue(..), MapListSize(..), InclusionSize(..)) --import Gargantext.Text.Metrics (filterCooc, FilterConfig(..), Clusters(..), SampleBins(..), DefaultValue(..), MapListSize(..), InclusionSize(..))
--import Gargantext.Text.Metrics.Count (coocOn) --import Gargantext.Text.Metrics.Count (coocOn)
--import Gargantext.Text.Parsers.CSV --import Gargantext.Text.Parsers.CSV
--import Gargantext.Text.Terms (TermType, extractTerms) --import Gargantext.Text.Terms (TermType, extractTerms)
...@@ -120,21 +120,21 @@ cooc2graph :: (Map (Text, Text) Int) -> IO Graph ...@@ -120,21 +120,21 @@ cooc2graph :: (Map (Text, Text) Int) -> IO Graph
cooc2graph myCooc = do cooc2graph myCooc = do
--printDebug "myCooc" myCooc --printDebug "myCooc" myCooc
-- Filtering terms with inclusion/Exclusion and Specificity/Genericity scores -- Filtering terms with inclusion/Exclusion and Specificity/Genericity scores
let myCooc3 = filterCooc ( FilterConfig (MapListSize 350 ) {- let myCooc3 = filterCooc ( FilterConfig (MapListSize 350 )
(InclusionSize 500 ) (InclusionSize 500 )
(SampleBins 10 ) (SampleBins 10 )
(Clusters 3 ) (Clusters 3 )
(DefaultValue 0 ) (DefaultValue 0 )
) myCooc ) myCooc
--printDebug "myCooc3 size" $ M.size myCooc3 -} --printDebug "myCooc3 size" $ M.size myCooc3
--printDebug "myCooc3" myCooc3 --printDebug "myCooc3" myCooc3
-- Cooc -> Matrix -- Cooc -> Matrix
let (ti, _) = createIndices myCooc3 let (ti, _) = createIndices myCooc
--printDebug "ti size" $ M.size ti --printDebug "ti size" $ M.size ti
--printDebug "ti" ti --printDebug "ti" ti
let myCooc4 = toIndex ti myCooc3 let myCooc4 = toIndex ti myCooc
--printDebug "myCooc4 size" $ M.size myCooc4 --printDebug "myCooc4 size" $ M.size myCooc4
--printDebug "myCooc4" myCooc4 --printDebug "myCooc4" myCooc4
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment