test_that("Exercise plotting and dealing with different matrix input", {
    r1 <- rfitness(4)
    expect_silent(plot(r1))
    expect_silent(plot(r1, log = TRUE))
    expect_silent(plot(r1, log = TRUE, use_ggrepel = TRUE))
    expect_silent(plot(r1, log = TRUE, show_labels = FALSE))
    
    
    ## Specify fitness in a matrix, and plot it
    m5 <- cbind(A = c(0, 1, 0, 1), B = c(0, 0, 1, 1), F = c(1, 2, 3, 5.5))
    expect_silent(plotFitnessLandscape(m5))

    m6 <- cbind(c(0, 1, 0, 1), c(0, 0, 1, 1), c(1, 2, 3, 5.5))
    expect_message(plotFitnessLandscape(m6),
                   "Setting/resetting gene names because", fixed = TRUE)

    m7 <- cbind(c(0, 1, 0, 1), c(0, 0, 1, 1), F = c(1, 2, 3, 5.5))
    expect_message(plotFitnessLandscape(m7),
                   "Setting/resetting gene names because", fixed = TRUE)

    m8 <- cbind(A = c(0, 1, 0, 1), c(0, 0, 1, 1), F = c(1, 2, 3, 5.5))
    expect_message(plotFitnessLandscape(m8),
                   "Setting/resetting gene names because", fixed = TRUE)

    
    ## Specify fitness with allFitnessEffects, and plot it
    fe <- allFitnessEffects(epistasis = c("a : b" = 0.3,
                                          "b : c" = 0.5),
                            noIntGenes = c("e" = 0.1))
    
    expect_silent(plot(evalAllGenotypes(fe, order = FALSE)))

    ## same as
    expect_silent(plotFitnessLandscape(evalAllGenotypes(fe, order = FALSE)))
    ## more ggrepel
    expect_silent(plot(evalAllGenotypes(fe, order = FALSE), use_ggrepel = TRUE))
})


test_that("to_FitnessMatrix stops as it should", {
    x1 <- data.frame(a = 1:2, b = 1:2)
    expect_error(OncoSimulR:::to_Fitness_Matrix(x1, 2000),
                 "We cannot guess what you are passing",
                 fixed = TRUE)
    x2 <- list(a = 12, b = 13)
    expect_error(OncoSimulR:::to_Fitness_Matrix(x2, 2000),
                 "We cannot guess what you are passing",
                 fixed = TRUE)
    ## This is done above
    ## g <- cbind(c(0, 1, 0, 1), c(0, 0, 1, 1))
    ## s1 <- c(1, 1.4, 1.2, 1.5)
    ## expect_error(OncoSimulR:::to_Fitness_Matrix(cbind(g, s1), 2000),
    ##              "Matrix x must have column names",
    ##              fixed = TRUE)
    ## expect_message(plotFitnessLandscape(cbind(g, s1)),
    ##              "Matrix x must have column names",
    ##              fixed = TRUE)
    ## expect_message(plotFitnessLandscape(cbind(g, A = c(1, 2))),
    ##              "Matrix x must have column names",
    ##              fixed = TRUE)
})



test_that("to_FitnessMatrix can deal with df", {
    m4 <- data.frame(G = c("A, B", "A", "WT", "B"),
                     Fitness = c(3, 2, 1, 4))
    expect_message(OncoSimulR:::to_Fitness_Matrix(m4, 2000),
                   "Column names of object", fixed = TRUE)
    m5 <- data.frame(G = c("A, B", "B"),
                     Fitness = c(3, 2))
    expect_message(OncoSimulR:::to_Fitness_Matrix(m5, 2000),
                   "Column names of object", fixed = TRUE)
    x1 <- data.frame(a = c("A, B"), Fitness = 2)
    expect_message(OncoSimulR:::to_Fitness_Matrix(x1, 2000),
                   "Column names of object", fixed = TRUE)
    x2 <- data.frame(a = c("A, B", "B"), Fitness = c(2, 3))
    expect_message(OncoSimulR:::to_Fitness_Matrix(x2, 2000),
                   "Column names of object", fixed = TRUE)
    x3 <- data.frame(a = c("A, B", "C"), Fitness = c(2, 3))
    expect_message(OncoSimulR:::to_Fitness_Matrix(x3, 2000),
                   "Column names of object", fixed = TRUE)
    ## Now, the user code
    expect_message(plotFitnessLandscape(x1))
    expect_message(plotFitnessLandscape(x2))
    expect_message(plotFitnessLandscape(x3))
    expect_message(plotFitnessLandscape(m5))
    expect_message(plotFitnessLandscape(m4))
})


