#!/usr/bin/env Rscript library(tidyverse) library(plyr) library(dplyr) library(readr) library(optparse) library(openxlsx) budget_to_cfg <- function(budget) { if (budget == 3.13) { return("b3g128") } else if (budget == 3.25) { return("b3g64") } else if (budget == 3.51) { return("b3g32") } else if (budget == 4.13) { return("b4g128") } else if (budget == 4.25) { return("b4g64") } else if (budget == 4.51) { return("b4g32") } else if (budget == 8.13) { return("b8g128") } else if (budget == 8.25) { return("b8g64") } else if (budget == 8.51) { return("b8g32") } else if (budget == 2.13) { return("b2g128") } else if (budget == 2.25) { return("b2g64") } else if (budget == 2.51) { return("b2g32") } else { return("b4g64") } } strip_name <- function(name) { start <- nchar("fnorm-") + 1 stop <- nchar(name) - 4 return(substr(name, start, stop)) } parser <- OptionParser() parser <- add_option( parser, c("-f", "--factor"), type = "double", help = "Factor to apply", metavar = "double" ) parser <- add_option( parser, c("-c", "--milp_cost_csv"), type = "character", help = "Dump of MiLP cost csv from the HQQ", metavar = "character" ) parser <- add_option( parser, c("-a", "--allot_csv_file"), type = "character", help = "Allocation CSV file", metavar = "character" ) parser <- add_option( parser, c("--attempt"), type = "character", help = "attempt", metavar = "character" ) args <- parse_args(parser) if (is.null(args$milp_cost_csv)) { milp_cost_csv <- "debug.csv" } else { milp_cost_csv <- args$milp_cost_csv } if (is.null(args$attempt)) { the_attempt <- "mxq1" } else { the_attempt <- args$attempt } if (is.null(args$allot_csv_file)) { allot_csv_file <- paste0( "data/allot/mxq/", the_attempt, "/quant-allot-", the_attempt, ".csv" ) } else { allot_csv_file <- args$allot_csv_file } df_fnorm <- read_csv(milp_cost_csv) k_cols <- c( "module", "layer", "cfg", "nbit1", "gsize1", "nbit2", "gsize2", "fnorm", "memmb", "params", "sensitivity" ) df_fnorm <- df_fnorm |> mutate( cfg = paste0("b", nbit1, "g", gsize1) ) |> select(all_of(k_cols)) |> mutate( cfg = factor( cfg, levels = c( "b2g128", "b2g64", "b2g32", "b3g128", "b3g64", "b3g32", "b4g128", "b4g64", "b4g32", "b8g128", "b8g64", "b8g32" ) ) ) by <- join_by(module == module, layer == layer, cfg == cfg) df_cfgs <- read_csv(allot_csv_file) if ("attempt" %in% names(df_cfgs)) { df_cfgs <- df_cfgs |> filter(attempt == the_attempt) } df_check <- df_cfgs |> mutate( cfg = paste0("b", b1, "g", g1), cfg_base = sapply(bit_budget, budget_to_cfg) ) |> select(-c("b1", "g1", "b2", "g2", "memmb")) |> mutate( cfg = factor( cfg, levels = c( "b2g128", "b2g64", "b2g32", "b3g128", "b3g64", "b3g32", "b4g128", "b4g64", "b4g32", "b8g128", "b8g64", "b8g32" ) ) ) |> left_join(df_fnorm, by) df_check_sum <- df_check |> left_join( df_fnorm, suffix = c("", "_hqq"), join_by( module == module, layer == layer, cfg_base == cfg ) ) df_check_det <- df_check_sum |> select( !c( "param_cnt", "params_quant_tot", "params_hqq", "sensitivity_hqq", "nbit1", "nbit2", "gsize1", "gsize2", "nbit1_hqq", "nbit2_hqq", "gsize1_hqq", "gsize2_hqq", ) ) write.xlsx( df_check_det, "allot-check-det.xlsx", overwrite = TRUE, asTable = TRUE ) df_final <- df_check_sum |> group_by(cfg_base, bit_budget) |> dplyr::summarise( memmb = sum(memmb), memmb_hqq = sum(memmb_hqq), fnorm = sum(fnorm), fnorm_hqq = sum(fnorm_hqq), params_tot = sum(params) ) |> mutate( memmb = round(memmb, digits = 4), memmb_hqq = round(memmb_hqq, digits = 4), fnorm = round(fnorm, digits = 4), fnorm_hqq = round(fnorm_hqq, digits = 4), fnorm_imporved = fnorm < fnorm_hqq, theory_memmb = params_tot * bit_budget / 8 / 1024^2, mem_pct_of_hqq = round(100 * memmb / memmb_hqq, digits = 4), mem_pct_of_theory = round(100 * memmb / theory_memmb, digits = 4) ) |> select( c( "cfg_base", "bit_budget", "fnorm_hqq", "fnorm", "fnorm_imporved", "memmb_hqq", "memmb", "mem_pct_of_hqq", "mem_pct_of_theory" ) ) write.xlsx( df_final, "df_final.xlsx", overwrite = TRUE, asTable = TRUE )