## ----include = FALSE----------------------------------------------------------
try({
  data_url <- "https://github.com/alarm-redist/redist-data/raw/main/data/king_county.rds"
  data_path <- tempfile()
  download.file(data_url, data_path)
})

knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  eval = file.exists(data_path)
)
set.seed(5118)

## ----setup, message=FALSE-----------------------------------------------------
library(dplyr)
library(ggplot2)
library(scales)
library(patchwork)

library(redist)

data_url <- "https://github.com/alarm-redist/redist-data/raw/main/data/king_county.rds"
data_path <- tempfile()
download.file(data_url, data_path)
king_shp <- readRDS(data_path)
print(king_shp)

## ----include= FALSE-----------------------------------------------------------
n_city <- length(unique(king_shp$city)) - 1
tot_area <- as.numeric(sum(sf::st_area(king_shp)))
tot_pop <- sum(king_shp$pop)
unincorp_area <- as.numeric(sum(sf::st_area(king_shp[king_shp$city == "UNINCORP", ])))
unincorp_pop <- sum(king_shp$pop[king_shp$city == "UNINCORP"])

## ----water-plot, fig.width=8, echo= FALSE-------------------------------------
areas <- as.numeric(units::set_units(sf::st_area(king_shp), mi^2))
pop_plot <- ggplot(king_shp, aes(fill = pop / areas)) +
  geom_sf(size = 0) +
  scale_fill_viridis_c(trans = "sqrt", labels = comma, limits = c(0, 25e3), oob = squish) +
  labs(title = "Population Density") +
  theme_void() +
  theme(legend.position = "bottom")
water_plot <- ggplot(king_shp, aes(fill = pct_water)) +
  geom_sf(size = 0) +
  scale_fill_viridis_c(labels = percent) +
  labs(title = "Water") +
  theme_void() +
  theme(legend.position = "bottom")
water_plot + pop_plot

## ----city-distr-plot, echo= FALSE---------------------------------------------
cities <- summarize(group_by(king_shp, city, distr), .groups = "drop")
districts <- summarize(group_by(king_shp, distr))
ggplot(cities) +
  geom_sf(aes(fill = city, alpha = city != "UNINCORP"), color = "#444444") +
  geom_sf(color = "black", size = 1, data = districts, fill = "#00000000") +
  geom_sf_text(aes(label = distr),
    size = 10, fontface = "bold", color = "#000000aa",
    data = districts
  ) +
  scale_alpha_manual(values = c(0, 0.8)) +
  guides(fill = "none", alpha = "none") +
  labs(title = "Cities with Council District Overlays") +
  theme_void()

## -----------------------------------------------------------------------------
existing_parity <- redist.parity(king_shp$distr, king_shp$pop)
king <- redist_map(king_shp, existing_plan = distr, pop_tol = existing_parity)
print(king)

## ----king-adj, fig.height=6---------------------------------------------------
plot(king, adj = TRUE, centroids = FALSE, zoom_to = (city == "SEA"))

## -----------------------------------------------------------------------------
filter(king, distr %in% c(2, 4, 8))

## ----king-water---------------------------------------------------------------
plot(filter(king, pct_water >= 0.99, pop == 0)) + geom_sf_text(aes(label = id))

## ----king-land----------------------------------------------------------------
water_prec <- filter(king, pct_water >= 0.99, pop == 0) %>% pull(id)
water_prec <- setdiff(water_prec, c("WVPS34", "WVSP34"))
king_land <- filter(king, !(id %in% water_prec))
plot(king_land)

## ----seattle-land-adj, fig.height=6-------------------------------------------
plot(king_land, adj = TRUE, centroids = FALSE, zoom_to = (city == "SEA"))

## -----------------------------------------------------------------------------
merge_by(king_land, city)

## ----merged-city--------------------------------------------------------------
king_merged <- merge_by(king_land, city, drop_geom = FALSE)
plot(king_merged, adj = TRUE)

## -----------------------------------------------------------------------------
cat(splits_admin(king_land$distr, king_land, city), "split cities\n")

king_land %>%
  mutate(is_unsplit = !is_county_split(distr, city)) %>%
  plot(is_unsplit)

king_unsplit <- king_land %>%
  mutate(unsplit_id = freeze(!is_county_split(distr, city))) %>%
  merge_by(unsplit_id, city, collapse_chr = FALSE)
print(king_unsplit)

## ----unsplit-plan, fig.width=8------------------------------------------------
plans <- redist_smc(king_unsplit, 100, silent = TRUE)
print(plans)
print(pullback(plans))
redist.plot.plans(pullback(plans), draws = 1:4, shp = king_land)

## -----------------------------------------------------------------------------
pop_inside_cores <- function(boundary) {
  king_land %>%
    mutate(core = make_cores(boundary = boundary)) %>%
    as_tibble() %>%
    group_by(core) %>%
    filter(n() > 2) %>% # filter to cores only
    pull(pop) %>%
    sum()
}
pop_inside_cores(1) / sum(king_land$pop)
pop_inside_cores(2) / sum(king_land$pop)

## ----cores--------------------------------------------------------------------
king_cores <- king_land %>%
  mutate(core = make_cores(boundary = 1)) %>%
  merge_by(core, drop_geom = FALSE)
plot(king_cores)

## ----core-plans---------------------------------------------------------------
plans <- redist_smc(king_cores, 100, silent = TRUE)
redist.plot.plans(plans, draws = 1:4, shp = king_cores)

