2022-08-25 13:03:36 +02:00
#' @title Calculate changes (spatial mixture class)
spatialMixture_muutokset <- R6Class (
classname = " spatialMixture_muutokset" ,
public = list (
#' @param ind ind
#' @param rowsFromInd rowsFromInd
#' @param data data
#' @param adjprior adjprior
#' @param priorTerm priorTerm
#' @param logml logml
#' @param cliques cliques
#' @param separators separators
laskeMuutokset = function (
ind , rowsFromInd , data , adjprior , priorTerm , logml , cliques , separators
) {
2022-09-15 09:34:58 +02:00
# Palauttaa npops * 1 taulun, jossa i:s alkio kertoo, mik?olisi
# muutos logml:ss? mikהli yksil?ind siirretההn koriin i.
2024-07-02 12:17:02 +02:00
# diffInCounts on poistettava globals$COUNTS:in siivusta i1 ja lisהttהv?
# globals$COUNTS:in siivuun i2, mikהli muutos toteutetaan.
npops <- size ( globals $ COUNTS , 3 )
2022-09-15 09:34:58 +02:00
muutokset <- zeros ( npops , 1 )
emptyPop_pops <- findEmptyPop ( npops )
emptyPop <- emptyPop_pops $ emptyPop
pops <- emptyPop_pops $ pops
rm ( emptyPop_pops )
2024-07-02 12:17:02 +02:00
i1 <- globals $ PARTITION ( ind )
2022-09-15 09:34:58 +02:00
i2 <- pops [find ( pops != i1 ) ]
if ( emptyPop > 0 ) {
i2 <- c ( i2 , emptyPop )
}
rows <- ( ( ind - 1 ) * rowsFromInd + 1 ) : ( ind * rowsFromInd )
2024-07-02 12:17:02 +02:00
diffInCounts <- computeDiffInCounts ( rows , size ( globals $ COUNTS , 1 ) , size ( globals $ COUNTS , 2 ) , data )
2022-09-15 09:34:58 +02:00
diffInSumCounts <- sum ( diffInCounts )
diffInCliqCounts <- computeDiffInCliqCounts ( cliques , ind )
diffInSepCounts <- computeDiffInCliqCounts ( separators , ind )
2024-07-02 12:17:02 +02:00
globals $ COUNTS [ , , i1 ] <- globals $ COUNTS [ , , i1 ] - diffInCounts
globals $ SUMCOUNTS [i1 , ] <- globals $ SUMCOUNTS [i1 , ] - diffInSumCounts
globals $ CLIQCOUNTS [ , i1 ] <- globals $ CLIQCOUNTS [ , i1 ] - diffInCliqCounts
globals $ SEPCOUNTS [ , i1 ] <- globals $ SEPCOUNTS [ , i1 ] - diffInSepCounts
2022-09-15 09:34:58 +02:00
for ( i in i2 ) {
2024-07-02 12:17:02 +02:00
globals $ CLIQCOUNTS [ , i ] <- globals $ CLIQCOUNTS [ , i ] + diffInCliqCounts
globals $ SEPCOUNTS [ , i ] <- globals $ SEPCOUNTS [ , i ] + diffInSepCounts
globals $ COUNTS [ , , i ] <- globals $ COUNTS [ , , i ] + diffInCounts
globals $ SUMCOUNTS [i , ] <- globals $ SUMCOUNTS [i , ] + diffInSumCounts
2022-09-15 09:34:58 +02:00
muutokset [i ] <- computeLogml ( adjprior , priorTerm ) - logml
2024-07-02 12:17:02 +02:00
globals $ CLIQCOUNTS [ , i ] <- globals $ CLIQCOUNTS [ , i ] - diffInCliqCounts
globals $ SEPCOUNTS [ , i ] <- globals $ SEPCOUNTS [ , i ] - diffInSepCounts
globals $ COUNTS [ , , i ] <- globals $ COUNTS [ , , i ] - diffInCounts
globals $ SUMCOUNTS [i , ] <- globals $ SUMCOUNTS [i , ] - diffInSumCounts
2022-09-15 09:34:58 +02:00
}
2024-07-02 12:17:02 +02:00
globals $ COUNTS [ , , i1 ] <- globals $ COUNTS [ , , i1 ] + diffInCounts
globals $ SUMCOUNTS [i1 , ] <- globals $ SUMCOUNTS [i1 , ] + diffInSumCounts
globals $ CLIQCOUNTS [ , i1 ] <- globals $ CLIQCOUNTS [ , i1 ] + diffInCliqCounts
globals $ SEPCOUNTS [ , i1 ] <- globals $ SEPCOUNTS [ , i1 ] + diffInSepCounts
2022-09-15 09:34:58 +02:00
# Asetetaan muillekin tyhjille populaatioille sama muutos, kuin
# emptyPop:lle
if ( emptyPop > 0 ) {
empties <- mysetdiff ( 1 : npops , c ( i2 , i1 ) )
muutokset [empties ] <- muutokset ( emptyPop )
}
return ( list ( muutokset = muutokset , diffInCounts = diffInCounts ) )
} ,
#' @param i1 i1
#' @param rowsFromInd rowsFromInd
#' @param data data
#' @param adjprior adjprior
#' @param priorTerm priorTerm
#' @param logml logml
#' @param cliques cliques
#' @param separators separators
laskeMuutokset2 = function (
i1 , rowsFromInd , data , adjprior , priorTerm , logml , cliques , separators
) {
# Palauttaa npops * 1 taulun, jossa i:s alkio kertoo, mik?olisi
# muutos logml:ss? mikהli korin i1 kaikki yksilצt siirretההn
# koriin i.
# Laskee muutokset vain yhdelle tyhjהlle populaatiolle, muille tulee
# muutokseksi 0.
2024-07-02 12:17:02 +02:00
# global globals$COUNTS # global globals$SUMCOUNTS
# global globals$PARTITION # global globals$POP_LOGML
# global globals$CLIQCOUNTS # global globals$SEPCOUNTS
2022-09-15 09:34:58 +02:00
2024-07-02 12:17:02 +02:00
npops <- size ( globals $ COUNTS , 3 )
2022-09-15 09:34:58 +02:00
muutokset <- zeros ( npops , 1 )
emptyPop <- findEmptyPop ( npops ) $ emptyPop
pops <- findEmptyPop ( npops ) $ npops
i2 <- pops [find ( pops != i1 ) ]
if ( emptyPop > 0 ) {
i2 <- c ( i2 , emptyPop )
}
2024-07-02 12:17:02 +02:00
inds <- find ( globals $ PARTITION == i1 )
2022-09-15 09:34:58 +02:00
rows <- computeRows ( rowsFromInd , inds , length ( inds ) )
2024-07-02 12:17:02 +02:00
diffInCounts <- computeDiffInCounts ( rows , size ( globals $ COUNTS , 1 ) , size ( globals $ COUNTS , 2 ) , data )
2022-09-15 09:34:58 +02:00
diffInSumCounts <- sum ( diffInCounts )
diffInCliqCounts <- computeDiffInCliqCounts ( cliques , inds )
diffInSepCounts <- computeDiffInCliqCounts ( separators , inds )
2024-07-02 12:17:02 +02:00
globals $ COUNTS [ , , i1 ] <- globals $ COUNTS [ , , i1 ] - diffInCounts
globals $ SUMCOUNTS [i1 , ] <- globals $ SUMCOUNTS [i1 , ] - diffInSumCounts
globals $ CLIQCOUNTS [ , i1 ] <- 0
globals $ SEPCOUNTS [ , i1 ] <- 0
2022-09-15 09:34:58 +02:00
for ( i in i2 ) {
2024-07-02 12:17:02 +02:00
globals $ CLIQCOUNTS [ , i ] <- globals $ CLIQCOUNTS [ , i ] + diffInCliqCounts
globals $ SEPCOUNTS [ , i ] <- globals $ SEPCOUNTS [ , i ] + diffInSepCounts
globals $ COUNTS [ , , i ] <- globals $ COUNTS [ , , i ] + diffInCounts
globals $ SUMCOUNTS [i , ] <- globals $ SUMCOUNTS [i , ] + diffInSumCounts
2022-09-15 09:34:58 +02:00
muutokset [i ] <- computeLogml ( adjprior , priorTerm ) - logml
2024-07-02 12:17:02 +02:00
globals $ CLIQCOUNTS [ , i ] <- globals $ CLIQCOUNTS [ , i ] - diffInCliqCounts
globals $ SEPCOUNTS [ , i ] <- globals $ SEPCOUNTS [ , i ] - diffInSepCounts
globals $ COUNTS [ , , i ] <- globals $ COUNTS [ , , i ] - diffInCounts
globals $ SUMCOUNTS [i , ] <- globals $ SUMCOUNTS [i , ] - diffInSumCounts
2022-09-15 09:34:58 +02:00
}
2024-07-02 12:17:02 +02:00
globals $ COUNTS [ , , i1 ] <- globals $ COUNTS [ , , i1 ] + diffInCounts
globals $ SUMCOUNTS [i1 , ] <- globals $ SUMCOUNTS [i1 , ] + diffInSumCounts
globals $ CLIQCOUNTS [ , i1 ] <- diffInCliqCounts
globals $ SEPCOUNTS [ , i1 ] <- diffInSepCounts
2022-09-15 09:34:58 +02:00
return ( list ( muutokset = muutokset , diffInCounts = diffInCounts ) )
} ,
#' @param T2 T2
#' @param inds2 inds2
#' @param rowsFromInd rowsFromInd
#' @param data data
#' @param adjprior adjprior
#' @param priorTerm priorTerm
#' @param i1 i1
#' @param logml logml
#' @param cliques cliques
#' @param separators separators
laskeMuutokset3 = function (
T2 , inds2 , rowsFromInd , data , adjprior , priorTerm , i1 , logml , cliques ,
separators
) {
# Palauttaa length(unique(T2)) * npops taulun, jossa (i, j):s alkio
# kertoo, mik?olisi muutos logml:ss? jos populaation i1 osapopulaatio
# inds2(find(T2 == i)) siirretההn koriin j.
# Laskee vain yhden tyhjהn populaation, muita kohden muutokseksi jהה 0.
2024-07-02 12:17:02 +02:00
# global globals$COUNTS # global globals$SUMCOUNTS
# global globals$PARTITION # global globals$POP_LOGML
# global globals$CLIQCOUNTS # global globals$SEPCOUNTS
2022-09-15 09:34:58 +02:00
2024-07-02 12:17:02 +02:00
npops <- size ( globals $ COUNTS , 3 )
2022-09-15 09:34:58 +02:00
npops2 <- length ( unique ( T2 ) )
muutokset <- zeros ( npops2 , npops )
for ( pop2 in 1 : npops2 ) {
inds <- inds2 [find ( T2 == pop2 ) ]
ninds <- length ( inds )
if ( ninds > 0 ) {
rows <- computeRows ( rowsFromInd , inds , ninds )
2024-07-02 12:17:02 +02:00
diffInCounts <- computeDiffInCounts ( rows , size ( globals $ COUNTS , 1 ) , size ( globals $ COUNTS , 2 ) , data )
2022-09-15 09:34:58 +02:00
diffInSumCounts <- sum ( diffInCounts )
diffInCliqCounts <- computeDiffInCliqCounts ( cliques , inds )
diffInSepCounts <- computeDiffInCliqCounts ( separators , inds )
2024-07-02 12:17:02 +02:00
globals $ COUNTS [ , , i1 ] <- globals $ COUNTS [ , , i1 ] - diffInCounts
globals $ SUMCOUNTS [i1 , ] <- globals $ SUMCOUNTS [i1 , ] - diffInSumCounts
globals $ CLIQCOUNTS [ , i1 ] <- globals $ CLIQCOUNTS [ , i1 ] - diffInCliqCounts
globals $ SEPCOUNTS [ , i1 ] <- globals $ SEPCOUNTS [ , i1 ] - diffInSepCounts
2022-09-15 09:34:58 +02:00
emptyPop <- findEmptyPop ( npops ) $ emptyPop
pops <- findEmptyPop ( npops ) $ pops
i2 <- pops [find ( pops != i1 ) ]
if ( emptyPop > 0 ) {
i2 <- c ( i2 , emptyPop )
}
for ( i in i2 ) {
2024-07-02 12:17:02 +02:00
globals $ CLIQCOUNTS [ , i ] <- globals $ CLIQCOUNTS [ , i ] + diffInCliqCounts
globals $ SEPCOUNTS [ , i ] <- globals $ SEPCOUNTS [ , i ] + diffInSepCounts
globals $ COUNTS [ , , i ] <- globals $ COUNTS [ , , i ] + diffInCounts
globals $ SUMCOUNTS [i , ] <- globals $ SUMCOUNTS [i , ] + diffInSumCounts
2022-09-15 09:34:58 +02:00
muutokset [pop2 , i ] <- computeLogml ( adjprior , priorTerm ) - logml
2024-07-02 12:17:02 +02:00
globals $ CLIQCOUNTS [ , i ] <- globals $ CLIQCOUNTS [ , i ] - diffInCliqCounts
globals $ SEPCOUNTS [ , i ] <- globals $ SEPCOUNTS [ , i ] - diffInSepCounts
globals $ COUNTS [ , , i ] <- globals $ COUNTS [ , , i ] - diffInCounts
globals $ SUMCOUNTS [i , ] <- globals $ SUMCOUNTS [i , ] - diffInSumCounts
2022-09-15 09:34:58 +02:00
}
2024-07-02 12:17:02 +02:00
globals $ COUNTS [ , , i1 ] <- globals $ COUNTS [ , , i1 ] + diffInCounts
globals $ SUMCOUNTS [i1 , ] <- globals $ SUMCOUNTS [i1 , ] + diffInSumCounts
globals $ CLIQCOUNTS [ , i1 ] <- globals $ CLIQCOUNTS [ , i1 ] + diffInCliqCounts
globals $ SEPCOUNTS [ , i1 ] <- globals $ SEPCOUNTS [ , i1 ] + diffInSepCounts
2022-09-15 09:34:58 +02:00
}
}
return ( muutokset )
} ,
#' @param inds inds
#' @param rowsFromInd rowsFromInd
#' @param data data
#' @param adjprior adjprior
#' @param priorTerm priorTerm
#' @param logml logml
#' @param cliques cliques
#' @param separators separators
#' @param i1 i1
#' @param i2 i2
laskeMuutokset5 = function (
inds , rowsFromInd , data , adjprior , priorTerm , logml , cliques , separators ,
i1 , i2
) {
# Palauttaa length(inds) * 1 taulun, jossa i:s alkio kertoo, mik?olisi
# muutos logml:ss? mikהli yksil?i vaihtaisi koria i1:n ja i2:n vהlill?
2024-07-02 12:17:02 +02:00
# global globals$COUNTS # global globals$SUMCOUNTS
# global globals$PARTITION
# global globals$CLIQCOUNTS # global globals$SEPCOUNTS
2022-09-15 09:34:58 +02:00
ninds <- length ( inds )
muutokset <- zeros ( ninds , 1 )
2024-07-02 12:17:02 +02:00
cliqsize <- size ( globals $ CLIQCOUNTS , 2 )
sepsize <- size ( globals $ SEPCOUNTS , 2 )
2022-09-15 09:34:58 +02:00
for ( i in 1 : ninds ) {
ind <- inds [i ]
2024-07-02 12:17:02 +02:00
if ( globals $ PARTITION [ind ] == i1 ) {
2022-09-15 09:34:58 +02:00
pop1 <- i1 # mist?
pop2 <- i2 # mihin
} else {
pop1 <- i2
pop2 <- i1
}
rows <- ( ( ind - 1 ) * rowsFromInd + 1 ) : ( ind * rowsFromInd )
2024-07-02 12:17:02 +02:00
diffInCounts <- computeDiffInCounts ( rows , size ( globals $ COUNTS , 1 ) , size ( globals $ COUNTS , 2 ) , data )
2022-09-15 09:34:58 +02:00
diffInSumCounts <- sum ( diffInCounts )
diffInCliqCounts <- computeDiffInCliqCounts ( cliques , ind )
diffInSepCounts <- computeDiffInCliqCounts ( separators , ind )
2024-07-02 12:17:02 +02:00
globals $ COUNTS [ , , pop1 ] <- globals $ COUNTS [ , , pop1 ] - diffInCounts
globals $ SUMCOUNTS [pop1 , ] <- globals $ SUMCOUNTS [pop1 , ] - diffInSumCounts
globals $ COUNTS [ , , pop2 ] <- globals $ COUNTS [ , , pop2 ] + diffInCounts
globals $ SUMCOUNTS [pop2 , ] <- globals $ SUMCOUNTS [pop2 , ] + diffInSumCounts
2022-09-15 09:34:58 +02:00
2024-07-02 12:17:02 +02:00
globals $ CLIQCOUNTS [ , pop1 ] <- globals $ CLIQCOUNTS [ , pop1 ] - diffInCliqCounts
globals $ CLIQCOUNTS [ , pop2 ] <- globals $ CLIQCOUNTS [ , pop2 ] + diffInCliqCounts
globals $ SEPCOUNTS [ , pop1 ] <- globals $ SEPCOUNTS [ , pop1 ] - diffInSepCounts
globals $ SEPCOUNTS [ , pop2 ] <- globals $ SEPCOUNTS [ , pop2 ] + diffInSepCounts
2022-09-15 09:34:58 +02:00
muutokset [i ] <- computeLogml ( adjprior , priorTerm ) - logml
2024-07-02 12:17:02 +02:00
globals $ COUNTS [ , , pop1 ] <- globals $ COUNTS [ , , pop1 ] + diffInCounts
globals $ SUMCOUNTS [pop1 , ] <- globals $ SUMCOUNTS [pop1 , ] + diffInSumCounts
globals $ COUNTS [ , , pop2 ] <- globals $ COUNTS [ , , pop2 ] - diffInCounts
globals $ SUMCOUNTS [pop2 , ] <- globals $ SUMCOUNTS [pop2 , ] - diffInSumCounts
2022-09-15 09:34:58 +02:00
2024-07-02 12:17:02 +02:00
globals $ CLIQCOUNTS [ , pop1 ] <- globals $ CLIQCOUNTS [ , pop1 ] + diffInCliqCounts
globals $ CLIQCOUNTS [ , pop2 ] <- globals $ CLIQCOUNTS [ , pop2 ] - diffInCliqCounts
globals $ SEPCOUNTS [ , pop1 ] <- globals $ SEPCOUNTS [ , pop1 ] + diffInSepCounts
globals $ SEPCOUNTS [ , pop2 ] <- globals $ SEPCOUNTS [ , pop2 ] - diffInSepCounts
2022-09-15 09:34:58 +02:00
}
return ( muutokset )
2022-08-25 13:03:36 +02:00
}
)
)
#' @title Calculate changes (admix1 class)
2020-10-19 14:23:22 +02:00
#' @description Palauttaa npops*npops taulun, jonka alkio (i,j) kertoo, mik?on
#' muutos logml:ss? mikäli populaatiosta i siirretään osuuden verran
#' todennäköisyysmassaa populaatioon j. Mikäli populaatiossa i ei ole mitään
#' siirrettävää, on vastaavassa kohdassa rivi nollia.
2022-08-25 12:54:55 +02:00
#' @importFrom R6 R6Class
admix1_muutokset <- R6Class (
classname = " admix1_muutokset" ,
public = list (
2022-08-25 13:03:36 +02:00
#' @param osuus Percentages?
#' @param osuusTaulu Percentage table?
#' @param omaFreqs own Freqs?
#' @param logml log maximum likelihood
2022-08-25 12:54:55 +02:00
laskeMuutokset4 = function ( osuus , osuusTaulu , omaFreqs , logml ) {
2024-04-10 16:04:07 +02:00
if ( isGlobalEmpty ( globals $ COUNTS ) ) {
2022-08-25 12:54:55 +02:00
npops <- 1
} else {
2024-04-10 16:04:07 +02:00
npops <- ifelse ( is.na ( dim ( globals $ COUNTS ) [3 ] ) , 1 , dim ( globals $ COUNTS ) [3 ] )
2022-08-25 12:54:55 +02:00
}
notEmpty <- which ( osuusTaulu > 0.005 )
muutokset <- zeros ( npops )
empties <- ! notEmpty
2021-11-10 14:02:35 +01:00
2022-08-25 12:54:55 +02:00
for ( i1 in notEmpty ) {
osuusTaulu [i1 ] <- osuusTaulu [i1 ] - osuus
for ( i2 in c ( colon ( 1 , i1 - 1 ) , colon ( i1 + 1 , npops ) ) ) {
osuusTaulu [i2 ] <- osuusTaulu [i2 ] + osuus
loggis <- computeIndLogml ( omaFreqs , osuusTaulu )
2021-11-10 14:02:35 +01:00
2022-08-25 12:54:55 +02:00
# Work around Matlab OOB bug
if ( i1 > nrow ( muutokset ) ) {
muutokset <- rbind ( muutokset , muutokset * 0 )
}
if ( i2 > ncol ( muutokset ) ) {
muutokset <- cbind ( muutokset , muutokset * 0 )
}
2021-11-10 14:02:35 +01:00
2022-08-25 12:54:55 +02:00
muutokset [i1 , i2 ] <- loggis - logml
osuusTaulu [i2 ] <- osuusTaulu [i2 ] - osuus
}
osuusTaulu [i1 ] <- osuusTaulu [i1 ] + osuus
}
return ( muutokset )
2021-11-10 14:02:35 +01:00
}
2022-08-25 12:54:55 +02:00
)
)
2022-08-25 13:48:17 +02:00
#' @title Calculate changes (greedyMix class)
#' @description Palauttaa npops*1 taulun, jossa i:s alkio kertoo, mik<69> olisi
#' muutos logml:ss<73> , mik<69> li yksil<69> ind siirret<65> <74> n koriin i.
2024-07-02 12:17:02 +02:00
#' diffInCounts on poistettava globals$COUNTS:in siivusta i1 ja lis<69> tt<74> v<EFBFBD>
#' globals$COUNTS:in siivuun i2, mik<69> li muutos toteutetaan.
2022-08-25 13:48:17 +02:00
#'
#' Lis<69> ys 25.9.2007:
#' Otettu k<> ytt<74> <74> n globaali muuttuja LOGDIFF, johon on tallennettu muutokset
#' logml:ss<73> siirrett<74> ess<73> yksil<69> it<69> toisiin populaatioihin.
greedyMix_muutokset <- R6Class (
classname = " greedyMix_muutokset" ,
public = list (
#' @param ind ind
#' @param globalRows globalRows
#' @param data data
#' @param adjprior adjprior
#' @param priorTerm priorTerm
2024-06-26 14:27:02 +02:00
#' @param npops Number of populations
2024-04-10 14:25:22 +02:00
laskeMuutokset = function ( ind , globalRows , data , adjprior , priorTerm , npops ) {
2024-04-10 16:04:07 +02:00
muutokset <- globals $ LOGDIFF [ind , ]
2022-08-25 13:48:17 +02:00
2024-04-10 16:04:07 +02:00
i1 <- globals $ PARTITION [ind ]
i1_logml <- globals $ POP_LOGML [i1 ]
2022-08-25 13:48:17 +02:00
muutokset [i1 ] <- 0
2023-08-11 14:31:08 +02:00
if ( is.null ( dim ( globalRows ) ) ) {
rows <- globalRows [1 ] : globalRows [2 ]
} else {
rows <- globalRows [ind , 1 ] : globalRows [ind , 2 ]
}
2024-04-10 15:09:12 +02:00
2022-08-25 13:48:17 +02:00
diffInCounts <- computeDiffInCounts (
2024-04-10 16:04:07 +02:00
rows , size ( globals $ COUNTS , 1 ) , size ( globals $ COUNTS , 2 ) , data
2024-04-10 15:09:12 +02:00
)
2022-08-25 13:48:17 +02:00
diffInSumCounts <- colSums ( diffInCounts )
2024-04-10 16:04:07 +02:00
globals $ COUNTS [ , , i1 ] <- globals $ COUNTS [ , , i1 ] - diffInCounts
globals $ SUMCOUNTS [i1 , ] <- globals $ SUMCOUNTS [i1 , ] - diffInSumCounts
2024-04-10 15:09:12 +02:00
new_i1_logml <- computePopulationLogml ( i1 , adjprior , priorTerm )
2024-04-10 16:04:07 +02:00
globals $ COUNTS [ , , i1 ] <- globals $ COUNTS [ , , i1 ] + diffInCounts
globals $ SUMCOUNTS [i1 , ] <- globals $ SUMCOUNTS [i1 , ] + diffInSumCounts
2022-08-25 13:48:17 +02:00
i2 <- matlab2r :: find ( muutokset == - Inf ) # Etsit<69> <74> n populaatiot jotka muuttuneet viime kerran j<> lkeen. (Searching for populations that have changed since the last time)
i2 <- setdiff ( i2 , i1 )
2024-04-10 16:04:07 +02:00
i2_logml <- globals $ POP_LOGML [i2 ]
2022-08-25 13:48:17 +02:00
ni2 <- length ( i2 )
2024-04-10 16:04:07 +02:00
globals $ COUNTS [ , , i2 ] <- globals $ COUNTS [ , , i2 ] + repmat ( diffInCounts , c ( 1 , 1 , ni2 ) )
globals $ SUMCOUNTS [i2 , ] <- globals $ SUMCOUNTS [i2 , ] + repmat ( diffInSumCounts , c ( ni2 , 1 ) )
2024-04-10 15:09:12 +02:00
new_i2_logml <- computePopulationLogml ( i2 , adjprior , priorTerm )
2024-04-10 16:04:07 +02:00
globals $ COUNTS [ , , i2 ] <- globals $ COUNTS [ , , i2 ] - repmat ( diffInCounts , c ( 1 , 1 , ni2 ) )
globals $ SUMCOUNTS [i2 , ] <- globals $ SUMCOUNTS [i2 , ] - repmat ( diffInSumCounts , c ( ni2 , 1 ) )
2022-08-25 13:48:17 +02:00
2024-04-10 15:09:12 +02:00
muutokset [i2 ] <- new_i1_logml [ , ] - i1_logml + new_i2_logml [ , ] - i2_logml
2024-04-10 16:04:07 +02:00
globals $ LOGDIFF [ind , ] <- muutokset
2022-08-25 13:48:17 +02:00
return ( list ( muutokset = muutokset , diffInCounts = diffInCounts ) )
} ,
#' @param i1 i1
#' @param globalRows globalRows
#' @param data data
#' @param adjprior adjprior
#' @param priorTerm priorTerm
laskeMuutokset2 = function ( i1 , globalRows , data , adjprior , priorTerm ) {
# % Palauttaa npops*1 taulun, jossa i:s alkio kertoo, mik<69> olisi
# % muutos logml:ss<73> , mik<69> li korin i1 kaikki yksil<69> t siirret<65> <74> n
# % koriin i.
2024-04-10 16:04:07 +02:00
npops <- size ( globals $ COUNTS , 3 )
2022-08-25 13:48:17 +02:00
muutokset <- zeros ( npops , 1 )
2024-04-10 16:04:07 +02:00
i1_logml <- globals $ POP_LOGML [i1 ]
2022-08-25 13:48:17 +02:00
2024-04-10 16:04:07 +02:00
inds <- matlab2r :: find ( globals $ PARTITION == i1 )
2022-08-25 13:48:17 +02:00
ninds <- length ( inds )
if ( ninds == 0 ) {
2024-04-10 16:04:07 +02:00
diffInCounts <- zeros ( size ( globals $ COUNTS , 1 ) , size ( globals $ COUNTS , 2 ) )
2024-07-02 12:17:02 +02:00
return ( list ( " muutokset" = muutokset , " diffInCounts" = diffInCounts ) )
2022-08-25 13:48:17 +02:00
}
2020-10-19 14:23:22 +02:00
2021-11-10 14:02:35 +01:00
rows <- list ( )
2024-07-02 12:17:02 +02:00
for ( i in seq_len ( ninds ) ) {
2024-04-10 16:04:07 +02:00
ind <- inds [i ]
lisa <- globalRows [ind , 1 ] : globalRows [ind , 2 ]
2021-11-10 14:02:35 +01:00
rows <- c ( rows , t ( lisa ) )
}
2022-08-25 13:48:17 +02:00
2021-11-10 14:02:35 +01:00
diffInCounts <- computeDiffInCounts (
2024-04-10 16:04:07 +02:00
t ( rows ) , size ( globals $ COUNTS , 1 ) , size ( globals $ COUNTS , 2 ) , data
2021-11-10 14:02:35 +01:00
)
2024-07-02 12:17:02 +02:00
diffInSumCounts <- colSums ( diffInCounts )
2021-11-10 14:02:35 +01:00
2024-04-10 16:04:07 +02:00
globals $ COUNTS [ , , i1 ] <- globals $ COUNTS [ , , i1 ] - diffInCounts
globals $ SUMCOUNTS [i1 , ] <- globals $ SUMCOUNTS [i1 , ] - diffInSumCounts
2021-11-10 14:02:35 +01:00
new_i1_logml <- computePopulationLogml ( i1 , adjprior , priorTerm )
2024-04-10 16:04:07 +02:00
globals $ COUNTS [ , , i1 ] <- globals $ COUNTS [ , , i1 ] + diffInCounts
globals $ SUMCOUNTS [i1 , ] <- globals $ SUMCOUNTS [i1 , ] + diffInSumCounts
2021-11-10 14:02:35 +01:00
2024-07-02 12:17:02 +02:00
if ( i1 < npops ) {
i2 <- c ( 1 : ( i1 - 1 ) , ( i1 + 1 ) : npops )
} else {
i2 <- 1 : ( i1 - 1 )
}
2024-04-10 16:04:07 +02:00
i2_logml <- globals $ POP_LOGML [i2 ]
2021-11-10 14:02:35 +01:00
2024-04-10 16:04:07 +02:00
globals $ COUNTS [ , , i2 ] <- globals $ COUNTS [ , , i2 ] + repmat ( diffInCounts , c ( 1 , 1 , npops - 1 ) )
globals $ SUMCOUNTS [i2 , ] <- globals $ SUMCOUNTS [i2 , ] + repmat ( diffInSumCounts , c ( npops - 1 , 1 ) )
2022-08-25 13:48:17 +02:00
new_i2_logml <- computePopulationLogml ( i2 , adjprior , priorTerm )
2024-04-10 16:04:07 +02:00
globals $ COUNTS [ , , i2 ] <- globals $ COUNTS [ , , i2 ] - repmat ( diffInCounts , c ( 1 , 1 , npops - 1 ) )
globals $ SUMCOUNTS [i2 , ] <- globals $ SUMCOUNTS [i2 , ] - repmat ( diffInSumCounts , c ( npops - 1 , 1 ) )
2021-11-10 14:02:35 +01:00
2024-07-02 12:17:02 +02:00
i1_diff <- new_i1_logml - i1_logml
muutokset [i2 ] <- rep ( i1_diff , length ( i2_logml ) ) + new_i2_logml - i2_logml
2022-08-25 13:48:17 +02:00
return ( list ( muutokset = muutokset , diffInCounts = diffInCounts ) )
} ,
#' @param T2 T2
#' @param inds2 inds2
#' @param globalRows globalRows
#' @param data data
#' @param adjprior adjprior
#' @param priorTerm priorTerm
#' @param i1 i1
laskeMuutokset3 = function (
T2 , inds2 , globalRows , data , adjprior , priorTerm , i1
) {
# Palauttaa length(unique(T2))*npops taulun, jossa (i,j):s alkio
# kertoo, mik<69> olisi muutos logml:ss<73> , jos populaation i1 osapopulaatio
# inds2(matlab2r::find(T2==i)) siirret<65> <74> n koriin j.
2024-07-02 12:17:02 +02:00
npops <- size ( globals $ COUNTS , 3 )
2022-08-25 13:48:17 +02:00
npops2 <- length ( unique ( T2 ) )
muutokset <- zeros ( npops2 , npops )
2024-07-02 12:17:02 +02:00
i1_logml <- globals $ POP_LOGML [i1 ]
2022-08-25 13:48:17 +02:00
for ( pop2 in 1 : npops2 ) {
inds <- inds2 [matlab2r :: find ( T2 == pop2 ) ]
ninds <- length ( inds )
if ( ninds > 0 ) {
rows <- list ( )
for ( i in 1 : ninds ) {
ind <- inds [i ]
lisa <- globalRows [ind , 1 ] : globalRows [ind , 2 ]
rows <- c ( rows , t ( lisa ) )
}
diffInCounts <- computeDiffInCounts (
2024-07-02 12:17:02 +02:00
t ( rows ) , size ( globals $ COUNTS , 1 ) , size ( globals $ COUNTS , 2 ) , data
2022-08-25 13:48:17 +02:00
)
2024-07-02 12:17:02 +02:00
diffInSumCounts <- colSums ( diffInCounts )
2022-08-25 13:48:17 +02:00
2024-07-02 12:17:02 +02:00
globals $ COUNTS [ , , i1 ] <- globals $ COUNTS [ , , i1 ] - diffInCounts
globals $ SUMCOUNTS [i1 , ] <- globals $ SUMCOUNTS [i1 , ] - diffInSumCounts
2022-08-25 13:48:17 +02:00
new_i1_logml <- computePopulationLogml ( i1 , adjprior , priorTerm )
2024-07-02 12:17:02 +02:00
globals $ COUNTS [ , , i1 ] <- globals $ COUNTS [ , , i1 ] + diffInCounts
globals $ SUMCOUNTS [i1 , ] <- globals $ SUMCOUNTS [i1 , ] + diffInSumCounts
2022-08-25 13:48:17 +02:00
2024-07-02 12:17:02 +02:00
if ( i1 < npops ) {
i2 <- c ( 1 : ( i1 - 1 ) , ( i1 + 1 ) : npops )
} else {
i2 <- 1 : ( i1 - 1 )
}
i2_logml <- t ( globals $ POP_LOGML [i2 ] )
2022-08-25 13:48:17 +02:00
2024-07-02 12:17:02 +02:00
globals $ COUNTS [ , , i2 ] <- globals $ COUNTS [ , , i2 ] + repmat ( diffInCounts , c ( 1 , 1 , npops - 1 ) )
globals $ SUMCOUNTS [i2 , ] <- globals $ SUMCOUNTS [i2 , ] + repmat ( diffInSumCounts , c ( npops - 1 , 1 ) )
2022-08-25 13:48:17 +02:00
new_i2_logml <- t ( computePopulationLogml ( i2 , adjprior , priorTerm ) )
2024-07-02 12:17:02 +02:00
globals $ COUNTS [ , , i2 ] <- globals $ COUNTS [ , , i2 ] - repmat ( diffInCounts , c ( 1 , 1 , npops - 1 ) )
globals $ SUMCOUNTS [i2 , ] <- globals $ SUMCOUNTS [i2 , ] - repmat ( diffInSumCounts , c ( npops - 1 , 1 ) )
2022-08-25 13:48:17 +02:00
2024-07-02 12:17:02 +02:00
i1_diff <- new_i1_logml - i1_logml
muutokset [pop2 , i2 ] <- rep ( i1_diff , length ( i2_logml ) ) + new_i2_logml - i2_logml
2022-08-25 13:48:17 +02:00
}
}
return ( muutokset )
} ,
#' @param inds inds
#' @param globalRows globalRows
#' @param data data
#' @param adjprior adjprior
#' @param priorTerm priorTerm
#' @param i1 i1
#' @param i2 i2
laskeMuutokset5 = function ( inds , globalRows , data , adjprior , priorTerm , i1 , i2 ) {
# Palauttaa length(inds)*1 taulun, jossa i:s alkio kertoo, mik<69> olisi
# muutos logml:ss<73> , mik<69> li yksil<69> i vaihtaisi koria i1:n ja i2:n v<> lill<6C> .
ninds <- length ( inds )
muutokset <- zeros ( ninds , 1 )
2024-07-02 12:17:02 +02:00
i1_logml <- globals $ POP_LOGML [i1 ]
i2_logml <- globals $ POP_LOGML [i2 ]
2022-08-25 13:48:17 +02:00
for ( i in 1 : ninds ) {
ind <- inds [i ]
2024-07-02 12:17:02 +02:00
if ( globals $ PARTITION [ind ] == i1 ) {
2022-08-25 13:48:17 +02:00
pop1 <- i1 # mist<73>
pop2 <- i2 # mihin
} else {
pop1 <- i2
pop2 <- i1
}
rows <- globalRows [ind , 1 ] : globalRows [ind , 2 ]
diffInCounts <- computeDiffInCounts (
2024-07-02 12:17:02 +02:00
rows , size ( globals $ COUNTS , 1 ) , size ( globals $ COUNTS , 2 ) , data
2022-08-25 13:48:17 +02:00
)
diffInSumCounts <- sum ( diffInCounts )
2021-11-10 14:02:35 +01:00
2024-07-02 12:17:02 +02:00
globals $ COUNTS [ , , pop1 ] <- globals $ COUNTS [ , , pop1 ] - diffInCounts
globals $ SUMCOUNTS [pop1 , ] <- globals $ SUMCOUNTS [pop1 , ] - diffInSumCounts
globals $ COUNTS [ , , pop2 ] <- globals $ COUNTS [ , , pop2 ] + diffInCounts
globals $ SUMCOUNTS [pop2 , ] <- globals $ SUMCOUNTS [pop2 , ] + diffInSumCounts
2021-11-10 14:02:35 +01:00
2022-08-25 13:48:17 +02:00
new_logmls <- computePopulationLogml ( c ( i1 , i2 ) , adjprior , priorTerm )
muutokset [i ] <- sum ( new_logmls )
2021-11-10 14:02:35 +01:00
2024-07-02 12:17:02 +02:00
globals $ COUNTS [ , , pop1 ] <- globals $ COUNTS [ , , pop1 ] + diffInCounts
globals $ SUMCOUNTS [pop1 , ] <- globals $ SUMCOUNTS [pop1 , ] + diffInSumCounts
globals $ COUNTS [ , , pop2 ] <- globals $ COUNTS [ , , pop2 ] - diffInCounts
globals $ SUMCOUNTS [pop2 , ] <- globals $ SUMCOUNTS [pop2 , ] - diffInSumCounts
2022-08-25 13:48:17 +02:00
}
2021-11-10 14:02:35 +01:00
2022-08-25 13:48:17 +02:00
muutokset <- muutokset - i1_logml - i2_logml
return ( muutokset )
}
)
)