0

I'm using R to generate DAGs with 4 nodes. I need to generate all the possible DAGs without using any packages. Because there are 6 pairs and each pair has 3 options: no egde, or two directions, the total possibilities are 3**6 = 729. I think it's a sort of dfs problem but I can't implement in R. This is my code, but it is too long, and still use build in function expand.grid. Is there any simple way to solve the problem? Thanks!

A <- matrix(c(0,0,0,0,
              0,0,0,0,
              0,0,0,0,
              0,0,0,0),nrow=4,byrow=T)

bases=c('A','B','C')
all = expand.grid(bases, bases, bases,bases,bases,bases)
nrow(all)
res = list()
for (i in (1:nrow(all))){
  if (all$Var1[i] == 'A'){
    A[1,2] = 0
    A[2,1] = 0
  }
  if (all$Var1[i] == 'B'){
    A[1,2] = 1
    A[2,1] = 0
  }
  if (all$Var1[i] == 'C'){
    A[1,2] = 0
    A[2,1] = 1
  }
  if (all$Var2[i] == 'A'){
    A[1,3] = 0
    A[3,1] = 0
  }
  if (all$Var2[i] == 'B'){
    A[1,3] = 1
    A[3,1] = 0
  }
  if (all$Var2[i] == 'C'){
    A[1,3] = 0
    A[3,1] = 1
  }
  if (all$Var3[i] == 'A'){
    A[1,4] = 0
    A[4,1] = 0
  }
  if (all$Var3[i] == 'B'){
    A[1,4] = 1
    A[4,1] = 0
  }
  if (all$Var3[i] == 'C'){
    A[1,4] = 0
    A[4,1] = 1
  }
  if (all$Var4[i] == 'A'){
    A[2,3] = 0
    A[3,2] = 0
  }
  if (all$Var4[i] == 'B'){
    A[2,3] = 1
    A[3,2] = 0
  }
  if (all$Var4[i] == 'C'){
    A[2,3] = 0
    A[3,2] = 1
  }
  if (all$Var5[i] == 'A'){
    A[2,4] = 0
    A[4,2] = 0
  }
  if (all$Var5[i] == 'B'){
    A[2,4] = 1
    A[4,2] = 0
  }
  if (all$Var5[i] == 'C'){
    A[2,4] = 0
    A[4,2] = 1
  }
  if (all$Var6[i] == 'A'){
    A[3,4] = 0
    A[4,3] = 0
  }
  if (all$Var6[i] == 'B'){
    A[3,4] = 1
    A[4,3] = 0
  }
  if (all$Var6[i] == 'C'){
    A[3,4] = 0
    A[4,3] = 1
  }
  res[[i]] = A
}

1 Answers1

0

This is shorter but still seems to be possible to optimise.

A <- matrix(c(0,0,0,0,
              0,0,0,0,
              0,0,0,0,
              0,0,0,0),nrow=4,byrow=TRUE)

A_saved <- A
bases <- c('A','B','C')
all <- expand.grid(rep(list(bases), 6))
dim(all)

# create the list with its full length,
# don't keep expanding the vector or list
# in a loop, it's very slow
res <- vector("list", length = nrow(all))
for (i in (1:nrow(all))){
  A <- A_saved
  A[1,2] <- +(all$Var1[i] == 'B')
  A[2,1] <- +(all$Var1[i] == 'C')
  A[1,3] <- +(all$Var2[i] == 'B')
  A[3,1] <- +(all$Var2[i] == 'C')
  A[1,4] <- +(all$Var3[i] == 'B')
  A[4,1] <- +(all$Var3[i] == 'C')
  A[2,3] <- +(all$Var4[i] == 'B')
  A[3,2] <- +(all$Var4[i] == 'C')
  A[2,4] <- +(all$Var5[i] == 'B')
  A[4,2] <- +(all$Var5[i] == 'C')
  A[3,4] <- +(all$Var6[i] == 'B')
  A[4,3] <- +(all$Var6[i] == 'C')
  res[[i]] <- A
}
Rui Barradas
  • 70,273
  • 8
  • 34
  • 66