xref: /aosp_15_r20/external/rappor/apps/rappor-analysis/server.R (revision 2abb31345f6c95944768b5222a9a5ed3fc68cc00)
1*2abb3134SXin Lilibrary(shiny)
2*2abb3134SXin Li
3*2abb3134SXin Lisource("../../analysis/R/read_input.R")
4*2abb3134SXin Lisource("../../analysis/R/decode.R")
5*2abb3134SXin Li
6*2abb3134SXin Li# Random number associated with the session used in exported file names.
7*2abb3134SXin Liseed <- sample(10^6, 1)
8*2abb3134SXin Li
9*2abb3134SXin LiPlotCohorts <- function(x, highlighted, color = "grey") {
10*2abb3134SXin Li  n <- nrow(x)
11*2abb3134SXin Li  k <- ncol(x)
12*2abb3134SXin Li  if (n < 16) {
13*2abb3134SXin Li    par(mfrow = c(n, 1), mai = c(0, .5, .5, 0))
14*2abb3134SXin Li  } else if (n < 64) {
15*2abb3134SXin Li    par(mfrow = c(n / 2, 2), mai = c(0, .5, .5, 0))
16*2abb3134SXin Li  } else {
17*2abb3134SXin Li    par(mfrow = c(n / 4, 4), mai = c(0, .5, .5, 0))
18*2abb3134SXin Li  }
19*2abb3134SXin Li  for (i in 1:n) {
20*2abb3134SXin Li    cc <- rep(color, k)
21*2abb3134SXin Li    if (!is.null(highlighted)) {
22*2abb3134SXin Li      ind <- highlighted[which(ceiling(highlighted / k) == i)] %% k
23*2abb3134SXin Li      cc[ind] <- "greenyellow"
24*2abb3134SXin Li    }
25*2abb3134SXin Li    barplot(x[i, ], main = paste0("Cohort ", i), col = cc, border = cc,
26*2abb3134SXin Li            names.arg = "")
27*2abb3134SXin Li  }
28*2abb3134SXin Li}
29*2abb3134SXin Li
30*2abb3134SXin LishinyServer(function(input, output, session) {
31*2abb3134SXin Li  Params <- reactive({
32*2abb3134SXin Li    param_file <- input$params
33*2abb3134SXin Li    if (!is.null(param_file)) {
34*2abb3134SXin Li      params <- ReadParameterFile(param_file$datapath)
35*2abb3134SXin Li      updateSelectInput(session, "size", selected = params$k)
36*2abb3134SXin Li      updateSelectInput(session, "hashes", selected = params$h)
37*2abb3134SXin Li      updateSelectInput(session, "instances", selected = params$m)
38*2abb3134SXin Li      updateSliderInput(session, "p", value = params$p)
39*2abb3134SXin Li      updateSliderInput(session, "q", value = params$q)
40*2abb3134SXin Li      updateSliderInput(session, "f", value = params$f)
41*2abb3134SXin Li    } else {
42*2abb3134SXin Li      params <- list(k = as.numeric(input$size),
43*2abb3134SXin Li                     h = as.numeric(input$hashes),
44*2abb3134SXin Li                     m = as.numeric(input$instances),
45*2abb3134SXin Li                     p = as.numeric(input$p),
46*2abb3134SXin Li                     q = as.numeric(input$q),
47*2abb3134SXin Li                     f = as.numeric(input$f))
48*2abb3134SXin Li    }
49*2abb3134SXin Li    params
50*2abb3134SXin Li  })
51*2abb3134SXin Li
52*2abb3134SXin Li  Counts <- reactive({
53*2abb3134SXin Li    params <- Params()
54*2abb3134SXin Li    counts_file <- input$counts
55*2abb3134SXin Li    if (is.null(counts_file)) {
56*2abb3134SXin Li      return(NULL)
57*2abb3134SXin Li    }
58*2abb3134SXin Li
59*2abb3134SXin Li    counts <- ReadCountsFile(counts_file$datapath, params)
60*2abb3134SXin Li    updateNumericInput(session, "N", value = sum(counts[, 1]))
61*2abb3134SXin Li    counts
62*2abb3134SXin Li  })
63*2abb3134SXin Li
64*2abb3134SXin Li  output$countsUploaded <- reactive({
65*2abb3134SXin Li    ifelse(is.null(input$counts), FALSE, TRUE)
66*2abb3134SXin Li  })
67*2abb3134SXin Li  outputOptions(output, 'countsUploaded', suspendWhenHidden=FALSE)
68*2abb3134SXin Li
69*2abb3134SXin Li  Map <- reactive({
70*2abb3134SXin Li    params <- Params()
71*2abb3134SXin Li    map_file <- input$map
72*2abb3134SXin Li    if (is.null(map_file)) {
73*2abb3134SXin Li      return(NULL)
74*2abb3134SXin Li    }
75*2abb3134SXin Li
76*2abb3134SXin Li    map <- ReadMapFile(map_file$datapath, params)
77*2abb3134SXin Li    updateSelectInput(session, "selected_string", choices = map$strs, selected = map$strs[1])
78*2abb3134SXin Li    map
79*2abb3134SXin Li  })
80*2abb3134SXin Li
81*2abb3134SXin Li  output$mapUploaded <- reactive({
82*2abb3134SXin Li    ifelse(is.null(input$map), FALSE, TRUE)
83*2abb3134SXin Li  })
84*2abb3134SXin Li  outputOptions(output, 'mapUploaded', suspendWhenHidden=FALSE)
85*2abb3134SXin Li
86*2abb3134SXin Li  DecodingParams <- reactive({
87*2abb3134SXin Li    list(alpha = as.numeric(input$alpha),
88*2abb3134SXin Li         correction = input$correction)
89*2abb3134SXin Li  })
90*2abb3134SXin Li
91*2abb3134SXin Li  Analyze <- reactive({
92*2abb3134SXin Li    if (is.null(input$map) || is.null(input$counts)) {
93*2abb3134SXin Li      return()
94*2abb3134SXin Li    }
95*2abb3134SXin Li    params <- Params()
96*2abb3134SXin Li    map <- Map()
97*2abb3134SXin Li    counts <- Counts()
98*2abb3134SXin Li    decoding_params <- DecodingParams()
99*2abb3134SXin Li
100*2abb3134SXin Li    fit <- Decode(counts, map$map, params,
101*2abb3134SXin Li                  alpha = decoding_params$alpha,
102*2abb3134SXin Li                  correction = decoding_params$correction)
103*2abb3134SXin Li    fit
104*2abb3134SXin Li  })
105*2abb3134SXin Li
106*2abb3134SXin Li  # Results summary.
107*2abb3134SXin Li  output$pr <- renderTable({
108*2abb3134SXin Li    Analyze()$summary
109*2abb3134SXin Li  },
110*2abb3134SXin Li                           include.rownames = FALSE, include.colnames = FALSE)
111*2abb3134SXin Li
112*2abb3134SXin Li  # Results table.
113*2abb3134SXin Li  output$tab <- renderDataTable({
114*2abb3134SXin Li     Analyze()$fit
115*2abb3134SXin Li   },
116*2abb3134SXin Li     options = list(iDisplayLength = 100))
117*2abb3134SXin Li
118*2abb3134SXin Li  # Results barplot.
119*2abb3134SXin Li  output$res_barplot <- renderPlot({
120*2abb3134SXin Li    fit <- Analyze()$fit
121*2abb3134SXin Li
122*2abb3134SXin Li    par(mai = c(2, 1, 1, .5))
123*2abb3134SXin Li
124*2abb3134SXin Li    bp <- barplot(fit$proportion, col = "palegreen",
125*2abb3134SXin Li            main = "Discovered String Distribution")
126*2abb3134SXin Li    abline(h = Analyze()$privacy[7, 2], col = "darkred", lty = 2, lwd = 2)
127*2abb3134SXin Li    text(bp[, 1], 0, paste(fit$strings, " "), srt = 45, adj = c(1, 1), xpd = NA)
128*2abb3134SXin Li    legend("topright", legend = "Detection Frequency", lty = 2, lwd = 2, col = "darkred",
129*2abb3134SXin Li           bty = "n")
130*2abb3134SXin Li  })
131*2abb3134SXin Li
132*2abb3134SXin Li  # Epsilon.
133*2abb3134SXin Li  output$epsilon <- renderTable({
134*2abb3134SXin Li    Analyze()$privacy
135*2abb3134SXin Li  },
136*2abb3134SXin Li                                include.rownames = FALSE, include.colnames = FALSE, digits = 4)
137*2abb3134SXin Li
138*2abb3134SXin Li  output$map <- renderPlot({
139*2abb3134SXin Li    image(as.matrix(Map()$map), col = c("white", "darkred"), xaxt = "n", yaxt = "n", bty = "n")
140*2abb3134SXin Li  })
141*2abb3134SXin Li
142*2abb3134SXin Li  # Estimated bits patterns.
143*2abb3134SXin Li  output$ests <- renderPlot({
144*2abb3134SXin Li    ests <- Analyze()$ests
145*2abb3134SXin Li    ind <- which(input$selected_string == Map()$strs)
146*2abb3134SXin Li    high <- unlist(Map()$map_pos[ind, -1])
147*2abb3134SXin Li    PlotCohorts(ests, high, color = "darkred")
148*2abb3134SXin Li  })
149*2abb3134SXin Li
150*2abb3134SXin Li  # Collisions.
151*2abb3134SXin Li  output$collisions <- renderPlot({
152*2abb3134SXin Li    params <- Params()
153*2abb3134SXin Li    map <- Map()
154*2abb3134SXin Li    tab <- table(unlist(map$map_pos[, -1]))
155*2abb3134SXin Li    tab <- tab[as.character(1:(params$k * params$m))]
156*2abb3134SXin Li    tab[is.na(tab)] <- 0
157*2abb3134SXin Li    tab <- matrix(tab, nrow = params$m, byrow = TRUE)
158*2abb3134SXin Li
159*2abb3134SXin Li    ind <- which(input$selected_string == map$strs)
160*2abb3134SXin Li    high <- unlist(map$map_pos[ind, -1])
161*2abb3134SXin Li
162*2abb3134SXin Li    PlotCohorts(tab, high, color = "navajowhite")
163*2abb3134SXin Li  })
164*2abb3134SXin Li
165*2abb3134SXin Li  # Observed counts.
166*2abb3134SXin Li  output$counts <- renderPlot({
167*2abb3134SXin Li    counts <- as.matrix(Analyze()$counts)
168*2abb3134SXin Li    ind <- which(input$selected_string == Map()$strs)
169*2abb3134SXin Li    high <- unlist(Map()$map_pos[ind, -1])
170*2abb3134SXin Li    PlotCohorts(counts, high, color = "darkblue")
171*2abb3134SXin Li  })
172*2abb3134SXin Li
173*2abb3134SXin Li  # Downloadable datasets.
174*2abb3134SXin Li  output$download_fit <- downloadHandler(
175*2abb3134SXin Li                                         filename = function() { paste("results_", seed, "_", date(), '.csv', sep='') },
176*2abb3134SXin Li                                         content = function(file) {
177*2abb3134SXin Li                                                     write.csv(Analyze()$fit, file, row.names = FALSE)
178*2abb3134SXin Li                                                   }
179*2abb3134SXin Li                                         )
180*2abb3134SXin Li
181*2abb3134SXin Li  output$download_summary <- downloadHandler(
182*2abb3134SXin Li                                         filename = function() { paste("summary_", seed, "_", date(), '.csv', sep='') },
183*2abb3134SXin Li                                         content = function(file) {
184*2abb3134SXin Li                                                     write.csv(rbind(Analyze()$summary, Analyze()$privacy, Analyze()$params),
185*2abb3134SXin Li                                                               file, row.names = FALSE)
186*2abb3134SXin Li                                                   }
187*2abb3134SXin Li                                         )
188*2abb3134SXin Li
189*2abb3134SXin Li  output$example_params <- renderTable({
190*2abb3134SXin Li    as.data.frame(ReadParameterFile("params.csv"))
191*2abb3134SXin Li  },
192*2abb3134SXin Li                                include.rownames = FALSE)
193*2abb3134SXin Li
194*2abb3134SXin Li  output$example_counts <- renderTable({
195*2abb3134SXin Li    counts <- ReadCountsFile("counts.csv")[, 1:15]
196*2abb3134SXin Li    cbind(counts, rep("...", nrow(counts)))
197*2abb3134SXin Li  },
198*2abb3134SXin Li                                include.rownames = FALSE, include.colnames = FALSE)
199*2abb3134SXin Li
200*2abb3134SXin Li  output$example_map <- renderTable({
201*2abb3134SXin Li    map <- ReadMapFile("map.csv", ReadParameterFile("params.csv"))
202*2abb3134SXin Li    map$map_pos[1:10, ]
203*2abb3134SXin Li  },
204*2abb3134SXin Li                                include.rownames = FALSE, include.colnames = FALSE)
205*2abb3134SXin Li
206*2abb3134SXin Li})
207