R/allcyc.R

Defines functions `rgivenshape` `rgs1` `rcyc` `r1cyc` `allcyc` `allcycn`

`allcycn` <- function(n) {
  out <- matrix(0, factorial(n - 1), n)
  index <- 1
  CyclicPermut2 <- function(i, p) {
    j <- i + 1
    x <- p[i]
    if (i < n) { # 'n' available via lexical scope
      while (j <= n) {
        p[i] <- p[j]
        p[j] <- x
        CyclicPermut2(i + 1, p) # recursive
        p[j] <- p[i]
        j <- j + 1
      } # while loop closes
      p[i] <- x
    } else {
      out[index, ] <<- p
      index <<- index + 1
    }
  } # definition of CyclicPermut() closes
  CyclicPermut2(1, seq_len(n))
  return(as.word(out))
}

`allcyc` <- function(s) {
  capply(allcycn(length(s)), function(x) {
    s[x]
  })
}

`r1cyc` <- function(len, vec) {
  out <- sample(vec, len)
  for (i in seq_len(len - 1)) {
    j <- sample(seq(from = i + 1, to = len), 1)
    swap <- out[i]
    out[i] <- out[j]
    out[j] <- swap
  }
  return(out)
}

`rcyc` <- function(n, len, r = len) {
  out <- matrix(0, n, r)
  for (i in seq_len(n)) {
    out[i, ] <- as.word(as.cycle(r1cyc(len, seq_len(r))), r)
  }
  return(as.cycle(out))
}

`rgs1` <- function(s) {
  n <- seq_len(sum(s))
  s <- s[s > 1]
  out <- id
  for (i in s) {
    vec <- sample(n, i, replace = FALSE)
    out <- out + as.cycle(r1cyc(i, vec))
    n <- n[!(n %in% vec)]
  }
  return(out)
}

`rgivenshape` <- function(n, s, size = sum(s)) {
  if (length(n) > 1) {
    return(Recall(n = 1, s = n))
  }
  out <- rep(id, n)
  s <- c(s, rep(1, size - sum(s)))
  for (i in seq_len(n)) {
    out[i] <- rgs1(s)
  }
  return(out)
}
RobinHankin/permutations documentation built on Sept. 4, 2024, 10:14 p.m.