test_that("internal peak valley functions", {
    
    x <- matrix(NA, 14, 14)
    x[1, 3] <- -2
    x[1, 2] <- -4
    x[2, 3] <- 5
    x[3, 4] <- 0
    x[4, 5] <- 0
    x[5, 6] <- 4
    x[3, 7] <- -3
    x[7, 8] <- 0
    x[3, 10] <- -4
    x[10, 11] <- -4
    x[11, 12] <- 0
    x[12, 13] <- 3
    x[8, 9] <- 5
    x[12, 14] <- -5
    
    (pv <-  OncoSimulR:::peak_valley(x))
    expect_equal(c(1, 6, 9, 13), pv$peak)
    expect_equal(c(2, 7, 8, 14), pv$valley)

    x <- matrix(NA, 15, 15)
    x[1, 3] <- -2
    x[1, 2] <- -4
    x[2, 3] <- 5
    x[3, 4] <- 0
    x[4, 5] <- 0
    x[5, 6] <- 4
    x[3, 7] <- -3
    x[7, 8] <- 0
    x[3, 10] <- -4
    x[10, 11] <- -4
    x[11, 12] <- 0
    x[12, 13] <- 3
    x[8, 9] <- 5
    x[12, 14] <- -5
    x[14, 15] <- 2
    
    (pv <-  OncoSimulR:::peak_valley(x))
    expect_equal(c(1, 6, 9, 13, 15), pv$peak)
    expect_equal(c(2, 7, 8, 14), pv$valley)


    x <- matrix(NA, 15, 15)
    x[1, 3] <- -2
    x[1, 2] <- -4
    x[2, 3] <- 5
    x[3, 4] <- 3
    x[4, 5] <- 0
    x[5, 6] <- 4
    x[3, 7] <- -3
    x[7, 8] <- 0
    x[3, 10] <- -4
    x[10, 11] <- -4
    x[11, 12] <- 0
    x[12, 13] <- 3
    x[8, 9] <- 5
    x[12, 14] <- -5
    x[14, 15] <- 2

    (pv <-  OncoSimulR:::peak_valley(x))
    expect_equal(c(1, 6, 9, 13, 15), pv$peak)
    expect_equal(c(2, 7, 8, 14), pv$valley)



    x <- matrix(NA, 15, 15)
    x[1, 3] <- -2
    x[1, 2] <- -4
    x[2, 3] <- 5
    x[3, 4] <- 3
    x[4, 5] <- -1
    x[5, 6] <- 4
    x[3, 7] <- -3
    x[7, 8] <- 0
    x[3, 10] <- -4
    x[10, 11] <- -4
    x[11, 12] <- 0
    x[12, 13] <- 3
    x[8, 9] <- 5
    x[12, 14] <- -5
    x[14, 15] <- 2

    (pv <-  OncoSimulR:::peak_valley(x))
    expect_equal(c(1, 4, 6, 9, 13, 15), pv$peak)
    expect_equal(c(2, 5, 7, 8, 14), pv$valley)


    x <- matrix(NA, 15, 15)
    x[1, 3] <- -2
    x[1, 2] <- -4
    x[2, 3] <- 5
    x[3, 4] <- 3
    x[4, 5] <- -1
    x[5, 6] <- 4
    x[3, 7] <- -3
    x[7, 8] <- 0
    x[3, 10] <- -4
    x[10, 11] <- -4
    x[11, 12] <- 0
    x[12, 13] <- 3
    x[8, 9] <- 5
    x[12, 14] <- -5
    x[14, 15] <- 2
    x[2, 7] <- 1

    (pv <-  OncoSimulR:::peak_valley(x))
    expect_equal(c(1, 4, 6, 9, 13, 15), pv$peak)
    expect_equal(c(2, 5, 14), pv$valley)



    x <- matrix(NA, 15, 15)
    x[1, 3] <- -2
    x[1, 2] <- -4
    x[2, 3] <- 5
    x[3, 4] <- 0
    x[4, 5] <- -1
    x[5, 6] <- 4
    x[3, 7] <- -3
    x[7, 8] <- 0
    x[3, 10] <- -4
    x[10, 11] <- -4
    x[11, 12] <- 0
    x[12, 13] <- 3
    x[8, 9] <- 5
    x[12, 14] <- -5
    x[14, 15] <- 2
    x[2, 7] <- 1 ## hummm.. 3 and 4 should be a peak?Nope, from 1

    (pv <-  OncoSimulR:::peak_valley(x))
    expect_equal(c(1, 6, 9, 13, 15), pv$peak)
    expect_equal(c(2, 5, 14), pv$valley)


    x <- matrix(NA, 15, 15)
    x[1, 3] <- 1
    x[1, 2] <- -4
    x[2, 3] <- 5
    x[3, 4] <- 0
    x[4, 5] <- -1
    x[5, 6] <- 4
    x[3, 7] <- -3
    x[7, 8] <- 0
    x[3, 10] <- -4
    x[10, 11] <- -4
    x[11, 12] <- 0
    x[12, 13] <- 3
    x[8, 9] <- 5
    x[12, 14] <- -5
    x[14, 15] <- 2
    x[2, 7] <- 1

    (pv <-  OncoSimulR:::peak_valley(x))
    expect_equal(c(3, 4, 6, 9, 13, 15), pv$peak)
    expect_equal(c(2, 5, 14), pv$valley)



    x <- matrix(NA, 5, 5)
    x[1, 3] <- -2
    x[2, 3] <- 4
    x[3, 4] <- 0
    x[4, 5] <- 6

    (pv <-  OncoSimulR:::peak_valley(x))
    expect_equal(c(1, 5), pv$peak)
    expect_equal(c(2), pv$valley)


    x <- matrix(NA, 5, 5)
    x[1, 3] <- -2
    x[2, 3] <- -5
    x[3, 4] <- 0
    x[4, 5] <- 6

    (pv <-  OncoSimulR:::peak_valley(x))
    expect_equal(c(1, 2, 5), pv$peak)
    expect_equal(c(3, 4), pv$valley)

    
})


