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

[Community pairing] alignment step

parent f51243c0
...@@ -44,7 +44,7 @@ module Gargantext.Database.Action.Flow.Pairing ...@@ -44,7 +44,7 @@ module Gargantext.Database.Action.Flow.Pairing
import Data.Set (Set) import Data.Set (Set)
import Control.Lens (_Just, (^.)) import Control.Lens (_Just, (^.))
import Data.Map (Map, fromList, fromListWith) import Data.Map (Map, fromList, fromListWith)
import Data.Maybe (catMaybes) import Data.Maybe (catMaybes, fromMaybe)
import Data.Text (Text, toLower) import Data.Text (Text, toLower)
import Database.PostgreSQL.Simple.SqlQQ (sql) import Database.PostgreSQL.Simple.SqlQQ (sql)
import Gargantext.Core.Types (TableResult(..)) import Gargantext.Core.Types (TableResult(..))
...@@ -58,6 +58,7 @@ import Gargantext.Database.Schema.Node ...@@ -58,6 +58,7 @@ import Gargantext.Database.Schema.Node
import Gargantext.Prelude hiding (sum) import Gargantext.Prelude hiding (sum)
import Safe (lastMay) import Safe (lastMay)
import qualified Data.Map as DM import qualified Data.Map as DM
import qualified Data.Map as Map
import qualified Data.Text as DT import qualified Data.Text as DT
import qualified Data.Set as Set import qualified Data.Set as Set
...@@ -155,12 +156,6 @@ getNgramsTindexed corpusId ngramsType' = fromList ...@@ -155,12 +156,6 @@ getNgramsTindexed corpusId ngramsType' = fromList
------------------------------------------------------------------------ ------------------------------------------------------------------------
finalPairing :: CorpusId -> ListId
-> CommunityId -> ListId
-> Map ContactId (Set DocId)
finalPairing = undefined
-- savePairing -- savePairing
-- insert ContactId_DocId as NodeNode -- insert ContactId_DocId as NodeNode
-- then each ContactId could become a corpus with its DocIds -- then each ContactId could become a corpus with its DocIds
...@@ -170,22 +165,70 @@ finalPairing = undefined ...@@ -170,22 +165,70 @@ finalPairing = undefined
------------------------------------------------------------------------ ------------------------------------------------------------------------
type ContactName = Text type ContactName = Text
type DocAuthor = Text type DocAuthor = Text
data ToProject = ContactName | DocAuthor
instance Ord ToProject
instance Eq ToProject
type Projected = Text type Projected = Text
type Projection a = Map a Projected
projectionFrom :: Set ContactName -> (ContactName -> Projected) -> Map ContactName Projected
projectionFrom ss f = fromList $ map (\s -> (s, f s)) (Set.toList ss)
projection :: Set ToProject -> (ToProject -> Projected) -> Projection ToProject projectionTo :: Set DocAuthor -> (DocAuthor -> Projected) -> Map Projected (Set DocAuthor)
projection ss f = fromList $ map (\s -> (s, f s)) (Set.toList ss) projectionTo ss f = fromListWith (<>) $ map (\s -> (f s, Set.singleton s)) (Set.toList ss)
align :: Projection ContactName -> Projection DocAuthor align :: Map ContactName Projected
-> Map ContactName (Set ContactId) -> Map DocAuthor (Set DocId) -> Map Projected (Set DocAuthor)
-> Map DocAuthor (Set DocId)
-> Map ContactName (Set DocId)
align mc ma md = fromListWith (<>)
$ map (\c -> (c, getProjection md $ testProjection c mc ma))
$ Map.keys mc
where
getProjection :: Map DocAuthor (Set DocId) -> Set DocAuthor -> Set DocId
getProjection ma sa =
if Set.null sa
then Set.empty
else Set.unions $ sets ma
where
sets ma'= Set.map (\s -> lookup s ma') sa
lookup s' ma'= fromMaybe Set.empty (Map.lookup s' ma')
testProjection :: ContactName
-> Map ContactName Projected
-> Map Projected (Set DocAuthor)
-> Set DocAuthor
testProjection cn' mc' ma' = case Map.lookup cn' mc' of
Nothing -> Set.empty
Just c -> case Map.lookup c ma' of
Nothing -> Set.empty
Just a -> a
fusion :: Map ContactName (Set ContactId)
-> Map ContactName (Set DocId)
-> Map ContactId (Set DocId) -> Map ContactId (Set DocId)
align = undefined fusion mc md = undefined
{- fromListWith (<>)
$ catMaybes
$ map (\c -> case Map.lookup c mc of
Nothing -> Nothing
Just x -> map (\
$ toList mc
-}
finalPairing :: AnnuaireId
-> (CorpusId, ListId, NgramsType)
-> (ContactName -> Projected)
-> (DocAuthor -> Projected)
-> Cmd err (Map ContactId (Set DocId))
finalPairing aId (cId, lId, ngt) fc fa = do
mc <- getNgramsContactId aId
md <- getNgramsDocId cId lId ngt
let
contactNameProjected = projectionFrom (Set.fromList $ Map.keys mc) fc
authorDocProjected = projectionTo (Set.fromList $ Map.keys md) fa
pure $ fusion mc $ align contactNameProjected authorDocProjected md
------------------------------------------------------------------------ ------------------------------------------------------------------------
...@@ -193,7 +236,7 @@ align = undefined ...@@ -193,7 +236,7 @@ align = undefined
getNgramsContactId :: AnnuaireId getNgramsContactId :: AnnuaireId
-> Cmd err (Map Text (Set NodeId)) -> Cmd err (Map ContactName (Set NodeId))
getNgramsContactId aId = do getNgramsContactId aId = do
contacts <- getAllContacts aId contacts <- getAllContacts aId
pure $ fromListWith (<>) pure $ fromListWith (<>)
...@@ -208,10 +251,10 @@ getNgramsContactId aId = do ...@@ -208,10 +251,10 @@ getNgramsContactId aId = do
getNgramsDocId :: CorpusId getNgramsDocId :: CorpusId
-> ListId -> ListId
-> NgramsType -> NgramsType
-> Cmd err (Map Text (Set Int)) -> Cmd err (Map DocAuthor (Set NodeId))
getNgramsDocId corpusId listId ngramsType getNgramsDocId corpusId listId ngramsType
= fromListWith (<>) = fromListWith (<>)
<$> map (\(t,nId) -> (t, Set.singleton nId)) <$> map (\(t,nId) -> (t, Set.singleton (NodeId nId)))
<$> selectNgramsDocId corpusId listId ngramsType <$> selectNgramsDocId corpusId listId ngramsType
selectNgramsDocId :: CorpusId selectNgramsDocId :: CorpusId
......
...@@ -292,9 +292,6 @@ deviation = sqrt . variance ...@@ -292,9 +292,6 @@ deviation = sqrt . variance
movingAverage :: (Eq b, Fractional b) => Int -> [b] -> [b] movingAverage :: (Eq b, Fractional b) => Int -> [b] -> [b]
movingAverage steps xs = map mean $ chunkAlong steps 1 xs movingAverage steps xs = map mean $ chunkAlong steps 1 xs
ma :: [Double] -> [Double]
ma = movingAverage 3
----------------------------------------------------------------------- -----------------------------------------------------------------------
----------------------------------------------------------------------- -----------------------------------------------------------------------
--- Map in Map = Map2 --- Map in Map = Map2
......
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