sva.patched=function (dat, mod, mod0 = NULL, n.sv = NULL, method = c("irw", 
    "two-step"), vfilter = NULL, B = 5, numSVmethod = "be") 
{
    if (is.null(n.sv)) {
        n.sv = num.sv(dat, mod, method = numSVmethod, vfilter = vfilter)
    }
    if (!is.null(vfilter)) {
        if (vfilter < 100 | vfilter > dim(dat)[1]) {
            stop(paste("The number of genes used in the analysis must be between 100 and", 
                dim(dat)[1], "\n"))
        }
        tmpv = rowVars(dat)
        ind = which(rank(-tmpv) < vfilter)
        dat = dat[ind, ]
    }
    if (n.sv > 0) {
        cat(paste("Number of significant surrogate variables is: ", 
            n.sv, "\n"))
        method <- match.arg(method)
        if (method == "two-step") {
            return(twostepsva.build(dat = dat, mod = mod, n.sv = n.sv))
        }
        if (method == "irw") {
            # return(irwsva.build(dat = dat, mod = mod, mod0 = mod0, n.sv = n.sv, B = B))
            return(irwsva.build.patched(dat = dat, mod = mod, mod0 = mod0, n.sv = n.sv, B = B))
        }
    }
    else {
        print("No significant surrogate variables")
        return(list(sv = 0, pprob.gam = 0, pprob.b = 0, n.sv = 0))
    }
}

irwsva.build.patched<-
function (dat, mod, mod0 = NULL, n.sv, B = 5) 
{
    n <- ncol(dat)
    m <- nrow(dat)
    if (is.null(mod0)) {
        mod0 <- mod[, 1]
    }
    Id <- diag(n)
    resid <- dat %*% (Id - mod %*% solve(t(mod) %*% mod) %*% 
        t(mod))
    uu <- eigen(t(resid) %*% resid)
    vv <- uu$vectors
    ndf <- n - dim(mod)[2]
    pprob <- rep(1, m)
    one <- rep(1, n)
    Id <- diag(n)
    df1 <- dim(mod)[2] + n.sv
    df0 <- dim(mod0)[2] + n.sv
    rm(resid)
    cat(paste("Iteration (out of", B, "):"))
    for (i in 1:B) {
        mod.b <- cbind(mod, uu$vectors[, 1:n.sv])
        mod0.b <- cbind(mod0, uu$vectors[, 1:n.sv])
        ptmp <- f.pvalue(dat, mod.b, mod0.b)
        pprob.b <- (1 - sva:::edge.lfdr(ptmp))
        mod.gam <- cbind(mod0, uu$vectors[, 1:n.sv])
        mod0.gam <- cbind(mod0)
        ptmp <- f.pvalue(dat, mod.gam, mod0.gam)
        pprob.gam <- (1 - sva:::edge.lfdr(ptmp))
        pprob <- pprob.gam * (1 - pprob.b)
        dats <- dat * pprob
        dats <- dats - rowMeans(dats)
        uu <- eigen(t(dats) %*% dats)
        cat(paste(i, " "))
    }
    # sv = fast.svd(dats, tol = 0)$v[, 1:n.sv] 
    # Patch code
    if(any(dats!=0)) sv = fast.svd(dats, tol = 0)$v[, 1:n.sv]
    else sv=svd(dats)$v[, 1:n.sv]

    retval <- list(sv = sv, pprob.gam = pprob.gam, pprob.b = pprob.b, 
        n.sv = n.sv)
    return(retval)
}