## Beware that using peak_valley on only_accessible makes a difference
test_that("internal peak valley functions w/wo inaccessible filter", {
    ## A is accessible, a peak
    ## AB is a peak if only forward. But there is no
    ## reciprocal sign epistasis here!

    ## We want peaks in general, not just
    ## under assumption of "no back mutation"?

    ## Well, no, that is not obvious with cancer progression models if we
    ## do not allow back mutations.
    
    ## We get a different result when we restrict to accessible
    ## because all < 0 in adjacency are turned to NAs.

    ## Thinking in terms of adjacency matrix, AB is not a peak if it has a
    ## positive and a negative entry in its column, because the negative
    ## entry means there is an ancestor with larger fitness.
    ## But see below for why plainly using the adjacency matrix can give bad results.
    
    ## The next matrices are all fitness matrix. Last column is fitness.
    mf1 <- rbind(
        c(0, 0, 1),
        c(1, 0, 4),
        c(0, 1, 2),
        c(1, 1, 3)
    )

    plotFitnessLandscape(mf1)
    
    expect_equal(
        OncoSimulR:::peak_valley(
                                OncoSimulR:::genot_to_adj_mat(mf1))$peak, 2)
    
    expect_equal(
            OncoSimulR:::peak_valley(
                             OncoSimulR:::filter_inaccessible(
                                              OncoSimulR:::genot_to_adj_mat(mf1), 0))$peak,
        c(2, 4))

    expect_equal(
        OncoSimulR:::fast_peaks(mf1, 0),
        c(2, 4))


    ## reorder the rows of the matrix. Affects fast_peaks, as it should
    mf1 <- rbind(
        c(1, 0, 4),
        c(0, 0, 1),
        c(1, 1, 3),
        c(0, 1, 2)
    )
    
    plotFitnessLandscape(mf1)
    ## this is not affected, since it uses, by construction, the ordered matrix
    expect_equal(
        OncoSimulR:::peak_valley(
                                OncoSimulR:::genot_to_adj_mat(mf1))$peak, 2)
    ## ditto
    expect_equal(
            OncoSimulR:::peak_valley(
                             OncoSimulR:::filter_inaccessible(
                                              OncoSimulR:::genot_to_adj_mat(mf1), 0))$peak,
        c(2, 4))
    expect_equal(
        OncoSimulR:::fast_peaks(mf1, 0),
        c(1, 3))


    
    ## filtering by inaccessible also likely gets rid of all
    ## peaks in the non-accessible part of the fitness landscape.
    ## But of course those cannot be peaks, since they are inaccessible

    mf3 <- rbind(
        c(0, 0, 0, 1),
        c(1, 0, 0, 2),
        c(0, 1, 0, 0.1),
        c(0, 0, 1, 0.3),
        c(1, 1, 0, 3),
        c(1, 0, 1, 4),
        c(0, 1, 1, 0.4),
        c(1, 1, 1, 0.2)
    )

    ## plotFitnessLandscape(mf3)
    ## BC is detected as a peak, the seventh entry
    expect_equal(OncoSimulR:::peak_valley(OncoSimulR:::genot_to_adj_mat(mf3))$peak,
                 c(5, 6, 7))

    ## recall this gives the columns of the reduced matrix, which are the former
    ## 5 and 6
    expect_equal(OncoSimulR:::peak_valley(
                                  OncoSimulR:::filter_inaccessible(
                                                   OncoSimulR:::genot_to_adj_mat(mf3), 0))$peak,
                 c(3, 4))

    ## correct indices from original matrix
    expect_equal(
        OncoSimulR:::fast_peaks(mf3, 0),
        c(5, 6))

    ## works under reorder?
    expect_equal(
        OncoSimulR:::fast_peaks(mf3[c(5, 1, 2, 3, 7, 4, 6), ], 0),
        c(1, 7))

    
  

    mf4 <- rbind(
        c(0, 0, 0, 1),
        c(1, 0, 0, 2),
        c(0, 1, 0, 0.1),
        c(0, 0, 1, 0.3),
        c(1, 1, 0, 3),
        c(1, 0, 1, 4),
        c(0, 1, 1, 0.4),
        c(1, 1, 1, 1.2)
    )

    ## plotFitnessLandscape(mf4)
    
    ## ABC is not detected as a peak, because it is not.
    ## Issue is not its accessibility, but that AC and AB have larger fitness
    ## see example with mf5
    expect_equal(OncoSimulR:::peak_valley(OncoSimulR:::genot_to_adj_mat(mf4))$peak,
                 c(5, 6))

    ## recall this gives the columns of the reduced matrix, which are the former
    ## 5 and 6
    expect_equal(OncoSimulR:::peak_valley(
                                  OncoSimulR:::filter_inaccessible(
                                                   OncoSimulR:::genot_to_adj_mat(mf4), 0))$peak,
                 c(3, 4))

    expect_equal(
        OncoSimulR:::fast_peaks(mf4, 0),
        c(5, 6))

    
    ## Now ABC is accessible
      mf5 <- rbind(
        c(0, 0, 0, 1),
        c(1, 0, 0, 2),
        c(0, 1, 0, 0.1),
        c(0, 0, 1, 0.3),
        c(1, 1, 0, 3),
        c(1, 0, 1, 4),
        c(0, 1, 1, 0.4),
        c(1, 1, 1, 3.5)
    )
 
      ## plotFitnessLandscape(mf5)
      ## plotFitnessLandscape(mf5, only_accessible = TRUE)
      
      ## But only AC is the peak, correctly
      expect_equal(OncoSimulR:::peak_valley(OncoSimulR:::genot_to_adj_mat(mf5))$peak,
                   c(6))

      ## Now, both AC and ABC are peaks
      ## columns 4 and 5 correspond to genotypes 6 and 8
      expect_equal(OncoSimulR:::peak_valley(
                                    OncoSimulR:::filter_inaccessible(
                                                     OncoSimulR:::genot_to_adj_mat(mf5), 0))$peak,
                   c(4, 5))

      expect_equal(
          OncoSimulR:::fast_peaks(mf5, 0),
          c(6, 8))

    ## AC and ABC same max fitness
      mf6 <- rbind(
        c(0, 0, 0, 1),
        c(1, 0, 0, 2),
        c(0, 1, 0, 0.1),
        c(0, 0, 1, 0.3),
        c(1, 1, 0, 3),
        c(1, 0, 1, 4),
        c(0, 1, 1, 0.4),
        c(1, 1, 1, 4)
    )
 
      ## plotFitnessLandscape(mf6)
      ## Both AC and ABC are peaks. Correctly
      expect_equal(OncoSimulR:::peak_valley(OncoSimulR:::genot_to_adj_mat(mf6))$peak,
                   c(6, 8))

      ## fast peaks should refuse to run
      expect_error(
          OncoSimulR:::fast_peaks(mf6, 0),
          "There could be several connected maxima",
          fixed = TRUE)



      ## A and AC
      mf7 <- rbind(
        c(0, 0, 0, 1),
        c(1, 0, 0, 4),
        c(0, 1, 0, 0.1),
        c(0, 0, 1, 0.3),
        c(1, 1, 0, 3),
        c(1, 0, 1, 4),
        c(0, 1, 1, 0.4),
        c(1, 1, 1, 3.4)
    )
      ## plotFitnessLandscape(mf7)
      ## Both A and AC are peaks. Correctly
      expect_equal(OncoSimulR:::peak_valley(OncoSimulR:::genot_to_adj_mat(mf7))$peak,
                   c(2, 6))

      ## fast peaks should refuse to run
      expect_error(
          OncoSimulR:::fast_peaks(mf7, 0),
          "There could be several connected maxima",
          fixed = TRUE)
      

      
      ## A, AC, ABC same max fitness
      mf8 <- rbind(
        c(0, 0, 0, 1),
        c(1, 0, 0, 4),
        c(0, 1, 0, 0.1),
        c(0, 0, 1, 0.3),
        c(1, 1, 0, 3),
        c(1, 0, 1, 4),
        c(0, 1, 1, 0.4),
        c(1, 1, 1, 4)
    )
      ## plotFitnessLandscape(mf8)
      ## Both A and AC are peaks. Correctly
      expect_equal(OncoSimulR:::peak_valley(OncoSimulR:::genot_to_adj_mat(mf8))$peak,
                   c(2, 6, 8))

      
      ## fast peaks should refuse to run
      expect_error(
          OncoSimulR:::fast_peaks(mf8, 0),
          "There could be several connected maxima",
          fixed = TRUE)
      
      ## A, AC, AB same max fitness
      mf9 <- rbind(
        c(0, 0, 0, 1),
        c(1, 0, 0, 4),
        c(0, 1, 0, 0.1),
        c(0, 0, 1, 0.3),
        c(1, 1, 0, 4),
        c(1, 0, 1, 4),
        c(0, 1, 1, 0.4),
        c(1, 1, 1, 2.4)
    )
      ## plotFitnessLandscape(mf9, use_ggrepel = TRUE)
      ## Both A and AC are peaks. Correctly
      expect_equal(OncoSimulR:::peak_valley(OncoSimulR:::genot_to_adj_mat(mf9))$peak,
                   c(2, 5, 6))

      
      
      ## This illustrates that the "filter_inaccessible" is not just "do
      ## not take into account inaccessible genotypes" but, properly, do
      ## not take into account, do not allow any travelling through
      ## inaccessible paths.

      ## Thus, filter_inaccessible is the way to go if we want to exclude
      ## backmutation. In no bakcmutation, it is not possible to go from
      ## m+1 to m mutations.
      
      ## It also shows that naively looking at the adjacency matrix can
      ## fail. Two reasons:

      ## a) the last row will never have any entries and yet it need not
      ## be a peak.

      ## b) simply looking at adjacency matrix is not the correct
      ## procedure when some fitnesses can be equal. That is what the
      ## function peak_valley works hard to get right :-)
      
      
    cp2 <- structure(c(0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 
1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 
1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 
1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 
0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 
1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 
1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 
1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 
1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 
0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 
0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 
0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 
0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 
1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 
1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 
1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 
0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 
0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 
1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 
1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 
1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 
1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 
1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 
0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 
1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 
0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 
0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 
1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 
0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 
1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 
1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0.852873407703003, 
1.51520969989942, 1.09934414414554, 1.08362391548151, 1.06352377058758, 
0.875558455823467, 1.69351291065104, 2.92492684398312, 1.02057836095586, 
0.994559647972076, 1.01807462848707, 0.782398502758159, 0.755318352952028, 
1.81553780643735, 1.7427209966816, 1.00116069406198, 0.790243245268257, 
3.38168029927183, 1.18573953796889, 1.24679706264807, 0.944183929293486, 
1.04153712305771, 1.20232261789798, 1.0345783487807, 1.04678440594199, 
0.993244793867836, 0.97914067773803, 0.79321495112376, 0.868101325153957, 
0.866235177920767, 4.1155779007473, 3.163209721772, 4.34977195536485, 
1.09932137400121, 1.08612305022998, 0.916953742980573, 0.850115441923501, 
1.06277833622263, 0.865087563773651, 0.928169473201598, 0.904902930158639, 
0.897493717866434, 0.71149600120298, 1.06538015204221, 1.07859259299858, 
0.858803230350538, 2.25551012930227, 1.09241633274047, 0.870425423271033, 
2.17687545546796, 0.84459090869647, 4.58149975106353, 3.85245245151455, 
1.28342034151899, 1.08529050597462, 1.02256835452167, 1.04982916832593, 
1.0457848642841, 0.90107628754529, 1.08969768294891, 1.05766476796899, 
0.902394628842996, 0.888348932462492, 1.01037474862489, 0.954093541062801, 
0.807820459139572, 2.74832174163312, 1.01318977068049, 0.854004033396404, 
0.842034005421367, 0.800544915243185, 5.31108977064723, 5.31423066433053, 
1.16539625099584, 0.983449927610599, 0.996320237843515, 0.9794158873742, 
1.02038748073625, 0.808875731463122, 0.964868528161141, 0.966566509486774, 
0.860373057266184, 0.81168825662344, 1.19978481918247, 0.98157798351476, 
0.999463234369357, 0.98711106267367, 0.961995700808845, 4.79391503400402, 
0.998909701750288, 0.996465768481649, 0.785688019266101, 0.778917380394268, 
1.17230915723272, 1.19911647477422, 0.961939861987872, 0.981542927739855, 
0.999822362533057, 1.15236749698624, 0.919688401637553, 0.876733220798505, 
0.92069327916386, 0.958801043337062, 0.670589798279379, 0.84152795885645, 
5.93895353544503, 0.723329951949942, 0.733188455582477, 1.07557023464861, 
1.09180382079188, 0.923957719945906, 0.93313538716072, 0.896562810368268, 
1.09769821865825, 1.10615389985864, 0.94426955155254, 0.898545873061366, 
0.876269943340891, 1.11556411094416, 0.94930544641744, 1.02495854041569, 
0.794907983845338, 0.847332095413669, 0.776896984008625, 0.928896557877041, 
0.945135371172636, 0.892100531723894), .Dim = c(128L, 8L), .Dimnames = list(
    NULL, c("CDKN2A", "KRAS", "MLL3", "PXDN", "SMAD4", "TGFBR2", 
    "TP53", "")))

    expect_equal(length(
        OncoSimulR:::peak_valley(OncoSimulR:::genot_to_adj_mat(cp2))$peak), 4)

    expect_equal(length(
        OncoSimulR:::peak_valley(
                         OncoSimulR:::filter_inaccessible(
                                          OncoSimulR:::genot_to_adj_mat(cp2), 0))$peak), 6)


    expect_equal(
          OncoSimulR:::fast_peaks(cp2, 0),
        c(51, 55, 68, 74, 90, 107))

    ## Nope, since filter inaccessible removes genotypes
    expect_false(all(
        OncoSimulR:::peak_valley(
                         OncoSimulR:::filter_inaccessible(
                                          OncoSimulR:::genot_to_adj_mat(cp2), 0))$peak ==
        OncoSimulR:::fast_peaks(cp2, 0)))
    

    ## compare with the probl
    gnn <- OncoSimulR:::to_Fitness_Matrix(cp2, 1000)$afe[, "Genotype"]

    plotFitnessLandscape(cp2, use_ggrepel = TRUE, only_accessible = TRUE)
    
    expect_equal(
        gnn[OncoSimulR:::fast_peaks(cp2, 0)],
        c("KRAS, PXDN, TP53",
          "MLL3, PXDN, SMAD4",
          "CDKN2A, KRAS, MLL3, TP53",
          "CDKN2A, KRAS, TGFBR2, TP53",
          "KRAS, MLL3, TGFBR2, TP53",
          "CDKN2A, KRAS, PXDN, SMAD4, TP53"))

    ## can also check by removing the inacessible genotypes so the indices are the same
    agg <- OncoSimulR:::wrap_accessibleGenotypes(cp2, 0)
    cp3 <- cp2[agg, ]

    ## This is NOT correct: we have removed the inacessible,
    ## but we allow backmutation
    ## OncoSimulR:::peak_valley(
    ##                  OncoSimulR:::genot_to_adj_mat(cp3))$peak
    
    expect_equal(OncoSimulR:::peak_valley(
                     OncoSimulR:::filter_inaccessible(
                                      OncoSimulR:::genot_to_adj_mat(cp3), 0))$peak,
                 OncoSimulR:::fast_peaks(cp3, 0))

    gnn3 <- gnn[agg]

    expect_equal(
        gnn3[OncoSimulR:::fast_peaks(cp3, 0)],
        c("KRAS, PXDN, TP53",
          "MLL3, PXDN, SMAD4",
          "CDKN2A, KRAS, MLL3, TP53",
          "CDKN2A, KRAS, TGFBR2, TP53",
          "KRAS, MLL3, TGFBR2, TP53",
          "CDKN2A, KRAS, PXDN, SMAD4, TP53"))

    
})



test_that("Some random checks of the fast peaks function", {
    niter <- 50
    for(i in 1:niter) {
        for(ng in 2:6) {
            rtmp <- rfitness(ng)
            p1 <- OncoSimulR:::peak_valley(
                                   OncoSimulR:::filter_inaccessible(
                                                    OncoSimulR:::genot_to_adj_mat(rtmp), 0))$peak
            expect_equal(length(p1),
                         length(OncoSimulR:::fast_peaks(rtmp, 0)))
            agg <- OncoSimulR:::wrap_accessibleGenotypes(rtmp, 0)
            if(length(agg) >= 2) {
                ## cat(".")
                p2 <- OncoSimulR:::peak_valley(
                                       OncoSimulR:::filter_inaccessible(
                                                        OncoSimulR:::genot_to_adj_mat(rtmp[agg, , drop = FALSE]), 0))$peak
                expect_equal(p2, OncoSimulR:::fast_peaks(rtmp[agg, , drop = FALSE], 0))
                expect_equal(length(p2), length(p1))
            }
        }
    }
})