[Qca-commits] r15 - / QCA QCA/R QCA/data QCA/inst QCA/man QCA/src QCA/tests QCA/tests/Examples pkg
noreply at r-forge.r-project.org
noreply at r-forge.r-project.org
Thu Jun 26 15:42:02 CEST 2014
Author: dusadrian
Date: 2014-06-26 15:42:02 +0200 (Thu, 26 Jun 2014)
New Revision: 15
Added:
QCA/
QCA/DESCRIPTION
QCA/NAMESPACE
QCA/R/
QCA/R/allExpressions.R
QCA/R/base3rows.R
QCA/R/calibrate.R
QCA/R/createChart.R
QCA/R/createMatrix.R
QCA/R/createString.R
QCA/R/deMorgan.R
QCA/R/demoChart.R
QCA/R/eqmcc.R
QCA/R/eqmccLoop.R
QCA/R/factorize.R
QCA/R/findSubsets.R
QCA/R/findSupersets.R
QCA/R/findTh.R
QCA/R/fuzzyand.R
QCA/R/fuzzyor.R
QCA/R/getRow.R
QCA/R/getSolution.R
QCA/R/is.print.R
QCA/R/onAttach.R
QCA/R/pof.R
QCA/R/prettyString.R
QCA/R/prettyTable.R
QCA/R/rowDominance.R
QCA/R/solveChart.R
QCA/R/sortMatrix.R
QCA/R/sortVector.R
QCA/R/superSubset.R
QCA/R/superSubsetOld.R
QCA/R/truthTable.R
QCA/R/verifyQCA.R
QCA/R/writePrimeimp.R
QCA/R/writeSolution.R
QCA/data/
QCA/data/d.AS.tab
QCA/data/d.BWB.tab
QCA/data/d.Bas.tab
QCA/data/d.CS.tab
QCA/data/d.CZH.tab
QCA/data/d.Emm.tab
QCA/data/d.HK.RData
QCA/data/d.HMN.tab
QCA/data/d.Kil.tab
QCA/data/d.Kro.tab
QCA/data/d.RS.tab
QCA/data/d.SA.tab
QCA/data/d.SS.tab
QCA/inst/
QCA/inst/CITATION
QCA/inst/ChangeLog
QCA/inst/TODO
QCA/man/
QCA/man/QCA-internal.Rd
QCA/man/QCA.package.Rd
QCA/man/allExpressions.Rd
QCA/man/calibrate.Rd
QCA/man/createMatrix.Rd
QCA/man/d.AS.Rd
QCA/man/d.BWB.Rd
QCA/man/d.Bas.Rd
QCA/man/d.CS.Rd
QCA/man/d.CZH.Rd
QCA/man/d.Emm.Rd
QCA/man/d.HK.Rd
QCA/man/d.HMN.Rd
QCA/man/d.Kil.Rd
QCA/man/d.Kro.Rd
QCA/man/d.RS.Rd
QCA/man/d.SA.Rd
QCA/man/d.SS.Rd
QCA/man/deMorgan.Rd
QCA/man/demoChart.Rd
QCA/man/eqmcc.Rd
QCA/man/factorize.Rd
QCA/man/findSubsets.Rd
QCA/man/findSupersets.Rd
QCA/man/findTh.Rd
QCA/man/getRow.Rd
QCA/man/pof.Rd
QCA/man/solveChart.Rd
QCA/man/superSubset.Rd
QCA/man/truthTable.Rd
QCA/src/
QCA/src/allSol.c
QCA/src/findSubsets.c
QCA/src/m2.c
QCA/src/removeRedundants.c
QCA/src/solveChart.c
QCA/src/superSubset.c
QCA/src/truthTable.c
QCA/tests/
QCA/tests/Examples/
QCA/tests/Examples/QCA-Ex.Rout.save
pkg/QCA_1.1-3.2.tar.gz
Removed:
pkg/QCA/
Log:
Still testing relation between QCA and pkg folders
Added: QCA/DESCRIPTION
===================================================================
--- QCA/DESCRIPTION (rev 0)
+++ QCA/DESCRIPTION 2014-06-26 13:42:02 UTC (rev 15)
@@ -0,0 +1,13 @@
+Package: QCA
+Version: 1.1-3.2
+Date: 2014-06-26
+Title: A Package for Qualitative Comparative Analysis
+Authors at R: c(person("Adrian", "Dusa", role = c("aut", "cre"),
+ email = "dusa.adrian at unibuc.ro"),
+ person("Alrik", "Thiem", role = "aut",
+ email = "alrik.thiem at unige.ch"))
+Depends: R (>= 3.0.0)
+Imports: lpSolve
+Suggests: VennDiagram
+Description: This package provides functions for performing Qualitative Comparative Analysis (csQCA, tQCA, mvQCA and fsQCA).
+License: GPL (>= 2)
Added: QCA/NAMESPACE
===================================================================
--- QCA/NAMESPACE (rev 0)
+++ QCA/NAMESPACE 2014-06-26 13:42:02 UTC (rev 15)
@@ -0,0 +1,54 @@
+useDynLib(QCA)
+export(.onAttach,
+ allExpressions,
+ base3rows,
+ calibrate,
+ createChart,
+ createMatrix,
+ createString,
+ demoChart,
+ deMorgan,
+ deMorganLoop,
+ eqmcc,
+ eqmccLoop,
+ factorize,
+ findSubsets,
+ findSupersets,
+ findTh,
+ fuzzyand,
+ fuzzyor,
+ getRow,
+ getSolution,
+ is.deMorgan,
+ is.pof,
+ is.qca,
+ is.tt,
+ is.sS,
+ pof,
+ prettyString,
+ prettyTable,
+ print.aE,
+ print.deMorgan,
+ print.fctr,
+ print.pof,
+ print.qca,
+ print.mqca,
+ print.pic,
+ print.sS,
+ print.tt,
+ rowDominance,
+ solveChart,
+ sortMatrix,
+ sortVector,
+ superSubset,
+ truthTable,
+ verify.data,
+ verify.dir.exp,
+ verify.expl,
+ verify.inf.test,
+ verify.qca,
+ verify.mqca,
+ verify.tt,
+ writePrimeimp,
+ writeSolution)
+import(lpSolve)
Property changes on: QCA/NAMESPACE
___________________________________________________________________
Added: svn:executable
+ *
Added: QCA/R/allExpressions.R
===================================================================
--- QCA/R/allExpressions.R (rev 0)
+++ QCA/R/allExpressions.R 2014-06-26 13:42:02 UTC (rev 15)
@@ -0,0 +1,11 @@
+`allExpressions` <-
+function(noflevels, raw=FALSE, arrange=FALSE) {
+ aEmat <- createMatrix(noflevels + 1)
+ if (arrange) {
+ aEmat <- sortMatrix(aEmat)
+ sum.zeros <- apply(aEmat, 1, function(idx) sum(idx == 0))
+ aEmat <- aEmat[order(sum.zeros, decreasing=TRUE), ]
+ }
+ return(structure(list(aE=aEmat - 1, raw=raw), class = "aE"))
+}
+
Property changes on: QCA/R/allExpressions.R
___________________________________________________________________
Added: svn:executable
+ *
Added: QCA/R/base3rows.R
===================================================================
--- QCA/R/base3rows.R (rev 0)
+++ QCA/R/base3rows.R 2014-06-26 13:42:02 UTC (rev 15)
@@ -0,0 +1,15 @@
+base3rows <- function(nofconditions) {
+ multiplier <- 0
+ gap <- NULL
+ for (i in 2:nofconditions) {
+ multiplier <- 3*multiplier + 1
+ gap <- c(gap, multiplier, gap)
+ }
+
+ linejump <- (3^nofconditions + 1)/2
+ rownums <- c(linejump, sapply(gap, function(jump) {
+ linejump <<- linejump + jump + 2
+ }))
+ return(sort(c(rownums, rownums + 1)))
+ }
+
Property changes on: QCA/R/base3rows.R
___________________________________________________________________
Added: svn:executable
+ *
Added: QCA/R/calibrate.R
===================================================================
--- QCA/R/calibrate.R (rev 0)
+++ QCA/R/calibrate.R 2014-06-26 13:42:02 UTC (rev 15)
@@ -0,0 +1,212 @@
+`calibrate` <-
+function (x, type="crisp", thresholds = NA, include = TRUE, logistic = FALSE,
+ idm = 0.95, ecdf = FALSE, p = 1, q = 1) {
+ if (!is.numeric(x)) {
+ cat("\n")
+ stop("x is not numeric.\n\n", call. = FALSE)
+ }
+ if (!(type %in% c("crisp", "fuzzy"))) {
+ cat("\n")
+ stop("Unknown calibration type.\n\n", call. = FALSE)
+ }
+ if (all(is.na(thresholds))) {
+ cat("\n")
+ stop("Threshold value(s) not specified.\n\n", call. = FALSE)
+ }
+ if (type == "crisp") {
+ xrange <- range(x, na.rm=TRUE)
+ if (any(as.numeric(unclass(cut(thresholds, breaks=c(-Inf, xrange, Inf)))) != 2)) {
+ cat("\n")
+ stop("Threshold value(s) outside the range of x.\n\n", call. = FALSE)
+ }
+ return(as.numeric(unclass(cut(x, breaks=c(-Inf, thresholds, Inf), right=!include))) - 1)
+ # the built-in findInterval() was interesting, but doesn't cope well with the include argument
+ }
+ else if (type == "fuzzy") {
+ check.equal <- function(x, y) {
+ check.vector <- as.logical(unlist(lapply(x, all.equal, y)))
+ check.vector[is.na(check.vector)] <- FALSE
+ return(check.vector)
+ }
+ if (!(length(thresholds) %in% c(3, 6))) {
+ cat("\n")
+ stop("For fuzzy data, thresholds should be of type:\n\"c(thEX, thCR, thIN)\"\nor\n\"c(thEX1, thCR1, thIN1, thIN2, thCR2, thEX2)\".\n\n", call. = FALSE)
+ }
+ if (idm <= 0.5 | idm >= 1) {
+ cat("\n")
+ stop("The inclusion degree of membership has to be bigger than 0.5 and less than 1.\n\n", call. = FALSE)
+ }
+ # needed because sometimes thresholds values inherit names, e.g. from being calculated with quantile()
+ thresholds <- as.vector(thresholds)
+
+ if (length(thresholds) == 3) {
+ thEX <- thresholds[1]
+ thCR <- thresholds[2]
+ thIN <- thresholds[3]
+ if (logistic) {
+ if (thresholds[1] > thresholds[3]) {
+ thEX <- thresholds[3]
+ thIN <- thresholds[1]
+ }
+
+ y <- (x < thCR) + 1
+ result <- 1/(1 + exp(-((x - thCR) * (c(1, -1)[y]*log(idm/(1 - idm))/(c(thIN, thEX)[y] - thCR)))))
+
+ if (thresholds[1] > thresholds[3]) {
+ return(1 - result)
+ }
+ else {
+ return(result)
+ }
+ }
+ else {
+ if (any(table(c(thEX, thCR, thIN)) > 1)) {
+ cat("\n")
+ warning("Some thresholds equal, that should not be equal.\n\n", call. = FALSE)
+ }
+ increasing <- TRUE
+ if (thIN < thCR & thCR < thEX) {
+ increasing <- FALSE
+ }
+
+ if (ecdf) {
+ ecdfx <- x[-which(x < min(thresholds))]
+ ecdfx <- ecdfx[-which(ecdfx > max(thresholds))]
+ Fn <- ecdf(ecdfx)
+ }
+
+ fs <- rep(NA, length(x))
+ for (i in seq(length(x))) {
+ if (increasing) {
+ if (x[i] < thEX | check.equal(x[i], thEX)) {
+ fs[i] <- 0
+ }
+ else if (x[i] < thCR | check.equal(x[i], thCR)) {
+ fs[i] <- (((thEX - x[i])/(thEX - thCR))^p)/2
+ if (ecdf) {
+ fs[i] <- (Fn(x[i])/Fn(thCR))/2
+ }
+ }
+ else if (x[i] < thIN | check.equal(x[i], thIN)) {
+ fs[i] <- 1 - (((thIN - x[i])/(thIN - thCR))^q)/2
+ if (ecdf) {
+ fs[i] <- 1 - ((1 - Fn(x[i]))/(1 - Fn(thCR)))/2
+ }
+ }
+ else {
+ fs[i] <- 1
+ }
+ }
+ else {
+ # return(list(Fn, thIN, thCR, thEX))
+ if (x[i] < thIN | check.equal(x[i], thIN)) {
+ fs[i] <- 1
+ }
+ else if (x[i] < thCR | check.equal(x[i], thCR)) {
+ fs[i] <- 1 - (((thIN - x[i])/(thIN - thCR))^q)/2
+ if (ecdf) {
+ fs[i] <- 1 - (Fn(x[i])/Fn(thCR))/2
+ }
+ }
+ else if (x[i] < thEX | check.equal(x[i], thEX)) {
+ fs[i] <- (((thEX - x[i])/(thEX - thCR))^p)/2
+ if (ecdf) {
+ fs[i] <- ((1 - Fn(x[i]))/(1 - Fn(thCR)))/2
+ }
+ }
+ else {
+ fs[i] <- 0
+ }
+ }
+ }
+ }
+ return(fs)
+ }
+ else {
+ thEX1 <- thresholds[1]
+ thCR1 <- thresholds[2]
+ thIN1 <- thresholds[3]
+ thIN2 <- thresholds[4]
+ thCR2 <- thresholds[5]
+ thEX2 <- thresholds[6]
+ if (thCR1 < min(thEX1, thIN1) | thCR1 > max(thEX1, thIN1)) {
+ cat("\n")
+ stop("First crossover threshold not between first exclusion and inclusion thresholds.\n\n", call. = FALSE)
+ }
+ if (thCR2 < min(thEX2, thIN2) | thCR2 > max(thEX2, thIN2)) {
+ cat("\n")
+ stop("Second crossover threshold not between second exclusion and inclusion thresholds.\n\n", call. = FALSE)
+ }
+ if (any(table(c(thEX1, thCR1, thIN1)) > 1) | any(table(c(thIN2, thCR2, thEX2)) > 1) | thCR1 == thCR2) {
+ cat("\n")
+ stop("Some thresholds equal, that should not be equal.\n\n", call. = FALSE)
+ }
+ increasing <- TRUE
+ if (thIN1 < thCR1 & thCR1 < thEX1 & thEX1 <= thEX2 & thEX2 < thCR2 & thCR2 < thIN2) {
+ increasing <- FALSE
+ }
+ if (increasing) {
+ if (thEX1 == thEX2) {
+ cat("\n")
+ stop("some thresholds equal that should not be equal.\n\n", call. = FALSE)
+ }
+ }
+ else {
+ if (thIN1 == thIN2) {
+ cat("\n")
+ stop("some thresholds equal that should not be equal.\n\n", call. = FALSE)
+ }
+ }
+ fs <- rep(NA, length(x))
+ for (i in seq(length(x))) {
+ if (increasing) {
+ if (x[i] < thEX1 | check.equal(x[i], thEX1)) {
+ fs[i] <- 0
+ }
+ else if (x[i] < thCR1 | check.equal(x[i], thCR1)) {
+ fs[i] <- (((thEX1 - x[i])/(thEX1 - thCR1))^p)/2
+ }
+ else if (x[i] < thIN1) {
+ fs[i] <- 1 - (((thIN1 - x[i])/(thIN1 - thCR1))^q)/2
+ }
+ else if (x[i] < thIN2 | check.equal(x[i], thIN2)) {
+ fs[i] <- 1
+ }
+ else if (x[i] < thCR2 | check.equal(x[i], thCR2)) {
+ fs[i] <- 1 - (((thIN2 - x[i])/(thIN2 - thCR2))^q)/2
+ }
+ else if (x[i] < thEX2 | check.equal(x[i], thEX2)) {
+ fs[i] <- (((thEX2 - x[i])/(thEX2 - thCR2))^p)/2
+ }
+ else {
+ fs[i] <- 0
+ }
+ }
+ else {
+ if (x[i] < thIN1 | check.equal(x[i], thIN1)) {
+ fs[i] <- 1
+ }
+ else if (x[i] < thCR1 | check.equal(x[i], thCR1)) {
+ fs[i] <- 1 - (((thIN1 - x[i])/(thIN1 - thCR1))^q)/2
+ }
+ else if (x[i] < thEX1) {
+ fs[i] <- (((thEX1 - x[i])/(thEX1 - thCR1))^p)/2
+ }
+ else if (x[i] < thEX2 | check.equal(x[i], thEX2)) {
+ fs[i] <- 0
+ }
+ else if (x[i] < thCR2 | check.equal(x[i], thCR2)) {
+ fs[i] <- (((thEX2 - x[i])/(thEX2 - thCR2))^p)/2
+ }
+ else if (x[i] < thIN2 | check.equal(x[i], thIN2)) {
+ fs[i] <- 1 - (((thIN2 - x[i])/(thIN2 - thCR2))^q)/2
+ }
+ else {
+ fs[i] <- 1
+ }
+ }
+ }
+ return(fs)
+ }
+ }
+}
Added: QCA/R/createChart.R
===================================================================
--- QCA/R/createChart.R (rev 0)
+++ QCA/R/createChart.R 2014-06-26 13:42:02 UTC (rev 15)
@@ -0,0 +1,23 @@
+`createChart` <-
+function (input, copyinput, rows, cols) {
+ input2 <- matrix(logical(length(input)), dim(input))
+ input2[input > 0] <- TRUE
+
+ result <- sapply(seq(nrow(input)), function(x) {
+ apply(copyinput, 1, function(y) {
+ all(input[x, input2[x,]] == y[input2[x,]])
+ })
+ })
+
+ if (nrow(copyinput) == 1) {
+ result <- matrix(result)
+ }
+ else {
+ result <- t(result)
+ }
+
+ if (!missing(rows)) rownames(result) <- rows
+ if (!missing(cols)) colnames(result) <- cols
+ return(result)
+}
+
Property changes on: QCA/R/createChart.R
___________________________________________________________________
Added: svn:executable
+ *
Added: QCA/R/createMatrix.R
===================================================================
--- QCA/R/createMatrix.R (rev 0)
+++ QCA/R/createMatrix.R 2014-06-26 13:42:02 UTC (rev 15)
@@ -0,0 +1,27 @@
+`createMatrix` <-
+function(noflevels, logical = FALSE) {
+ conds <- length(noflevels)
+ pwr <- unique(noflevels)
+ if (any(pwr > 2)) {
+ logical <- FALSE
+ }
+ if (length(pwr) == 1) {
+ create <- function(idx) {
+ rep.int(c(sapply(seq_len(pwr) - 1, function(x) rep.int(x, pwr^(idx - 1)))),
+ pwr^conds/pwr^idx)
+ }
+ retmat <- sapply(rev(seq_len(conds)), create)
+ }
+ else {
+ mbase <- c(rev(cumprod(rev(noflevels))), 1)[-1]
+ orep <- cumprod(rev(c(rev(noflevels)[-1], 1)))
+ retmat <- sapply(seq_len(conds), function(x) {
+ rep.int(rep.int(seq_len(noflevels[x]) - 1, rep.int(mbase[x], noflevels[x])), orep[x])
+ })
+ }
+ if (logical) {
+ retmat <- matrix(as.logical(retmat), nrow=nrow(retmat), ncol=ncol(retmat))
+ }
+ return(retmat)
+}
+
Property changes on: QCA/R/createMatrix.R
___________________________________________________________________
Added: svn:executable
+ *
Added: QCA/R/createString.R
===================================================================
--- QCA/R/createString.R (rev 0)
+++ QCA/R/createString.R 2014-06-26 13:42:02 UTC (rev 15)
@@ -0,0 +1,26 @@
+`createString` <-
+function(mydata, collapse="*", uplow=FALSE, use.tilde=FALSE) {
+ mydata <- changemydata <- as.matrix(mydata)
+ conditions <- colnames(mydata)
+ if (uplow) {
+ changemydata[mydata == 0] <- tolower(rep(conditions, each=nrow(mydata))[mydata == 0])
+ changemydata[mydata == 1] <- toupper(rep(conditions, each=nrow(mydata))[mydata == 1])
+ }
+ else if (use.tilde) {
+ changemydata[mydata == 0] <- paste("~", toupper(rep(conditions, each=nrow(mydata))[mydata == 0]), sep="")
+ changemydata[mydata == 1] <- toupper(rep(conditions, each=nrow(mydata))[mydata == 1])
+ }
+ else {
+ for (i in sort(unique(as.vector(mydata)))) {
+ changemydata[mydata == i] <- paste(rep(conditions, each=nrow(mydata))[mydata == i], "{", i, "}", sep="")
+ }
+ }
+
+ input <- rep(NA, nrow(mydata))
+
+ for (i in 1:nrow(mydata)) {
+ input[i] <- paste(changemydata[i, ], collapse = collapse)
+ }
+ return(input)
+}
+
Property changes on: QCA/R/createString.R
___________________________________________________________________
Added: svn:executable
+ *
Added: QCA/R/deMorgan.R
===================================================================
--- QCA/R/deMorgan.R (rev 0)
+++ QCA/R/deMorgan.R 2014-06-26 13:42:02 UTC (rev 15)
@@ -0,0 +1,523 @@
+`deMorgan` <-
+function(expression, prod.split = "", use.tilde = FALSE) {
+
+ # print("bla")
+
+ # TO DO: capture and error the usage of both "cD" and "D*E" in the same expression
+
+
+ # STRUCTURE of the big.list
+
+ # level 1: split by separate components
+ # "A + B(C + D*~E)" has two components "A" and "B(C + D*~E)"
+
+ # level 2: split by brackets
+ # "B(C + D*~E)" has "B" and "C + D*~E"
+
+ # level 3: split by "+"
+ # "C + D*~E" has "C" and "D*~E"
+
+ # level 4: split by "*"
+ # "D*~E" has "D" and "~E"
+
+ # level 5: split by "~" (the result is only a vector, not a list)
+ # "~E" has "~" and "E"
+
+
+ # big.list <- splitMainComponents(expression)
+ # big.list <- splitBrackets(big.list)
+ # big.list <- removeSingleStars(big.list)
+ # big.list <- splitPluses(big.list)
+ # big.list <- splitStars(big.list)
+ # big.list <- splitTildas(big.list)
+ # big.list <- solveBrackets(big.list)
+ # big.list <- simplifyList(big.list)
+
+ if (class(expression) == "deMorgan") {
+ expression <- paste(expression[[1]][[2]], collapse = " + ")
+ }
+
+ splitMainComponents <- function(expression) {
+ ind.char <- unlist(strsplit(expression, split=""))
+
+ # remove all spaces (or white space)
+ ind.char <- ind.char[ind.char != " "]
+
+ if (grepl("\\(", expression)) {
+ # split the string in individual characters
+
+ open.brackets <- which(ind.char == "(")
+ closed.brackets <- which(ind.char == ")")
+
+ invalid <- ifelse(grepl("\\)", expression), length(open.brackets) != length(closed.brackets), FALSE)
+
+ if (invalid) {
+ cat("\n")
+ stop("Invalid expression, open bracket \"(\" not closed with \")\".\n\n", call. = FALSE)
+ }
+
+
+ all.brackets <- sort(c(open.brackets, closed.brackets))
+
+ if (length(all.brackets) > 2) {
+ for (i in seq(3, length(all.brackets))) {
+ if (all.brackets[i] - all.brackets[i - 1] == 1) {
+ open.brackets <- setdiff(open.brackets, all.brackets[seq(i - 1, i)])
+ closed.brackets <- setdiff(closed.brackets, all.brackets[seq(i - 1, i)])
+ }
+
+ if (all.brackets[i] - all.brackets[i - 1] == 2) {
+ if (ind.char[all.brackets[i] - 1] != "+") {
+ open.brackets <- setdiff(open.brackets, all.brackets[seq(i - 1, i)])
+ closed.brackets <- setdiff(closed.brackets, all.brackets[seq(i - 1, i)])
+ }
+ }
+ }
+ }
+
+ for (i in seq(length(open.brackets))) {
+ plus.signs <- which(ind.char == "+")
+ last.plus.sign <- plus.signs[plus.signs < open.brackets[i]]
+ if (length(last.plus.sign) > 0) {
+ open.brackets[i] <- max(last.plus.sign) + 1
+ }
+ else {
+ if (1 == 1) {
+ open.brackets[i] <- 1
+ }
+ }
+ next.plus.sign <- plus.signs[plus.signs > closed.brackets[i]]
+ if(length(next.plus.sign) > 0) {
+ closed.brackets[i] <- min(next.plus.sign) - 1
+ }
+ else {
+ closed.brackets[i] <- length(ind.char)
+ }
+ }
+
+ # create an empty list with at least 3 times as many components as number of open brackets (just to make sure I have enough)
+ big.list <- vector(mode="list", length = length(open.brackets) + 2)
+
+ if (length(open.brackets) == 1) {
+ # there is only one open bracket
+ if (open.brackets > 1) {
+ # there's something before that open bracket
+ big.list[[1]] <- paste(ind.char[seq(1, open.brackets - 2)], collapse = "")
+ }
+ nep <- min(which(unlist(lapply(big.list, is.null))))
+ big.list[[nep]] <- paste(ind.char[seq(open.brackets, closed.brackets)], collapse = "")
+ if (closed.brackets < length(ind.char)) {
+ # there is something beyond the closed bracket
+ nep <- min(which(unlist(lapply(big.list, is.null))))
+ big.list[[nep]] <- paste(ind.char[seq(closed.brackets + 2, length(ind.char))], collapse = "")
+ }
+ }
+ else {
+ for (i in seq(length(open.brackets))) {
+ if (i == 1) {
+ # check if there's anything meaningful before the FIRST bracket
+ # i.e. containing a "+" sign, like "A + B(C + D)"
+ # before the first bracket is "A + B", but only B should be multiplied with "C + D"
+
+ if (open.brackets[1] > 1) {
+ # there is something before the first bracket
+ big.list[[1]] <- paste(ind.char[seq(1, open.brackets[1] - 2)], collapse = "")
+ }
+
+ nep <- min(which(unlist(lapply(big.list, is.null))))
+ big.list[[nep]] <- paste(ind.char[seq(open.brackets[i], closed.brackets[i])], collapse = "")
+
+ }
+ else {
+ nep <- min(which(unlist(lapply(big.list, is.null))))
+ big.list[[nep]] <- paste(ind.char[seq(open.brackets[i], closed.brackets[i])], collapse = "")
+
+ if (i == length(closed.brackets)) {
+ if (closed.brackets[i] < length(ind.char)) {
+ # there is something beyond the last closed bracket
+ nep <- min(which(unlist(lapply(big.list, is.null))))
+
+ big.list[[nep]] <- paste(ind.char[seq(closed.brackets[i] + 2, length(ind.char))], collapse = "")
+
+ }
+ }
+
+ }
+ }
+ }
+
+ nulls <- unlist(lapply(big.list, is.null))
+
+ if (any(nulls)) {
+ big.list <- big.list[-which(nulls)]
+ }
+
+ }
+ else {
+ big.list <- vector("list", length = 1)
+ big.list[[1]] <- paste(ind.char, collapse="")
+ }
+
+ return(big.list)
+ }
+
+
+ #####
+ # split each main component by separating brackets components
+ splitBrackets <- function(big.list) {
+ return(lapply(big.list, function(x) {
+ as.list(unlist(strsplit(unlist(strsplit(x, split="\\(")), split="\\)")))
+ }))
+ }
+
+
+
+ #####
+ # remove individual components with single "*" signs
+ removeSingleStars <- function(big.list) {
+ return(lapply(big.list, function(x) {
+ single.components <- unlist(lapply(x, function(y) {
+ return(y == "*")
+ }))
+ return(x[!single.components])
+ }))
+ }
+
+
+
+
+ #####
+ # split by "+"
+ splitPluses <- function(big.list) {
+ return(lapply(big.list, function(x) {
+ lapply(x, function(y) {
+ plus.split <- unlist(strsplit(y, "\\+"))
+ return(as.list(plus.split[plus.split != ""]))
+ })
+ }))
+ }
+
+
+
+ #####
+ # split by "*"
+ splitStars <- function(big.list) {
+ return(lapply(big.list, function(x) {
+ lapply(x, function(y) {
+ lapply(y, function(z) {
+ star.split <- unlist(strsplit(z, ifelse(prod.split == "", "", paste("\\", prod.split, sep=""))))
+ star.split <- star.split[star.split != ""]
+ if (prod.split == "") {
+ tilda <- star.split == "~"
+ if (any(tilda)) {
+ tilda.pos <- which(tilda)
+ if (max(tilda.pos) == length(star.split)) {
+ cat("\n")
+ stop(paste("Unusual expression \"", z, "\": terminated with a \"~\" sign?\n\n", sep=""), call. = FALSE)
+ }
+ star.split[tilda.pos + 1] <- paste("~", star.split[tilda.pos + 1], sep="")
+ star.split <- star.split[-tilda.pos]
+ }
+ }
+
+ return(as.list(star.split[star.split != ""]))
+ })
+ })
+ }))
+ }
+
+
+
+
+ #####
+ # split by "~"
+ splitTildas <- function (big.list) {
+ return(lapply(big.list, function(x) {
+ lapply(x, function(y) {
+ lapply(y, function(z) {
+ lapply(z, function(w) {
+ if (grepl("~", w)) {
+ wsplit <- unlist(strsplit(w, split=""))
+ if (max(which(wsplit == "~")) > 1) {
+ cat("\n")
+ stop(paste("Unusual expression: ", w, ". Perhaps you meant \"*~\"?\n\n", sep=""), call. = FALSE)
+ }
+ else {
+ return(c("~", sub("~", "", w)))
+ }
+ }
+ else {
+ return(w)
+ }
+ })
+ })
+ })
+ }))
+ }
+
+
+
+
+ ######
+ # determine if and which main components have brackets, and SOLVE them
+ solveBrackets <- function(big.list) {
+ bracket.comps <- which(unlist(lapply(big.list, length)) > 1)
+ if (length(bracket.comps) > 0) {
+ for (i in bracket.comps) {
+ lengths <- unlist(lapply(big.list[[i]], length))
+ indexes <- createMatrix(lengths) + 1
+ ncol.ind <- ncol(indexes)
+ i.list <- vector("list", length = nrow(indexes))
+
+ for (j in seq(length(i.list))) {
+ i.list[[j]] <- vector("list", length = prod(dim(indexes)))
+ start.position <- 1
+
+ for (k in seq(ncol.ind)) {
+ for (l in seq(length(big.list[[i]][[k]][[indexes[j, k]]]))) {
+ i.list[[j]][[start.position]] <- big.list[[i]][[k]][[indexes[j, k]]][[l]]
+ start.position <- start.position + 1
+ }
+ }
+
+ if (start.position <= length(i.list[[j]])) {
+ i.list[[j]] <- i.list[[j]][- seq(start.position, length(i.list[[j]]))]
+ }
+ }
+
+
+ big.list[[i]] <- list(i.list)
+ }
+ }
+
+ return(big.list)
+ }
+
+
+
+
+ simplifyList <- function(big.list) {
+ lengths <- unlist(lapply(big.list, function(x) length(x[[1]])))
+
+ big.list.copy <- vector("list", length = sum(lengths))
+
+ start.position <- 1
+
+ for (i in seq(length(big.list))) {
+ for (j in seq(lengths[i])) {
+ big.list.copy[[start.position]] <- big.list[[i]][[1]][[j]]
+ start.position <- start.position + 1
+ }
+ }
+ return(big.list.copy)
+ }
+
+
+
+
+ negateValues <- function(big.list, tilda = TRUE) {
+ lapply(big.list, function(x) {
+ lapply(x, function(y) {
+ if (tilda) {
+ if (length(y) > 1) {
+ y <- toupper(y[2])
+ }
+ else {
+ if (use.tilde) {
+ y <- c("~", toupper(y))
+ }
+ else {
+ y <- tolower(y)
+ }
+ }
+ }
+ else {
+ if (y == toupper(y)) {
+ if (use.tilde) {
+ y <- c("~", toupper(y))
+ }
+ else {
+ y <- tolower(y)
+ }
+ }
+ else {
+ y <- toupper(y)
+ }
+ }
+ })
+ })
+ }
+
+
+
+
+ removeDuplicates <- function(big.list) {
+
+ big.list <- lapply(big.list, function(x) {
+
+ values <- unlist(lapply(x, paste, collapse=""))
+ x <- x[!duplicated(values)]
+
+
+ # now trying to eliminate those which have both positive and negative
+ # like "~A" and "A", or "a" and "A"
+ ind.values <- unlist(x)
+ ind.values <- ind.values[ind.values != "~"]
+ ind.values <- toupper(ind.values)
+
+ if (length(x) == 0 | any(table(ind.values) > 1)) {
+ return(NULL)
+ }
+ else {
+ return(x)
+ }
+ })
+
+ big.list <- big.list[!unlist((lapply(big.list, is.null)))]
+
+
+ # big.list.pasted
+ blp <- lapply(big.list, function(x) {
+ unlist(lapply(x, paste, collapse=""))
+ })
+
+ redundants <- vector(length = length(big.list))
+
+ pairings <- combn(length(big.list), 2)
+
+ for (i in seq(ncol(pairings))) {
+ blp1 <- blp[[pairings[1, i]]]
+ blp2 <- blp[[pairings[2, i]]]
+ if (length(blp1) == length(blp2)) {
+ if (all(sort(blp1) == sort(blp2))) {
+ redundants[pairings[2, i]] <- TRUE
+ }
+ }
+ else {
+ if (length(blp1) < length(blp2)) {
+ if (length(setdiff(blp1, blp2)) == 0) {
+ redundants[pairings[2, i]] <- TRUE
+ }
+ }
+ else {
+ if (length(setdiff(blp2, blp1)) == 0) {
+ redundants[pairings[1, i]] <- TRUE
+ }
+ }
+ }
+ }
+
+ return(big.list[!redundants])
+
+ }
+
+
+
+ if (is.qca(expression)) {
+ result <- deMorganLoop(expression)
+ }
+ else if (is.character(expression) & length(expression) == 1) {
+
+ if (grepl("\\{", expression)) {
+ if (grepl("~", expression)) {
+ cat("\n")
+ stop("Impossible combination of both \"~\" and \"{}\" multi-value notation.\n\n", call. = FALSE)
+ }
+ use.tilde <- FALSE
+ }
+
+ if (prod.split == "" & grepl("\\*", expression)) {
+ # cat("\n")
+ # stop("The \"*\" symbol was found: consider using the argument prod.split = \"*\".\n\n", call. = FALSE)
+ prod.split <- "*"
+ }
+
+ if (prod.split != "" & prod.split != "*") {
+ if (!grepl(prod.split, expression)) {
+ cat("\n")
+ stop("The product operator \"", prod.split, "\" was not found.\n\n", call. = FALSE)
+ }
+ }
+
+ big.list <- simplifyList(solveBrackets(splitTildas(splitStars(splitPluses(removeSingleStars(splitBrackets(splitMainComponents(expression))))))))
+
+ flat.vector <- unlist(big.list)
+ unique.values <- unique(flat.vector)
+
+ already.letters <- all(nchar(unique.values) == 1)
+
+ tilda <- ifelse(any(flat.vector == "~"), TRUE, FALSE)
+
+ if (tilda) {
+ use.tilde <- TRUE
+ }
+
+ if (tilda & prod.split == "" & any(toupper(flat.vector) != flat.vector)) {
+ cat("\n")
+ stop("Unusual usage of both \"~\" sign and lower letters.\n\n", call. = FALSE)
+ }
[TRUNCATED]
To get the complete diff run:
svnlook diff /svnroot/qca -r 15
More information about the Qca-commits
mailing list