newman_mod <- function(g, weights=NULL){
  A <- get.adjacency(g) # adj
  m <- ecount(g)
  n <- vcount(g)
  
  if (is.null(weights)){
    weights <- rep(1,n)
  }
  
  # Obtain the modularity matrix
  B.node.i <- function(i){degree(g)[i]*degree(g)}
  B.node.all <- sapply(1:n, B.node.i)
  B <- A - (B.node.all/(2*m))
  # NOTE: This is identical to: modularity_matrix(g) ! Can verify with:
  # modularity_matrix(g) == B
  B.eigs <- eigen(B)
  max.lam <- B.eigs$values[1]
  s <- ifelse(B.eigs$vectors[,1]>0,1,-1)
  
  weights <- B.eigs$vectors[n]/B.eigs$vectors[,1]
  # Plotting
  #V(g)$color <- ifelse(B[1,]>0,"green","yellow")
  V(g)$color <- ifelse(B.eigs$vectors[,1]>0,"green","yellow")
  V(g)$size <- 10
  plot(g, main=paste(g.netname, " Newman Modularity"))
  clust1 = list()
  clust2 = list()
  clusters = list()
  
  # Make list of clusters
  for(i in 1:n){
      ifelse(V(g)[i]$color=="green",
              clust1 <- append(clust1, V(g)[i]$name),
              clust2 <- append(clust2, V(g)[i]$name))}

  clusters <- list(clust1, clust2)
  
  Q.node.i <- function(i){sum(
    (((B.eigs$vectors[i])*weights[i]*s)^2)*B.eigs[i]$values)}
  Q <- (1/(4*m))*sapply(1:n, Q.node.i)
 
  return(list(Q=Q,max.lam=max.lam,weights=weights,clusters=clusters))
}
