diff --git a/.gitignore b/.gitignore index 31ce055c..e2a168ab 100644 --- a/.gitignore +++ b/.gitignore @@ -72,6 +72,7 @@ target/ .claude/settings.local.json .claude/reviews/ .claude/paper-review/ +.claude/scheduled_tasks.lock # MCP configuration (may contain tokens) .mcp.json diff --git a/benchmarks/R/generate_nprobust_golden.R b/benchmarks/R/generate_nprobust_golden.R new file mode 100644 index 00000000..bf413106 --- /dev/null +++ b/benchmarks/R/generate_nprobust_golden.R @@ -0,0 +1,208 @@ +# Generate nprobust mse-dpi golden values for the Phase 1b parity suite. +# +# This script re-implements the mse-dpi algorithm from +# nprobust::lpbwselect.mse.dpi (nprobust 0.5.0, SHA 36e4e53, source at +# npfunctions.R:498-607 of github.com/nppackages/nprobust) so that every +# intermediate quantity the Python port needs to parity-check is exposed. +# Calling lpbwselect() directly would only surface h and b; we also need +# c.bw, bw.mp2, bw.mp3, and the per-stage (V, B1, B2, R) diagnostics. +# We therefore use nprobust::: internals via getFromNamespace(). +# +# Usage: +# Rscript benchmarks/R/generate_nprobust_golden.R +# +# Requirements: +# nprobust (CRAN), jsonlite +# +# Output: +# benchmarks/data/nprobust_mse_dpi_golden.json +# +# Phase 1b of the HeterogeneousAdoptionDiD implementation (de Chaisemartin, +# Ciccia, D'Haultfoeuille & Knau 2026, arXiv:2405.04465v6). Python tests at +# tests/test_bandwidth_selector.py and tests/test_nprobust_port.py load +# this JSON and check agreement to 1% relative tolerance. + +library(nprobust) +library(jsonlite) + +stopifnot(packageVersion("nprobust") == "0.5.0") + +# Internal helper re-implementing lpbwselect.mse.dpi while returning every +# stage output. Mirrors npfunctions.R:498-607 line-by-line (with the even +# / interior branches that apply for p=1, deriv=0, boundary eval). +lprobust_bw <- getFromNamespace("lprobust.bw", "nprobust") + +extract_mse_dpi_stages <- function(d, y, kernel = "epa", eval_point = 0.0, + bwcheck = 21, bwregul = 1, vce = "nn") { + p <- 1L; deriv <- 0L; q <- p + 1L + # For HAD (p=1, deriv=0), (p-deriv) %% 2 == 1, so `even` is FALSE. + # nprobust's conditional: if (even==FALSE | interior==TRUE) -> use + # closed-form lprobust.bw$bw; else -> optimize. For HAD this means + # every stage bandwidth comes from the closed form, not optimize. + even <- (p - deriv) %% 2 == 0 + interior <- FALSE + + N <- length(d) + x_iq <- quantile(d, 0.75) - quantile(d, 0.25) + x_min <- min(d); x_max <- max(d) + range_ <- x_max - x_min + + C_c <- switch(kernel, "epa" = 2.34, "uni" = 1.843, + "tri" = 2.576, "gau" = 1.06, + stop("unknown kernel: ", kernel)) + + c.bw <- C_c * min(sd(d), x_iq / 1.349) * N^(-1/5) + bw.max <- max(abs(eval_point - x_min), abs(eval_point - x_max)) + c.bw <- min(c.bw, bw.max) + + # Nearest-neighbor precomputation when vce="nn" (npfunctions.R:518-529). + dups <- dupsid <- NULL + if (vce == "nn") { + order_x <- order(d) + d <- d[order_x]; y <- y[order_x] + dups <- integer(N) + for (j in 1:N) dups[j] <- sum(d == d[j]) + dupsid <- integer(N); j <- 1L + while (j <= N) { + dupsid[j:(j + dups[j] - 1L)] <- 1:dups[j] + j <- j + dups[j] + } + } + + bw.min <- NULL + if (!is.null(bwcheck)) { + bw.min <- sort(abs(d - eval_point))[bwcheck] + c.bw <- max(c.bw, bw.min) + } + + # Helper: dispatch between closed-form and optimize exactly as R does. + select_bw <- function(C, exp_bias, exp_var, scale, range_) { + if (!even || interior) { + return(C$bw) + } + fn <- function(H) { + abs(H^exp_bias * (C$B1 + H * C$B2 + scale * C$R)^2 + + C$V / (N * H^exp_var)) + } + optimize(fn, interval = c(.Machine$double.eps, range_))$minimum + } + + # Stage 2: C.d1 -> bw.mp2 (npfunctions.R:539-546) + C_d1 <- lprobust_bw(y, d, NULL, eval_point, o = q + 1L, nu = q + 1L, + o.B = q + 2L, h.V = c.bw, h.B1 = range_, + h.B2 = range_, scale = 0, vce = vce, nnmatch = 3L, + kernel = kernel, dups = dups, dupsid = dupsid) + bw.mp2 <- select_bw(C_d1, + exp_bias = 2 * (q + 1) + 2 - 2 * (q + 1), + exp_var = 1 + 2 * (q + 1), + scale = 0, range_ = range_) + + # Stage 2: C.d2 -> bw.mp3 (npfunctions.R:549-556) + C_d2 <- lprobust_bw(y, d, NULL, eval_point, o = q + 2L, nu = q + 2L, + o.B = q + 3L, h.V = c.bw, h.B1 = range_, + h.B2 = range_, scale = 0, vce = vce, nnmatch = 3L, + kernel = kernel, dups = dups, dupsid = dupsid) + bw.mp3 <- select_bw(C_d2, + exp_bias = 2 * (q + 2) + 2 - 2 * (q + 2), + exp_var = 1 + 2 * (q + 2), + scale = 0, range_ = range_) + + # Apply clipping (npfunctions.R:559-565) + bw.mp2 <- min(bw.mp2, bw.max) + bw.mp3 <- min(bw.mp3, bw.max) + if (!is.null(bw.min)) { + bw.mp2 <- max(bw.mp2, bw.min) + bw.mp3 <- max(bw.mp3, bw.min) + } + + # Stage 3: C.b -> b.mse.dpi (npfunctions.R:569-580) + C_b <- lprobust_bw(y, d, NULL, eval_point, o = q, nu = p + 1L, + o.B = q + 1L, h.V = c.bw, h.B1 = bw.mp2, + h.B2 = bw.mp3, scale = bwregul, vce = vce, + nnmatch = 3L, kernel = kernel, + dups = dups, dupsid = dupsid) + b.mse.dpi <- select_bw(C_b, + exp_bias = 2 * q + 2 - 2 * (p + 1), + exp_var = 1 + 2 * (p + 1), + scale = bwregul, range_ = range_) + b.mse.dpi <- min(b.mse.dpi, bw.max) + if (!is.null(bw.min)) b.mse.dpi <- max(b.mse.dpi, bw.min) + + # Stage 3 final: C.h -> h.mse.dpi (npfunctions.R:585-595) + C_h <- lprobust_bw(y, d, NULL, eval_point, o = p, nu = deriv, + o.B = q, h.V = c.bw, h.B1 = b.mse.dpi, + h.B2 = bw.mp2, scale = bwregul, vce = vce, + nnmatch = 3L, kernel = kernel, + dups = dups, dupsid = dupsid) + h.mse.dpi <- select_bw(C_h, + exp_bias = 2 * p + 2 - 2 * deriv, + exp_var = 1 + 2 * deriv, + scale = bwregul, range_ = range_) + h.mse.dpi <- min(h.mse.dpi, bw.max) + if (!is.null(bw.min)) h.mse.dpi <- max(h.mse.dpi, bw.min) + + stage_record <- function(C) { + list(V = as.numeric(C$V), B1 = as.numeric(C$B1), + B2 = as.numeric(C$B2), R = as.numeric(C$R), + bw = as.numeric(C$bw)) + } + + list( + c_bw = as.numeric(c.bw), + bw_mp2 = as.numeric(bw.mp2), + bw_mp3 = as.numeric(bw.mp3), + b_mse_dpi = as.numeric(b.mse.dpi), + h_mse_dpi = as.numeric(h.mse.dpi), + bw_min = if (is.null(bw.min)) NA_real_ else as.numeric(bw.min), + bw_max = as.numeric(bw.max), + stage_d1 = stage_record(C_d1), + stage_d2 = stage_record(C_d2), + stage_b = stage_record(C_b), + stage_h = stage_record(C_h) + ) +} + +set.seed(20260419) + +# DGP 1: d ~ Uniform(0, 1), y = d + d^2 + N(0, 0.5) +G <- 2000L +d1 <- runif(G, 0, 1) +y1 <- d1 + d1^2 + rnorm(G, 0, 0.5) + +# DGP 2: d ~ Beta(2, 2), y = d + d^2 + N(0, 0.5) (f(0) vanishes at boundary) +d2 <- rbeta(G, 2, 2) +y2 <- d2 + d2^2 + rnorm(G, 0, 0.5) + +# DGP 3: Half-normal d, y = 0.5 * d^2 + N(0, 1) +d3 <- abs(rnorm(G, 0, 1)) +y3 <- 0.5 * d3^2 + rnorm(G, 0, 1) + +golden <- list( + metadata = list( + nprobust_version = as.character(packageVersion("nprobust")), + nprobust_sha = "36e4e532d2f7d23d4dc6e162575cca79e0927cda", + seed = 20260419L, + generator = "benchmarks/R/generate_nprobust_golden.R", + algorithm = paste("Port of nprobust::lpbwselect.mse.dpi with all five", + "stage bandwidths plus per-stage (V, B1, B2, R).", + "Evaluation at boundary eval=0 for HAD use case", + "(p=1, deriv=0, interior=FALSE).") + ), + dgp1 = c(list(n = G, d = d1, y = y1, kernel = "epa", + description = "Uniform(0,1), polynomial m(d) = d + d^2"), + extract_mse_dpi_stages(d1, y1, kernel = "epa")), + dgp2 = c(list(n = G, d = d2, y = y2, kernel = "epa", + description = "Beta(2,2) - boundary density vanishes at 0"), + extract_mse_dpi_stages(d2, y2, kernel = "epa")), + dgp3 = c(list(n = G, d = d3, y = y3, kernel = "epa", + description = "Half-normal d, quadratic m(d) with unit noise"), + extract_mse_dpi_stages(d3, y3, kernel = "epa")) +) + +out_path <- "benchmarks/data/nprobust_mse_dpi_golden.json" +dir.create("benchmarks/data", recursive = TRUE, showWarnings = FALSE) +write_json(golden, out_path, auto_unbox = TRUE, pretty = TRUE, digits = 14) +cat("Golden values written to", out_path, "\n") +cat("DGP 1 h.mse.dpi:", golden$dgp1$h_mse_dpi, "\n") +cat("DGP 2 h.mse.dpi:", golden$dgp2$h_mse_dpi, "\n") +cat("DGP 3 h.mse.dpi:", golden$dgp3$h_mse_dpi, "\n") diff --git a/benchmarks/data/nprobust_mse_dpi_golden.json b/benchmarks/data/nprobust_mse_dpi_golden.json new file mode 100644 index 00000000..7971c6a5 --- /dev/null +++ b/benchmarks/data/nprobust_mse_dpi_golden.json @@ -0,0 +1,135 @@ +{ + "metadata": { + "nprobust_version": "0.5.0", + "nprobust_sha": "36e4e532d2f7d23d4dc6e162575cca79e0927cda", + "seed": 20260419, + "generator": "benchmarks/R/generate_nprobust_golden.R", + "algorithm": "Port of nprobust::lpbwselect.mse.dpi with all five stage bandwidths plus per-stage (V, B1, B2, R). Evaluation at boundary eval=0 for HAD use case (p=1, deriv=0, interior=FALSE)." + }, + "dgp1": { + "n": 2000, + "d": [0.346165986265987, 0.209471254376695, 0.349041724810377, 0.716006569564342, 0.898241959745064, 0.243056782288477, 0.994502683868632, 0.72356012603268, 0.617742204340175, 0.184574166312814, 0.360668655950576, 0.0166198713704944, 0.243221291573718, 0.0545476607512683, 0.540974493604153, 0.0504873525351286, 0.261057120747864, 0.391940114321187, 0.814565308624879, 0.108375295298174, 0.13834393187426, 0.512229334330186, 0.0478169047273695, 0.100965828401968, 0.371775630395859, 0.814653061330318, 0.415226160548627, 0.953240251867101, 0.547831779113039, 0.236800524173304, 0.393821754027158, 0.244248000206426, 0.953606148483232, 0.931744179222733, 0.680257683387026, 0.298957533668727, 0.88265565619804, 0.128144388785586, 0.833566912217066, 0.400369830196723, 0.979392393724993, 0.717489112401381, 0.0226255464367568, 0.741721712984145, 0.364105844404548, 0.739364994456992, 0.779507027007639, 0.215398214291781, 0.557517429115251, 0.509595426497981, 0.0880534134339541, 0.942485455656424, 0.979364822385833, 0.899419735185802, 0.8257914588321, 0.0699988235719502, 0.586125469533727, 0.468556467676535, 0.198046021163464, 0.589375919429585, 0.443083612248302, 0.157112209359184, 0.913243385963142, 0.609673663042486, 0.490071891108528, 0.640822818269953, 0.897421445697546, 0.209234605543315, 0.861506450921297, 0.71758383163251, 0.558338104747236, 0.464701133081689, 0.587141113588586, 0.290861047105864, 0.0359098170883954, 0.920508336974308, 0.792128319852054, 0.479324264684692, 0.337711642496288, 0.818299568258226, 0.220936849247664, 0.52664658986032, 0.249563686782494, 0.966086203698069, 0.325990043347701, 0.873903862899169, 0.458118894370273, 0.958207823801786, 0.726639168104157, 0.0545280911028385, 0.620755526702851, 0.14421889022924, 0.88032222352922, 0.474268751451746, 0.566884424071759, 0.212288883049041, 0.548560665920377, 0.572998574236408, 0.150096291676164, 0.545961163705215, 0.994045423809439, 0.977496839826927, 0.634692997206002, 0.19527647155337, 0.37164824991487, 0.199898849939927, 0.855995104182512, 0.380616884911433, 0.111964516574517, 0.60909396619536, 0.0861780024133623, 0.466514209052548, 0.124189377296716, 0.794151060981676, 0.755291044013575, 0.512759718578309, 0.867843558313325, 0.328859160887077, 0.19950527115725, 0.0969520376529545, 0.378513019764796, 0.808877027127892, 0.0075638173148036, 0.54419371811673, 0.853563324315473, 0.196863275719807, 0.0844467850401998, 0.326953303068876, 0.920718509005383, 0.664035634603351, 0.795962965581566, 0.997707337606698, 0.504139503464103, 0.646651067072526, 0.591779042733833, 0.70702116494067, 0.488630972104147, 0.828964573331177, 0.838794119656086, 0.112228092039004, 0.15459791617468, 0.686503263423219, 0.548998836195096, 0.739735872717574, 0.0582955288700759, 0.0714581438805908, 0.140629949979484, 0.0969659145921469, 0.705183843616396, 0.5967554631643, 0.6069399965927, 0.196023046970367, 0.764648385113105, 0.358476451830938, 0.597267293604091, 0.573412094730884, 0.441976554691792, 0.0406449246220291, 0.0311573348008096, 0.548311298945919, 0.830822173506021, 0.439536614809185, 0.00242402008734643, 0.95698778773658, 0.189367923419923, 0.471140919020399, 0.720085203414783, 0.430984531063586, 0.75122578558512, 0.98676150967367, 0.411048472626135, 0.0019293709192425, 0.0404439424164593, 0.678068289067596, 0.17221128824167, 0.810175884515047, 0.889592037769035, 0.125831579789519, 0.134606805862859, 0.17729956493713, 0.806072544772178, 0.464825366158038, 0.0829992818180472, 0.607695522950962, 0.447436264250427, 0.918594481423497, 0.016578201437369, 0.370964861940593, 0.587161103961989, 0.797623571939766, 0.769571264274418, 0.466079520992935, 0.486190814292058, 0.038844694616273, 0.00554388226009905, 0.900599654531106, 0.986486836336553, 0.222894153557718, 0.263349249493331, 0.158585336757824, 0.953510861145332, 0.345950931776315, 0.774059432558715, 0.406812589382753, 0.850905269384384, 0.570366530679166, 0.745160267921165, 0.451919118175283, 0.82126110047102, 0.232621849048883, 0.629993522074074, 0.860256613465026, 0.852116476977244, 0.97403391613625, 0.937790857627988, 0.268897952046245, 0.313622194342315, 0.258739491924644, 0.776861760998145, 0.294774421025068, 0.0104251164011657, 0.385157823562622, 0.289683123352006, 0.0397914610803127, 0.145499656908214, 0.180101718753576, 0.927040336187929, 0.00735224434174597, 0.958527865819633, 0.805642059538513, 0.0733334876131266, 0.291449388256297, 0.928822499001399, 0.155919728102162, 0.830825956305489, 0.00942840380594134, 0.0506175083573908, 0.52499695844017, 0.517598603153601, 0.840408019721508, 0.672916795359924, 0.105822045821697, 0.341756916139275, 0.347996193217114, 0.761391787789762, 0.356950287008658, 0.769412316381931, 0.106106081977487, 0.454008342465386, 0.405670804204419, 0.997827005805448, 0.856950008310378, 0.175768490182236, 0.536302397958934, 0.54664321267046, 0.925200182246044, 0.110503353178501, 0.974775074748322, 0.893235757481307, 0.483778121182695, 0.854575430974364, 0.156689777504653, 0.177061900962144, 0.955811394844204, 0.752134338021278, 0.670787909766659, 0.997947260038927, 0.179800922283903, 0.83955774595961, 0.84686216711998, 0.844218583311886, 0.0184601317159832, 0.166388230631128, 0.522887883009389, 0.995224664686248, 0.513486358569935, 0.748237108811736, 0.117110065417364, 0.542970935814083, 0.975555986631662, 0.162274452392012, 0.632582000689581, 0.4727776364889, 0.05226282752119, 0.741254779975861, 0.895933669991791, 0.974539231974632, 0.501151696778834, 0.728561727330089, 0.486959007102996, 0.0258453912101686, 0.0823663268238306, 0.308127107797191, 0.93733459780924, 0.379768842365593, 0.634399563539773, 0.0229966386687011, 0.629672926152125, 0.980344728799537, 0.897913390770555, 0.700686074560508, 0.957531769294292, 0.291666150791571, 0.835613635601476, 0.362494588829577, 0.0560990229714662, 0.156788922380656, 0.84624841902405, 0.219629955012351, 0.278462586691603, 0.834928127238527, 0.629183793673292, 0.513552502030507, 0.800564049743116, 0.57928385422565, 0.262598753906786, 0.040933579672128, 0.0387121390085667, 0.90013647521846, 0.5696493210271, 0.893220361787826, 0.110668223584071, 0.0852648168802261, 0.19990719947964, 0.413161811186001, 0.225361170014367, 0.849377339240164, 0.27834514179267, 0.66585423448123, 0.129469590028748, 0.694007028825581, 0.849266499746591, 0.98294817423448, 0.301099549047649, 0.388678389368579, 0.917739828582853, 0.712108347564936, 0.263724901014939, 0.256018333137035, 0.925620447145775, 0.325656013796106, 0.80588898411952, 0.257794239092618, 0.63797940639779, 0.294329738477245, 0.483464000280946, 0.664098173612729, 0.690138690639287, 0.946303514530882, 0.60035257297568, 0.355265755672008, 0.094594351015985, 0.0293781994841993, 0.512208945350721, 0.346746783936396, 0.174543977947906, 0.310165398521349, 0.0338154551573098, 0.369213777827099, 0.271116427378729, 0.592838131822646, 0.91222952818498, 0.637821137206629, 0.724744545063004, 0.00670987460762262, 0.0709518219809979, 0.446817366871983, 0.59286718768999, 0.89411172317341, 0.425121284322813, 0.697349152993411, 0.408724039793015, 0.359295903937891, 0.291864159749821, 0.584204216953367, 0.37872953992337, 0.841451559215784, 0.580973877571523, 0.538322201929986, 0.108931166119874, 0.472713785478845, 0.415993254166096, 0.920726923039183, 0.237032779259607, 0.76625645859167, 0.323362786555663, 0.0135008129291236, 0.782505482202396, 0.976652146084234, 0.407539737643674, 0.0979770328849554, 0.0500321115832776, 0.280847172951326, 0.382082442520186, 0.74515720969066, 0.0822519431822002, 0.583281073486432, 0.226379232713953, 0.476089478470385, 0.45865219226107, 0.00220466102473438, 0.0875268063973635, 0.473497366532683, 0.883599874563515, 0.368850355036557, 0.537226560525596, 0.233144672354683, 0.432790939928964, 0.159332912415266, 0.0212741554714739, 0.314498063875362, 0.843503124313429, 0.138636061456054, 0.717186489608139, 0.250860005617142, 0.305247880984098, 0.126011644490063, 0.257026718230918, 0.867932873312384, 0.341555891791359, 0.813263542717323, 0.87631299905479, 0.529588733799756, 0.786630074027926, 0.914084275485948, 0.37163211684674, 0.261467156931758, 0.0213125878944993, 0.870039186673239, 0.783236826770008, 0.232409801799804, 0.133864864939824, 0.904983918182552, 0.461845124373212, 0.24576448998414, 0.548322686459869, 0.849324014736339, 0.298708525020629, 0.782572541385889, 0.855804286664352, 0.423282893840224, 0.362640563864261, 0.259313524002209, 0.031848419457674, 0.870247574523091, 0.976611375808716, 0.829543895320967, 0.618165113264695, 0.0432053508702666, 0.728933557635173, 0.925752375507727, 0.680354470154271, 0.883131397189572, 0.0651688864454627, 0.334054737119004, 0.144990539178252, 0.976222740951926, 0.89502010634169, 0.333566243061796, 0.856545548420399, 0.194540746510029, 0.436813483480364, 0.424124392215163, 0.926754391519353, 0.940207581501454, 0.665230019949377, 0.644590303301811, 0.950676682172343, 0.483485494973138, 0.236260325880721, 0.920036104740575, 0.423172840382904, 0.202069191029295, 0.455405379412696, 0.719571536639705, 0.107610498089343, 0.338315623812377, 0.0196876644622535, 0.673011309467256, 0.57781854015775, 0.758517007809132, 0.00773818604648113, 0.0399852155242115, 0.272136890329421, 0.121671132044867, 0.0925804565194994, 0.0105228209868073, 0.792728501372039, 0.768788015469909, 0.0449427138082683, 0.114256979431957, 0.898899374064058, 0.0751600991934538, 0.254237898392603, 0.364029271993786, 0.646676766686141, 0.0198329114355147, 0.260944580892101, 0.117712674662471, 0.923460611142218, 0.000687360530719161, 0.374208538327366, 0.36059916834347, 0.0446418835781515, 0.518746672896668, 0.583803632296622, 0.82351150480099, 0.480567471589893, 0.252306047128513, 0.929676372557878, 0.644048162503168, 0.745667407987639, 0.106003910070285, 0.360957469092682, 0.450716452673078, 0.12437226716429, 0.211736926110461, 0.415367042878643, 0.307559641776606, 0.353773124748841, 0.0110073678661138, 0.340558582218364, 0.244798981817439, 0.159673176240176, 0.910186115419492, 0.602241577813402, 0.589151523308828, 0.641388297779486, 0.440442847553641, 0.112232891377062, 0.391904273070395, 0.613961776252836, 0.819045865442604, 0.491677639307454, 0.17106905579567, 0.650638972176239, 0.797189625212923, 0.855213769013062, 0.912803761661053, 0.392356115859002, 0.871137496782467, 0.337621423881501, 0.0346126104705036, 0.763218939770013, 0.224954331526533, 0.608436790993437, 0.180038806749508, 0.119603846687824, 0.383979103062302, 0.139423688640818, 0.94398993300274, 0.182417087024078, 0.871353969210759, 0.0479166391305625, 0.60594955412671, 0.665909121977165, 0.498791569843888, 0.243559457361698, 0.708635791670531, 0.841032015858218, 0.94662646157667, 0.298621259164065, 0.0533671078737825, 0.60282590915449, 0.887838952476159, 0.377908347873017, 0.603024781681597, 0.615386335644871, 0.944401478162035, 0.58739640400745, 0.133071501739323, 0.821745748398826, 0.543809500290081, 0.575919000199065, 0.304370456375182, 0.19655086658895, 0.689686176599935, 0.420205363305286, 0.415261306799948, 0.583954121917486, 0.95316331461072, 0.440062945475802, 0.514308047946543, 0.748825821559876, 0.730109460419044, 0.534410978201777, 0.966143697267398, 0.0937944904435426, 0.691361869918182, 0.709835424320772, 0.909959269454703, 0.0735295531339943, 0.542851083911955, 0.639230704400688, 0.341176292393357, 0.109317106194794, 0.785765172448009, 0.479654854862019, 0.310927505372092, 0.789418202359229, 0.927716168807819, 0.104034946765751, 0.228270627558231, 0.895048796432093, 0.23120599030517, 0.770107773831114, 0.74092574371025, 0.302314371801913, 0.195076666073874, 0.729092280380428, 0.58094388525933, 0.839168735314161, 0.105585782090202, 0.231496359454468, 0.162439019652084, 0.328693069750443, 0.784283224260435, 0.781130024464801, 0.66749774874188, 0.919308005599305, 0.349182921694592, 0.735060207080096, 0.018048663623631, 0.346293591428548, 0.857443949906155, 0.684518822701648, 0.140832643723115, 0.890577943529934, 0.650103968568146, 0.254752794280648, 0.59976072399877, 0.688927080016583, 0.196075043873861, 0.446470738388598, 0.0525089902803302, 0.0252177428919822, 0.57538332650438, 0.785854885587469, 0.96662048692815, 0.973383453208953, 0.76566643640399, 0.806489786598831, 0.0613111646380275, 0.724368748720735, 0.53181457798928, 0.604408302111551, 0.0903146902564913, 0.0495185614563525, 0.29019934637472, 0.0132103613577783, 0.582651629112661, 0.557533023646101, 0.0582127820234746, 0.16918781818822, 0.74642851180397, 0.512961986940354, 0.723103327210993, 0.478869381826371, 0.142701753647998, 0.360577651765198, 0.456413254141808, 0.564994873711839, 0.286811434431002, 0.0683555151335895, 0.796672585653141, 0.424362274352461, 0.228145495988429, 0.137164179002866, 0.190289808670059, 0.0168805175926536, 0.786586451344192, 0.941047086613253, 0.950291624758393, 0.726629540789872, 0.257150660501793, 0.767686791718006, 0.0649160966277122, 0.0560184586793184, 0.452478966908529, 0.699444561963901, 0.1950129927136, 0.464016245445237, 0.298849532147869, 0.915026630740613, 0.36833375855349, 0.679462193045765, 0.0791741597931832, 0.110823457594961, 0.3275465820916, 0.21324375574477, 0.224521839758381, 0.0279958660248667, 0.613803187618032, 0.141370096709579, 0.703676754143089, 0.672589749563485, 0.365164802642539, 0.597185381222516, 0.312340612057596, 0.471220351289958, 0.339753149542958, 0.744692320935428, 0.807826767209917, 0.724047389347106, 0.0350416509900242, 0.0143141078297049, 0.459135277895257, 0.30829482502304, 0.418717910069972, 0.815170946996659, 0.0107350833714008, 0.337225042749196, 0.102577632991597, 0.747796148061752, 0.476201005745679, 0.703248817007989, 0.051908576162532, 0.459711804753169, 0.924661928554997, 0.937453694874421, 0.536539393011481, 0.644264965550974, 0.826208461308852, 0.863652743864805, 0.354973023058847, 0.508016061969101, 0.422145219985396, 0.109045032644644, 0.860373968956992, 0.873121923301369, 0.165575219783932, 0.749390787212178, 0.491679725935683, 0.347241363255307, 0.485138176940382, 0.726532976841554, 0.430901356972754, 0.644576223334298, 0.0958067227620631, 0.800067360512912, 0.208580225007609, 0.725203845882788, 0.274529229849577, 0.558585841907188, 0.914937655674294, 0.613545369822532, 0.777274392312393, 0.950940080918372, 0.208959483541548, 0.0548990098759532, 0.156664268812165, 0.667626031907275, 0.993408191250637, 0.824056321755052, 0.719680809648708, 0.802751770010218, 0.12754001095891, 0.49136710469611, 0.551430308958516, 0.967217141529545, 0.552265034522861, 0.30444347858429, 0.689662781078368, 0.22357439249754, 0.50318945129402, 0.214576940750703, 0.213493100134656, 0.21657902863808, 0.553997766925022, 0.196543265599757, 0.711638573091477, 0.636808233335614, 0.225673588225618, 0.422356360126287, 0.0346148791722953, 0.926113870926201, 0.114635883597657, 0.585584190906957, 0.288217863067985, 0.197413493646309, 0.33805296709761, 0.228494751034304, 0.250013976590708, 0.308070640312508, 0.548453547526151, 0.0781810639891773, 0.721189826726913, 0.948349711019546, 0.891269214451313, 0.924918508157134, 0.147290858905762, 0.130571335554123, 0.209332755766809, 0.155585276195779, 0.269416294060647, 0.411228037672117, 0.722519133705646, 0.587787507101893, 0.6123622211162, 0.518332035979256, 0.182636057492346, 0.544378993101418, 0.0147249745205045, 0.535813916008919, 0.321362973656505, 0.205680906772614, 0.54778169747442, 0.784348062705249, 0.829245734261349, 0.00375733687542379, 0.24470688845031, 0.260210833745077, 0.347320474451408, 0.644113708287477, 0.210952768102288, 0.710949777392671, 0.614339445950463, 0.524131555110216, 0.703624569112435, 0.571564108366147, 0.597110274014995, 0.210792856523767, 0.739173778798431, 0.470145630650222, 0.913970083929598, 0.712311905110255, 0.28057779953815, 0.232601853553206, 0.262526802020147, 0.735199363203719, 0.962150099920109, 0.117133115185425, 0.655319362413138, 0.231908950954676, 0.50218626530841, 0.59284511487931, 0.931831866037101, 0.146845633164048, 0.261370225809515, 0.301943109370768, 0.316532094962895, 0.189213626319543, 0.828078367048874, 0.344364186283201, 0.437133249128237, 0.887415676377714, 0.914971266873181, 0.348534266231582, 0.987768000224605, 0.271276933839545, 0.826023813802749, 0.713736071251333, 0.68195412424393, 0.0589782192837447, 0.900705822743475, 0.52805641386658, 0.949266337323934, 0.291764075867832, 0.138189361197874, 0.559128606691957, 0.978667428484187, 0.769618967780843, 0.354563920991495, 0.892473468789831, 0.247240169672295, 0.100765257608145, 0.137648966629058, 0.405013991519809, 0.687203532084823, 0.283987054601312, 0.424270047806203, 0.539361731382087, 0.818480196641758, 0.682315783808008, 0.531873786123469, 0.600602154852822, 0.714892279589549, 0.159297755220905, 0.694253968540579, 0.970819691661745, 0.492535071447492, 0.506918601924554, 0.167514077620581, 0.337768448516726, 0.248893624637276, 0.925369200529531, 0.556087115779519, 0.790567449294031, 0.466152016073465, 0.369516845559701, 0.940985555760562, 0.181657440727577, 0.945475308457389, 0.632333346875384, 0.649533868068829, 0.252008438808843, 0.716518989065662, 0.495150202419609, 0.320279214531183, 0.210181148024276, 0.0514442976564169, 0.560021026292816, 0.29286945075728, 0.917381049366668, 0.803549237549305, 0.0452492046169937, 0.112628205213696, 0.221681158524007, 0.729071120964363, 0.104118769988418, 0.882043196121231, 0.459914450999349, 0.416778416838497, 0.262269402621314, 0.573443383909762, 0.921211799606681, 0.0589693824294955, 0.984318975824863, 0.554940220667049, 0.324975168332458, 0.683668156387284, 0.741510772844777, 0.740346545120701, 0.73672842187807, 0.996173938270658, 0.441907065687701, 0.233366794418544, 0.0930367063265294, 0.468237418448552, 0.99687910778448, 0.779569183941931, 0.24905294389464, 0.265866270754486, 0.105899329530075, 0.355320486938581, 0.808142820606008, 0.878293003886938, 0.380768493749201, 0.154580352362245, 0.1790848642122, 0.869953661691397, 0.43932518386282, 0.347169925458729, 0.0455705637577921, 0.0333972957450897, 0.0621360936202109, 0.882865717867389, 0.644302360946313, 0.759708921425045, 0.0987621112726629, 0.0488398158922791, 0.592836511554196, 0.183323624311015, 0.578793099848554, 0.313642387511209, 0.079180357279256, 0.00837347051128745, 0.198537290794775, 0.960450880229473, 0.201183356577531, 0.0494250457268208, 0.58247592812404, 0.162518873345107, 0.41830415953882, 0.841959724901244, 0.530866049928591, 0.0651320363394916, 0.388923087855801, 0.152429191861302, 0.78437339188531, 0.721455001272261, 0.0480059091933072, 0.255862743826583, 0.923264801502228, 0.0735937890131027, 0.585168677149341, 0.334852176485583, 0.497336049797013, 0.76684049400501, 0.328165993792936, 0.982986759394407, 0.353461236460134, 0.830989680020139, 0.419485906837508, 0.89386971690692, 0.311883631860837, 0.755107209086418, 0.656258726958185, 0.792798206442967, 0.653999446658418, 0.515845178393647, 0.726155805634335, 0.791332655819133, 0.771861086366698, 0.998458849964663, 0.385981810512021, 0.506247248500586, 0.306236730422825, 0.689386155223474, 0.703666259767488, 0.768168316455558, 0.499030924867839, 0.516966850031167, 0.826102776220068, 0.708552662050352, 0.958447616547346, 0.509259008336812, 0.759817730169743, 0.385211349232122, 0.62458301638253, 0.309523917734623, 0.965570610249415, 0.937558384845033, 0.274171748431399, 0.930241738911718, 0.866209502797574, 0.735354160424322, 0.968940973980352, 0.302237041760236, 0.755376565270126, 0.0839991285465658, 0.382933429675177, 0.985571265453473, 0.640504273120314, 0.966484017670155, 0.85932929161936, 0.828322415240109, 0.979190739337355, 0.000682256650179625, 0.517754849279299, 0.397424189373851, 0.518826328683645, 0.397790491348132, 0.775976140517741, 0.824180848896503, 0.65212856954895, 0.222941487561911, 0.362701597390696, 0.667807255405933, 0.610867321258411, 0.00524797453545034, 0.610754749970511, 0.90493203769438, 0.720862101530656, 0.385244729463011, 0.622641267254949, 0.198215500218794, 0.273100967518985, 0.491399378748611, 0.522423380520195, 0.710679515497759, 0.0565299310255796, 0.232824528357014, 0.694566445425153, 0.291381621034816, 0.815326593117788, 0.530679869698361, 0.912955796578899, 0.720692346571013, 0.501583010656759, 0.544575373409316, 0.149034550879151, 0.347778346855193, 0.920255882199854, 0.617883791448548, 0.81809138157405, 0.226378874620423, 0.398595812031999, 0.0968610381241888, 0.994760420406237, 0.0512143529485911, 0.00586678297258914, 0.0426991432905197, 0.565394036937505, 0.252433461137116, 0.561920315027237, 0.866363671142608, 0.126184610649943, 0.995565863559023, 0.204895244212821, 0.0875206408090889, 0.838491184869781, 0.868904869072139, 0.932153575820848, 0.418825665488839, 0.509266648907214, 0.106256694998592, 0.405198326800019, 0.0773831617552787, 0.845014412188902, 0.37225196021609, 0.0646194501314312, 0.0962763654533774, 0.671104866312817, 0.63611079659313, 0.967374862637371, 0.739096531411633, 0.211647768272087, 0.374446410452947, 0.0703165887389332, 0.65702386922203, 0.255057242466137, 0.761350652901456, 0.18956631468609, 0.642159200040624, 0.314154952066019, 0.795467847026885, 0.018454814562574, 0.32123433239758, 0.949331248411909, 0.77007478964515, 0.88346459902823, 0.913648173911497, 0.0427822580095381, 0.0387546285055578, 0.560760743217543, 0.527077378705144, 0.728853151667863, 0.633032421348616, 0.16190230846405, 0.594751540804282, 0.899772045202553, 0.328569470439106, 0.3018197810743, 0.888973295455799, 0.719074605032802, 0.626063140342012, 0.934896849794313, 0.216132152359933, 0.0820675841532648, 0.604176676366478, 0.00571468565613031, 0.047701945528388, 0.470655684359372, 0.659271740820259, 0.647840971359983, 0.623760173330083, 0.0443880027160048, 0.0420190247241408, 0.603662333451211, 0.251959848450497, 0.386834810720757, 0.033413621596992, 0.794680561637506, 0.355705644935369, 0.973415603162721, 0.430098228389397, 0.640250506345183, 0.191442689625546, 0.890403778990731, 0.259040008066222, 0.852067284751683, 0.849557830253616, 0.525598332984373, 0.337649035500363, 0.906788495834917, 0.990627779625356, 0.727288963505998, 0.819436003221199, 0.121443680021912, 0.0902478341013193, 0.679523289902136, 0.748120269039646, 0.823129307944328, 0.688810828141868, 0.220231028040871, 0.232631715713069, 0.128410123754293, 0.936530837323517, 0.991138841956854, 0.0640033839736134, 0.166268767323345, 0.518817614763975, 0.813877743203193, 0.509033096721396, 0.902099477592856, 0.232552591711283, 0.47328081051819, 0.912580891046673, 0.261829343391582, 0.984099922701716, 0.224039877299219, 0.698577008442953, 0.140014365082607, 0.416591045912355, 0.326758888084441, 0.407039372483268, 0.598754855338484, 0.149549961090088, 0.632791304728016, 0.214431840227917, 0.851591898594052, 0.576258381130174, 0.372065811185166, 0.138699955539778, 0.599262639414519, 0.805780943250284, 0.281927065225318, 0.563775651622564, 0.223280415870249, 0.7287523066625, 0.0608015148900449, 0.904845746001229, 0.352294401731342, 0.501498747384176, 0.250394890317693, 0.160575491376221, 0.694857817841694, 0.238557010190561, 0.324171503540128, 0.709977475227788, 0.542670724447817, 0.0982357454486191, 0.201090529793873, 0.342294976348057, 0.436868348158896, 0.419391678413376, 0.897632704116404, 0.14165248000063, 0.710510603617877, 0.663611287251115, 0.226078710053116, 0.488332784967497, 0.503454522928223, 0.950689522782341, 0.993008250370622, 0.127547826152295, 0.55250099231489, 0.36221415316686, 0.707453545648605, 0.386695204302669, 0.373590733623132, 0.795789421070367, 0.195181924849749, 0.942012312822044, 0.822275212034583, 0.419553896877915, 0.736235396936536, 0.132925521349534, 0.982908334815875, 0.0789758414030075, 0.745443465886638, 0.882432844256982, 0.144489598227665, 0.830355362733826, 0.548394820885733, 0.0911384776700288, 0.239079666789621, 0.534361547557637, 0.526585444342345, 0.3677137196064, 0.662374228239059, 0.278356518596411, 0.898062677122653, 0.309130660258234, 0.223267955472693, 0.653858408331871, 0.744698766386136, 0.0968892222736031, 0.792425002902746, 0.182938886340708, 0.258253048872575, 0.376066589495167, 0.373899925267324, 0.246126017998904, 0.970395153621212, 0.0221219267696142, 0.198418113170192, 0.391265231650323, 0.386380730196834, 0.8609193128068, 0.649101250106469, 0.654616613639519, 0.663492733612657, 0.11027526576072, 0.917333149118349, 0.906974832294509, 0.793510631425306, 0.160674791550264, 0.375623267842457, 0.93916101497598, 0.0237628405448049, 0.489064895780757, 0.322569782845676, 0.4599790640641, 0.968248449033126, 0.503750688862056, 0.137057992629707, 0.756053738528863, 0.227066091960296, 0.309221654431894, 0.282568486407399, 0.531660587526858, 0.109790723770857, 0.389323289273307, 0.311167601961643, 0.484018966555595, 0.778408627957106, 0.184841200010851, 0.757811259012669, 0.986676204716787, 0.0837076371535659, 0.89952951297164, 0.914983659749851, 0.53359681321308, 0.485397913493216, 0.979551484808326, 0.722250586375594, 0.274030110333115, 0.289351657265797, 0.580856527667493, 0.0421090731397271, 0.0313935191370547, 0.873520685359836, 0.753175287740305, 0.63278384343721, 0.429824267048389, 0.481334067881107, 0.943610515911132, 0.69317014887929, 0.0562590889167041, 0.936676322016865, 0.127720152959228, 0.31169597664848, 0.39611326972954, 0.11601515696384, 0.268483157269657, 0.193756226217374, 0.233666321495548, 0.518231372581795, 0.460481578717008, 0.823136486811563, 0.572886652778834, 0.26970086642541, 0.0252918105106801, 0.751138216117397, 0.507224886212498, 0.423158447491005, 0.23900619498454, 0.129596123937517, 0.326314738718793, 0.00163172255270183, 0.623543184250593, 0.552510866895318, 0.646969760302454, 0.0150880995206535, 0.401812738040462, 0.324191327905282, 0.0397449100855738, 0.243267814395949, 0.421371039701626, 0.165414540329948, 0.398785921745002, 0.141016276087612, 0.447666534688324, 0.3833509280812, 0.316562929423526, 0.746283146319911, 0.64709970774129, 0.501022403826937, 0.733173224376515, 0.541713636135682, 0.408266205806285, 0.825185902183875, 0.7188757781405, 0.802253080764785, 0.737347897375003, 0.340869465144351, 0.274535093223676, 0.179198093945161, 0.0225234772078693, 0.646316331578419, 0.309881212888286, 0.490314984228462, 0.0205285784322768, 0.485585268121213, 0.961239985190332, 0.381273278268054, 0.431834955234081, 0.869653564412147, 0.561370071489364, 0.345067326445132, 0.52247998281382, 0.0226064729504287, 0.598832377698272, 0.359920742688701, 0.24953829869628, 0.798385076690465, 0.899008631007746, 0.199391112430021, 0.20537858013995, 0.928835645550862, 0.0613949652761221, 0.476923653390259, 0.37228161143139, 0.942239755531773, 0.563439138932154, 0.914925095392391, 0.35024698660709, 0.757748999865726, 0.0326341828331351, 0.638125430559739, 0.744583706837147, 0.345288509735838, 0.0809473798144609, 0.108300823019817, 0.775789130479097, 0.584923906251788, 0.450362811563537, 0.190775425871834, 0.677310225088149, 0.990003114100546, 0.197140638250858, 0.342674592975527, 0.597823499934748, 0.131013640435413, 0.767920399550349, 0.181014633039013, 0.0393636133521795, 0.375324764754623, 0.0596955914516002, 0.676822294481099, 0.0149589360225946, 0.874781360849738, 0.325679809087887, 0.64086690871045, 0.000214893138036132, 0.0232361871749163, 0.0877890605479479, 0.173101101536304, 0.525004471419379, 0.412782779429108, 0.574271852849051, 0.447789158206433, 0.882244452834129, 0.533046854194254, 0.435744627844542, 0.863218422746286, 0.726926951669157, 0.981378197204322, 0.880946195218712, 0.727039013756439, 0.720376670593396, 0.461857170099393, 0.670274453470483, 0.770723266061395, 0.889530535088852, 0.116440584650263, 0.888700416311622, 0.359070120612159, 0.12731885490939, 0.538178196176887, 0.115669594611973, 0.419497300172225, 0.907019917387515, 0.348498432664201, 0.315922209527344, 0.662755283527076, 0.915843957103789, 0.792905329726636, 0.623989657498896, 0.535526007413864, 0.147767442977056, 0.329031515633687, 0.65581144974567, 0.113701197784394, 0.533550477819517, 0.806492020376027, 0.117409565951675, 0.105941674672067, 0.913901569787413, 0.362242017639801, 0.256795873399824, 0.678519504610449, 0.522882194491103, 0.338524610502645, 0.732171974144876, 0.618778471369296, 0.220345605164766, 0.854066167259589, 0.191926053725183, 0.180709004402161, 0.628960605012253, 0.0195417483337224, 0.0282633968163282, 0.569316555513069, 0.199712104396895, 0.372885905904695, 0.468138043303043, 0.259083372773603, 0.678661161102355, 0.791841745842248, 0.526053826091811, 0.541167847113684, 0.104974264046177, 0.311746375635266, 0.563720937352628, 0.857543558580801, 0.745404939400032, 0.502702720928937, 0.723164536524564, 0.833933053305373, 0.374148273840547, 0.89905043062754, 0.404067774768919, 0.466253074584529, 0.709111290285364, 0.0323791520204395, 0.0328103427309543, 0.66775024170056, 0.342230007983744, 0.960891990223899, 0.887521343305707, 0.996665539452806, 0.262510693166405, 0.254967446904629, 0.859071091283113, 0.381083494983613, 0.353397941915318, 0.13397060893476, 0.5512810414657, 0.537397629348561, 0.151046285638586, 0.0610557186882943, 0.568482440896332, 0.567784585990012, 0.345591999357566, 0.229777362430468, 0.111217645229772, 0.362608945695683, 0.965476510347798, 0.356678530573845, 0.017892541596666, 0.239369696937501, 0.95735845528543, 0.281470225425437, 0.509387956000865, 0.0823534775990993, 0.928517641033977, 0.290370534872636, 0.966219618683681, 0.260365671245381, 0.258849262259901, 0.357635213294998, 0.408947244752198, 0.852252011885867, 0.297321632038802, 0.0117885156068951, 0.00855209049768746, 0.869031344074756, 0.903909913729876, 0.649121041642502, 0.196550518507138, 0.174227272160351, 0.257708035875112, 0.659660637145862, 0.404001670191064, 0.602646267274395, 0.84100860869512, 0.271027329843491, 0.472252521198243, 0.667010412784293, 0.980501636862755, 0.439125028904527, 0.464763628318906, 0.314189652213827, 0.114199460251257, 0.93585679656826, 0.800984351662919, 0.795697245979682, 0.22088409611024, 0.712769389851019, 0.392207334283739, 0.0806282174307853, 0.938192947069183, 0.667966789798811, 0.684854451334104, 0.994374047266319, 0.862775617046282, 0.663851945428178, 0.791130019817501, 0.778783566085622, 0.135758342919871, 0.381403374951333, 0.156394353834912, 0.0675784233026206, 0.684849941637367, 0.32192695653066, 0.45939053199254, 0.979936513584107, 0.952109209727496, 0.491436710814014, 0.228782906197011, 0.0550466275308281, 0.672973179491237, 0.0594962041359395, 0.774250347167253, 0.586573536740616, 0.698183617787436, 0.690110424067825, 0.509923483245075, 0.236010291147977, 0.496517707360908, 0.767467655939981, 0.389440126949921, 0.310276824980974, 0.0541447447612882, 0.632761855144054, 0.784978661220521, 0.102379544172436, 0.668765302048996, 0.010094323894009, 0.827144383452833, 0.19629889074713, 0.545737344073132, 0.563829079503193, 0.0171148008666933, 0.142092283349484, 0.425463587744161, 0.252864009002224, 0.755256301257759, 0.592835387215018, 0.275791980791837, 0.171719887992367, 0.422216148581356, 0.565559581620619, 0.852838244754821, 0.693415904417634, 0.912613668246195, 0.676351933274418, 0.983497129287571, 0.725790180731565, 0.518605720251799, 0.562294972129166, 0.989682135405019, 0.598856115480885, 0.194652979029343, 0.895285645499825, 0.0712745052296668, 0.172468857141212, 0.613315540598705, 0.131680391961709, 0.00211440911516547, 0.689466883661225, 0.0621356274932623, 0.823896761750802, 0.894140936434269, 0.433863654267043, 0.344865736318752, 0.898936402518302, 0.613895801594481, 0.917653430020437, 0.81467113061808, 0.21362269949168, 0.253619932569563, 0.0031126665417105, 0.439006055239588, 0.358437464572489, 0.559220538241789, 0.359307199949399, 0.552037703804672, 0.714498153654858, 0.207370839314535, 0.140031647402793, 0.509940527146682, 0.755228843772784, 0.915650078328326, 0.148176364367828, 0.920221140608191, 0.90866948897019, 0.533411973621696, 0.789369453210384, 0.133013139246032, 0.0123751393985003, 0.832500803051516, 0.669455478200689, 0.233885506168008, 0.520845055114478, 0.682811491889879, 0.427943505113944, 0.924030547961593, 0.894643577747047, 0.899492271943018, 0.409257180523127, 0.611079786904156, 0.261544398032129, 0.0131758442148566, 0.11240000766702, 0.933025031350553, 0.177189914742485, 0.942686608294025, 0.791205604793504, 0.824275144608691, 0.441551951691508, 0.338690917938948, 0.826990676345304, 0.5736788965296, 0.749313668115065, 0.339912298601121, 0.677000709576532, 0.322028340306133, 0.984041546937078, 0.473424986004829, 0.0730628666933626, 0.567171187372878, 0.658182400511578, 0.336227480322123, 0.261582172010094, 0.872948424192145, 0.287021150346845, 0.311737046111375, 0.0984924072399735, 0.150928899412975, 0.355980124557391, 0.485411348287016, 0.568928191903979, 0.275347152724862, 0.233043291606009, 0.526002286700532, 0.884423713665456, 0.0922431491781026, 0.623843021923676, 0.169392848620191, 0.678698956035078, 0.290033337660134, 0.775040951091796, 0.350297480123118, 0.899462326196954, 0.634948935592547, 0.256356385536492, 0.182159858988598, 0.977257989812642, 0.620611815014854, 0.06907046912238, 0.355846131918952, 0.143800066085532, 0.905331493820995, 0.0270492895506322, 0.2435387163423, 0.681851610308513, 0.848152410704643, 0.135445976862684, 0.175756627460942, 0.390451044775546, 0.401260072365403, 0.25127462646924, 0.442384134745225, 0.625229990575463, 0.555432797409594, 0.95550792850554, 0.191333845024928, 0.00168043375015259, 0.889306707773358, 0.787859318079427, 0.540803863666952, 0.0616270713508129, 0.840093308826908, 0.705555197549984, 0.351381950313225, 0.0921918849926442, 0.406589814461768, 0.839818005217239, 0.457485317718238, 0.129245649557561, 0.392828929005191, 0.711810810957104, 0.283385962480679, 0.543242496438324, 0.159029385540634, 0.473513310775161, 0.705203220481053, 0.308465875219554, 0.512635463615879, 0.792351564858109, 0.927064916118979, 0.855060771806166, 0.00603786646388471, 0.0307486841920763, 0.507452466292307, 0.999538347125053, 0.588900240603834, 0.106804926181212, 0.096492389915511, 0.148477659793571, 0.157827967545018, 0.992642661323771, 0.93813056172803, 0.901907638413832, 0.668016549898311, 0.255510518094525, 0.888806634582579, 0.747922644019127, 0.933406369760633, 0.183879241580144, 0.810766326263547, 0.110946126980707, 0.510299790184945, 0.584730410017073, 0.0416869705077261, 0.00386962038464844, 0.802852530032396, 0.960613649105653, 0.466828531352803, 0.819400991080329, 0.137095607584342, 0.273952119285241, 0.792261292692274, 0.0962358629330993, 0.874706146074459, 0.535070253070444, 0.815890475176275, 0.513203339651227, 0.880865497514606, 0.759889968438074, 0.613883769139647, 0.782457083463669, 0.579230112954974, 0.714677541283891, 0.645804676227272, 0.899858664721251, 0.68659992213361, 0.973367396043614, 0.726136944023892, 0.611537456745282, 0.863986969925463, 0.515921162441373, 0.246667020721361, 0.794377547223121, 0.349875852931291, 0.445035658311099, 0.962578833568841, 0.358111737761647, 0.166376163018867, 0.463746593799442, 0.0490092581603676, 0.113414003513753, 0.831336693139747, 0.840878094779328, 0.292032978031784, 0.125231629237533, 0.890103582525626, 0.306721605360508, 0.268771347589791, 0.399368161568418, 0.392082674661651, 0.0478826346807182, 0.676022889791057, 0.554108540061861, 0.778931396082044, 0.608271048171446, 0.615079631796107, 0.00694751320406795, 0.0246562028769404, 0.326056216377765, 0.377244483446702, 0.658051557838917, 0.885901875328273, 0.939381778705865, 0.873675169190392, 0.67057319986634, 0.762281560106203, 0.844460201915354, 0.509005482308567, 0.825657671084628, 0.959524786565453, 0.264135148143396, 0.489430909976363, 0.744400044903159, 0.932136837160215, 0.0317221803124994, 0.442821763223037, 0.319218684220687, 0.392838149797171, 0.28886223770678, 0.38048786483705, 0.0892004549968988, 0.691311177564785, 0.0532405427657068, 0.581292044604197, 0.553374276030809, 0.334577008383349, 0.999597164569423, 0.84324157400988, 0.380404989002272, 0.358497683191672, 0.724441345548257, 0.413458978757262, 0.725488867610693, 0.12355336570181, 0.742723390460014, 0.713215169496834, 0.348563363775611, 0.753136217361316, 0.643560046330094, 0.0924783318769187, 0.351908915210515, 0.74082766729407, 0.259260039543733, 0.158601856324822, 0.783217063173652, 0.365029092878103, 0.132314311340451, 0.84535407810472, 0.832263902295381, 0.838424753164873, 0.239421851700172, 0.659816602943465, 0.120624675415456, 0.6397284346167, 0.823397135362029, 0.895531405229121, 0.417783912736923, 0.565354623831809, 0.59629130945541, 0.38015892310068, 0.160488981287926, 0.119852832984179, 0.559395015239716, 0.864476463058963, 0.300965693313628, 0.156593979801983, 0.0689875953830779, 0.654235401889309, 0.57324287109077, 0.529678581980988, 0.672031012363732, 0.132477952865884, 0.836709110531956, 0.279154593823478, 0.550440431106836, 0.553933318937197, 0.101397789316252, 0.179422649322078, 0.111367230536416, 0.668391137151048, 0.753152373479679, 0.0616070998366922, 0.520023127086461, 0.0257466374896467, 0.57041241764091, 0.719869782449678, 0.286305549088866, 0.797395617701113, 0.651126661803573, 0.94067126349546, 0.0755345742218196, 0.160497416974977, 0.171673237113282, 0.097575644031167, 0.269207977922633, 0.976075924700126, 0.680690449662507, 0.958873420022428, 0.232048991601914, 0.744527370203286, 0.895795886637643, 0.50910839275457, 0.457218793453649, 0.978228926192969, 0.992669925093651, 0.53016379266046, 0.980776103679091, 0.962227289564908, 0.359518567100167, 0.212030187249184, 0.572824609698728, 0.309235240332782, 0.936791330808774, 0.303851896198466, 0.923770627239719, 0.256225823890418, 0.110831299098209, 0.754323045024648, 0.193384368903935, 0.37887423299253, 0.424219543579966, 0.365397836314514, 0.297307209577411, 0.34588307607919, 0.757166122552007, 0.547470551915467, 0.861450910102576, 0.200045872246847, 0.844962926814333, 0.544759169686586, 0.187013126211241, 0.0595349750947207, 0.292369664879516, 0.477636355208233, 0.597272343933582, 0.772327048005536, 0.180859056068584, 0.608215524582192, 0.420488112606108, 0.632368653779849, 0.497825608588755, 0.55523740244098, 0.170654512010515, 0.794666604604572, 0.703558492008597], + "y": [0.127409013941536, 0.259704904979668, -0.325430487956134, 1.28519915389909, 1.67173862570367, 0.272735354144643, 2.22534020122952, 1.08961313999269, 1.3720918711898, 0.236607399212498, 1.49253609958635, 0.488880589812829, 0.567475393203614, 0.544615043359027, 0.149548597555775, 0.716063482889429, -0.385229479805715, 0.535708160498762, 2.23055894718691, 0.310070269094779, 0.345520453814561, 1.92153999710385, 0.178361412211419, -0.0870076763620393, 0.547822439872253, 2.02941424830463, 0.0516762698048544, 1.50726414002462, 0.672009706997568, -0.443858844763067, 0.843155026850744, 0.373763013049766, 2.29048100964846, 2.58101755559321, 1.18484673308105, 1.29248121466933, 1.40842541968759, 0.0187804672445814, 1.25377708045325, 0.926753414600449, 2.30280822291568, 1.68604961709851, -0.257518463333365, 0.703249219603809, 0.784363308938266, 1.78233906016794, 2.77988729746676, 0.559215050447783, 0.632450312952368, 1.3157195724007, 0.396448293766819, 2.6592241029636, 2.0855288759236, 1.94884700659471, 0.957260060833043, 0.18716763063987, -0.186005153858802, 1.10367403048544, 0.618909254926726, 1.48496979971748, 0.705350209565507, 0.336114413274574, 1.82066546528513, 1.15602165861511, 0.774281222014263, 1.42474025345588, 2.3668907164332, 0.794674648599702, 1.01799531866667, 1.90479545762214, 1.63117522526422, 1.20894150029931, 1.64790312867293, 1.43352546708837, 0.465781070318052, 1.80786096675332, 1.43515297783589, 0.727685218224957, -0.0928162415419211, 1.80752947721029, 0.610693513045008, 1.06031253849131, -0.0566043742836863, 2.0307572058794, 0.159874055756814, 2.07896690131237, 1.34823011810207, 1.78587582100957, 1.04695883469942, -0.898893293235406, 1.10628084153084, 0.136481198161458, 2.24910797899499, 0.525081097880932, 0.595115932788555, -0.120409518326741, 0.989740829357829, 0.759122000351103, 0.74524774798471, 1.66042980422554, 1.78487077324826, 2.2061656107579, 1.67976388879716, -0.26477138784094, -0.141440662351955, -0.335934415974077, 1.63089355135632, 0.0120069706501685, -0.162219265337323, 1.8155624725613, -0.185649073738895, 1.25576841489696, -0.208816051462482, 1.53170706081949, 1.14232334493739, 0.836659792795183, 1.48727954923902, -0.00096090211093075, -0.211915810527753, -0.500655570589765, 0.631287518331701, 2.19704390150556, -0.744877302797046, 1.05139882184139, 2.24576046627054, 0.967095149490927, -0.223002475166615, -0.417887356754763, 2.16978437815248, 0.893934608794192, 0.386278397033466, 2.4240216937389, 1.73162889275942, 0.841092615130328, -0.0598401591509008, 1.59769889717132, 0.240871222867088, 2.08562042881213, 1.40314271151497, 0.327814041727377, 0.576835024010073, 1.56831052666881, 1.3606082709411, 1.23612262524756, 0.955247435038302, 0.574813766005852, -0.0144444920484839, 0.044665368178101, 1.71097116478096, 1.52511037939834, 1.2157621621024, 0.380941599320219, 1.3056525090314, 0.711457707025305, 1.45770073132625, 0.625253167020145, 0.859706400747508, -0.574116776887863, 0.2438776768325, 0.397031550617265, 1.40954703865875, 0.879091458035327, -0.0712470377698649, 1.96801271563877, 0.0827044337638018, 1.59576338419212, 0.800740314230615, 0.611727774093077, 0.368424693199505, 1.92101345976112, 0.191472405466046, 0.12527165868518, -0.0556888329445061, 1.40032367394989, 0.378945661035816, 0.832289042782412, 1.95003156170238, -0.889842758130067, 0.274070689168858, 0.680710843348652, 0.715187091246175, 0.50961549583327, 0.604437081296028, 0.439887903470241, 0.898194341759608, 2.80297292034313, 0.180770089282713, 0.0711807705197811, 1.36240434184613, 1.68435042033604, 1.82621154282983, 1.57275461654435, 0.506479627222813, -0.290165598239041, 0.220511495539046, 1.86528371488287, 1.80180144534095, -0.052960120826252, 0.670710534354517, 0.675805074599692, 1.82761649598049, -0.299846474075191, 1.30811043614562, 0.735444036344724, 2.22893443660695, 1.00374078615023, 1.3756799555012, 0.674084437267308, 2.01220145856235, 0.0260137675602635, -0.00679499293842434, 1.06642151423345, 1.09780985692874, 2.42574942824215, 1.29251630867445, 0.759672554561615, 0.743095181199894, 0.328195581454741, 1.64997039607469, -0.120588105972901, 0.198195148212888, 0.872796853496786, 0.521537448459808, -0.046573699505016, -0.0560966260920954, -0.567855502972459, 1.65283359028107, 0.156405437483238, 1.93194572631172, 1.77862523729779, 0.874089646304595, -0.302644619358928, 1.7268375214826, 0.800784116965176, 1.64953756997014, -0.379723803340581, 0.420831135181378, 1.13075360182609, 1.01932456161399, 1.5527401713794, 0.576569001231381, -0.0668656046850978, -0.210911258629103, 0.147754750091855, 1.35997461606195, -0.43570944717135, 1.36013937430177, 0.445897050539279, 0.296051713553454, 0.479200539004404, 2.40552255044426, 1.62826875307876, 0.587140346351732, 0.681412381400845, -0.120251836787833, 2.15577641927265, 0.652165874095762, 2.16303192825693, 1.21566551548004, -0.283687080457899, 2.47963558565745, 0.617256274435911, 0.457884609319309, 2.43972452517142, 0.731524455382423, 0.775856768993385, 1.74617979741202, 0.502791925164491, 1.88158601763546, 1.48189872889396, 0.948732732197313, 0.329662716380206, -0.629056687032522, 0.746572818842245, 1.3262914658486, 1.15561838992649, 1.78226457985478, 0.474953271403286, 0.270084374684081, 1.78800735439108, 0.369130656516822, 1.16094969557318, 0.431395469232765, 0.262675306346066, 1.28678828422726, 2.56244180260004, 2.59343944741744, 1.30981834263464, 0.605685410568112, 0.221762645484613, -0.59617293327586, 1.0441412589376, 0.544440606054087, 1.72325193221359, 0.953996221938496, 1.81647960301805, 0.20195912052584, 1.57795143949319, 1.67371908311012, 1.3898675763029, 1.51319202080781, 1.94898177052305, 0.974034068773996, 1.78207581928234, 0.379754716575388, -0.0493557869131748, -0.468577172702172, 1.26159883419307, 0.181641900664017, 0.524351875299369, 1.91689413011576, 1.47864338957162, 0.38713828657509, 2.04167568892544, 1.23750698096033, 0.140956705428359, 0.608432410445728, 0.460468396678872, 1.64479491998833, 1.32659124783194, 2.22764204870888, 0.203447415147332, -0.24217746434789, 0.007127935845128, 2.1204489961709, 0.325517844822051, 2.02654237113102, 0.113345648866407, 1.68897117508896, 0.244543293816884, 0.219101834128894, 1.48767571315349, 1.62150686974309, 0.268397934868534, 0.374232855479746, 2.72034190588426, 1.82877581920783, -0.292944133343371, 0.0868703358588973, 1.44857160474383, 0.585893023644637, 2.52869451042549, 1.45410673507622, 0.638015237364367, -0.425192043004174, 0.648360598200336, 0.548857271395538, 1.92548214309124, 1.50624269811629, 0.361411460685703, 0.296497779616711, 0.319627742254928, -0.146674631204292, 0.691201383290036, 0.423241077038324, -0.139795304374085, -0.39216393872201, 0.767053938895112, 0.0228652766478084, -0.198764934102224, 0.709540026234686, 1.66032468896286, 1.24137501144142, 1.1788560193466, 0.164673306889384, -0.833488453057801, 0.324812106185467, 1.74962961892529, 1.34779433086373, 1.1162828204021, 0.90396212124761, -0.0417894465614936, 0.42625186656608, 0.454601700250006, 0.917542193929878, 1.16989635239232, 0.370573304450871, 1.53545066844526, 1.26714568409795, 0.117059176995041, 0.450391707456063, 0.0630492603932893, 1.12920994583476, 0.283250078699733, 1.56551136240835, -0.00722452419314507, -0.150348963537747, 1.69782073109285, 1.97203613171976, 0.179065209223973, -0.481000970534718, 0.679968351241561, 0.511606700991565, 0.798793320812615, 0.922597267495115, 0.673120678173308, 0.310487760327279, 0.590740561703538, 0.555353371114171, -0.087330686289414, 0.399996897981041, 0.951080420643065, 0.780372724798305, 1.60710435595034, 0.754007789672164, 1.06951310119398, 0.96002863225402, -0.036979785713405, 0.469081126492685, -0.278447712603119, 0.224612339082651, 1.48826371638644, -0.41443789952055, 1.06432330017032, -0.0081887098542982, 0.101832064735036, 1.08610851696897, 0.195235600870459, 2.52043402912127, 0.00513653875424464, 1.64905868755238, 1.55784999476663, 0.288739227043458, 0.26698440378268, 2.10156578971687, -0.169745805032069, 0.693799568224177, 0.19883475102555, 1.34361616216875, 1.47310359706797, -0.107079569490144, 0.69760290331852, 1.66754247759496, 0.762774482388144, -0.034241066677864, 0.64066553128985, 0.960480146964012, 0.681600912833126, 0.560392908992933, 1.71167081127976, 0.689536425502554, 0.104241563287786, -0.201079080071226, 0.687971591175781, 1.59544687478644, 1.4067606041264, 1.35729678156644, 0.743449120852725, 0.111641579217403, 1.60879732983445, 1.92434447344522, 0.963734382175732, 2.06220242722947, -0.554830622853891, 0.347380986541332, 0.0706037633555127, 2.66312736819867, 1.74007647200927, 0.382691600827679, 1.79367788360131, 0.469877971435934, 0.716688706136128, 0.116020328845131, 1.25483013316248, 1.86894020127635, 1.09650910738876, 0.902687864580246, 1.1588247426213, 0.98539570600424, -0.973698635602541, 2.00890040374938, -0.0719477875757326, 1.46931056086591, 0.784447669590588, 1.44397993309039, -0.245543128710112, 0.54552049564655, -0.308917095335252, 1.15620098155779, 1.16117058280685, 1.6636160874516, 0.230497570773037, -0.212824807898431, 0.672292319863463, 0.166397230412516, 0.680484822351858, -0.160546545566228, 0.612911123239495, 1.95675959559059, -0.178749050663541, -0.528953229769347, 1.44379073695365, -0.187513100884086, 0.271002954889983, 1.19952365553258, 0.611389629681369, -0.985776418649874, 1.20033179754684, -0.189372684954712, 1.52970819077855, 0.583725660809657, 0.58569291631527, 0.10483594627377, 0.402135725872379, 1.73671973563068, -0.196153034940785, 1.07899984698683, 0.591294964320959, 0.301650912582798, 1.46066837507739, 1.98983759239375, 0.835475715465355, 0.819757081930647, 0.334520609869262, 0.621151423149237, -0.0537963464502771, 0.595249164105977, 0.560289481302099, 0.0336770408621588, 0.371656401474011, -0.421665700747351, 0.00375404491891257, 0.0661359067742486, 0.339491027616221, 2.2492363543381, 0.876572798261078, 0.798253754372638, 0.875469185467005, 0.589069932951853, 0.162685183731995, 0.31126944726946, 1.1330454955047, 1.71270842686333, 0.0800783597194868, 0.609411255373181, 0.787250089933897, 2.8019846953882, 2.33130890495765, 0.76133124413189, 0.882747017157287, 1.82099654093807, 1.1687425805571, 0.285322819450279, 1.52798824756317, 0.567229334541801, 1.27330053638114, -0.133902191399443, 0.662009314117745, 0.862539510760804, 0.312306111155421, 2.03446563957161, 0.813588330621495, 1.6547183654359, -0.607706194553834, 0.673357010718798, 1.19637520808605, 0.64443215282319, 1.06474272015266, 1.67969056351737, 2.08027230467179, 1.55562080717479, 1.07826041943275, 0.190380417762063, 1.73834700540508, 1.71074341769137, 1.34485645698579, 0.710082979865723, 0.105087515098808, 2.6245847216973, 1.40055620309877, -0.223975418177569, 1.25296721234177, 0.358257431299459, 0.52396063547572, 0.28708689079291, 0.350232899646741, 1.18128618570399, 0.276588257556339, 0.947756798435837, 0.633220743036571, 1.20806069720462, 1.19958335617188, 0.500762427384601, 1.45361530400718, 1.7151864320262, 0.624891780801744, 1.91195590479052, -0.751427405044689, 0.793653787772604, 0.83057278138116, 1.71059721113022, -0.0769277496191388, 1.083607270749, 0.816565341936895, 0.164546701691372, 0.635915739043119, 1.86814896279617, 0.101943308137229, -0.352187778064412, 1.26236492153703, 2.16443869642004, 0.498237318925154, -0.307727868410139, 1.72851529871977, 0.535380354939536, 0.757696722405076, 0.852072930069451, 0.775675625982632, -0.389434793521468, 1.45801570848825, 0.627156766949514, 1.93282207794712, -0.299332891675717, 0.983374140661105, 0.630235250021591, 0.0363498854088057, 1.15871896312249, 1.25494088473028, 1.89889409194508, 2.58264964160187, -0.118902714612625, 1.29807913860561, 0.161527868139194, 0.328935581829806, 1.58657990581977, 1.25758283060805, 0.759247056753146, 2.29218990320038, 1.43909846851953, -0.439712035183451, 1.08856102328237, 1.40549883436641, 0.543742754498836, 1.25360023940494, 0.492018268950971, -0.179647250530397, 0.60534984328794, 1.19364454111849, 0.756045966937025, 1.46344055911921, 0.808365613388937, 1.85636277410177, 0.488462801166186, 1.48121757490417, 0.676244127606571, 1.54854275282894, -0.487843116929685, 0.554028111585228, 0.203941767377364, 0.0545670918035402, 0.325321128724485, 0.638282946279976, -0.496802088576678, -0.439785479944169, 1.66690979953855, 0.406620054631665, 1.17129555085907, 0.562167503614622, -0.232371955428677, -0.233723467509736, 0.910467856463531, 1.50981715859405, 0.190098019834501, -0.309784202316507, 1.08693531232391, 0.707746332197279, 0.40112794762108, 0.060532559724864, 0.500145039436241, 0.29297923160342, 0.472749527224134, 3.0449899929776, 1.30258310529158, 1.27790389519937, 0.262797942555192, 1.35471091903618, 0.0481326481055865, 0.307896712375739, 0.213761391324178, 1.52144073994455, -0.0732238706720594, 0.824579939562, -0.244014550185405, 1.01118268759291, 0.883326055320281, 1.34916437072641, -0.0658181430148824, 1.02015406637584, 0.383670886460314, 0.962721490672279, 0.302563859087564, -0.520362256472169, 0.821609161520623, 0.696379111805286, 1.19310052218619, 1.53089871778718, 0.695304812533039, 0.845413621363926, -0.081791156521063, 0.913272707186147, 0.705939695869349, 1.91730121373641, 1.07400794789628, 0.294083306304757, 1.20155806926584, -0.307121798984108, 0.884278297903183, 0.791244289291293, 0.504353299822485, 1.48870755828362, 0.876206412358508, 0.978022613880254, -1.31371589375414, 1.11948030088831, 0.910136279704124, 0.764165257925267, -0.492746237309985, 0.771489215132551, 1.25631789528592, 2.13209737511792, 0.780459117722136, 1.59520639667533, 1.80630077280097, 0.819630300636534, 1.54970951495257, 0.809034520166957, 1.29666423875453, -0.493739567587631, 2.20766142223235, 2.23797228801555, -0.553102476742955, 0.8801497354948, 0.574118830838149, 0.827918307136597, 0.391688691257543, 1.66131781704618, 0.776096903653661, 1.24508260460897, 0.255941647961932, 1.90626461086997, -0.0996934864972757, 0.810801326592838, 0.438477583089335, 1.18174585277821, 1.66237383760752, 1.36089612814607, 0.914562445965789, 2.01722399167317, 0.188003491368547, -0.426601898329341, -0.453402830894536, 2.21022316416874, 2.25092550272048, 0.956992392183197, 0.0386524896424627, 1.12990391556577, 0.286536607321684, 0.0992277472411742, 1.25078504156915, 1.647661616956, 0.698638132531489, 0.0405123291948245, 0.772902629108711, 1.01860157064573, 0.725308293490211, 0.276112742512458, -0.22585125175829, 0.0161451067573328, 1.28466323820862, 0.758802668045806, 0.874846610664344, 1.29668547501506, -0.0789860982860003, 0.687096889577299, 0.0465602507191857, 1.85511059918579, 0.0394957459578263, 0.858041784227359, -0.310362049011153, 0.244040976711051, -0.169324560265692, 0.664811555965372, -0.0252827395495832, 0.200485727612208, 0.640225107231066, 1.13211496714308, 1.34188987898413, 2.11728417118429, 1.46497979683055, 1.25232960752051, 0.323537251301915, 0.336010892084616, 1.01654194202193, 0.14951929021187, 0.675650170903131, -0.0304783275458682, 1.24995093309384, 1.7763074148047, 0.996051679857562, 0.900266564660006, 0.84612235830344, 0.94317527409156, -0.70575913760887, 1.08195665546986, 0.684439777530353, -0.0154719806439662, 0.0916526740701027, 1.04080200114601, 2.11428578333055, -0.0985758756248416, 1.11000123077787, 0.182258092760854, 0.31014415280597, 1.92623172012012, 0.65491067424319, 0.600681111304509, 1.13397441235104, 0.606293226795844, 2.05047657660497, 1.29161792405749, 0.200269661846955, 0.404119230960995, 0.867474556470412, 1.13399133913415, 1.56576669827351, 1.95034046931124, 0.424535142469901, 0.562341135669539, 0.379250366915534, 0.45766205397136, 1.39335365205281, -0.129700864187866, 0.886350021879936, 0.573922658482445, 0.890767506932291, 0.475592368435796, 1.20889880315509, 0.798094894210923, 0.370836988253661, 0.579060769870881, 0.647773760417724, -0.651802413186052, 2.44440365181514, 0.389161514839118, 1.33073741816993, 1.77487019917857, 1.34666014218205, 1.07518472346411, 2.14249483075376, -0.636409837704476, 1.83109825639538, 1.80427037067128, 0.939327226383897, 0.392074396852904, 2.18156462600403, 0.793043182505109, 1.40563645203617, 0.827984280717337, -0.3691629659921, 0.3795771244666, 2.25335495604695, 1.4744644868031, 0.0311550499118692, 1.44509040241456, 0.263042961529597, 0.158121156405131, -0.394338504218848, 2.01357216750149, 0.814544814575813, 0.0368112870539131, 0.942452836906662, 0.411677348401298, 1.9153666445643, 0.789216205702337, 0.904845683813734, 1.14538095717404, 1.51484643188827, 0.0074605757856499, 1.76444921623893, 3.28154955553185, 0.205403948163434, 0.813762481778926, 0.3856632048082, 0.413891657797851, 0.796448823424933, 1.80306273729322, 0.0628274079156055, 0.630973594260427, 0.314079873786486, 1.30460935364194, 1.67981502496774, -0.0189623964060937, 1.50701810956417, 1.47789940706263, 0.82808420708169, 0.496561580436781, 0.523376071584206, 0.333628707790166, -0.0151780536286155, -0.452535787176737, 0.0955863313466249, 0.8629179361828, 0.537072794568249, 2.77260849193379, 1.93960294279573, 1.06774178551925, 0.418317818147214, 0.855359072966044, 1.19572426356275, 0.817211288954001, 1.92876790314715, 0.0210508814560778, 1.62572347808347, 1.69130647989792, 1.09533321329869, 0.934851789775891, -0.053200150807414, 1.60029711500193, 1.21968343751632, 0.355947936541807, 1.42296693278704, 1.64681750022405, 1.64018596076896, 1.01525643010359, 1.34544777090947, 0.781516131271482, 0.541547085345076, -0.222176093853688, 0.668585046973195, 1.91862203211242, 1.66178831974149, 1.3723243671274, 0.344776525787288, -0.4118386091377, 0.951905209037123, 0.672644268504895, 2.0184945311968, 0.351754301152207, -0.160236885095437, 0.421536904018166, 1.15804382047982, 0.567431673995688, 0.776842816872604, -0.235059855577211, -0.0181180363770087, 0.771340242800071, 1.46892138224002, 1.37571446742596, 0.982598148275927, 0.279132754723721, 0.21043146726768, 2.2089263396705, -0.627635604497449, 0.722134063487509, 0.990116227459745, -0.261026684051709, -0.602590792545456, 0.973508926300887, 2.38668204492012, 0.969766551498678, -0.107666112581529, 0.363145104285993, -0.0727990143429281, 0.00849801059366617, 0.847654153363238, 0.89919775268039, 0.150419180542046, 0.764382627262873, 0.558210678815955, 1.96410253707675, 1.27092518358747, -0.102192522749499, 0.651962866815797, 1.62923769250499, -0.11125971780986, 1.55518506819987, 0.147160461861958, -0.512664894148518, 1.50748860135272, 0.989402713284918, 1.8797310932265, 0.959516116088042, 1.03066896807676, 1.12384137595065, 1.48648699195421, 1.65503920145478, 1.10067296892826, 1.65022642767275, 1.28346287987726, 0.902595965666836, 1.60456043706239, 1.12434918748357, 1.37653892902169, 1.52592100123687, 2.41820863732387, 0.542286577711241, 1.21079784968737, 0.195777243076624, 0.600888957165434, 0.9943248053239, 0.915407203540142, 0.847684488680551, 0.579839368245834, 0.911635042831704, 2.07084369546317, 2.08420137147799, 0.510885550540527, 0.70514901926802, 0.708316011813601, 0.621491556518486, 0.738389891298481, 1.43290618168303, 1.08386360279803, 0.0623963000597443, 2.24237600111814, 1.09577605679834, 0.866913845015044, 2.03740179470896, 0.812232249437685, 0.943585205945446, 0.406369623239671, 0.592673586873619, 2.4011847639257, 0.877298465286437, 2.02302719969278, 2.48480589625788, 1.34529828727732, 2.2618918537765, 0.336479544726121, 0.561709422403247, 0.504548133720167, -0.0187089089385243, 0.425708114873973, 0.861702828641364, 0.640890515745977, 0.611771972552247, 0.523335085638402, 0.467075187127723, 0.80319956231822, 0.215335157026221, -0.575298820479817, 1.16869791491453, 2.43255119415168, 1.18533915907915, -0.0785092855822789, 0.682004157358844, -0.670311415108659, 0.915360643413106, 0.507229176935431, 0.866253644918148, 1.29371568259581, 0.0121348989842369, 0.918017517594984, 0.991421000142595, -0.0745800138579733, 1.85004276116598, 0.665801717314313, 2.30950471857275, 2.24069183309931, 1.03262177941174, 0.686883555652982, -0.194179181105734, 0.630190795099592, 1.87094988405588, 1.03137661319853, 1.38630046768965, 1.60149681015383, 0.15895952507348, 0.783085984358466, 1.08698414143225, -0.147238192699961, -0.261193959929814, 0.731689183635697, 0.817221378294854, -0.183890079473155, 1.36896398978811, 1.36944372933968, 0.0854082285895334, 1.41108877375866, 0.0900832280915123, 0.266752192394646, 2.68570540573764, 1.52344367149911, 2.19532076445421, 0.265436460120095, 0.0559870200529556, 0.782613098089175, 0.796070331825299, 0.470393890233487, 1.28405246299416, 0.290772981378752, 0.47406020009529, 0.0115253322092193, 0.625797619221867, 0.569680971612263, 2.10539119353392, 0.985806913527125, 0.501450255900261, 0.456282156217373, 0.0454257371295724, 1.42619152242106, 0.377083694712252, 1.87479879621462, 0.210821529868338, 1.18931476513021, 0.443807800039015, 1.23339328473922, 0.265507584123651, 1.0738388151507, 2.24421918832317, 1.39481159894472, 1.1245841863299, 1.06010131124656, 0.600295977356791, -0.693455149708647, 0.327200284582977, 0.651950656462308, 2.22372744511568, 1.75573539361929, -0.763839791001174, 2.0406371950935, 2.46868876346383, 0.448747237434108, 0.165354851490912, 1.58651380545891, 1.46773366076625, 1.70242271427112, 1.26452133462873, 0.116282566730294, -0.515317008245649, 0.477068203555412, -0.395038383913991, -0.79639983388427, -0.815375066199472, 0.0675741740301994, 1.726465620607, 0.306464881334805, 0.13085975475021, -0.0456645790358243, 0.526589222799186, 0.461722015998484, 0.189889046605203, -0.479213006886541, 1.74999461577825, 0.43719735514608, 0.890519856236759, 0.64831248233203, 0.916683617608412, 0.704140860672029, 1.4859584173504, 0.297383334968486, 1.28137925308746, 1.93074725625091, 0.222678401060666, -0.259588712586025, 1.17727394293358, 1.91109940444046, 1.33138380990749, 0.424476748262322, 0.884137924631488, -0.622912397408473, 1.2626788221836, 1.09707407401659, 1.89470345399507, 1.85509330465301, 0.816297828214817, 0.689260606175496, 0.245782821401106, 1.45159060232144, 2.54293986322737, -0.175989670352784, 0.141672612767388, 0.382269171979669, 1.03683899432519, 0.476587547295114, 1.64815258131935, 0.82823830311025, 0.297767632293479, 1.94747133824148, -0.537163621575463, 2.40534261072377, 1.13953833979867, 1.91090944596797, 1.00943110389758, 0.331756845932617, 0.0400614870838644, 1.2616454959004, 0.647210547703343, -0.0629161552716242, 1.05010582042848, 0.073600336455945, 2.0716785185262, 1.53616942683778, 0.455550979404339, 0.0940920289167317, 1.32294252227744, 1.81572716042105, 0.392431383239705, 0.622140888902998, 1.58895611112457, 0.854224311043313, 0.0419785508542783, 2.13727659895724, 0.466671521817737, 0.922266895300734, 0.203641774127989, 0.163320991071616, 0.981369917573719, 1.18827934682059, 0.528938370170844, 1.52509991079665, 0.987742463758625, -0.443365415719644, 0.320085723616626, 0.335767307705395, 0.302881437026047, 0.823487054177867, 2.01885153787727, -0.583432853692159, 1.84236460278645, 0.971874261679684, 0.972207417684302, -0.332088559778757, 0.201858315827242, 1.87777800653992, 2.57074295942602, -0.103130593037236, 1.13115339097335, 1.16029566786049, 1.59364436380967, 0.328238092258881, 1.50463701714882, 1.14736012848471, 0.928477315894698, 1.08075459671265, 2.23084333860968, -0.0746515081729545, 1.26653398425743, 1.21030929635932, 1.64811258550465, -0.0557898364705383, 2.17482769271981, 1.85712563426891, 1.06148141980878, 2.1319338538372, 0.732937693254811, 0.82473886135661, 0.18490073087335, 0.721168871953085, 0.887774026148709, 1.00889666277304, 0.896586262672789, 0.707127090927429, 1.71222469088597, 0.393564231082289, 0.223096328994459, 0.732242874286039, 1.35062432391068, 0.00532068855518233, 1.75220847821765, 0.0463370350326482, 0.899595411531473, -0.697135637635513, 0.527758640814232, 0.565206832641306, 1.99224577094587, 0.126233857960082, 0.684206533377432, 0.440996656084909, 0.927942061205126, 0.989302173797744, 0.467088893345657, 0.458271507938683, -0.0303912687866799, -0.550988240568929, 1.70411620075628, 1.67854500704731, 1.12561706696608, 0.0221333336678235, 0.398164022089692, 1.45044361670256, -0.661338120632559, 0.710564783503899, 1.05810663880786, 0.477884207689622, 2.12284277759376, 0.542404806194741, 0.754463054926417, 0.653289073781057, 0.42423036293284, 1.36948032025022, 0.162519205981176, 0.106318152809788, 0.0973379436333456, 1.26262889256059, 1.39739920014555, 0.597636716159587, 1.48738710268866, 0.586120712587564, 2.01403776227662, 1.9748927792355, -1.32128909052713, 1.84637458650985, 2.21303538024556, 0.287078930421037, 0.379555832418974, 1.3835298091881, 0.61478993356172, 0.151828698048922, 0.374254870335673, -0.211756745973944, 1.08877085442081, 0.326745219672835, 0.995028498835492, 1.4360163070297, 0.48978491243771, 0.636559698324812, 1.48413472116037, 0.898357994935248, 1.55705959648143, 1.02627488660849, 2.66256845010888, 0.316774704052492, -0.213752150981369, 1.17768875989609, 1.22544680543115, 1.01341311284697, 1.14564077691336, -0.270569974514031, 0.936191454583217, 0.958913777989489, 0.853816805210342, 0.646308583149955, 0.895230837194064, -0.516928566760096, 1.18304393429457, 0.982280309495619, 0.624407601323937, 0.366937128289675, 0.797026037939906, 0.122543476462753, 0.296873781887, 0.0710759107109136, 0.147792316237699, 1.46924823859129, -1.11857888758975, 0.268929410091709, 1.40049994917226, 0.455792660334302, -0.690560110706923, -0.0288154917819379, 0.310963066583793, 0.617194033269004, 0.71471209304084, 0.855520363007456, 0.422696050515834, 0.338507931130069, 1.10404252848778, 0.517000138445093, 1.92121556026214, 1.02139442075355, 1.31765769842761, 1.05215627749046, 1.76606806422563, 1.1150300966616, 1.32055631906446, 2.02338531769033, 0.0178903354974891, 0.816124670750231, 0.548951684071714, 0.37539880336781, 1.63320446245126, 0.560806238532623, -0.191756609720634, -0.0818595905667981, 0.385988683606735, 1.76940879174909, 0.649750849772462, 0.71900832804925, 1.76722330415663, 0.953213498351612, 0.711661669088886, 0.0140754202146272, 0.242735735590833, 0.531098184283085, 0.832220132159921, 0.399169156816117, 1.49092962933021, 0.659324749583111, 0.154620241229346, 0.758857041368499, 3.26638793839018, -0.276719547390514, 0.926728850832568, 0.348223206810173, 1.62936752769784, 0.85643907015654, 1.63905890453768, -0.221871739808047, 1.97048572222006, -0.228368601867131, 0.560875599634183, 1.53257807518746, 0.567468877008208, -0.2879201431488, 0.56259589168196, 1.21091474427006, -0.0843834899991927, 1.09424697929062, 0.480968365153419, 1.49615515786886, 2.12221600260143, 0.594558407751898, 0.274663668213397, 0.741904517868962, 0.092638646017485, 1.63142296782554, 1.06609053318515, -0.682042189816971, 0.552250434399728, 0.548266093150241, 1.75728955405835, -0.293764995444739, 1.08369058690291, 0.351344531304508, 2.28647471853645, -0.563981969063894, 0.221360171576124, -0.477325756777584, -0.155809286573802, 0.829489034542459, -0.043646031880501, 0.237235595418668, 0.492473829527413, 1.64998989470409, 0.814323766281126, 0.94913645140748, 1.25354536282072, 1.39038893450006, 1.51864312818769, 1.35024619378923, 0.809913184177759, 1.77556244085733, 0.295399899269272, 1.67406924778625, 1.38846903783445, 1.86233240684709, 0.245342086576459, 2.0427450000813, 0.153936263033365, -0.218540055318186, 0.677702984644642, -0.0843131066950992, 0.858231449161533, 2.02711287282564, 0.0286473130390026, -0.00176129751509396, 1.20740166632495, 1.97279146697421, 1.57757316009936, 0.717692046913578, 1.20530367175948, -1.28849826063483, 0.904956506066753, 0.616290420868048, 0.725019721498565, 0.64295489602179, 1.46628547005323, -0.381659521598058, -0.246516557588309, 2.10248643004964, 0.993683622930514, -0.0813814393337578, 0.464861069995211, 0.834779586113623, 0.7727446013495, 1.64889685444267, 1.61539419267003, -0.0710280143363479, 1.09303895159064, -0.692542805504817, 0.875409087089616, 0.783448934096631, 0.533338825974892, 0.69050814017449, 0.536542215425038, -0.591833407974221, -0.0286262085102281, -0.148834270204899, 0.8957553789617, 0.551594606390518, 1.75564589320617, 1.94969393847645, 0.430896715482592, 0.697977403286, 0.751324726514526, 0.613649216780143, 2.01383723146647, 0.888764288682449, 1.23189181107168, 1.01058324057585, 0.579930873943887, 1.03858173492914, 2.23591951860498, 0.615681670684818, 0.0470140624830044, 0.691888356448066, 0.190465485592363, 0.278471976148841, 1.09794124845686, -0.154655136783457, 2.19472180111908, 1.15332320814849, 2.52373908311577, 0.496623391177215, 0.604986370101872, 2.20955864597186, 0.479531737039609, 0.134137129438687, -0.722018679755775, 1.13881282330803, 0.584282737119521, -0.0313968427082831, 0.2956445346544, 1.79247941162093, 0.704553931198529, 0.237880131287257, -0.0574766162129982, -0.00885219110810179, 0.908340823520131, 1.73817690421629, 0.53953004430303, -0.66522482149742, -0.113345757219756, 1.90854338742109, 0.178942838586517, 1.25528671363397, 0.55000034495999, 2.0942277641506, 0.0782223898787024, 1.327005362442, 0.571622229573304, 0.392705456671656, -0.110634965019611, 0.190917107786159, 1.50410061919773, -0.35564754734407, -0.560333678254578, 0.46525945786098, 1.40314489727009, 1.12441690604302, 1.33208153523012, 0.461432217439893, 0.423532241245628, 0.480858735420144, 1.86220058369792, 1.34341170055382, 0.831242086347174, 1.09880030181698, 0.526342069510727, -0.248547337081187, 1.13063518863384, 1.41982173253697, 0.680586291999851, 0.848275808253421, 1.11111345706873, 0.571937423083322, 0.970361221959119, 1.01569080914864, 1.40904030303009, 1.20241984123686, -0.119518477118794, 0.803042910669262, 0.396314497720956, 1.91625057118802, 0.592349541209136, 1.3741569684773, 2.2804606787961, 2.13121649516224, 1.52118823440914, 0.747377917718117, 1.51822363252475, 0.623332172388276, 0.0412294042846001, -0.230511035396847, 0.117164272081567, 1.95816680471061, 0.390399048110242, 0.804001154655137, 1.0542476071264, 2.32704504340084, 1.89407771433034, 0.454060709640314, -0.941901660996956, 2.33329808770445, 0.0277275615501328, 1.25693006851963, 1.17717173086068, 1.31641246383062, 0.410869273977623, 1.13476566314495, 0.570279992075814, 1.02418210659674, 1.7433877281753, 0.638258217781785, 0.47044522181969, -0.354479421738106, 1.20698693134722, 0.718593153705428, 0.558457785136087, 0.78678090801627, -0.191863611899872, 0.75232723861601, 0.696634330475758, 0.644494841385836, 0.807657087328771, -0.0757343913704049, 0.397377391004685, 1.54321900308773, -0.290432825220088, 1.68746358143099, 1.04138605336793, 0.153736763934842, 0.322938852981825, 1.67678727219476, 0.834453952904083, 2.47435102174469, 1.21735705404012, 1.31255890054262, 0.637251345595608, 1.18355089692425, 2.4543858374925, 0.443714528064138, 0.743238314179069, 1.9903585924613, 1.01231523892636, 0.176443025342584, 1.41501018163712, 0.603682447842142, 0.190698470407241, 0.918465079779607, 0.468148681779517, -0.580965724684053, 1.2769380593859, -0.393120979147151, 1.42061559201334, 1.72275491501881, 0.691728950168391, 0.706541525607979, 1.97019863550877, -0.388273626521746, 2.05345656292299, 1.63337808950738, 0.682456878796008, -0.066614812863788, 0.283632165996807, -0.0418766287764183, 0.461566390957292, 0.934228894878605, 0.25846878745207, 1.18039768076819, 0.453083371139599, -0.903137600154971, -0.110018670632235, 1.04396890079584, 1.59884778767295, 2.28509000433415, -0.479357448983257, 2.09569697127825, 2.65275336716232, 0.837258199426856, 1.6205676254886, 0.619132006994642, 0.251857462749974, 0.804962203572, 0.966718801104505, 0.021056575796518, 0.248101811609879, -0.0550596609389411, -0.0640054588458855, 1.21022505832183, 1.55161010086859, 1.36187012361802, 0.246229570654655, 0.916377133281988, 0.798344854816886, -0.0748628001189632, -0.464364899882694, 1.87353203682012, 0.574382329079415, 1.06525705469258, 1.90993697900022, 1.35559472803263, 0.17953720754688, -0.206404816692355, 2.41570398312454, 0.464173608011925, 1.14230509053553, 0.335039143239848, 1.03594308977617, 0.722377956247345, 1.65838934067584, 0.198097767696342, -0.858851098680489, 0.464809560940482, 1.20545255870904, 0.454486537593497, 0.507672411843752, 1.96996272084038, -0.0984172517546044, 0.850376488154633, -0.62845360760277, 0.624792284166876, 0.833928829220767, 0.770061941282572, 0.201433149667003, -0.0177804485327817, -0.198569089369529, 1.66501380618946, 2.07238523839257, 0.414621817681244, 1.13762555748652, 0.317814384303304, 0.988939451407527, 0.574883698256066, 2.08219327565094, 0.0610603452867045, 1.72674109405224, 0.504417362022537, 0.453119542416999, 0.544544225121826, 1.26549843568095, 0.819766950074266, -0.431943031291436, 0.274090159779875, 0.318576065941822, 2.46199069246976, 0.308106054007801, 0.679431106205734, 1.128767746502, 2.07638256373321, 0.390696579382197, 0.13403447820919, 0.498709465246796, 0.564107481295106, 0.197224308798642, 0.45217559184761, 1.80399578713352, 0.644251627357157, 1.85413893570775, 0.509619921322822, -1.04965952471218, 2.03786503908221, 1.29013532019261, 0.247062348607821, 0.514726219669968, 0.925647886347117, 1.07672798360522, -0.187557291448885, 0.130595668515435, 0.369056352612602, 2.5044355321903, 0.981262353451882, 0.209090922975086, 0.766295954071107, 0.628672561612277, 1.59450238756548, 0.231610784071275, 1.11825956818574, 0.421500103162799, 0.59200048809966, 0.922021822343103, 0.481460698627945, 1.5949624929619, 2.21825472026781, 2.48297983886359, -0.844813600053736, -0.0972942623254328, -0.122148051355891, 1.63713702540672, 1.33357701757347, -0.21207415299303, 0.652540021369821, 0.690313004555632, -0.404097526404667, 1.57539904128755, 1.66851311252336, 1.57518209362537, 0.228055943539626, 0.113358804188588, 2.66854030558179, 0.851686803900211, 2.14578773000432, 0.0512379688191504, 0.810746463742735, 0.94780573356071, 0.638592822631729, 0.553288999302799, 1.20904276064709, 0.0787129750565735, 2.00064566466805, 1.37355823262872, 0.820557551469982, 1.4716946818406, -0.694517241408807, -0.0932888714889302, 1.13263685771656, 0.734579357536043, 1.78517353149122, 1.40779683084368, 0.758899150748515, 1.42345610470596, 2.50365214341127, 0.964854472727584, 1.35413468724895, 1.41781090589402, 1.05532710165678, 0.465096505432621, 1.72233364160669, 2.76259612101946, 1.05767152193219, 2.54633827426452, 0.701358948738807, 0.591191534560386, 1.29186118144022, 1.12051402649779, -0.781187852065789, 1.24679905644025, 1.01393198582936, 0.203636800001963, 2.07782014659493, 0.436766374103568, -0.218770701497527, 0.890126975605671, 1.12196028818941, 1.10306525929564, 0.516218083032658, 1.46635159223563, 0.329438178496483, 0.373819121188746, 2.6381088844175, -0.14828706557532, -0.244487736481294, 0.53082282607502, 1.03000258756571, 0.322070464873831, 1.81038707704771, 0.521494038385098, 1.38064840449862, 0.810961987896252, -0.014974378926627, -0.54675728690245, 0.348240042165126, 0.7237419506404, 0.948731817696404, 1.36765534672271, 2.25324541091666, 1.38297668108905, 1.29179262328547, 1.17695626116976, 1.13847795951159, 1.47628759179619, 0.590129436104505, 1.12213209015714, 1.49567016616307, -0.264831557020625, 1.02257321399362, 0.904243315392089, 1.67756906667353, 0.14152325435116, 0.723347542327027, 0.0799860469979794, 1.64610090224128, 0.098692882232859, -0.285813380813523, 0.780057532527072, 1.26257172441293, -0.0357205701889907, 1.66571843465557, 1.14494796839829, 0.927252097258505, 1.4467296670969, 2.3331054315751, 0.636200579150911, -0.0668862257169812, 1.61183087597846, -0.300346432493927, 1.10241658012881, -0.0132484379883845, 1.34851470747154, 1.41787977789991, -0.271127450217881, 1.1868763491102, 1.14100686277484, 0.336910863559253, 0.426108316278718, 1.22299964090365, 1.13744201455132, -1.58355681547173, 0.647340830337044, 0.442683503855262, 0.067765926158058, 1.81095126395926, 1.98583372506009, 1.39686402608791, 0.406951276122047, 2.45303254728655, 0.077682832316983, 0.976596211193672, 1.38571980342747, 1.29440447604433, 0.339601286411222, -0.349659928587526, 1.34195702816396, 0.351888557859602, 0.3708929824262, 0.459374991786266, 0.528220924959532, 1.28081147894976, 0.581777046547865, 0.38691385151563, -0.459191001091196, 0.475736204829857, 1.21924074779233, 0.971690819466648, 1.30594019279873, 0.393548991205512, 0.665218777282113, 0.450131137025755, 0.323348870067985, 0.315878635853137, -0.879487826870873, 0.364139270538216, 0.624319842666758, 0.962612603942058, 0.551252856449602, 0.169857125506674, 1.96623453645869, 0.107998469594702, 0.706906530491809, 0.7571342009968, 0.58126519383327, 0.3672718132355, 1.84102310806957, 1.77492960652901, 0.439300377604849, 0.193882036754448, 0.317307809274861, 0.961914870201155, 0.254613457701989, 1.64067061678499, 1.04507326259965, 2.03782016492023, 0.0754495526878309, 0.826424129857723, 2.53332013417233, 0.54062074750692, 0.358615447827104, 1.36154345383982, 1.92595090413736, 0.061589472850167, 1.53286613027934, 1.60949107698807, 1.11909926106417, -0.328488709200344, 1.59260627846739, 0.631986312692104, 1.92507487112921, -0.111339989101591, 1.81501025981704, 1.34252420181786, 0.374669906451859, 1.30742700890416, -0.286929545862319, 0.566902607794602, -0.337119164479857, 0.505776272683039, 0.271680171104474, -0.168046222383786, 1.5134998941889, 0.7152377426855, 1.88877085796308, -0.18565146872605, 0.968964953882576, 1.81272058525704, 0.182855693594821, 0.491042277938507, -0.199207266895663, -0.154342893643636, 0.890723728765914, 0.640273029966793, 0.444122535940313, 1.44112581607274, 0.259672470767083, 1.26437946854378, 1.01321705745627, 1.37142715930795, 0.0193876569180312, 1.38346644773985, 1.56117259041461], + "kernel": "epa", + "description": "Uniform(0,1), polynomial m(d) = d + d^2", + "c_bw": 0.150094630963947, + "bw_mp2": 0.649526306014496, + "bw_mp3": 0.771837802269375, + "b_mse_dpi": 0.352076488662106, + "h_mse_dpi": 0.20538267793198, + "bw_min": 0.0075638173148036, + "bw_max": 0.999597164569423, + "stage_d1": { + "V": 997.46594627272509, + "B1": -9.21048949332348, + "B2": 25.33098036427046, + "R": 0, + "bw": 0.649526306014496 + }, + "stage_d2": { + "V": 15987.605398220447, + "B1": 24.92239189537232, + "B2": -102.93072254115151, + "R": 0, + "bw": 0.771837802269375 + }, + "stage_b": { + "V": 60.37720777364014, + "B1": 7.55603418991171, + "B2": -14.95086991240427, + "R": 55.45074151853838, + "bw": 0.352076488662106 + }, + "stage_h": { + "V": 0.856631528521177, + "B1": 0.290414672008218, + "B2": -0.659014671210741, + "R": 0.208671048282756, + "bw": 0.20538267793198 + } + }, + "dgp2": { + "n": 2000, + "d": [0.361267473517689, 0.238220594247238, 0.504554625391331, 0.630264174798756, 0.663470855030386, 0.358030751917142, 0.455946667544574, 0.317725517999562, 0.818908573555378, 0.2745290788451, 0.608203800143882, 0.739042549158069, 0.537573035659345, 0.47936164861184, 0.603704689173178, 0.848695131221604, 0.424320478748285, 0.13165287791538, 0.370571210276341, 0.249988593335641, 0.616800232053338, 0.730435226795301, 0.193048104745397, 0.193609264719771, 0.504958241390047, 0.164906519281093, 0.478471290089948, 0.730758001151567, 0.670353387783638, 0.156199839154363, 0.459871515041254, 0.734367661688258, 0.860706151369214, 0.00944081714192487, 0.561042367092713, 0.570613553183413, 0.741008087803753, 0.379570949477906, 0.167928764217923, 0.748070338461307, 0.2176123461068, 0.143062742029894, 0.335360773244719, 0.725798995512674, 0.39105147083997, 0.431468801761068, 0.405273792702722, 0.385319122269916, 0.679613179237713, 0.764049047465398, 0.347177302992433, 0.682562963363268, 0.653264251538503, 0.356341467062222, 0.867382659711678, 0.504256755581673, 0.639842700507737, 0.310696773594775, 0.557277902640212, 0.263106560027121, 0.561236565728278, 0.147607910616101, 0.42569049191221, 0.344777318441761, 0.486955415051278, 0.623549191317632, 0.729394767119796, 0.107190013203822, 0.358053552129766, 0.710059885000423, 0.597982454414563, 0.537949598330299, 0.797304170773559, 0.0577116208459553, 0.374610171237043, 0.53196201059537, 0.0787922360490052, 0.482028240803567, 0.411399838708097, 0.849020698962371, 0.749255833900151, 0.719034223340004, 0.287965471560409, 0.735852990068251, 0.292134563115187, 0.290855175638698, 0.81490172235184, 0.824815424159289, 0.2386644973003, 0.434811787645074, 0.498962817254046, 0.787529677927835, 0.725907456993821, 0.748167188169315, 0.363948004663164, 0.118488513626291, 0.386406181310413, 0.415296913999118, 0.416113849329018, 0.656536610619175, 0.404288343111428, 0.628894256500088, 0.335589715887494, 0.0574307126223412, 0.236995247231181, 0.54461322547118, 0.137227876793429, 0.184027641713375, 0.606632596182136, 0.220995755108265, 0.566941326461769, 0.18771029548461, 0.905806140402764, 0.295058616392649, 0.604633717401063, 0.475736486390877, 0.414620564622635, 0.406644825365339, 0.49209694180182, 0.51085723035899, 0.314195088557946, 0.447041621110469, 0.313378060483727, 0.526787294571785, 0.938819076639277, 0.189090599299595, 0.530660036474977, 0.41093807161664, 0.0711320317249373, 0.819381169802725, 0.569935852753473, 0.138674552582772, 0.519522299139659, 0.472386344354175, 0.526757132781875, 0.538110462433794, 0.692708751413971, 0.353237179283689, 0.464833112603173, 0.751630011555304, 0.620828410280743, 0.569138954780366, 0.734153057205029, 0.263279039891724, 0.424951783080577, 0.73288659352415, 0.558917297228448, 0.619649981488589, 0.774186713780518, 0.836414072942112, 0.503735093886389, 0.8088958173839, 0.484211769805976, 0.800033211191807, 0.311997727013006, 0.541640677924093, 0.564820820331263, 0.911011410767653, 0.644983703099763, 0.770685794445079, 0.48393164304858, 0.573485232859843, 0.909146513028462, 0.320253809001159, 0.79916045961928, 0.884165095742132, 0.828306162415763, 0.499370300725637, 0.786291707691318, 0.390990807487546, 0.221144218791801, 0.0686570999201183, 0.408677047549359, 0.163368313215597, 0.302553782725007, 0.718058974274394, 0.110297200006243, 0.682977397716113, 0.48760591163106, 0.577028959659789, 0.669800211806964, 0.389888845588078, 0.137425806826927, 0.237490220876824, 0.574621383853318, 0.622836178933443, 0.137895894836132, 0.684531532541678, 0.416122431742075, 0.695494960410086, 0.378325965342441, 0.922348731979269, 0.261647882336813, 0.447964240287837, 0.949985477531597, 0.87104281805342, 0.114162044695396, 0.820403797275806, 0.463459222679437, 0.484642098836037, 0.324039793948972, 0.770413335989956, 0.586855319159853, 0.520105871307116, 0.316266988033394, 0.758205805145959, 0.38870465127841, 0.375775731724755, 0.618697451838261, 0.780020939033824, 0.474659919096084, 0.298001906605453, 0.202283601837895, 0.667036940656512, 0.12056483613737, 0.719185612780476, 0.728433873612816, 0.382628396186346, 0.554743867517529, 0.515628317086044, 0.589891103240143, 0.654773824064492, 0.531552963453641, 0.361623077898103, 0.0777617670874316, 0.806518276477315, 0.675005502525124, 0.600427571971894, 0.331503231446859, 0.57013027431017, 0.959892617718375, 0.394390807457698, 0.360437940745303, 0.894785217114642, 0.754401947070683, 0.742264714045768, 0.279339291425387, 0.619703623452922, 0.366085041029595, 0.321105473790928, 0.63763785481592, 0.952743652740147, 0.536956300672213, 0.550328889951216, 0.16935360956317, 0.42741890304264, 0.231251791055132, 0.199851535061625, 0.0624537499042909, 0.481776348086074, 0.17520044086164, 0.939721487874847, 0.629357396598991, 0.821935834589559, 0.331061417984605, 0.473182944496906, 0.689894014865177, 0.0487628137513167, 0.430112242137712, 0.963848389337914, 0.893493095871242, 0.348845861005322, 0.425134015166362, 0.781206980477994, 0.357304510496754, 0.912268943344115, 0.780035970592382, 0.229165987202778, 0.455941941286248, 0.459481382573144, 0.241864283239274, 0.530869652044193, 0.237681520425057, 0.637421472879186, 0.546751458455234, 0.751856619864881, 0.221441770210471, 0.612660981186295, 0.0618030006629608, 0.173579278667292, 0.74116181552131, 0.736706161392959, 0.82413186783037, 0.516288301301573, 0.64822125305049, 0.697714330764496, 0.263249668210211, 0.163988218842029, 0.831276344539084, 0.885549231553841, 0.887589020735278, 0.877040676240799, 0.435590284954852, 0.779309398668508, 0.775132429962168, 0.730656801898297, 0.78388801364009, 0.374339070028104, 0.300980259308649, 0.380466234288507, 0.261616566981472, 0.487435403092849, 0.134097430383576, 0.427813300826388, 0.586817038346838, 0.153627803350054, 0.350199997972932, 0.930882557205183, 0.138311517459321, 0.161376718871277, 0.408911174430451, 0.694465075175208, 0.730292037459772, 0.592082697442578, 0.514318922143516, 0.300735664876795, 0.167881530815118, 0.726921080082175, 0.312060238347821, 0.45328375310282, 0.607197089339177, 0.353744553617411, 0.839843269531139, 0.515168142434347, 0.146002103389538, 0.791787251615961, 0.37479907656681, 0.47905645299852, 0.368141591800669, 0.640582108133645, 0.389991810715979, 0.718108593402259, 0.716780507974289, 0.699461748983795, 0.352342250227825, 0.526141810314866, 0.550639097447673, 0.597419408972307, 0.459649111929651, 0.747245164012651, 0.593919934663673, 0.548807036133444, 0.775269097274031, 0.153817047491798, 0.207219822043161, 0.876698014048274, 0.623143813347663, 0.357285773696423, 0.369091641753831, 0.462837032322583, 0.354005088029065, 0.613086025014583, 0.570888146107238, 0.438993464976678, 0.466341722687935, 0.685103407526422, 0.297497607323225, 0.29853056097013, 0.414571056011281, 0.546045220744211, 0.18873715526352, 0.261523395767405, 0.782400646906845, 0.286090253286241, 0.675265006559649, 0.573651771192472, 0.755449774344421, 0.145845141878792, 0.388189205548935, 0.465312393488067, 0.212548631946903, 0.483401702906179, 0.767194586241601, 0.20374244880795, 0.447558329257969, 0.816036215580489, 0.524364109032547, 0.502769661391973, 0.640612514007663, 0.482160068485671, 0.573063504400869, 0.298915782521855, 0.648128534171823, 0.438509787220965, 0.724756789802552, 0.0507944187753469, 0.701849279033798, 0.786890089805342, 0.156890751098593, 0.749740248046482, 0.200146176906199, 0.474844144918538, 0.239054731434913, 0.51694504744118, 0.758901353853531, 0.787952975923852, 0.819199787724943, 0.567748349871253, 0.188790849209149, 0.205482924720323, 0.31415727249067, 0.101157448721941, 0.565284006568083, 0.615477587672417, 0.704779807033314, 0.320524367507545, 0.302290738261263, 0.536492237356328, 0.783515635832087, 0.468969875488274, 0.41761398445007, 0.215606340650172, 0.633156209542553, 0.556263085687732, 0.296470337345498, 0.271720048307349, 0.311357212998971, 0.943216233113151, 0.917267208085882, 0.735700836854584, 0.724185056082667, 0.545527027359099, 0.27222314504761, 0.578159762983875, 0.558597311152039, 0.688127051178826, 0.684008053539472, 0.846270041300683, 0.892475291617331, 0.311613751046674, 0.289415515998283, 0.571793186176287, 0.771443819638896, 0.534545931822667, 0.680859485037961, 0.211711972624034, 0.142986789069879, 0.483046470311118, 0.303765257471916, 0.58062733258445, 0.275186842338285, 0.217149648494654, 0.730480248102487, 0.335924295388343, 0.251858774812673, 0.499692499188674, 0.556767681873718, 0.372514349624802, 0.751460179075463, 0.219238572136291, 0.82405059739776, 0.331736374391333, 0.70855977534499, 0.437982844811699, 0.418849883131075, 0.67493096424746, 0.325992221520277, 0.563178373742345, 0.481490246411541, 0.549426006177342, 0.492362559085123, 0.293183654448765, 0.535861766712994, 0.441266303741041, 0.470715277119268, 0.58105097685486, 0.471931810803338, 0.209201893904069, 0.295353627016895, 0.4472148172412, 0.843875877596989, 0.136886587856597, 0.25588883173245, 0.518870544069374, 0.620370164569569, 0.45492960268111, 0.700009129286774, 0.71201669613423, 0.56239715015962, 0.246891797817853, 0.699959622949137, 0.605762798351694, 0.606097455533467, 0.789763329641915, 0.5215782238146, 0.355680852753018, 0.500512720543116, 0.592036737065862, 0.35185160836015, 0.290385043060616, 0.512707423514695, 0.310840823911262, 0.629553407537813, 0.588224190632401, 0.717091083905593, 0.452332083227732, 0.359810696362011, 0.644368222439108, 0.835895858743552, 0.402530475648166, 0.0946921711642869, 0.311065137334673, 0.420264270160466, 0.796607899950576, 0.80905518519358, 0.339930171287862, 0.589111736761016, 0.710001324088913, 0.425145787980148, 0.522144732657872, 0.697349819787379, 0.576292634479384, 0.405784915504723, 0.638691805323333, 0.630416651713603, 0.310828713740547, 0.336742252911308, 0.333807233949217, 0.421602683036893, 0.407031623584971, 0.521961512311993, 0.289859427737551, 0.411182286180139, 0.462334047683704, 0.547391690324943, 0.77799214318857, 0.858218039342702, 0.210778955776615, 0.315457348614545, 0.657369622417949, 0.839381162609346, 0.653318281643093, 0.812842791434997, 0.654905371757667, 0.499489948705204, 0.348521096056467, 0.240485605718822, 0.18242876512127, 0.745736919793218, 0.69441847096858, 0.0828680499040036, 0.628824634551113, 0.650110890208817, 0.653470308711726, 0.444887770639355, 0.391387544033596, 0.374595647584094, 0.725878342544454, 0.410738694774043, 0.44791495769024, 0.414039287032027, 0.445935834712033, 0.374224321776253, 0.557870286803619, 0.358468356708654, 0.368324492863611, 0.297680018224277, 0.224918866363253, 0.611195393242764, 0.841479670907436, 0.181481518523419, 0.815926045740764, 0.784824084420407, 0.719226937890615, 0.221778772065655, 0.195329598270685, 0.887434293394314, 0.55770949642608, 0.715404371421272, 0.620357650583071, 0.455751870127241, 0.185535947923378, 0.754626326102965, 0.0210664627224002, 0.67604904889517, 0.971493389316696, 0.0759270415362816, 0.488250254217146, 0.282505272742728, 0.34266872678871, 0.78246376402295, 0.563220736639494, 0.497043593955923, 0.143463385351541, 0.53413022057208, 0.265982578775912, 0.836125720916818, 0.577181168958609, 0.977039486158702, 0.623854616752971, 0.791259428766945, 0.150675740348499, 0.67366365329292, 0.705910504393763, 0.848727328670292, 0.566263148839828, 0.917913113520856, 0.277024362503032, 0.550009994191743, 0.17426767756534, 0.871400325515125, 0.136948615197964, 0.116168834636001, 0.212185328287605, 0.0129672648577454, 0.31027612225129, 0.268682404420146, 0.524390830711848, 0.741555245974752, 0.260131643971643, 0.488482643713432, 0.0686693852874064, 0.3211326494313, 0.316706311828841, 0.479573620416789, 0.714950285626581, 0.326585124985691, 0.631092307272719, 0.666319902783037, 0.125106971091537, 0.216101729686898, 0.391585872479695, 0.298221424950289, 0.909955970063905, 0.702262123888571, 0.434971521943397, 0.738634497109676, 0.182658049737954, 0.491614670340209, 0.333714635317102, 0.386797743043041, 0.888860076214896, 0.553261781345731, 0.593280785762993, 0.786542451072017, 0.652209603403912, 0.725953331025683, 0.543856005220992, 0.326538471274685, 0.4290764221733, 0.291954678783408, 0.567844991570806, 0.474247596117984, 0.433259101319958, 0.679104692112251, 0.18794082841054, 0.0880793030707649, 0.537962442866649, 0.640534948707606, 0.658149795988854, 0.673466563873399, 0.599195187200486, 0.120103943121414, 0.386119546913995, 0.708049391309741, 0.725224079993583, 0.319869160119647, 0.638765807011627, 0.862413179425622, 0.473884747816462, 0.859282384435259, 0.44853991774689, 0.501755068328435, 0.748960098897695, 0.864651274002139, 0.572832292872323, 0.379890026369494, 0.4422294830259, 0.582888388404395, 0.766351919208811, 0.72167161995346, 0.473569547124599, 0.310526453562178, 0.561849768126194, 0.580160283085067, 0.651077677823022, 0.63603955087567, 0.314911215083804, 0.391464037720985, 0.734147633124367, 0.343974307638966, 0.292146859252487, 0.605526037808263, 0.737970478388438, 0.729047757625372, 0.30966357345697, 0.291508305625363, 0.494430312532019, 0.554798350750912, 0.229719695668399, 0.664721050825644, 0.342543723633264, 0.382682178703012, 0.704065843323529, 0.392104904106907, 0.915118358612656, 0.880424743896439, 0.639714818225762, 0.415991481848697, 0.172914733777227, 0.466851283785278, 0.450060337955162, 0.411413618355846, 0.957951190795198, 0.76961106876993, 0.5095097266928, 0.110441563602171, 0.819662448963863, 0.641544223742911, 0.400847376708885, 0.736960604783099, 0.170450546115482, 0.157711157956283, 0.34269112235673, 0.259638026002671, 0.640407335738233, 0.157914118560652, 0.542486960975814, 0.427389709765864, 0.381513075229782, 0.553243750786808, 0.662789671296951, 0.604669916337244, 0.340435178523453, 0.375585188040352, 0.261954677017694, 0.828571638409212, 0.821418654670689, 0.478777599124797, 0.44774351079454, 0.309786589315509, 0.244066955848228, 0.727899166722897, 0.194351649515375, 0.198843869942576, 0.472724248568456, 0.540357460256628, 0.544510158411592, 0.611732833250873, 0.384191868973781, 0.389364500724753, 0.626109171849696, 0.252434584680236, 0.546523980964848, 0.540143423119332, 0.364800763665316, 0.899052771717935, 0.0469385270782239, 0.523285369166214, 0.467770393741789, 0.611481624850813, 0.023650340027434, 0.619503996328048, 0.173281218566367, 0.323637827253567, 0.129259956455276, 0.416336088894532, 0.529663907742828, 0.147104319997223, 0.562149478545475, 0.803086320851814, 0.396271003181504, 0.911318656438169, 0.528821864563542, 0.855548618322056, 0.564129359684021, 0.223177212025586, 0.601742288237348, 0.478533262655957, 0.42672799062368, 0.225264251918802, 0.393775546305223, 0.748009934985104, 0.829793934322655, 0.527543701857954, 0.703972380851338, 0.478089315610373, 0.453139538251668, 0.582044739581513, 0.319607305998765, 0.777371569119146, 0.275817493216206, 0.576121260707038, 0.321735910177603, 0.45077617231704, 0.277399291779884, 0.893449413121706, 0.860883942313873, 0.374811454219132, 0.532632503841141, 0.468478678391722, 0.176564008686676, 0.380831022199414, 0.705411088052679, 0.53386183675614, 0.250097472647455, 0.383932780888233, 0.293249259950801, 0.185850132271545, 0.424091380509735, 0.0756423429862765, 0.509114087880859, 0.713555227054582, 0.289187498758922, 0.763300393299234, 0.44460804571614, 0.384825804786388, 0.638804617766589, 0.482330624056527, 0.61929733260011, 0.774651196009981, 0.167465158870475, 0.317373229239122, 0.709584645470712, 0.762197627139472, 0.267400441293372, 0.661425611259166, 0.674232767927112, 0.85901793973616, 0.599959270607869, 0.23033924117036, 0.553802926224119, 0.632245754666313, 0.683813102429035, 0.309440293198199, 0.257442008735199, 0.430139939250557, 0.693732210361653, 0.871612718752347, 0.505628147537939, 0.162192001704594, 0.34730501483001, 0.478601295048723, 0.527418500864751, 0.996719508472803, 0.27396272811604, 0.625842837490582, 0.445962161254591, 0.574760116368816, 0.44900313261524, 0.273595070843444, 0.247808493933599, 0.277609057003407, 0.720245237669622, 0.87666397716481, 0.534563507232173, 0.491413365107201, 0.603940630426676, 0.273725044472701, 0.385202876594953, 0.712030826782179, 0.171618842125448, 0.18348503720674, 0.590017987346589, 0.753689835040918, 0.591611035774049, 0.520891415653549, 0.778149012326674, 0.336111767677675, 0.470286474663532, 0.529177452171311, 0.546839277289746, 0.530723312781127, 0.579744840925862, 0.447906666016294, 0.544802862237146, 0.302784137224055, 0.294740950391205, 0.456891572312396, 0.0947060983789287, 0.72807493040421, 0.81488240578895, 0.371034918423885, 0.101557228068265, 0.5326757996951, 0.802851983320169, 0.785441565284418, 0.340403238360808, 0.530280797446926, 0.678273661923333, 0.59725499899119, 0.530896753161403, 0.316448392297818, 0.162685130274937, 0.608541722291265, 0.72168093510524, 0.178117355576324, 0.226560656675884, 0.425054266239178, 0.72750406914056, 0.592903311063522, 0.408792759839381, 0.204465100130214, 0.134083392399045, 0.286728047792828, 0.284639563194922, 0.243880737460929, 0.779009489418335, 0.926995855812668, 0.444229419284677, 0.48329400399131, 0.180612690330271, 0.630510325205578, 0.108770498034832, 0.25441518145472, 0.601030112164677, 0.488840788622516, 0.720834815546508, 0.540687454886483, 0.592292775015217, 0.584241922765592, 0.309501971129981, 0.690808437190741, 0.69634843977065, 0.649302569561521, 0.416126452635215, 0.188119193924864, 0.0770939790942633, 0.545813866917145, 0.630657156158807, 0.56802936996558, 0.62653793996898, 0.443384815650037, 0.351323079235828, 0.363763959736914, 0.856360336693313, 0.188466413674965, 0.463689288416307, 0.91970270885483, 0.354205188980337, 0.421274396115671, 0.304018615839152, 0.667894481231511, 0.265006336402639, 0.282904949288913, 0.588888052792074, 0.429396428728045, 0.696707202004921, 0.41657957612376, 0.395455932536675, 0.565793142336218, 0.604846497328704, 0.725620725862873, 0.674467368114483, 0.456834944268518, 0.494114092941328, 0.505567032710459, 0.203831888140383, 0.462316425102541, 0.573989286079938, 0.270668551255118, 0.77112430839747, 0.61744746177555, 0.501839033179473, 0.410246379962741, 0.118645373918573, 0.231978782481522, 0.505647538870676, 0.240782462579687, 0.230914738346734, 0.501874454472123, 0.648072903649321, 0.311871438365247, 0.746302202143945, 0.489452519495089, 0.52188257536668, 0.799543043589667, 0.614865337601805, 0.762191565027126, 0.868170654209373, 0.150900122669069, 0.406440532870928, 0.585431635065353, 0.284267519151305, 0.469845390889059, 0.20943142104259, 0.596013127688248, 0.174540378948187, 0.779581663632502, 0.654588661402903, 0.85026659422881, 0.894682317044138, 0.133155144472931, 0.310568822808506, 0.877729664874855, 0.913338424336926, 0.782229087268756, 0.252990173773708, 0.400252594386291, 0.346206371635063, 0.502762184213457, 0.178239463017023, 0.700516727470545, 0.5603714911922, 0.192808396832127, 0.584763539537572, 0.819293624937873, 0.88531953246044, 0.624587904888485, 0.463693222029889, 0.701585996799178, 0.108792052196484, 0.689436297868109, 0.595686630245792, 0.274713271719191, 0.461889027198301, 0.648527860864616, 0.0595878038829901, 0.269561901646675, 0.738551114360653, 0.263664357115953, 0.292786655384558, 0.55344824127388, 0.871927587260923, 0.769547250716014, 0.576945113325514, 0.330727818755251, 0.158863441039416, 0.538596448685412, 0.174601344337172, 0.258607424080627, 0.546585334001549, 0.593850036594555, 0.311683260977209, 0.576492197773575, 0.527930606598328, 0.514250704322171, 0.352521624986487, 0.13787507137307, 0.620506674221805, 0.412267578878861, 0.560654163962745, 0.375004253737561, 0.588022731709601, 0.359335219664935, 0.614553690423263, 0.701882928330897, 0.635541805645407, 0.859125573282702, 0.423834410088333, 0.437787449242725, 0.290960888729047, 0.750151477243431, 0.0416021138967484, 0.259522008174877, 0.407446982959771, 0.757365343443976, 0.396453574563276, 0.371338597124029, 0.292827596723433, 0.731510110883042, 0.185703999439625, 0.862267734358948, 0.46736200374553, 0.299496444299844, 0.35816181241444, 0.727614033312294, 0.293647092309995, 0.683291009440059, 0.215791097702712, 0.614999562409115, 0.305440537192573, 0.629002794646627, 0.495048349806027, 0.361715686061657, 0.270644057932402, 0.609230974115542, 0.210346375097371, 0.166220535632373, 0.479019514559241, 0.618621968820841, 0.262891773372463, 0.563624370886336, 0.434027338413583, 0.532366666319618, 0.780027504307777, 0.845679201445456, 0.760484871935526, 0.322752517523392, 0.423706885547789, 0.320950239797791, 0.502268671105625, 0.449201776097723, 0.625429931316086, 0.518763209888766, 0.566716754189239, 0.418282932928185, 0.668930062734424, 0.820337680135638, 0.507351991904016, 0.299597005243119, 0.397466890298314, 0.246770208985768, 0.842519328496314, 0.79953166587541, 0.528956141242885, 0.338024068123058, 0.742599081313548, 0.0552649867429978, 0.533493104102222, 0.563787059951636, 0.60909451025743, 0.643224594980319, 0.506801399103911, 0.136314232074786, 0.22067493275269, 0.0344593107470157, 0.244474948322149, 0.558290063551746, 0.450077547863446, 0.835518966594943, 0.937228441805043, 0.835648954470551, 0.21803458598068, 0.748858469383496, 0.844859648218284, 0.168449041040415, 0.430072469679662, 0.123077677487271, 0.714700148395632, 0.591624224616352, 0.200874734597264, 0.901846886692609, 0.302202472071713, 0.603638799820016, 0.460251277301147, 0.709499153115505, 0.66039157813128, 0.162911278778444, 0.0903168451810954, 0.629106871454359, 0.485059234984299, 0.353905477745503, 0.595663730379244, 0.30263211030537, 0.0838654401026516, 0.479042560167811, 0.136713882697192, 0.243070430201443, 0.532019482941527, 0.796334009517304, 0.636834912512999, 0.685856143336632, 0.417575132680562, 0.978976940021349, 0.263587292430462, 0.518416579692266, 0.34154197038199, 0.0410378945496632, 0.448415833046497, 0.686384281047359, 0.30737571991227, 0.672802657196511, 0.762655786786166, 0.149974637063501, 0.195957220751757, 0.57639369345939, 0.37695971074962, 0.708942704566271, 0.964270124570001, 0.969610281444329, 0.232202711523609, 0.422559840274056, 0.0994738222579921, 0.556393743197384, 0.261228092630958, 0.0677597083808645, 0.302638348362072, 0.778368283490752, 0.305030364904606, 0.23009380874219, 0.305801787880418, 0.19844293180799, 0.398417879877809, 0.505515600158945, 0.533213324651035, 0.683052528714448, 0.488882297192944, 0.326528831434465, 0.150453901006675, 0.187421598510693, 0.824745477745331, 0.286190428338314, 0.133493746849463, 0.130374458598495, 0.642919618947702, 0.662271964079912, 0.430771015027973, 0.895442500338865, 0.699334843018277, 0.321737676252256, 0.590774822735692, 0.671722440758891, 0.678804250968918, 0.35134947158497, 0.514843089178187, 0.540569741945269, 0.390392106360246, 0.56945138902856, 0.261690056568155, 0.418840295907415, 0.255708535500566, 0.662015172996696, 0.209313771141279, 0.88484250101175, 0.282249370166632, 0.24880969485618, 0.661556445736607, 0.452010966538503, 0.68569227521795, 0.385536048269066, 0.481840173555181, 0.897831981738017, 0.68237241976351, 0.378094747103409, 0.869590529748352, 0.623353660926752, 0.535177500576954, 0.446225149502366, 0.61300448142839, 0.022788386851259, 0.821431002418849, 0.764136391472335, 0.565614268790783, 0.272663670144718, 0.462789810132257, 0.565871656630075, 0.663615357879006, 0.667949764241281, 0.674830809650969, 0.456189824689096, 0.563969081281806, 0.576500866516516, 0.521125919273123, 0.418203697605989, 0.431098728163475, 0.286206702354805, 0.635015728500201, 0.0273785089177136, 0.446461710214243, 0.628640225613943, 0.175153857621145, 0.112733806329804, 0.0994548603094694, 0.236434589350698, 0.823956734297778, 0.744741911277875, 0.124426899831528, 0.865394738261418, 0.598074818466434, 0.796962727313124, 0.569376100178589, 0.832346684781596, 0.506484155138848, 0.277582130582829, 0.0547106619566946, 0.63511862996249, 0.605152995491238, 0.462843581600064, 0.749309594260992, 0.0647398328827382, 0.227243501261042, 0.276353899778944, 0.146717863815836, 0.822401744111238, 0.320573925183099, 0.350625872855421, 0.815085461247761, 0.694497154262841, 0.409478810497832, 0.208303600424077, 0.437273337463232, 0.558842087359094, 0.382007643006208, 0.319504985715842, 0.391516805652699, 0.159730477299477, 0.176419661983625, 0.961991528416179, 0.754756590268895, 0.490468217570359, 0.831623498778156, 0.494309874002748, 0.329409042321207, 0.675203932161236, 0.54321729275025, 0.190592087543238, 0.640739009749879, 0.633646517662467, 0.585206689966006, 0.308448436980507, 0.678095845783142, 0.298922366883785, 0.42888565933616, 0.438539998793615, 0.382540436749978, 0.543412591413139, 0.749455793794544, 0.927655706030953, 0.191666124103981, 0.863791681090617, 0.525972304631199, 0.180722195915951, 0.808258233501015, 0.421525901404868, 0.635337274020286, 0.445328526499186, 0.6217388402937, 0.780142400252062, 0.765560406266657, 0.652533997262196, 0.294456347752215, 0.672141731881257, 0.46948263675774, 0.662900559838175, 0.780171473296227, 0.438500967954175, 0.381211557380066, 0.778071129066738, 0.419129603020455, 0.0912722776645549, 0.201464775295136, 0.239337758880173, 0.391409543548829, 0.533172635226305, 0.467156154814984, 0.326307921546954, 0.00823575701618911, 0.505889847347559, 0.439430752489067, 0.716161111337425, 0.914747062477792, 0.0819028579592176, 0.65832198449709, 0.405256178346955, 0.188868635040921, 0.784007769099713, 0.621708979942783, 0.551448699871092, 0.102271687220664, 0.844485393742555, 0.871159166831912, 0.627376220857478, 0.610531412309708, 0.121428205198679, 0.419873696783603, 0.563749588245364, 0.285227705203524, 0.65244073805443, 0.424476653534636, 0.121209896208228, 0.818864758844204, 0.753665850215112, 0.36346416590408, 0.770416293794356, 0.632376334006223, 0.439252692225739, 0.0742346395073736, 0.488527879002207, 0.570242564719243, 0.329129021770479, 0.43983498903951, 0.638178648108228, 0.340551501148794, 0.202321935162851, 0.514971424802467, 0.687560074339677, 0.77811215695982, 0.508333909632471, 0.428978411504539, 0.282852770017702, 0.154620173327372, 0.575299445451533, 0.668794834257748, 0.741571380932261, 0.571917355093646, 0.505482435632829, 0.620863672100717, 0.57581515247628, 0.801586541905521, 0.733953199116526, 0.262107873158838, 0.485766214238788, 0.701789651418529, 0.867592735315424, 0.110340159056984, 0.392228391368233, 0.196330500093089, 0.11674125029708, 0.364151571642797, 0.326135924729286, 0.888466912180183, 0.435350372018569, 0.635585403894901, 0.273474352109977, 0.297508189956063, 0.513306559338474, 0.347790470405347, 0.402300834943214, 0.252597304247166, 0.721327092805159, 0.580886137180339, 0.278069053859838, 0.0508654548602877, 0.254004510666712, 0.541651960328818, 0.287084933247296, 0.759651146327261, 0.556381849733418, 0.57832097610418, 0.688718618065114, 0.410896375800598, 0.476954630947286, 0.433483898954489, 0.807383183599258, 0.251194795871188, 0.46451567414914, 0.27164666895075, 0.466172707012784, 0.797958579428185, 0.583015171512249, 0.226602922162781, 0.691261041451057, 0.740063271118521, 0.805843870621346, 0.625369298184368, 0.904086896332733, 0.893506106005085, 0.108531163325432, 0.38389546259103, 0.830733220287778, 0.417367247558713, 0.352338674615058, 0.311134216755175, 0.582422143147124, 0.676332412123957, 0.513350929345961, 0.770312893083469, 0.394923572146136, 0.7125694888951, 0.605429620532008, 0.498318615769754, 0.508112926450846, 0.186464713016319, 0.673935084181651, 0.301991747555908, 0.39120231887324, 0.243751366359354, 0.582948757882445, 0.324826984801042, 0.786092814497314, 0.837492492061223, 0.751987091546326, 0.372598569061423, 0.292364706946333, 0.176544689151582, 0.714179113837868, 0.454004474493034, 0.959223724696703, 0.420900039372741, 0.680722761479124, 0.51552031063319, 0.31365132056319, 0.699679752014305, 0.23876739354738, 0.84166711687664, 0.695372731375258, 0.149673724539411, 0.457134501282384, 0.555808401290512, 0.641201340818325, 0.30592177470714, 0.157035358126668, 0.864787049357768, 0.184647404793861, 0.674598497833115, 0.287214970141882, 0.207825681706745, 0.388053755627764, 0.397706559505343, 0.727845307934872, 0.383293147991404, 0.186533605293567, 0.199459757298473, 0.176086709172772, 0.646829900068053, 0.475474059473334, 0.613875512107345, 0.283269103396624, 0.443242026012282, 0.80410339749053, 0.733908581418512, 0.109041930794741, 0.721399508241908, 0.492934919515064, 0.410341714014263, 0.467149989292844, 0.452342473870113, 0.803945898133233, 0.163019326237155, 0.55531314381396, 0.775983581732046, 0.335602437493371, 0.0634166475542171, 0.625010276153909, 0.702901569453474, 0.719767383986648, 0.551051177290607, 0.728829506576815, 0.62522771245609, 0.47234297790546, 0.528007681225734, 0.537850976468626, 0.770502335988643, 0.577874116871023, 0.423453423052473, 0.379386722315887, 0.545812977515272, 0.175794151467443, 0.063636821757808, 0.723591109385843, 0.363895850859716, 0.468859181818879, 0.310514698688716, 0.810334988157935, 0.167119255152111, 0.606232571034948, 0.563328798173485, 0.497729414630683, 0.437125377034596, 0.449590896744658, 0.596115943931017, 0.23939706629824, 0.265037627230077, 0.924820097492753, 0.465370128795518, 0.369360475169093, 0.668856221481426, 0.317919737474363, 0.613012566017625, 0.635881482862339, 0.302852229998708, 0.0274432048507546, 0.469670999524134, 0.444552031254512, 0.0982264206830554, 0.808994438647398, 0.605441643264652, 0.582115610778019, 0.863185351521177, 0.205637925400629, 0.539191332925679, 0.501535287252632, 0.609450738615871, 0.766601692036653, 0.289428931762289, 0.851115724554508, 0.919180526531544, 0.787455917710499, 0.820035479089825, 0.546973884053841, 0.643191492192648, 0.331664665866235, 0.892250262406502, 0.33659607387949, 0.403351361837823, 0.855213428612529, 0.530216118486727, 0.36121283753099, 0.496830662059547, 0.837053722678844, 0.175052907734133, 0.948969920740055, 0.58987315824526, 0.137547037012116, 0.828413571490138, 0.49224501874534, 0.367255021775104, 0.297220327736045, 0.635174004416463, 0.733073703964943, 0.544946502303656, 0.295858389522207, 0.740294044228949, 0.918599287414009, 0.497242422281089, 0.0543367807274232, 0.662084951478272, 0.325236860534604, 0.830093569822316, 0.73269574865081, 0.218294567230063, 0.339542765876642, 0.507882743953105, 0.895744004442812, 0.723746772006011, 0.0913461266268352, 0.264732850454607, 0.127912477039178, 0.328730291673593, 0.705601370242899, 0.233720727272818, 0.667701591656051, 0.797321623427881, 0.5078006239997, 0.526146323630336, 0.686428134926938, 0.535037264749869, 0.436192178611313, 0.695326203793952, 0.456175348140242, 0.52436951121602, 0.715633219926264, 0.902700016867058, 0.550137630101494, 0.00161636745805875, 0.4047707394649, 0.145292237165758, 0.648390837352178, 0.592507581882624, 0.520825199080146, 0.513312592752224, 0.383025659011265, 0.456532117913621, 0.728477142444256, 0.419501427462641, 0.525127671274072, 0.84788766848362, 0.340411117870949, 0.357762132980898, 0.591228710189488, 0.593958952559181, 0.681071749270836, 0.844585293477362, 0.788308568101594, 0.431724144893149, 0.304589067663325, 0.539749390062015, 0.433225124999038, 0.32025737816724, 0.922383602084959, 0.418524367450853, 0.427449046215723, 0.553290237540675, 0.173408210984827, 0.492230956583903, 0.875744647684589, 0.501283678605096, 0.185923012382625, 0.366589844966643, 0.918552314902927, 0.383373025828476, 0.372766950233243, 0.329254570980206, 0.287639352222727, 0.655079212683627, 0.795437534010102, 0.612013020396835, 0.739971417212464, 0.719641830336421, 0.251668593486259, 0.694663591626702, 0.736338647433177, 0.312762146164525, 0.286122902380687, 0.661817747072227, 0.793253231731591, 0.567644785105224, 0.604143274477713, 0.317162150287681, 0.343581082553886, 0.293123870521075, 0.583885171945494, 0.707832659924055, 0.124422426042274, 0.478318130265402, 0.655968795145779, 0.470345014294792, 0.845374378072548, 0.81548234000575, 0.270139805443133, 0.350161589536477, 0.603277215223134, 0.869250397877779, 0.407729649210691, 0.92166722809246, 0.501221160606987, 0.42894025184424, 0.765558449385819, 0.564671464646684, 0.387172396356894, 0.509081771787768, 0.460054632959477, 0.695302271457175, 0.755736462748893, 0.043787479276068, 0.689094389197453, 0.307600966985553, 0.303158678366967, 0.363431005334047, 0.0437682319312159, 0.623510561637434, 0.886695412319128, 0.272983163474056, 0.946659664177407, 0.30111881309775, 0.920754708590358, 0.362983470230396, 0.370356843008965, 0.951398754593113, 0.650142032052073, 0.756250470823183, 0.298132498353356, 0.64545195873558, 0.387038462317235, 0.120345218395654, 0.654578617499134, 0.455794061075349, 0.460800546813356, 0.606270642415979, 0.451030511220142, 0.178398906628176, 0.327364754267601, 0.36192039920181, 0.460380882073733, 0.497859005541776, 0.631686041139058, 0.501135738183861, 0.69659787903848, 0.185509006860567, 0.816908008555391, 0.198390930778357, 0.691995493353952, 0.627360222790178, 0.845956278340018, 0.524161176042537, 0.869271015319728, 0.614925780124239, 0.407549321840874, 0.865084001788569, 0.953682672722826, 0.404971874795212, 0.145928129473291, 0.219952444304014, 0.556699181397157, 0.754428567485505, 0.230127583101075, 0.844762693285666, 0.838285342319094, 0.461826439625502, 0.545876049895358, 0.190046869826534, 0.51381846449614, 0.416306641157183, 0.550513046232618, 0.472935470415376, 0.515677294762864, 0.69913105350911, 0.441486998751587, 0.750744380876648, 0.430783676824544, 0.467946728061439, 0.201346496026446, 0.798691177132965, 0.777651202580135, 0.571865887744692, 0.247172628822816, 0.598130285062199, 0.511049864746358, 0.250303454642337, 0.17842044800459, 0.768202109428421, 0.0746007677771071, 0.396950093588054, 0.623768099908635, 0.61555719757799, 0.374937670863661, 0.4314862520942, 0.730577293156467, 0.521111979043245, 0.852548177270117, 0.425540684782696, 0.484545086128719, 0.340263201397928, 0.144160314349635, 0.68352964448007, 0.19510348138383, 0.367332221919586, 0.371581744296341, 0.537464599947576, 0.673367423371631, 0.561799887359015, 0.828666566750011, 0.197696051007592, 0.540960627840515, 0.635587690196517, 0.465696206398922, 0.214701748633659, 0.95271700112553, 0.262097800783016, 0.463578136274536, 0.605937011720347, 0.577447315885756, 0.0884273767680851, 0.652571031889073, 0.52483467266507, 0.214118808812759, 0.688599490854411, 0.329021988690167, 0.214901037746819, 0.217664370486002, 0.180791747423143, 0.268152803317259, 0.821705901124746, 0.644943706928534, 0.289053460588744, 0.779675658393884, 0.889157338733121, 0.183700153129336, 0.492172841865947, 0.404251952915113, 0.54131085968894, 0.562600372150788, 0.545533096809528, 0.675492620359178, 0.954531514306251, 0.618504481081158, 0.640066505957754, 0.260505279391069, 0.29916019492636, 0.0801062639356588, 0.789525913083835, 0.82875478880795, 0.67809643089036, 0.58747985507514, 0.538029817189549, 0.578491529680045, 0.661572756134994, 0.70895606891329, 0.793481775395047, 0.33291983671973, 0.862346055737252, 0.850673034783103, 0.954293113365225, 0.353057304201706, 0.242729107521629, 0.602607426249939, 0.586618310931789, 0.718009410342062, 0.563839124865677, 0.182314643579491, 0.758630360515284, 0.214956217224236, 0.552058069727736, 0.967362622975143, 0.655515076441264, 0.684141744169777, 0.702648233748016, 0.600921545511428, 0.717230735362897, 0.606311121370764, 0.802637579068216, 0.791326127262355, 0.293610914172104, 0.160897101748079, 0.2902160082692, 0.684124320876034, 0.630818087990109, 0.83720310213413, 0.604433761989869, 0.769040535786718, 0.271819752010857, 0.413560404581289, 0.721810084204728, 0.470732458772839, 0.796319811163139, 0.255163431133112, 0.484810266224626, 0.312297243957332, 0.683221866453526, 0.570958431849097, 0.550362368337741, 0.577810135647098, 0.857088752641185, 0.795446495919965, 0.730598742909559, 0.786595894282237, 0.568308469998209, 0.755411065650512, 0.158009243336635, 0.841691950719839, 0.802740706526927, 0.424776016421771, 0.752279775070582, 0.0988680627386613, 0.498841513264187, 0.71399667700942, 0.116081135377426, 0.388997227284253, 0.446446166643545, 0.602267345027114, 0.482806591806755, 0.807822596424996, 0.626271482369258, 0.191843441206745, 0.247921465003531, 0.716669751063689, 0.0297729761064188, 0.769729475490663, 0.587583365173686, 0.32221560338637, 0.638150102642252, 0.280314204720631, 0.6973297380747, 0.440420327554974, 0.172628748877, 0.435018724773599, 0.550064865567159, 0.269095852974913, 0.578498547294844, 0.83515902907505, 0.468808340820728, 0.473459048868766, 0.744000492369256, 0.147057623364434, 0.586037947959452, 0.711572974541502, 0.421944869762193, 0.503959214793522, 0.266387909258601, 0.601539486268807, 0.826030973988363, 0.772256639772648, 0.611795521683242, 0.814445076970563, 0.806379288413104, 0.27715461092958, 0.272370732275681, 0.826894977777753, 0.139340469238061, 0.843153936515749, 0.285728804290482, 0.0534595037102289, 0.520199433146644, 0.654072945918692, 0.841403270388048, 0.744787915240629, 0.371512069971349, 0.344568988478394, 0.327658886853187, 0.442161570151219, 0.0464598952968804, 0.683483033188601, 0.699074120216162, 0.775992794781406, 0.808476481802869, 0.126646694940755, 0.59527311823005, 0.155170840806459, 0.816944026308076, 0.536794230780434, 0.134151446406075, 0.341378220054302, 0.654726617266893, 0.754362083975797, 0.605584357465736, 0.687002309626554, 0.741092100981587, 0.224143803604108, 0.309402669224253, 0.557219010976808, 0.556106194453056, 0.198120444210832, 0.420804928218418, 0.485809471265616, 0.133008302305661, 0.574218943223953, 0.585698936655439, 0.592103780921933, 0.384272151145448, 0.364841993273538, 0.519523821544899, 0.826092967189445, 0.203209524386637, 0.845240217517666, 0.946843842979685, 0.599673292448414, 0.746632135605183, 0.554258322973509, 0.596412695677599, 0.423592746072881, 0.35801821738347, 0.676377521130645, 0.535331654704614, 0.564617484352459, 0.698550982379463, 0.432815816479126, 0.25388355186527, 0.545377830611884, 0.481866470604369], + "y": [0.791297028233724, 0.244038754658984, 0.191207155744449, 0.953217832060031, 1.51239111628407, 0.290190379467557, 0.0952098972150821, 0.114982117427457, 1.40703991609286, -0.196771255195225, 0.657953622786658, 1.78228796985736, 1.15670389180964, 0.0524649128196575, 1.37003208357507, 2.02395269144764, 1.09269898414561, 0.128930202868333, 0.373422570820595, -0.00730785845788667, 1.38573568788425, 1.57289596102533, 0.643603501000861, -0.241772804230951, 0.65107995775969, 0.31408948850155, 0.531917745390833, 1.64752040523134, 0.44709290629722, 0.489896217537927, 0.469339300378538, 1.02659568795552, 2.12423975319144, 0.103903996466176, 0.826570146304147, 0.0223728151928896, 1.69780132488544, 0.469083038845534, 0.739357991022146, 1.6185055412705, 0.248175834053516, -0.235238098543223, 0.293536706432281, 1.34166042678947, 1.04015760103354, 0.602144120723429, -0.154504035652957, -0.421948877797563, 1.4560571350915, 1.32280119367893, -0.283310445839577, 0.877223089985412, 1.36782380241347, 0.187207530812248, 1.08889207402624, 0.860630714902873, 1.09675036302558, 0.588364231632506, 1.24386199819285, 0.0620255418084317, 0.334549030489121, 0.353785774379338, 1.20376775940253, 1.11071444654741, 1.34366527483829, 1.11103927810199, 0.932022209485726, 0.299238242588181, 0.834831141451234, 0.822963511222002, 1.1224504429016, 0.126223927549583, 0.790481952301793, 0.388913031385269, 0.44278096812561, 0.893178420526728, -0.640074704285474, 1.52122534920109, 0.888113358174194, 2.08706243008783, 1.30056942507911, 1.43296916698036, 1.20852294031456, 1.85260685868376, 0.807607098334395, 0.493239950691249, 1.84875558845511, 1.24273309092939, 0.2127533260971, 1.13937662277475, 1.58685000295562, 0.94634108153251, 0.391476924108432, 1.625063762875, -0.136913055829422, -0.0488587046901687, 0.501276569038638, 1.08505549534246, 0.457637842576276, 1.17549393991926, 1.59732110315716, 1.11877238530036, 0.99339619758396, -0.358366808886499, 0.197966534484578, 1.6917908252154, -0.888292149152438, 0.290255992562096, 0.543724989923355, -0.0723421508704424, 1.46199238606542, 0.174995488177679, 2.31436113061437, -0.350629139756807, 0.622453201620728, 1.01350408400479, 0.0620248679852792, 1.15508918003962, 0.894776468681959, 0.583956390490402, 0.257668508436819, 0.595454366938168, 0.893163718115526, 0.940335119773311, 1.87226058350996, 0.465885787125782, 0.949214013729299, 0.745261040787701, 0.444438653865092, 1.84232771594669, 1.31088216706096, -0.476865063800924, 0.593283942101453, 0.18217134464169, 0.340569333003223, 1.33820190251497, 1.22921748998835, 0.790911336061064, 1.53684994266979, 0.582735943363778, 0.608135230646974, 0.331966902494153, 0.992531074188799, 1.49019966750727, 1.57531804158269, 1.63157049382969, 1.4325353063134, 1.12298824954881, -0.125346389382627, 1.37986145589067, 1.97951307319487, 1.00315358986596, 0.93755456271489, 2.24887770197252, 1.15570132593064, 0.705923702818988, 1.10851156332856, 0.962178200154401, 0.817597579844924, 0.310070369323891, 1.97644744519735, 1.04137367292579, 1.48179011621172, 0.282304961010145, 1.8393778272592, 2.12115773309157, 1.90225598153543, 0.279643122323187, 1.6579277437154, 0.861895478367095, 0.361302387255537, 0.486835127987435, -0.023220455241646, 0.31990589477102, 0.507520003102592, 1.45965357287043, -0.039176103271927, 2.41512393576305, 1.94877553834785, 1.08402770654048, 0.780286520590645, 0.152661377246495, 0.252271300989239, 0.472105086555707, 0.745183304635289, 0.514689332849806, 0.159682737256713, 0.953195383938519, 0.510190722492571, 1.28725607436904, 0.765451642270869, 1.28358312984263, 1.09307307480425, 0.512262954741341, 1.78165591081172, 1.47877369524326, 0.429535078488387, 1.42993308815778, 0.174101276726465, 0.817961631796423, 0.169068150446719, 1.17984753556018, 1.3225020317573, 0.948232481329499, -0.424040746611137, 0.742121233323647, 0.68560501378334, 0.270440699987151, 1.57734914990409, 1.21940386318218, 0.429436830532172, 1.09107733069384, 0.511991475585398, 0.920446365122896, -0.0431986748268853, 1.27243314232437, 2.58218029548055, 0.30047513713594, 1.27855018011917, 0.406979826250082, 0.998300597893326, 0.829590777007102, 0.712017092846134, 0.641640507308215, 0.708882492266182, 1.3522029500203, 1.36728681116383, 1.85856117703858, 0.473746029843868, 0.630359301265352, 2.37777234562256, 0.296979647350218, -0.00608204454958378, 1.62606567717275, 1.34777662585891, 1.91438760328592, 0.600152179306851, 0.50164386361534, 0.31831181419825, 0.960078304786095, 1.10800082328235, 1.3063902720862, 0.776564890451913, 0.882315240972164, 0.237388507304825, -0.101136035280312, 0.0500838425340572, 1.01570479778053, 0.167901484860767, 0.847008212133696, -0.10596632262295, 1.08803380981425, 0.806512657635982, 0.512442707123418, 0.749785888000831, 1.00200705404568, 1.31252367864903, 0.673148025757323, 0.356297819686573, 2.31346666831533, 2.38495845491012, 0.975324213446124, 0.186207564815044, 1.55239150235827, 0.0222752325483699, 1.36229749331142, 1.48314311419418, 0.381450753863309, -0.0589650709015792, 0.706369063535868, 0.906239728942597, 0.842933953973915, 0.429354262220364, 0.545349471102039, 1.40314514953705, 1.16449076223955, 0.296516873758216, 1.19746741890613, 0.956289895569673, -0.403580817483023, 0.766823865061225, -0.225898532440469, 1.68808978153905, 0.643146541801658, 0.417896509992243, 1.07299163419089, 0.0655183493975011, 0.298536870520329, 1.635516900878, 2.29867819347176, 1.55718205948539, 1.87161235770325, 0.643646176583174, 1.27238954176003, 1.43019677317153, 0.595021742296154, 1.92615162777505, 0.107846390817471, 0.339217663559493, 0.517153571768182, 0.876460476265911, 1.91191855583873, -0.145678616198609, 0.374343628140226, 0.38816235340819, 0.446614322268121, 0.329031675431041, 2.28732426156622, 1.05398841371789, 0.343419247764797, -0.019448062813783, 0.962417140497042, 0.398410461453066, 0.784081848535168, 0.793507117258507, 0.808897804988544, 0.181867417323391, 1.29212903221659, 0.509158242610235, 0.847092661111495, 1.6549023999255, 1.07338505515403, 2.03069329077714, 0.916394955983392, 0.308174278795222, 1.05987826837732, 0.277898349508572, 1.63050623194377, 0.650571441899128, 1.50302734191503, 1.58888845320499, 1.38706047182801, 1.22740318010786, 1.04202751249383, 0.757632523210917, 0.98589341955547, 0.235305769313338, 1.41297154299193, 0.556890032880417, 1.21381595753242, 0.622073328946544, 1.50173477698057, 1.39995821445458, 0.140952826461493, 0.700799351196101, 1.35240215548327, 1.77408430980513, 0.205924576888635, 0.44734634737878, 0.372826118689844, 0.853770294735437, 0.772681744614136, 0.7750640497786, -0.175698031047121, 0.0727063272583561, 1.46906175674735, 0.198422401019655, 0.249620849011459, 1.16253075769459, 0.340528723183565, -0.371374072913116, 0.056089248449493, 1.20409652995878, -0.0668201093002223, 1.52994047366705, 0.535468395900621, 1.09165305432009, 0.666470503960723, -0.0204600477280557, 0.686939391894562, -0.152032405093478, 0.61094589765231, 2.08311175507435, 0.253128224360626, 1.41439614156499, 1.99287217132811, 0.748248761185191, 0.533700461612434, 1.37490038434088, 0.334617075779728, 0.597123934740919, 0.753496724404756, 0.728103650847692, -0.057006396895928, 0.937869820620322, 0.63216182045884, 0.827828757477553, 1.90422029890669, 0.132214180734665, 1.22068324966264, 0.0987307833353603, 1.26968896979515, 0.0483667378019627, 1.42862795922892, 0.842692088147317, 1.37406600785826, 0.497456174632406, 1.49616475309491, -0.4692721690593, 1.09000101302053, 0.505918728387039, -0.133199789835019, 0.875157787228445, 1.42648499849565, 1.8063160045981, 0.993461768100565, -0.037968265357365, 0.888956500254624, 1.23400538291511, 0.807023875777159, 0.0743485699836119, 0.0404734893540113, 0.486958612513399, 0.834291423586689, 1.45959621986391, 0.0538666425069316, 0.125001215791829, 1.81165661461312, 1.40721104581659, 0.720528724001228, 1.23381097998599, 1.77866474173397, 0.0291285044192293, 0.0146054691599993, 0.360250079036537, 1.47267589480874, 0.495950402052205, 0.495475592383958, 2.11608416211871, 0.654390180033554, 0.421203135017004, 1.25934243467057, 0.341669126573374, 0.892625072868926, 0.330351366127076, -0.271137903391324, 0.554403466434641, 0.501234771054578, -0.247315749387071, 0.84859768720575, 0.0450879129213573, 0.0114786121172254, 1.60252163965547, 0.873882489036226, -0.129873608304682, 0.790251099774707, -0.163681436188385, -0.367663493078073, 2.04675546041473, 0.050759377368323, 1.22229274293846, 0.884601253776432, 0.664433954659874, 0.471636177805185, 0.509939583242485, 0.413021844576463, 0.813263132467962, -0.0316332273365207, 0.301949325416263, 0.624574414482903, 0.800992227565012, 0.414498035935236, 0.0440657928675999, 1.01390319496451, 0.330078815870708, 0.695953973175384, 1.3506354270399, -0.733624262523588, 0.110973842006469, 0.405832088146614, 1.71979561083268, -0.717731983213035, 0.30732083481512, 0.892623481144384, 1.38986260924105, 0.932486533704899, 1.31828438563511, 2.62566153573893, 0.877955344738624, 0.416378079156956, 1.8542370903751, 1.18793381239611, 1.35759243044381, 1.60216687977437, 1.10067559278832, 1.01742442774898, 0.38551722883974, 0.657435891936687, -0.468769650658311, -0.445728405892313, 1.23184159012002, 1.13498492329537, 1.36329942675571, 0.983862353839323, 1.9127284621534, 0.600830902327282, -0.219595629897761, 1.05595070624204, 1.41996827345681, 1.54555870363327, 0.659976487524396, 0.461084346089476, -0.123669664517795, 1.44525665675588, 2.19487167605926, -0.0446829732858897, 1.69970139198315, 0.740168666984535, 1.19487246950359, 1.70812292571449, 1.68120900841798, 0.701495063847626, -0.616327995852942, 0.630038496780698, 1.37033206619379, 0.443063268368473, 1.24016463146794, 0.768219986109627, 0.348585851653554, 0.473515058177875, 0.981620381310943, 0.341607999774856, 0.26137200228379, -0.143616202757786, 1.72626984673815, 0.688448107408465, 2.22595814148114, -0.354915450645288, -0.562924155100442, 2.15222891842773, 0.923536284854503, 1.19591519025364, 1.3054433828581, 1.61158207282331, 0.841459386685367, 0.171168929860837, 0.164277295287134, -0.0348477440219832, 1.14747496385787, 1.48333528099776, -0.228070999761521, 0.720473593196825, 1.44549257365759, 0.717978405523344, 1.61521048342354, 0.03700507924865, 0.0311684883840334, 0.822910462759137, 0.73405764048715, 0.765309542428048, 0.831290940132533, 0.0731618675875573, -0.169665505298568, 0.805258222379137, 0.246367237840226, 0.0596376120219675, -0.257809262890254, 0.451577305454347, 1.36167450412519, 2.50427071662808, 0.0794785696541886, 1.19255878270454, 1.72103891113993, 0.907258785886514, 0.542498358295761, 0.0119849842981471, 1.15781051891787, 1.06319390773552, 1.47263856017001, 0.834724526267123, 0.360503281394915, 0.353467628350923, 1.1239615829762, -1.1509058319105, 0.629337888214165, 1.71171268379228, -0.148834455816488, 0.302213254475051, 1.17157010784697, 1.20170588468343, 0.504939922498621, 1.02305617402422, 1.16782667749347, 1.12310496573758, 0.873580626036103, 0.297668763872437, 1.85357456222211, 0.395145555437907, 1.77470323647819, 1.99405727632444, 0.758968045395701, -0.0375809638744145, 0.807387596729959, 0.863418926623559, 1.86126221495834, 0.33897318083709, 1.98881127813619, 0.0809072292786554, 1.24988829309721, 0.898635712597226, 1.74927502322479, 0.0025369342586383, 0.612466513570872, -0.122019127070843, -0.859060279750338, -0.396669785786851, 0.0283798130833031, 1.80338228834702, 1.47670306112738, -0.323323778476199, 0.0891792379528025, 0.565011732193563, 0.542989633544883, -0.0342234813238015, 0.686568261346059, 1.34063942136232, -0.356447777512398, 0.55932134917428, 0.798005036622364, 0.731506271926493, -0.643048222355964, -0.272383572125753, 0.100363917943014, 1.56641878926606, 1.02849811153218, 0.567612334251061, 1.69514070187913, 0.030611846448514, 1.30231072765425, 0.607026118827921, 0.563339176803413, 1.60505621706985, 0.840659784039092, 1.48163457731799, 1.15696498969364, 1.41550113289028, 0.82203702767788, 1.155089019512, 0.595277755640903, 2.08118050332786, 0.0221108244018216, 0.577075312145375, -0.407772952733277, 0.855735970190543, 1.4049622793804, 0.0883284368251795, 0.629331948114059, 0.442796683768449, 1.16722875950976, 0.544154367097426, 1.59333402736473, 0.648053219006694, -0.211557411918503, 1.01402933975727, 0.796545301112199, 0.862516146517839, 0.652332194989547, 1.12682155344724, 1.47044674865238, 0.336140433328854, 1.87265248768099, 0.497584058176684, 2.1666196911942, 0.791979831035019, 1.65318589077098, 0.58542634590277, 0.599557480115016, 1.05918671187173, 0.779157956787088, 1.95532023086946, 1.17495907954265, -0.911410985123068, -0.36924783899587, 0.141312551226939, 1.29291650935055, 1.04812051790572, 1.53028441894846, 1.61829360163697, 0.745701324574266, 0.82453928228898, -0.376737097590653, 0.31631266256908, 0.925491025835489, 1.69553250771524, 1.35947657285069, 0.430727784234987, -0.0054690627042428, 0.803360482232763, 1.08472381529763, -0.159318145225096, 1.20259660732394, -0.0979813304576815, 0.680548567152296, 0.977491096473672, 0.928007357070023, 1.53131052428796, 2.1698571914518, 0.71655803270542, 0.627183970388835, 0.496078194729424, 0.251147760892117, 1.49328213817954, -0.293835971738045, 1.9534265106601, 1.12913753379551, 0.875724694555394, 0.748518935030444, 0.951809134287771, 0.184212438254943, -0.279191076807556, 1.05299280132288, 0.501016926585993, 0.532533775500234, 0.310343150268434, 0.584924640249776, 1.16297911784036, 0.210607829542661, 0.689350386931963, 1.52190642621659, 0.875595271172326, 0.865488944595315, 0.436979906694285, 1.22544971006553, 0.540469121837661, 0.551371139956174, -0.635639613170416, 1.12818744491753, 1.80274087382256, -0.531304955682569, 0.867234883469718, 1.04617466215464, 1.09914335520424, 1.68723053896413, 0.216915019978153, 0.456564690864096, 0.957657600436776, 0.966219254008622, 1.34774701625857, 1.04626000766344, 1.11282790945842, -0.286854323896051, 0.705164917088063, -0.147914988187973, 0.822806082443849, 0.0848146112198801, 0.755683327899337, 2.3965071784919, 0.0101960267752841, 0.0345253797944968, 0.336723834788785, 0.478338497555739, -0.35945201463012, 1.12837374918607, -0.489216169540242, 0.0311099093600566, 0.419693359905619, 0.633823294916021, 0.971176885757375, 0.0329340372084536, 1.38364685433071, 1.51752594713473, 0.113952604480716, 2.1647832640612, 0.661007973609476, 1.41966660548195, 0.813436753873623, 0.678567108120336, 0.511070826413205, 0.806072749788997, 0.613264731288498, -0.280250011829392, 1.25757568382638, 0.90220141220817, 1.2259307336138, 0.866830771045789, 1.26848754409402, 1.41759151583488, 0.450013793627311, 1.22345137459446, 0.327599410390525, 1.48626095599974, 0.697364225074452, 1.2108286429807, 0.700702960068709, 0.673522464555159, 0.208564109762453, 2.06788821511278, 1.99430410937617, 0.21858813993145, 0.424885553876329, 1.24717872917001, 0.0288942365551896, 0.23755547998516, 2.20537568802879, 0.907321303452538, 0.415923879507154, 1.82295411256658, 0.319094687102208, 0.92146930251837, 1.28170780971824, 0.231801667251412, 1.53835135955779, 1.59289816172732, -0.474803931720884, 1.61241964851891, 1.28917799946439, 1.48755913242727, 1.15067810298124, 1.10430666386749, 1.52294406463892, 0.93960917915174, -0.206016851592738, 0.272814580123753, 1.36383490740546, 2.25991087225907, -0.234814460910268, 0.267279421255295, 0.758269997570622, 1.34305820882252, 1.44998730310208, 0.356225757943191, 0.725186630939467, 0.817412786674196, 1.68228548273849, 0.641631077419556, 0.56893591707791, 0.204556580213793, 1.10722854994439, 0.653924119965135, 0.759505354581411, 0.659323421087518, 0.506071182000473, 0.899530928550326, 1.10343989888159, 1.52781972666203, 0.677634408222792, 0.259473380815907, 0.947482169690515, 0.789663378624974, 1.24910825191083, 0.105678369016844, 0.228160944973266, -0.590461767616723, 1.80799630031432, 1.54187969824004, 0.342524893896688, 0.680647620948987, -0.487960859907112, 0.0801800645040947, 0.484523408292863, 1.0531734123282, 0.373202237040334, 0.249336050160812, 0.757983462309163, 1.22186348763479, 0.879627821447885, 0.202965110694469, 1.73946924611757, 1.16558727923101, 0.887452540331842, 0.527084743249998, 0.567429722935773, 0.859170318616311, 1.24897235615367, 0.45054666830186, 0.566484595968786, 0.298850269057617, -0.10819438404579, 0.312303813236566, -0.795820747840202, 2.22394214377815, 1.21476579815592, -0.0385225999838754, -0.309866781682246, 0.646838789660952, 0.98019620430007, 1.35583155885776, 1.13918709142655, 0.591726065592147, 0.543395699833291, 1.03245316175819, 0.106833010569219, 0.169379173313513, 0.242292400968324, 1.30136096019567, 1.12621600072972, -0.207484244711407, -0.0806131012514728, 0.973991497633759, 1.22803480206011, 0.639132313096419, -0.102482084829368, -0.0743681173281583, 0.311745107833122, 0.535184667881083, 0.421522165722611, 0.318298642252532, 1.2837088548212, 1.66972167462718, 0.692078975181926, 0.777688314105186, 0.57936771941325, 1.15999718195822, 0.61695471476463, 0.422094268079283, 0.519816551760159, 0.98743782763227, 1.26930376216296, 1.28093177743018, 1.39481966243339, 0.400736836898495, 0.351297964969443, 1.61014269342929, 0.194902975430242, 1.42618925504592, 0.206415727363688, 0.77734218655692, -0.118996194518575, 0.39053229556813, 0.181843887856893, 1.78631538483691, 0.560720104514334, 0.366894918194055, 0.226971530755949, 0.762791813185652, 2.60497203013956, -0.0291746472752968, 0.839907131017573, 2.57930367436922, 1.30847522021835, 0.468226359902028, 0.777518361028834, 1.91172482460688, 0.582559471017039, 0.497704238520421, 0.811898156256922, 1.00373405271472, 0.76204354737292, 1.01411949461056, 0.669535659672043, 0.906559224818033, 0.693910192032928, 2.5042109157114, 1.08009166754217, 0.992643586318803, 0.456619419781872, 0.752741298229701, -0.636308326728737, 0.749578127770109, 0.83997107335183, 0.911959039917721, 1.01063227086327, 0.810824580253467, -0.375225277480659, 0.292012237986275, -0.620462274140596, 0.700195473976763, 0.843945494779057, 0.153596803231079, 0.401965598276319, 1.19483376587202, 1.13632761419934, 1.03205279739036, 1.47277002788664, 0.975137800332446, 0.89904110128808, 1.91236192610376, 1.73723164072355, 1.20262997287839, 0.837248946904965, -0.331441504860822, 0.385773911427499, 0.678208342948097, 0.98062477446335, 1.33493109842811, 0.0332650824540715, 1.6517986816666, 0.468566775735236, 1.53713467835229, 1.0490230261481, 1.57670719383729, 1.74318715468856, -0.201238648815897, 0.660972917412794, 1.02964384814844, 2.01068847193252, 1.55362047987294, -0.619466702894959, 0.2535341366243, 0.694647785101607, 1.82952758013349, 0.338735832453554, 2.21868449809777, 1.78098376653561, -0.548392888173602, 0.756176956161647, 1.82620417474788, 2.44003309280973, 0.921104117810963, 1.03323186239216, 1.7465862333403, 0.879410607871086, 0.727770779101027, 0.0678089740275742, 0.658988082663282, 1.41032860851174, 1.32107978973135, 0.502336000866127, 1.27062269940824, 1.21604623469245, -0.344746090679454, 0.961132083226171, 0.729775010365017, 1.17427200961231, 1.14204029804366, 0.249458593216563, 0.742105466371301, 0.107490001771372, 0.773874997083597, 0.739111076503967, 0.912142233918745, 0.968565114799862, 1.29787041087341, -0.113364914744623, 0.951813091993905, 0.495394319897318, 0.607562306802185, -0.151879937103086, 0.209550768996088, 2.06850271039177, 0.12810504399657, 0.716204320330395, 1.58679972659589, 0.0640838954164056, 0.280176811111124, 0.798289860174031, 1.75364357676087, 2.18167721420525, 2.08561338739524, 0.776862246216483, 0.823102852235952, 0.56028141608839, 1.40206261211797, -0.495945005735757, 1.36573783892379, 0.303259951431122, 1.43519986780318, 1.0395508187155, 0.922422076445296, 0.502338502545835, 0.427878759867013, 1.01140494015092, 2.48033936508381, 0.627014780967028, 0.18189455916156, 0.464596885387897, 1.51448868865636, 0.316943289033112, 1.28848912303723, 0.271162682196104, 1.60923355618232, 0.644807428307381, 1.59540051030593, -0.109898957847151, 1.3688674996793, 0.498849071814416, 1.17308347427083, 0.452980174417673, 0.205872176091736, 1.33460455843086, 0.923550474480218, 0.783294694439937, 0.72075193756459, 1.20087926512023, 0.446399940127713, 1.78725328630456, 1.1741090613644, 1.79789141612139, 0.471295271666917, 0.538781603425019, 1.34911015456642, 0.676376371600696, 0.943790148016377, 1.9143198709627, 0.130971615045195, 0.802886660734073, 0.832060672936112, 1.36149423697119, 1.01123770383565, 1.00766160729315, -0.0920247939568539, 1.04766091859066, 0.505253320195135, 1.5753987477666, 2.23691198025892, 1.16956247545861, 0.700440910447458, 1.61847695061404, 0.902657719492397, 1.08440239745993, 0.766701102184087, 1.89160069788121, 1.36956042847108, 0.731806959211107, -0.745725686012716, 0.192198741144266, -0.462033827709632, 0.184339942959621, 0.66193673252122, 0.269650210340524, 0.63650776935222, 2.32960037176523, 1.8057968564231, 0.127896701833997, 1.4320485081606, 1.82026665069761, -0.74580381295191, 0.833558797893901, 1.31760135286316, 1.79292276439851, 0.840464251408313, -0.0144821837754938, 1.99191774202686, -0.669090131351871, 0.97952273164624, 0.957789948718915, 0.858876792823993, 1.64064866651732, -0.0640009406475051, -0.295442019336979, -0.289207473947408, 0.248932966998994, 0.567099294541519, 0.574077401653194, 0.850744102217536, -0.475010160238959, 0.133708602878047, 0.686713179396876, 0.248019729210059, 1.86768455561126, 0.634177594473127, 1.54247987556409, 1.69351425968659, 1.26300545325841, 2.39660287387107, 0.55374842914972, 1.1721990090288, 0.310047299272781, 0.398690433314545, 0.416737697661426, 1.53146098784362, 0.732482774561579, 0.798895976948188, 1.16703043490891, 0.188165261495464, 1.03858155611981, 1.13428866687297, 0.664622926748075, 1.48766803407922, 1.67628637422693, 1.80738098592621, 0.15025788171034, 0.0495777362221217, 0.00714245228455605, 1.44408846952899, 0.947921503141734, -0.254175867956779, -0.344182125439496, 1.40679168459288, -0.307037317978624, 0.985170133928178, 0.490392312455973, 0.273512805752734, -0.339319827122865, 0.0585573865402023, 1.0459936620527, 1.61101505706648, -0.00436589580745694, 0.123245902988455, 0.429940462399953, 0.72293897618555, 1.60411056331657, 0.0323474280715219, 0.349401103040595, 0.0662054425016474, 1.39055842721615, 1.29185264978821, -0.191358417690657, 1.56976073980529, 0.281506022043556, 0.28140901023925, 0.959647514896054, 1.02526144424677, 1.38366759454953, 0.203865046238207, 0.631529095508741, 1.30499153857267, 0.912321261905104, 1.16087353394338, -0.0338643263046919, -0.423943672470231, -0.0436487248348115, 1.20024103467113, 0.842948247189733, 0.441580233356125, 1.01653781325244, -0.314793524707687, 0.961529675956483, 1.21503108689815, 1.05001142646104, 0.443065362068354, 0.489455767203247, 2.24023184106602, 1.29191049357383, 0.862688384022144, 1.99532953460665, 0.663975574476623, 0.343628542675996, 0.347284109508207, 0.984854209217653, 0.341077031282708, 0.598278878364293, 1.20341181108689, 1.57640729839996, 1.08364049127965, 1.28074930183446, 1.24004732975737, 1.89584829130598, 1.23637913759023, 0.975594631064133, -0.531507599548455, -0.0851680811597314, 1.25375478610354, 1.81083535431501, 0.784915516066552, 1.10817756601047, 0.752181122455469, 1.29343506494444, -0.181553127271655, 0.209358939347146, 1.15095661632041, 0.547825870349996, -0.250135584657278, 0.359664402859746, 1.2080712241988, 0.982060554684988, 1.67295444055016, -0.0523306120073469, 1.77434027876917, 1.03105152652334, 1.33218620429041, 0.257745640988306, 1.08479265547729, 0.408386434493307, 0.183941619850546, 0.478365574420127, 1.38613133188539, 0.625039037677527, 1.38614327286097, 0.849383170288343, 0.85852377819085, -0.703347350043189, 0.249314110719659, 0.0123757759812959, 1.44205752060686, 1.85390488794374, 0.91221865514055, 2.32031000743509, 0.785755834843495, 0.602119078364959, 0.46206321316361, 2.00906118495037, 0.859391014512906, 0.736966024619027, 0.125418101505438, 1.12690952949281, 1.0150911868806, 0.539529797287712, 2.47393619362776, 0.319364739330906, 0.904857026608045, 2.26123200426887, 1.29510078338851, -0.457977787893515, 0.615493307849358, -0.434776166013958, 0.313573758572621, 0.465507869370942, 1.29838191014102, 0.633520076430186, 0.865241399666309, 1.3490904602047, -0.360862916589337, 0.363705731178915, 1.64394412724582, -0.0741427199524778, 1.46472332031007, 1.65233503851102, 2.82770908691325, 1.05076631960981, 1.2018054075649, 1.42440838888329, 0.7472234836252, 1.46420504002285, 0.387503816257697, 0.663586784665369, 1.1860263351558, 0.672657360286247, 2.09505090114563, 1.07338143548107, 0.477605506851434, 1.06098006768121, 1.35812713612051, 0.706553595961849, 1.06511175259122, 0.944650855222933, 0.918941778064898, 1.03839081251478, 2.3277067274463, 1.18313645712852, 0.225390077239246, 0.365696237978901, 0.438947219770491, 0.328577484989326, 1.3209035761785, 0.41687984845288, 0.792694332933097, -0.477788257124926, 1.33549172284287, 0.891042213641587, 1.09495198556377, 2.2578935340342, 0.289193191478995, 1.82149747530736, 0.609689821343136, 0.260009197327196, 1.77467322831779, 0.6920922326691, 0.815829763250218, -1.1736335083825, 0.945079568005918, 1.9013313133649, 1.13009809487273, 0.391761985716133, 0.621058327860641, 0.758126965074474, 0.831077521026438, 0.198732748467304, 0.904301783348812, 0.22645695974648, -0.663698767055065, 1.41870336652404, 1.25912809645342, 0.778168258131829, 1.55901434163582, 0.809153125167529, 1.17993752524508, 0.0453417160847615, 0.896991837823526, 1.65348233090375, 0.175957706513471, 0.167049362280911, 1.2026629322379, 0.827636816147504, 0.54230399850759, 1.32623864542309, 0.22875625064551, 1.73430163239451, 0.913271481270479, 1.00106051204312, 0.34435384937105, 0.453326408800626, 1.29294994290395, 1.7509580582002, 0.446946669854203, 0.988459290490784, 1.52023047486433, 0.89461336319567, -1.16912344596165, 1.41678064387737, 0.594878735431804, 0.326852136211395, 1.43941033488132, 1.17768662081425, 2.21557375244709, -0.789826010901426, 0.305759526377313, 0.180476335420292, -0.317183459558696, 1.20166689542678, 0.0488458659779334, 1.36716609903563, -0.383461251588755, 0.772327571293538, 0.453450577937706, 0.424649726492397, 0.892515695020168, 0.81854398287901, 1.6347926842085, -0.00488631360206693, 1.0379545922983, 0.434870824262655, 0.338531867529888, -0.265206380021051, 1.15406292626761, 0.157437265392302, 0.95709452659242, 1.36856771581473, 0.603310761820572, 0.836536540478456, 2.10445913816191, 0.759212201601914, 0.894603895127028, 0.231500884282373, 2.33249779074823, 0.537646095725507, 0.50914577613185, -0.0465298782736221, -0.11796932815027, 0.968665761612492, 1.30860005165833, 0.143046234501236, 1.07061104392503, 0.978901819739869, 2.02689635882474, 0.431006751345985, 1.62512321384835, 1.39314112902094, 0.907533583022916, 0.841409150414983, 0.629838338034329, 0.358771099138524, 0.463638866219267, 0.331019306757832, 1.27450038208467, 0.727605758199525, 1.91125385925203, 1.81786787173873, 0.982947280894478, 1.96982890787239, 1.034695873899, 0.174939514721261, 1.39378574660494, 0.849252822939518, 0.655334382773484, 1.22696032040069, 0.0939184315812265, -0.630017567629217, 0.627601964562629, 0.779441207245622, 0.84141303050892, 2.44092004113482, 1.79250633192204, 1.43486023760324, 0.565368796130651, -0.0456351225765468, 1.72093623320415, 0.709875894909735, 2.10391894941596, -0.293111811706052, 1.17926549938389, 1.29124617626247, 0.827362337896368, 0.901134572524924, -0.535878979385178, 1.45817188583513, 2.58999378203012, -0.165915424417751, 1.25572378710766, 0.974610765271753, 1.29211215504168, 1.18514175095067, -0.414406951088545, 1.16525096066356, 0.692514208613535, 2.12735765760946, 0.310485456891616, -0.344497986215791, 0.349122940785996, 0.847240768775733, 1.46176577169757, 0.283658295212749, 0.348646837520133, 0.272389256347946, -0.0108551911525133, 1.57252945663782, 0.404588338104011, 0.107504583088117, -0.131356997164457, 0.574887436540469, 1.30788963245769, 1.85390082778848, -0.419489557221246, 1.11039975325175, 0.209384598801417, 0.243780387410274, 1.07689647329339, 1.74516839940691, 0.953317765484573, 0.103111013780279, 0.993667333754377, 1.74757313338178, 0.807250051562415, -0.239027256765511, 1.41978648944642, 2.53876140976176, 2.03676270686004, 0.292157423681815, 0.880912718266315, 0.568016349369821, 1.20092986576881, 0.940622698095401, 1.56100875324021, 1.72711111839033, 1.02634353634041, 0.799440731342728, 0.393579665105564, 0.655488294617261, -0.511503330364053, 0.141161980073959, 1.32845452790245, -0.0413348981795135, 0.731747471414367, 0.720540390052006, 0.87852705901313, 0.119200393821005, 1.01726168749898, 0.489455034069799, -0.232275236093739, 0.525113075216435, 1.53340538825732, 0.975404574616502, 0.535988864250869, -0.0679177511582775, 1.70038623358267, -0.284174797457204, 0.6044031639813, 0.833949006850313, 0.536069028748335, 1.14866837160024, 0.607543840514834, -0.197549781069164, -0.26439045893161, 0.571709906141914, 1.65175563505644, -0.100550499304559, 1.88254645777338, 1.45247135495439, 0.877479180192022, 2.03794503714206, 0.370126521900582, 1.85883432488092, 1.36206326481362, 1.46284543499193, 1.75221864784579, 0.651001497281617, 2.07400754329685, 1.66352967359951, 0.92607911904972, 2.377650934982, 1.56522878794343, 1.10447516151868, 0.742364240610183, 1.13778998586282, 0.741698278443117, 0.880109828596941, 1.41787384159156, 0.833967001337722, 0.876996673208465, 0.439596618396092, 2.22131691220592, -0.178279053886129, 2.42270288171662, 1.27550188973534, 0.9495523686578, 1.70063796061166, 0.0542439311945423, 0.33851830090918, 0.150464047117467, 1.6088817217263, 0.43923490790059, 0.727560085942286, 0.816850249795251, 0.614251474989511, 2.2792927453955, -0.383171284043013, 0.188377263099289, 0.579365516265015, 0.208056172908121, 1.04756793139254, 1.53966283727363, -0.419692921297279, 0.945009153180961, 0.927334448731955, 1.82966976305062, 1.15656895543186, 0.305316023155838, 0.125628619731483, 0.391528257407407, 1.11697934547305, 1.01595228795169, 0.0407918427046794, 0.283696554110987, 1.26808783817814, 1.50377842018605, 0.201135719767529, 1.84501633305596, 0.816716918718835, 0.260307025092671, 1.45259676234352, 1.43552607290743, 1.09619637867407, 2.73150619411934, 2.1950761327812, 0.798323898627067, 0.881378697917229, 0.511404033516052, -0.131859525590275, 1.59979729849223, 0.298628573841928, 1.20188541620013, 0.708809858214107, 0.996554860326936, 1.08598703647855, 1.39241295814326, 1.31150933545864, 0.570645684467628, 2.15126166579768, 1.46024614102899, 0.857903603723686, 0.736530257151627, 1.706787740656, 1.2504576979123, 1.59945893095399, 1.33059033961888, 0.960646330931222, 0.831522984647292, 1.07111371454729, 1.37214852083705, 0.545438614815327, 2.47987838629548, 0.762492054496563, 0.452536660375575, 1.19166509200359, -0.108787115473219, 1.2977073872773, 2.18953799084863, 0.891551632298869, 1.18444689812212, -0.0968346101333311, 1.96493461085098, 0.680048363576206, 0.635908742702762, 0.111719643975859, 0.213576561254727, 0.776555935638752, 1.76678233420533, 1.39384594730603, 1.16496989076783, 2.36506804053789, 0.924872470725841, 0.166367705778379, 0.790306742001951, -0.737344227887256, 1.2298635292092, 1.02238887717895, 1.95930082852037, -0.297072885814963, 0.31230614200506, 0.148609877264278, -0.0876283124356184, 1.2310293308702, 1.18456779160858, 1.45745260528244, 0.140328039094801, 0.671201929346591, 1.32944841668295, 0.923034385927285, 1.80895448802027, 1.58059989315431, 0.393780334301278, 0.631433576464703, 1.13472383034068, 1.33102766475736, 1.11453571258191, 1.35760766565926, 0.738627129903764, 0.539211120335622, 1.62546840835654, 0.764528774765823, -0.43026702678019, 0.553300729481354, 0.364574363637167, 1.19669760221554, 1.49249054815784, -1.03877919236252, 0.972934875401315, -0.230693596204225, 0.427800448378541, -0.0989626430053901, -0.161899004905661, 0.121390400469107, 1.88494790392893, -0.613587601958985, 1.79325437096032, -0.6262866165328, 1.39408763776631, 0.14505968251099, -0.163738500858699, 1.97727752478343, 0.516883447818729, 1.04480230728062, -0.0351528384449704, 0.412959514709458, -0.279390221427148, -0.171366113566014, -0.0579752799629507, 0.792046469412613, 0.610051295658793, 0.934480142206225, 0.742463487260078, 0.373788134598483, 0.925023882447004, 1.42536420407117, 1.53542753774388, 1.05074272918163, 1.49295176719773, 0.371837544804371, 0.479745609090184, 0.0237849982553453, 0.301829335051198, 1.09819973558145, 1.71861871504479, 0.437226736776097, 1.36319958833877, 0.920429552340885, 1.16276930579903, 0.577604831910617, 1.41210775635046, 1.26875209427929, 1.85932580586886, 0.622729147191756, 0.0847033755418543, 1.81948381345436, 1.02624437333654, 1.34752955394302, 0.596612465974153, 1.50024953718794, 1.88949205613851, 0.488210130876701, 0.941309904999228, -0.406679181081525, 0.438690515061092, 0.319532057682344, 1.78035366973195, 0.948461232235962, 1.4911545067543, 0.765976190038032, 0.278311771585541, 1.80821559452213, 0.383706964980456, 0.542563010977146, -0.434537014162333, 2.3302393101262, 1.75396281236331, 1.60686279858021, 0.254353353956857, 0.23750093030421, 0.187561446370054, -0.355335261959709, 0.00544211988165674, 0.583418217634772, -0.0379919682795426, -0.306520344553384, 0.580915309784902, 1.37201460971176, 0.331717113345892, 0.105499283708074, 0.956468750024425, 0.322489409273046, 0.786234810565424, 1.01606795211126, -0.769607746369736, -0.0695848749954557, 0.702981506807853, 1.68762539570364, -0.25340170997037, 0.678324595939283, 0.207600180617398, 0.638735293672892, 0.893409988412539, 0.854364364322344, 1.26213301923662, 0.522301775448041, 0.209682581959883, 1.74460388988258, 1.12310363558283, 0.400583986848822, 1.88018483425516, 0.223153477344738, 1.1413196336188, 0.397077753745915, 1.60548679181466, 0.272348288563004, 0.481782303969797, 1.19787604253225, 0.292339480031305, 1.24550943655975, 0.424106423952112, 1.51301844302079, 0.361453268829354, 0.253378440479617, 0.0622794026065129, 1.1042437747276, 1.12957966745661, 1.12617389311314, 1.12609456762877, 1.40684835728837, 0.238147058884775, 1.19180670941769, 0.116555365056109, 0.817426281299349, 0.83024301904352, 2.14988851995764, 1.00591500403989, 1.11092718385823, 1.01636200845521, 1.49231462271715, 0.794293967234216, 0.699609333082339, 0.625137344687247, 1.59824770320196, 1.55011032171275, 0.0454385426515826, 0.998817878376682, 0.236670065820946, 0.911690929777302, 1.5289902759598, 1.23042510128601, 1.257127583267, 0.724640524297399, 0.912136620293432, 2.23457847095692, 2.63241839393911, 1.11750633523308, 0.0625319277600787, 1.6101948823358, 0.1081549436654, 1.2913977516176, 0.824208549745437, 0.323833091323208, 1.31096518774976, 0.60389054793798, 0.71203447812336, 1.49473340128979, 0.43642784082945, 0.717377151404725, 0.90788010811639, 0.74321945673042, 1.76363822139191, 0.361727040296386, 1.95921676313961, 0.919141870228367, 1.08306578083685, 0.123210869886372, 0.0923973787647852, 1.54923615778486, 0.686290752049262, 1.27267907242905, 0.746275437715149, 0.48629354085528, 0.76554062756248, 0.0347799958623495, 2.22238581393793, 0.0573781392754794, 1.21125395911119, 0.0809867344870579, 0.60900542021481, -0.292763964673487, 1.45174223956458, 1.51368779619815, 1.50081411454279, 0.558465952277088, 0.950773893720867, 1.04462202955168, 1.27745080306744, 2.16779917218236, 1.40247905573805, 0.220660506147444, 0.313302088988318, 1.47572810947955, 1.8758361261336, 0.868813822772888, 1.35557754538764, -0.0264329341953259, 1.02252806525827, 0.564310041869491, -0.111696091644582, 0.789468461733921, 1.45285978504174, 0.96984500848264, 0.66275627900983, 1.35069162559501, 1.26058632710392, -0.423588955000732, 0.852594003347108, 1.96506603671098, 0.674725012265049, 1.7246571136888, 1.67900967524766, 0.13300523359931, 0.601193251382785, 1.30595771723685, 1.80622369612035, 0.271849590581289, -0.172978132949422, 0.460413326053875, 1.43569524809004, 0.0555521483035502, 1.12152085593395, 1.18661548343172, 1.42848569137768, 0.66487929528921, 0.0533534068219916, -0.322192833479711, 0.293854743937027, 0.964649321451465, 0.176109232088729, 0.22342366354136, 0.856921867218911, 0.923390613315582, 1.04750064206225, 0.754310107688596, 1.43436391143021, 0.535671741746265, 0.815691769922685, 0.639097144610799, -0.00969372333891372, 1.67360548518346, 0.534337075704307, 1.21921734620709, 0.704504057887461, 0.234209485803278, 0.80700488782231, -0.312165766335678, 0.853731914093129, 0.996574720215673, 0.705586016182929, 1.06502756015381, 0.192000362215279, 1.03400764524885, 0.260030441121708, 1.27477970765953, 2.11820171485237, 1.42070411930383, 1.11013766683195, 1.47281133022992, 1.19688345181612, -0.793562511960004, 1.17917969297149, 0.10143169349044, 0.47382699452053, 0.358561102563237, 1.16839627423695, 0.866751624452738, 1.40112352283156, 1.77072897809118, 1.35216824285909, -0.605225868218625, -0.0332658672533038, 1.13861774245837, 1.24069900932541, 0.0774214321124627, 1.26860852577603, 1.30038765510611, 1.29769507372199, 1.05255468057628, 0.246639827660025, 0.576195820308104, 1.60654784560388, 1.05523499598348, 0.482393080711424, 0.299857345541106, 0.0900417588981124, 1.6193682170034, 2.72026589018578, 0.412439465882156, 0.521188379409645, 1.54913372950119, 0.964508547093008, 0.443672159715798, 0.397614973924433, -0.149387606131896, 1.16909960004966, 0.641753217800621, 1.15713755877807, -0.633702670787214, 0.208227949806858, 0.474406366922564, 0.925188755196405], + "kernel": "epa", + "description": "Beta(2,2) - boundary density vanishes at 0", + "c_bw": 0.114817825058537, + "bw_mp2": 0.895035375539173, + "bw_mp3": 0.924760995416142, + "b_mse_dpi": 0.649265824450766, + "h_mse_dpi": 0.47782441767236, + "bw_min": 0.0534595037102289, + "bw_max": 0.996719508472803, + "stage_d1": { + "V": 9295.368953321653, + "B1": 6.64310989742829, + "B2": 29.38899379395808, + "R": 0, + "bw": 0.895035375539173 + }, + "stage_d2": { + "V": 144890.23711554261, + "B1": 27.76185936301423, + "B2": -156.60681809299894, + "R": 0, + "bw": 0.924760995416142 + }, + "stage_b": { + "V": 446.99662121949939, + "B1": -0.556705079069872, + "B2": 3.17280145716278, + "R": 11.17839748104471, + "bw": 0.649265824450766 + }, + "stage_h": { + "V": 10.32499078568157, + "B1": -0.132827292241867, + "B2": 0.0726333363229932, + "R": 0.0341722071907917, + "bw": 0.47782441767236 + } + }, + "dgp3": { + "n": 2000, + "d": [1.20237089264354, 0.0484451313007014, 0.766224321044015, 0.276789916804683, 0.894000672716489, 0.418348785483002, 0.14078153528302, 1.5093388620176, 0.155359615668906, 0.434848625141989, 1.10433863784628, 0.279774336048343, 0.642403797349376, 2.29685307966688, 0.673537634660684, 1.80814805338039, 0.12770135544451, 0.278604554667857, 0.126832466242897, 0.945986288916247, 0.772129108970524, 0.244199923562491, 2.64239418281596, 0.354215866306049, 0.912866351964479, 0.996989252131753, 0.513570940752079, 1.00444960290593, 0.288408344584766, 0.220014895208201, 0.703832286202406, 0.317717358662261, 1.3685936243201, 0.651536174718746, 0.951525948563602, 1.9858447764217, 0.46779341636334, 0.0136070461761312, 2.10462053277411, 0.52057478717232, 0.870730920107254, 0.0310890635048289, 0.624588134621781, 2.38467274034347, 0.600350626777684, 1.08813918615655, 1.14741964356497, 1.07669771969541, 0.431946746905684, 0.218273217365404, 0.0355615182542012, 0.453675670833924, 0.535712615290728, 1.49009031746951, 2.34589615863784, 0.71581978443947, 0.643787458902474, 0.402930136241464, 0.827582766579325, 0.574590560840096, 0.371291696517339, 0.240890414084164, 0.909606923185252, 0.736445632598141, 0.614345397448598, 0.847247899420924, 0.191873073956153, 0.462435714870735, 0.206688143638121, 1.22627945460292, 0.120978168754363, 1.81838974351625, 1.01075517272636, 0.951516643667505, 0.0866855001718373, 0.337579257278834, 0.569829107231266, 0.098888742172997, 1.01008085359677, 0.254459027204907, 0.841614032465699, 0.679294089648388, 0.561568641032099, 0.296102403188276, 1.04147987483499, 1.06738385411929, 0.675183336854126, 1.20571962801039, 0.654301334415799, 1.2714160011076, 1.53034749070959, 0.127935927952603, 1.11643661868935, 0.738365549843398, 3.22532278224432, 0.990183911602799, 0.253346819954046, 1.00906238031978, 0.856153677722955, 0.785266820260568, 1.98488543506911, 1.31092416243002, 0.351033970206849, 0.460078557525759, 0.798162274909898, 0.3058058128463, 1.77423869301737, 0.874402612701593, 0.391719950183889, 0.269121548035988, 1.0299669283499, 0.491014952519386, 0.26654600567397, 0.0158983819953969, 0.151033220567383, 1.07301892143939, 0.17908287884901, 1.21474996091664, 0.0218009342207539, 1.4783458734001, 1.6589485640814, 0.491686840446425, 0.189494912298115, 0.667526144089296, 0.759908134358065, 0.0888148898502087, 0.382118865999939, 0.502233076777303, 0.916331455438575, 0.935877851926251, 0.319777524909703, 0.156450790309467, 1.55160851628095, 0.350219894569342, 0.515924713062316, 0.866437549523957, 0.373159465844617, 0.373619617587266, 1.37720025492075, 0.416303964032795, 1.36721943462912, 1.18473113864037, 0.409583127220925, 0.64688040924869, 1.34389239307102, 1.38138330517039, 0.180390328646562, 0.753508377964561, 0.772903599984867, 1.71922502534166, 0.959915750281625, 1.59096122426499, 0.462971732387116, 1.45050690239514, 0.745383942404574, 0.355112429198966, 0.674253970997348, 0.232186339439587, 0.426852508074628, 1.32115885650127, 0.231483148320096, 0.272887273962589, 1.13906356928066, 0.0806907269779191, 0.52424420624588, 0.625285857027038, 0.423039420559927, 0.374318749850916, 1.60574740862761, 0.833074661090184, 0.46216629664936, 1.93925156755402, 0.184958009389439, 0.864474302253891, 0.233178130401636, 0.239358397922493, 1.61888705744393, 1.13515209428037, 0.367018966409352, 0.564771597664531, 0.277350626809437, 0.773840893070121, 1.55092128943954, 1.36303609175266, 0.0725581369804429, 0.641833535894618, 0.0905873174336272, 0.771108808971004, 0.143745013671519, 0.714129843044905, 1.40979233898559, 0.907311992996908, 0.0321384656732466, 1.28509568553591, 0.95760441341303, 0.0785539481401414, 1.35736568644042, 0.76681641674641, 1.48938063586865, 0.18067488397763, 0.0110955396670062, 0.197963720087584, 2.04308387688345, 0.224625382952333, 0.946795884812559, 0.794012930130634, 1.44733337157104, 0.316055601896499, 0.384192920720936, 0.540682185566896, 1.3475420079489, 0.493711044539428, 0.889351550449264, 1.16319545951582, 0.662998816924324, 0.722942005000311, 1.22717977821638, 1.73437566080438, 0.293749323850022, 1.33156707915902, 0.529085515211884, 1.46941930264628, 0.242180494495973, 1.84554421543229, 1.29835498802211, 0.234506253235605, 0.20047034719613, 1.65488468336237, 0.67204427433751, 0.176047037408205, 0.398628816006043, 0.239243579778561, 0.803102699099637, 1.06033706893678, 0.925173865904046, 1.18440704956631, 0.326015039122716, 1.2678048125212, 0.938279473146442, 0.878352507692361, 0.490354169430781, 0.951994621878724, 0.555693105083492, 0.485014054329749, 2.58441646042289, 0.64166482341716, 0.788477675692395, 0.403547809082885, 1.10062754950432, 0.352339739561355, 0.528676476764474, 0.140592078017682, 1.47525118551966, 0.963889060935515, 1.29770023891222, 2.35800607504653, 0.811064846329958, 1.45857254408649, 1.52242414366714, 0.949180158584996, 0.88615337422976, 1.00300385472398, 0.873791809175082, 0.191510635628109, 1.82113351645085, 0.396903444692291, 0.902240205667375, 0.917107972885628, 1.22291689453496, 0.813211728219609, 0.700390639757318, 0.558877137409628, 0.431173639496545, 0.199312532716538, 0.0628589273372194, 0.592770050925664, 0.0848232686095079, 0.837702846679468, 0.278314025563088, 1.59465849257543, 0.75859858406233, 0.0798007536778736, 0.33677418166427, 0.120407816658187, 0.603300130165327, 0.540551124464133, 0.274216678097486, 0.637811132538555, 0.406794929090294, 1.40635670568188, 0.565293039059625, 0.452321250112739, 0.158586954807449, 0.108874402399589, 0.884151862465889, 0.0445097578105271, 0.0309010408278302, 0.712055346400606, 0.68950346681296, 0.34219090337265, 1.22124887465168, 0.627783595530671, 0.349694833195396, 0.447113198007098, 0.40729250175113, 2.27748661532749, 1.07073579185075, 2.01878734383121, 0.011810137268291, 0.473564584908721, 0.365407065445621, 0.119935178327714, 2.41145818216472, 1.38104602198634, 0.468468972226921, 0.235211442193443, 0.234489240693478, 0.0663847018209171, 0.882124392705197, 1.49223473456122, 0.246137709862954, 1.20519381028453, 0.538091719618544, 1.06580520425642, 0.389944638322114, 0.114199392902004, 0.483782904763092, 1.71042445731243, 1.34596462396512, 1.46719911058417, 0.483236239114924, 0.271738386782678, 0.13786553077255, 1.5991650366947, 1.08557765560447, 2.63137355135818, 2.10095669698249, 0.817978904968229, 0.786534390144252, 1.5304489744602, 2.49837829543292, 1.14182692126766, 0.756505234940806, 0.437432785597213, 1.01640810593879, 0.858917550964479, 0.900213610291323, 1.37434690382464, 0.181872971513348, 1.24733718426015, 0.0519286894635995, 1.29715908123685, 0.438396538399395, 0.914069657320725, 1.84284616296338, 0.274112677370119, 0.578273266125555, 0.098676398073788, 2.07659605657276, 0.989004643906613, 1.19113033151444, 1.11974840416769, 0.618149256084396, 1.29223553645102, 0.202676335083869, 0.147602545825299, 0.934959361556693, 0.41778418427724, 1.27643926325602, 0.512038635938242, 1.22125447264138, 0.0505646062064727, 0.609437951547214, 1.87123145730889, 0.259480598647397, 0.537741488501781, 0.180202015717765, 1.15577594087928, 0.117527284527125, 1.02131169592937, 1.21079209129642, 1.10051868422842, 0.758564188796617, 0.139965410774278, 1.72758284142615, 0.583547041511116, 0.233636355367184, 0.470488449383103, 0.821755585858461, 0.911634447023033, 0.343457497815462, 0.525031743890039, 0.332529905289958, 0.845954532090984, 0.914182809899252, 0.448179074998277, 1.96403854370293, 0.457549444698162, 1.0128856337948, 0.9624985317273, 1.13561407877485, 1.58320721037991, 1.32404933922246, 0.499602868217234, 1.15604407917377, 0.880929759321737, 0.420922126276444, 1.88284717132849, 0.213657103281591, 1.87261972964732, 0.741581276142167, 1.58900674705678, 0.613679513165649, 1.23603179313379, 1.97810937763136, 2.13152413163778, 0.0895095061174304, 0.70415315378598, 1.48839879135678, 1.14037404115278, 0.207663259436885, 1.39862158767699, 0.329193763104699, 0.692400328304027, 0.0159445768617883, 0.295401134993541, 1.14221499003302, 0.72962610922323, 1.49334126630432, 0.73574343867124, 0.31639330841148, 0.76641250379494, 0.749477428362038, 0.757423482153829, 0.763589220841293, 0.0724862022744495, 1.11590630756457, 0.305594797089872, 0.163546607411322, 0.852636150482134, 0.510103945293716, 0.837947914673046, 0.525441133511222, 1.0621232708733, 0.938572376118084, 0.561278801430469, 0.597223810882288, 1.69861147954502, 0.527981355338538, 0.201182206228144, 0.228964176951861, 2.46218841308231, 0.28002028979104, 0.499476844167842, 1.1060289791711, 1.98076679440285, 1.83653685096957, 1.33254303549069, 1.04244475808676, 0.460199230600183, 0.279031293591633, 0.63110883925563, 0.0737096869098774, 0.649987877625925, 0.836951644341293, 0.244688802215055, 0.643610240608554, 0.694366393598404, 2.63473053061299, 0.0335959820446456, 1.60495148644133, 0.354803554142889, 0.875528794755527, 1.0436429056124, 0.14052976250417, 1.25302877931732, 0.541554214391497, 0.765540397314802, 2.53063491829256, 1.05489296673294, 1.10239095285761, 0.570030623469644, 2.35572159813549, 0.274726565966896, 0.469034445699253, 0.101443385101464, 1.08008212358518, 1.0216060029886, 0.154123172209341, 0.0736146747922277, 1.22025286527452, 1.59966490980215, 2.56529779344124, 1.02794091171859, 2.01982792053306, 0.850118100826367, 0.457515859075626, 0.0632095253912894, 1.14597348012438, 0.96658076967648, 0.0793336134737478, 1.16264557415414, 0.185042421145584, 0.294140674178588, 0.607934700804659, 0.254435272638023, 0.00919558815766677, 0.762554916304181, 0.0280707463341581, 0.711314786977657, 0.262941850994956, 0.986044431899504, 0.588958493778014, 0.704312391460914, 0.766808063874765, 1.19242602976374, 0.110087295144528, 1.00903359848921, 1.32930461851134, 0.248311539669927, 1.44741278413332, 0.163982113100262, 0.295989372977063, 1.080999420279, 0.860265076761365, 0.498511595596239, 0.783339499903177, 0.489690318293223, 0.495641828933296, 0.296683678446565, 1.79338126925345, 0.809768748665782, 0.995622729225894, 1.46935336282708, 1.12857536550611, 1.59391772430009, 0.662656606327163, 0.611635458291249, 0.848573281907043, 1.6715216373779, 1.89898230883546, 0.928864161521326, 1.00540294547881, 0.482819564860289, 0.348376284733318, 0.107873733984607, 1.66402996146252, 1.21441123955109, 1.91017482772654, 1.19733894776007, 0.754610685762524, 0.853160153864907, 1.34531373542408, 1.27323214402109, 0.556391267911845, 0.278066702994327, 2.04792612997287, 1.65835908684481, 2.27355527035354, 1.08366079771154, 0.787945910654809, 0.46160527708673, 1.24444292092708, 0.460156087927521, 0.959761107530459, 1.11456570044648, 0.534332502689107, 1.45283346929552, 0.867422902702882, 3.00979113479845, 2.27968041493376, 0.269800464956818, 0.292227900692324, 0.648423572370056, 1.23931337351711, 2.01849570324514, 0.913544760624583, 0.623094174521538, 0.156784859190268, 0.117385585116761, 0.636237765141287, 0.616544186787266, 1.51090424860527, 0.618225662705056, 0.131275355229481, 1.47173164202367, 1.36402870872131, 0.0369684776414706, 0.0490046669896018, 0.529963610530269, 0.322605368227881, 0.2011593139726, 0.218667416001334, 0.531093642657915, 1.21276405047622, 3.83211482317383, 2.5066370302552, 0.643540615724265, 0.257615608744577, 1.65774964228982, 0.241541667458793, 0.259183165972944, 0.993231497003328, 1.48309140063084, 1.22593155314722, 1.11263692962819, 0.920279207895602, 0.196609100702271, 0.539500771528591, 1.08957503757163, 0.887659914431978, 0.687401820743129, 0.759922930097567, 1.27628002242764, 2.1228716535546, 0.418975639260247, 0.316743618085634, 1.07939257332775, 1.76127401742912, 2.00593190472818, 0.035202784833199, 0.148576568411163, 0.281089224146386, 1.2801226892411, 0.125635063675271, 1.06446240314621, 1.26553596070138, 0.306657574846212, 0.920199867534181, 1.34462997232398, 0.0167319928797569, 0.0520795423478335, 0.783597017737165, 0.254201633026301, 1.43773129279926, 0.62572881076877, 0.861484394505514, 1.2636990368845, 1.16444278386047, 0.160936816147499, 2.43741663474119, 0.23088426764169, 0.334236912792149, 0.212117337637196, 0.624236565121342, 0.0837006592603694, 0.438634892334244, 1.76219217766848, 0.921751367871819, 0.6405339188034, 0.679366322370856, 1.85540818480919, 1.37771142035683, 0.153159438511939, 0.281643569391679, 0.505984915189501, 0.295008862836802, 0.107981935271961, 0.279423353066089, 0.563657304436785, 0.966816638691574, 0.121388410633225, 0.945825826073707, 0.012656934227711, 0.727912859041771, 0.768520556203264, 1.72553398070583, 1.06078062909555, 1.93301841002202, 1.25334227035407, 0.0170321927944841, 0.691643085435021, 0.0650780866160152, 0.477994023958279, 0.128581465769853, 0.320473499651608, 1.17436879458579, 0.789536207767244, 1.2631695541267, 0.0291397011251883, 0.7023844104794, 0.681115959849947, 0.932778865919551, 2.69085307645051, 0.122883114414224, 0.481596752818175, 0.235574179988383, 0.611274265964082, 1.23495376643996, 0.638829989603462, 2.05076256487794, 0.728767346461543, 1.0462345574498, 0.972118229109066, 0.221006524702406, 1.08665934520204, 2.50768232956327, 1.23767441471026, 1.02138060687782, 0.0732117561076364, 0.186089793711434, 0.782504806921792, 0.757810858256436, 0.707243580766142, 2.05649154127217, 0.105052959175734, 0.218287143316168, 2.03331283191084, 0.151324895141016, 0.741750697324678, 0.914783587095674, 0.31051294518822, 0.848365381331256, 1.97128828314963, 1.19134620432728, 0.251060714885532, 1.22055705251934, 0.718115234918871, 0.0358933962150604, 0.280756843785983, 0.105490461629431, 1.42869916517865, 1.3629597533885, 1.74687155060636, 0.518071576568826, 0.383369213616817, 1.03631398470967, 1.43279669000396, 0.220312120347431, 0.153138268926071, 0.0375312624961577, 1.12416365559214, 0.571769304132713, 0.129260436678501, 0.489367538956347, 0.955455517949649, 0.0391074607558297, 1.05231997270798, 1.60171257214144, 1.41198009767293, 0.562377227947199, 0.76622975107823, 0.659836668937199, 0.315199763555114, 1.61068019657952, 0.277925595383236, 0.455767733732653, 0.443063570885205, 0.822889880129965, 0.630872275869508, 0.0441824555365181, 1.34696871898161, 1.46988256485884, 0.982735411719386, 1.41135085609228, 0.19957520745301, 0.547559801983746, 0.329432609348742, 0.41545664782009, 0.349337683333784, 0.744303491174506, 0.07928232899989, 0.220303241855411, 1.31851127690623, 2.6289053353388, 1.07950562983049, 0.260464368130733, 3.25795896848462, 0.875043443138705, 0.945290080933351, 1.03876311104376, 1.21757881335423, 0.719971333407722, 0.245074749022244, 0.364610742252924, 1.40904490258502, 0.369625986343185, 0.800472596208791, 0.0529402744839606, 0.636816870222474, 1.19446667085282, 0.256749877313322, 1.03982123147511, 1.017533882158, 0.2278638197719, 1.49478818526588, 0.949389858872894, 0.575634678947588, 1.22422923879337, 0.937270302804682, 0.298843059668265, 0.280399392686563, 0.127588435351416, 0.687117635629361, 0.795733096717854, 0.59562276321844, 1.27773309586322, 1.74408840187733, 0.472022991075064, 0.520821134644993, 0.868409793812033, 1.22474076392872, 0.772531777752661, 0.942512394546796, 0.162824701929739, 1.05681914569219, 1.61245367671218, 0.340548832897836, 0.482149581695683, 1.18302141767309, 0.870844209604528, 0.167300495999921, 0.832959107243365, 1.01932753815323, 0.546383427778609, 2.57883197045487, 0.327862426150419, 1.19992453235952, 1.34855136676344, 1.28571321978529, 0.580714428307588, 0.0338220863519937, 1.00807229079103, 0.805308410858656, 0.803423138664532, 1.21347820161901, 0.588912671869986, 0.76444375790051, 0.776756079383572, 0.75930048589754, 0.175993796641401, 1.04343277795583, 1.3549947457643, 0.302426655512898, 0.817735281847192, 0.00508839819217828, 1.99870150902617, 0.648370763545097, 0.466492609354068, 0.280902879252449, 0.550839262086372, 0.895323546997264, 0.751073547425487, 0.744326361284383, 1.02139405705484, 0.407774339947196, 0.213242811672896, 0.366987039477978, 0.482968830101727, 0.0575020413078521, 0.198983312955828, 1.90728433535131, 0.522438749455237, 1.30656669923032, 0.706823387301612, 1.48333166754499, 0.570259793092007, 1.34388708001384, 0.770795627115304, 1.27299753153127, 0.631243185624457, 0.127195309135529, 1.07702618047925, 0.259484763144405, 0.0537936495445917, 1.27077118634606, 0.617897373948516, 1.56775050824, 0.4441687543647, 1.28857898483223, 1.41590214023858, 0.302635333770811, 0.100570910904198, 0.937837559947488, 0.847083378867065, 1.73303334131467, 0.32155003508653, 0.183142807315137, 1.25257626866867, 1.0877620419128, 1.01846993199043, 0.816342166879763, 2.18896027803021, 0.550019151467945, 0.590067612367566, 1.03556496530089, 0.481801793230585, 1.20071222452556, 0.1273250269204, 0.178790955364539, 0.690223050674334, 2.35174673620128, 0.966587123186351, 0.923000510748333, 1.12859440520832, 0.69996414019487, 1.24886665356002, 0.293120756490909, 1.1766847042021, 1.12970611840917, 0.215571297019337, 0.855915092233734, 0.871171997047042, 0.910094104727981, 0.538674220971858, 1.34053313743422, 1.21518222252412, 0.203874286306192, 0.804007670947257, 1.92965153831862, 0.550851060619072, 1.03077101503646, 0.489681850694367, 0.897732437332598, 2.01364050607687, 0.686050883275082, 0.404747064878979, 0.624383848103539, 0.41140586813659, 0.227359537520519, 0.931456928224069, 2.12126942909956, 0.0677357991540891, 1.37603824076632, 0.673615302504498, 0.56845560568639, 0.134373722212389, 0.241055009371441, 0.381106078536259, 0.11643382137701, 1.10631855765445, 0.792545867617552, 1.18781621333463, 1.27275880992597, 0.771856256978049, 1.47416431434606, 1.12958988414025, 2.07507787835994, 0.292235965907274, 0.992601599685047, 0.281943660600897, 0.621440826819595, 0.273147971130641, 0.968813280300521, 0.597421676054569, 0.486477611959738, 2.14450398334297, 1.84739253050399, 0.074786024211132, 0.920458274347765, 0.471530233364027, 0.224484111159938, 2.06089490036589, 0.548388112791988, 0.156060355842447, 0.109826427667044, 0.16162962793207, 1.93444628982352, 1.62738674754022, 1.00323189095627, 0.0609479112628589, 0.0213937786112247, 0.59907335206442, 1.03431778306813, 1.68753148660332, 0.38285143294812, 1.57465900118985, 0.422136526020045, 0.476566790434778, 0.0226551714900169, 1.22955668143635, 0.2320669695613, 1.67170787339879, 1.19844339561476, 1.62837396341641, 0.459064793245374, 0.322048083495955, 0.142064106346556, 1.11487716608495, 1.45216417882916, 0.501038279240208, 0.819587491044392, 1.18191142358765, 0.666904146087193, 0.246241740978229, 0.176425436013454, 0.0423430132622621, 1.95030433217913, 0.405542871314598, 0.944937384265602, 0.479362406170215, 0.222469481147099, 1.18234805472697, 0.668735417478713, 0.118624593211791, 0.841693746158909, 0.217816967426563, 0.542865225110226, 0.420643523648135, 1.44338391409387, 0.8988293088436, 0.0331513772034755, 1.34446721084615, 0.245128391354413, 0.384975639502292, 0.596831119098163, 0.316065432529807, 0.249406078132303, 0.605607601480655, 0.204408239809067, 0.53502928903926, 0.354505914245767, 0.769046359187295, 0.927890048287743, 0.195325470390666, 0.258712127102113, 1.09728504873573, 0.0266209670107661, 1.59315677714471, 1.24664503514635, 0.193791240497929, 0.0711685489488371, 0.318330908546175, 1.61495154499712, 0.333679681074534, 0.34680086196535, 0.0193912984695151, 0.203449692090167, 2.47635531579181, 0.356846581396322, 0.563579038777849, 1.23999434318076, 0.086836803124872, 0.63265452902387, 0.276546961927588, 0.0384029896290235, 0.307662140379808, 0.505866667179091, 0.69593337655599, 0.779136646470651, 0.382277621153628, 0.59125825474024, 0.297486382084862, 0.189523309891093, 0.516504907376138, 2.13984361613316, 1.0369540282173, 0.36017886661215, 1.23058424039961, 1.71250818385031, 0.478893556807226, 0.0055744459600798, 1.05332818944529, 0.094977765190386, 0.355793091093857, 1.10909871356788, 0.398180640643077, 0.127731464245645, 1.86818465316183, 0.314087041780995, 0.194331813181992, 0.898847547726183, 0.188033359482491, 0.666019633721605, 0.591916167985349, 0.194000554965158, 0.745795506491173, 0.298723182992643, 1.39107051194037, 1.73715084732086, 0.569027453903121, 0.013240750959125, 0.0180062693297147, 0.837502342801756, 0.07421498376491, 0.369723597140266, 2.01812988573546, 0.716598148185185, 0.112583989046287, 0.0826021167992485, 0.0832767265534655, 2.72452071845538, 2.31115071446475, 0.48437889896768, 1.45862204309428, 0.512590414966529, 1.02216626043369, 1.42576171101704, 0.0454193110969015, 0.847545759467413, 0.64813175275433, 0.159340862476551, 3.09316526895335, 2.37382641321015, 0.28009675677086, 0.92321941010699, 0.854366755229843, 0.817487942733599, 0.287905967648066, 0.036426416855786, 0.0925086172051073, 0.2106662063786, 0.492015118189247, 2.17359017917958, 0.182079749072865, 1.83414510681719, 1.32635563056311, 1.1168360140539, 1.59935988104998, 0.459028879102421, 2.31818396233012, 2.89433163108606, 0.927372850054642, 0.688197173301919, 1.86359287510477, 0.435198620288028, 1.55530611122696, 0.024500278339607, 0.362420590193298, 0.367740244478062, 1.46074668366354, 0.233619416293615, 0.374528888883341, 0.413683414267358, 0.0905702354636344, 1.26369766715766, 1.04537542923087, 0.32055366172032, 1.40828208503582, 0.174583116133027, 0.517468098777929, 1.14093419715141, 0.224824865060981, 1.06404474430755, 0.527806016636818, 1.99994801314283, 0.438352274888144, 1.53149295545269, 0.362865145956002, 1.21356773958747, 0.430358987915269, 0.487063656208715, 0.244333174491339, 0.207956218441181, 1.23689642296883, 0.150031240498366, 0.224584578181711, 0.592467980433539, 0.176329939236378, 1.55382794661758, 0.236234732117275, 1.00063985505793, 0.710121633952599, 0.678504460281666, 0.905080402601179, 0.674653649163352, 1.15518545741735, 1.41743477374695, 0.416004913972288, 2.13069230297499, 0.344390802005232, 0.0572718018800103, 0.310744228027685, 0.796062007589779, 0.0947725308537488, 1.10295348325331, 0.524207787530017, 1.03620934776658, 0.271160282939829, 0.685783658406043, 0.122685933823879, 0.446517425482737, 0.10947159377801, 1.52272774944312, 0.282766491814765, 0.149995818845496, 0.241890704521148, 0.211704996432389, 1.13586836311845, 1.74928796662334, 0.35732098355218, 0.0942287147426607, 0.367232775958733, 0.494157764417972, 0.0495553051036229, 0.555525373925488, 0.739784635922911, 1.66537245382631, 0.328733348193034, 0.182844389541859, 0.96090808785632, 0.620997150171067, 1.36091285099366, 0.0483821944503279, 0.269391229319914, 2.04903072887149, 1.69896588790055, 0.309357929137189, 0.862444993841647, 1.84396124067822, 0.135793159845811, 1.05848316793083, 0.695989625555952, 1.24353930361299, 0.275940362927498, 1.71272083817256, 1.47132602298782, 0.558260854482352, 0.682021673100408, 0.25088011750669, 0.246192649984452, 0.308713017839589, 0.6012639968151, 0.956979179835887, 0.950024660387664, 0.276114094669253, 0.397500536784862, 0.360493157136035, 0.339178632872666, 1.59921874751745, 2.54935918251185, 0.667589352874179, 2.98418371878456, 2.13717132044325, 0.300025534674076, 0.49632889720475, 1.01634207340606, 0.494073812278941, 1.09705429052726, 0.565733556616459, 0.308445497753273, 0.0877644909751363, 0.119092572312674, 0.62835583153248, 0.504046696624423, 0.864355465352112, 0.179769320445241, 1.38446440752976, 0.875348695779411, 1.59194817135806, 0.291298574324361, 0.387338127793729, 1.34704777852707, 0.436812921339168, 1.16504418144303, 0.0509155960566649, 1.05287474371417, 0.0921599104376289, 0.234655102885528, 0.795280623042385, 0.912075216823354, 0.474450076630261, 1.50999963292009, 0.12929257181446, 0.266508694024316, 1.30551800570629, 0.412444646857489, 2.6580831794991, 0.427265818843777, 0.00649475650600087, 0.861020205012243, 0.931409289423727, 1.25300383144337, 1.39852782899128, 1.45998226698124, 0.694815278397682, 1.31340607223752, 0.959805598258302, 1.19531199655448, 0.819577886623951, 0.433074847324325, 0.194869661641027, 0.457318722966947, 0.167375956803174, 0.344066079588852, 2.70110446403754, 1.13260883826205, 0.0586711262587459, 0.655825245151163, 0.214529519640043, 0.39613804024096, 1.06220567856937, 0.521187621877132, 0.580992015472307, 0.401222477796637, 0.428624308749998, 0.345210922903711, 1.58006691306147, 0.625795591256961, 0.0869354453017027, 0.827052455712802, 0.558050503298571, 1.27979209337686, 0.0336350755028262, 0.892925488095927, 1.13063906968574, 0.258626600112487, 0.082182982065504, 0.601231538589078, 0.895847676706846, 1.75907516630608, 1.60699959357566, 0.741663720678184, 0.912889761795143, 1.06703710805495, 0.388376089535367, 0.873328858284632, 0.124925138767967, 2.93784640233689, 0.0572902638358293, 0.0860550211344116, 1.56382467657296, 0.990552638614847, 0.659398532436799, 2.05143040218312, 0.0772691620539662, 0.630279181397179, 0.727892311832875, 1.23730673255881, 2.03979342318734, 0.522278253639433, 0.3523824073759, 0.0126305152202995, 0.884192374890539, 0.239255137067377, 1.50431983793267, 0.164050412703558, 1.84617730688733, 1.87438630455558, 2.91228341772622, 0.331598677710428, 0.178221185961247, 0.0476372694470718, 2.53239787862525, 0.441635176631176, 0.856257775250118, 0.822519302946565, 0.84006416871575, 1.51664228049337, 1.30343161118638, 0.929202549371224, 2.20928372371393, 0.0454866120052702, 1.22230011112852, 1.0070823529819, 0.44741836138007, 1.3560384988057, 0.283882796416647, 0.608579976073692, 0.330694393869685, 0.966850698968713, 0.526449385986222, 0.509352665540374, 1.8424496786259, 0.449418562572532, 0.379484355126582, 0.53293059188005, 0.0701223075673157, 0.502574868003094, 0.167664015358435, 0.095921136756328, 0.783418241556847, 1.33317990327452, 0.778894555658226, 0.0119820884241333, 0.758582216107565, 0.871138500379908, 0.0259389233147151, 0.72267516501087, 1.4677788272852, 1.63454346935867, 0.0420760951788391, 0.940398709431828, 0.460593908506112, 0.81579842948698, 0.458860287578265, 0.486242283329946, 0.310059726242304, 1.51884147564946, 0.493069278928839, 0.692115141116646, 0.52908612263678, 0.317286300196874, 0.659817062006464, 0.506265227160605, 0.385465705345106, 0.789307051310534, 0.64738925032375, 0.779536077736592, 0.268868166708464, 1.21898884975916, 1.21319774914372, 1.26118014073419, 1.55121912001629, 0.58027530809473, 1.40732814294452, 0.190308351362218, 0.1912931559429, 0.0128666422523922, 0.164653247782094, 1.90143980781227, 0.11378730749962, 1.35668779151118, 0.434277195134736, 1.20920997467313, 0.0678685195475081, 0.017173445350496, 0.977233096002097, 0.32981130563503, 1.80350338758122, 0.498465740762702, 1.58734340243928, 0.963424819292824, 0.351838243434622, 0.515259360132495, 0.408733266530562, 1.59332548720643, 0.476247088697892, 0.474844465068621, 0.0341929188673005, 0.192971350595155, 0.425047200416992, 0.0626110065354682, 0.470376671019026, 1.7913032892218, 1.18116514037734, 1.06463215313375, 0.58632690649968, 0.486153247714354, 0.89574541062471, 0.644040307857914, 1.71337039660739, 0.476904921582961, 0.401513181714329, 0.699962530131516, 0.144193473773163, 1.28046266382891, 0.528683413449276, 0.078164214834596, 0.496008778500996, 0.827577962699964, 0.68028349211283, 0.391119722791944, 0.575899357441391, 1.26385682601625, 0.395931219569063, 0.00974253167232995, 0.286592168079103, 1.76849358182689, 0.956258280783444, 0.5441317523441, 0.786539666480921, 1.40143954374867, 0.00902363991455094, 0.427981273827315, 0.906615335380396, 0.283588866799942, 0.356033114526455, 0.583697022629771, 0.376064174489333, 0.586158431917677, 0.0137316895525516, 1.40786288573413, 0.413431118551171, 0.501816597525789, 0.0835428734573409, 0.301667788378261, 1.50972413505636, 0.35448223673977, 0.41970994930169, 0.958991169516041, 1.51919141041231, 0.115418810005209, 0.545546961428826, 0.404412633606015, 0.748460954634191, 0.338398228146493, 0.0504174779464154, 0.827460827734414, 1.75592837599835, 0.402941498587918, 0.438555172651454, 1.1286642349594, 0.396240611938602, 0.464320115945278, 0.597155321846677, 0.0917902787063618, 0.292671356637619, 0.39041019994264, 1.40657701934451, 0.760749642725432, 0.725245093462509, 0.262445558657982, 1.00118907453069, 0.139181186235488, 0.261158401358902, 1.03307959613671, 0.727814963689532, 1.90756427603204, 0.264966700655133, 0.333112722976554, 0.308818792750985, 1.83248393219761, 0.885058695418053, 0.0436851636701903, 1.16965832438086, 1.66443923724697, 1.99704704588101, 2.35580381972848, 0.645886939559623, 0.407629677457917, 1.50175771509309, 0.111280387280224, 0.57040738822062, 0.741067926483092, 0.779848472972398, 0.118725818430636, 2.16743275136155, 0.0642037754378249, 1.68885263309651, 0.989979152945009, 2.03535377464567, 0.225775390650145, 0.949481841259033, 0.312997380487205, 0.775604651235266, 0.84599858573834, 0.859536406256661, 0.498414733174809, 0.664819292223975, 0.00450262992418332, 2.10713733092205, 0.272108143195029, 2.15151328170499, 1.24492679203346, 1.83805151488786, 0.570161999642932, 1.22624070578298, 0.515197463757405, 0.151105856430834, 1.66569281652967, 0.223313341658098, 0.802897253578311, 0.184738391238785, 0.0294525932724031, 0.926128949482124, 0.801762534905123, 0.484441766802911, 1.45810931301173, 1.17952971885193, 0.147078308725365, 0.264746456090396, 1.22231409949706, 0.775428690105179, 0.541409406293203, 0.758235753614088, 0.301856827765162, 1.76349683241156, 0.691111603134777, 0.566403696206073, 1.01876891524837, 0.240999120737643, 3.18311233222007, 0.265197613520063, 0.196684216371022, 2.04891500572985, 0.312218798140487, 1.29536833737655, 0.164851657138681, 0.620030588002863, 0.714632742595008, 0.805421676736982, 0.311626133776389, 0.148662267294819, 1.00566906267138, 0.0740323261106701, 0.00605097617247103, 2.13498266496445, 0.917931065627194, 0.228705847103242, 0.0207755201304314, 1.97665505505078, 0.755524971876775, 1.12232932678892, 0.188301243463609, 0.527020388275822, 2.05902209609619, 0.0961931063896329, 0.496716563144736, 0.84800830718544, 1.23886530282487, 2.45152014873011, 0.361288339744786, 0.463650213661952, 0.554562173029634, 0.97409565266406, 0.0977047753307962, 0.0138560567320247, 1.29817077622895, 2.23110335273514, 0.119580872391802, 1.3637602502359, 1.3960066046185, 0.043825190442009, 0.212068004087462, 0.482142688115579, 1.47048661705534, 0.741057871535435, 0.923872438292794, 0.621518005183975, 1.61441289841765, 0.327960883251848, 0.466892701678535, 0.276195080111274, 0.0817571698348812, 1.96580658115502, 0.373181049878732, 0.902605286748594, 1.19243523384276, 0.825714829131336, 1.53481629119121, 1.41961201815067, 0.778790253165815, 0.790395669680761, 1.67368643885906, 0.124741570774304, 1.70380554186126, 0.978787983008579, 2.7066764392758, 0.859550172074294, 0.554024906994845, 0.399141716336631, 0.883300848276327, 0.198547960099512, 0.389556101377818, 0.703515397012168, 0.746845421232104, 1.84102479441905, 0.419642948917211, 0.439251469849884, 1.41322466846085, 0.903619633229272, 1.05464974848655, 0.695308150009386, 0.273201874092199, 0.386019293281426, 0.543924898194806, 0.0663678114717509, 1.94735934391756, 1.55635204293866, 0.605891107327724, 1.26690095480121, 0.657553490299036, 0.837985763308252, 0.482310994594039, 0.926949276382056, 1.13812590951277, 0.123031401258693, 0.318486641195278, 1.50178000306639, 0.0599822445223912, 0.671614896954838, 1.37738580535374, 0.976696878882311, 0.782883107591815, 1.00462867745356, 0.336978676246931, 0.183227478873812, 0.903498416661149, 0.516525513143334, 0.0998536087285279, 0.0625729285732461, 0.342422207744307, 0.140498450895928, 0.430569380184067, 0.0283176575261599, 1.63049901691223, 0.652389532401533, 1.86115412884472, 1.22629240665882, 2.07577811054335, 0.344373909984328, 0.557332994574676, 0.266175218429447, 0.139175917145466, 0.680385019161283, 0.941503777981747, 1.10516274641013, 0.287916210316805, 0.474183437306115, 0.505652962759549, 0.361608539332917, 0.833482415271512, 0.540386973585675, 1.22271096738211, 1.13516810335941, 0.983298803356784, 0.569054852213215, 0.886250085190574, 2.45587973851957, 0.984612879676997, 0.33490614771837, 0.530108596621615, 0.388363294671662, 0.916244087604343, 1.11571198396242, 1.32501287477238, 0.121413385621521, 0.471501432070842, 0.676514643660101, 1.78489667180852, 1.82505530989367, 0.486418008084426, 0.429717744743499, 0.749565139720846, 0.509466289414498, 0.281207467451025, 1.35850235139132, 0.28064494910753, 0.192785403461022, 0.0800145680501216, 0.00995302435220202, 0.689602182046136, 0.217419747577931, 0.74718081966568, 0.591046263847043, 0.216769780095642, 0.73207512114105, 1.17760045230649, 0.185697985058637, 0.653594250724247, 0.972656007184612, 0.664643150544908, 1.02997934909045, 1.83569141976949, 0.148880994471588, 1.19311017525089, 1.5305166597248, 0.747202736835569, 1.11622408672362, 0.0035397330436021, 0.00540639838950857, 1.08429678922243, 0.175949981071411, 1.10266402334187, 0.312390273209478, 0.785035483645556, 1.40144530750149, 0.22532068178114, 0.875208716317538, 0.825190897293188, 0.569121487557552, 0.779505006987779, 1.66276401427351, 0.0996625273263207, 2.80579880938322, 0.601998836852973, 0.225930769831283, 0.0338240045347813, 0.631532194644809, 0.264002048362246, 0.66572465716422, 0.550471183744028, 0.0778137109252143, 1.455778768025, 0.912218838681844, 1.49822853202088, 0.648440761847396, 0.717329133251122, 0.883627537836783, 0.0424536046959009, 0.92898922480885, 0.73178014651009, 1.29311227844561, 0.859530095580206, 0.392377986891305, 3.45798591367054, 0.297622565428754, 0.0928956373497482, 0.115342828200427, 0.308824017731442, 0.229671883297874, 0.399165847554563, 1.25991942468375, 0.213068853637909, 0.374737494474814, 0.352989965279685, 1.28774164725765, 2.03568666344098, 0.854181971378253, 0.000328703792082699, 0.488530754218806, 1.28854457590239, 0.811602144623144, 0.197369007582792, 0.460496635152725, 0.265202513491082, 1.45426534684649, 0.251087894956094, 0.298240536061448, 0.99067236476113, 0.246781756324837, 0.680771788906498, 1.22797809377283, 1.22457971097459, 0.543519837917116, 0.39703367357227, 0.215945651705393, 0.0297302686955516, 0.650896572125972, 1.24031833424744, 1.07019279328719, 0.234667364809043, 0.514521306337586, 1.71160937415904, 1.74401388441698, 0.31600549208411, 0.74715870720426, 1.2082485725135, 0.144691264459074, 1.49120536861741, 0.960043192150442, 2.29028770317833, 0.74691391810218, 0.913011096188427, 0.457175939097812, 0.969478105354626, 0.624979006450373, 0.263865010182912, 0.313139535422427, 0.941571539664773, 1.17986768953744, 1.44501328639709, 0.117431599174814, 0.480956506800446, 0.493685234834386, 1.61542686582699, 1.64344627231347, 0.492102553557348, 0.36157978104925, 1.12733456390628, 0.512066978083952, 1.02044499282367, 0.875190432659147, 0.0204887312757552, 2.83628094726458, 1.0395505112967, 0.30575287919883, 1.47748990044183, 0.677268666066918, 0.905587740085977, 1.62215325150741, 0.0678997752083872, 0.238720210315516, 0.182626378216773, 1.65638816395497, 1.14970036858628, 2.09548431366744, 0.582342364698191, 0.225714001370198, 0.626768527433315, 1.34026858487751, 0.441427135275072, 0.033547938539784, 0.514043000151192, 0.0664070591774609, 0.684579577907551, 0.105101260189635, 0.062047801093771, 0.396945784619747, 0.608212720422103, 0.805685788142145, 0.501649448849746, 0.0259509952897559, 0.12218134964688, 0.59035260322165, 0.421375334162781, 1.61526126543073, 0.363642387621403, 0.924807189552314, 1.03443189777481, 0.295600762994054, 0.255761662172707, 0.353641971489028, 0.374664369821419, 0.612712666132209, 0.331730992954371, 1.09813135672636, 0.0883930463513997, 1.54475807940402, 1.24897109999528, 0.315612176753132, 0.396025419318367, 1.33951874597274, 1.91246967334755, 1.25284042686198, 0.928653069212724, 0.524859396307366, 0.302455996212025, 0.838336177070595, 0.643702264831, 0.431360606377647, 1.74293632465309, 1.26966688888671, 0.639588220200969, 0.028577506325881, 1.04723456631401, 1.94169040590408, 1.12350387413869, 1.60703304928834, 1.3226704645448, 0.13470721465751, 1.3278576465598, 1.21556292384473, 0.0156270027914305, 0.410051111797409, 0.589011673238391, 0.0328373388370193, 2.4704058270779, 1.31983504782383, 0.384981465721174, 1.81938841192431, 0.702077910618092, 0.00510322759888994, 0.816401826202479, 0.562076477984098, 0.726160327686839, 1.33676902437352, 0.539318890768057, 1.56415943435916, 1.07224645712806, 1.27441495102929, 0.618155292971176, 1.88060249417262, 0.0904536030893845, 1.83786324270616, 1.79769141333449, 0.712867357770126, 0.244321088344486, 0.0887766047144945, 0.330841030548733, 0.592049849401261, 0.589437372974043, 0.198765374680068, 0.570181626609932, 2.19038623171842, 1.13359240028183, 0.473615721031583, 0.312466859360406, 1.39299763404264, 0.281501558246274, 1.43489005079836, 0.020772047324314, 0.418237871814125, 0.341863144291297, 1.74690978314863, 0.377237907059675, 0.522680713583448, 0.720342302349064, 0.114613687434131, 0.0126284989665268, 0.630333737698193, 2.35920833368223, 0.682507491523109, 0.0496331447180806, 0.334757843492276, 0.676096191866821, 0.798732718851666, 0.268482076829002, 0.137777617028039, 0.962028633188183, 1.11464474106886, 1.90135835554369, 0.0212808560181081, 0.195113158604516, 0.316116168866787, 0.608438570158006, 0.88847072376507, 1.97714602212465, 0.648191130880461, 0.208134340856314, 1.70003012777116, 1.40309441314824, 1.4916887096198, 1.37978618059339, 0.286942312183584, 0.205424513578068, 0.49462383788222, 0.682940159495058, 0.453894981499832, 0.108079141873821, 0.973613751604398, 1.35172246584907, 0.924293167105215, 0.887679130674496, 0.462930252055093, 1.62650960987027, 1.50490041299578, 0.684384467109336, 0.010114642000104], + "y": [0.400186293759868, 0.410150497410415, 0.147817150443223, -0.071809912708905, 0.237031723306347, -0.104818771586418, -1.37464474579064, 2.24257902674854, -1.06680994896124, 0.982403792140793, 0.236739515663774, -1.82703515499173, 1.62543360802639, 3.25956935704872, 1.82602312721589, 0.807353996212157, 0.288659542615927, -0.585459054670095, 0.833532629408983, 1.83834498141863, 2.01149503550576, 0.660213380411584, 5.04867800024519, -0.170432857935459, 0.410210266452848, 0.556934131218736, 0.839873434425846, 0.512260114469936, -0.52321565830738, -0.939636958457947, 0.316501055821141, 1.26183502800552, 0.555536448451209, 0.455948030330004, 0.90356399615874, 1.06500551883596, -1.66126159409027, 2.51380553373482, 1.56711621987873, 0.529256422844372, 0.0452110877445497, -0.278727776146157, -0.513989918509595, 3.00866823266525, -0.37250719565775, -0.148583152788958, 1.00215269610922, 0.976221799511986, 1.7985165868343, 0.788794979507778, -1.98867822040832, 1.30176121234086, 0.998006711911393, 1.7472117273045, 3.10802327853253, -1.22394917268688, 0.899874870407368, -1.0709169065319, 1.93048195916003, 1.51622501240473, 0.0276832338304422, 0.466920839695451, -0.657290302331008, 0.614105581409604, 0.310983997024948, 1.24403164907164, 0.98708861167129, 0.415407195703237, -1.84798593053165, 0.0281532998128025, -0.600964038851645, 0.436614600660491, 0.531118636716462, 1.08515778104533, 1.02660209280025, 1.04130157164943, -1.08460049042505, -0.315199832657846, 0.999628470835676, -0.458294057331866, 0.454837632829601, -0.347317351061684, -0.668297360622603, 0.5620773558694, 1.55240423823205, 0.0808481738940115, -1.32237419259817, -0.4130288113822, 0.109095117768023, 0.0743772388611734, 1.69099670976841, -0.277145715769555, 1.61855857979603, 2.38066545613749, 4.67896987145721, -0.604210196685696, -0.831262228980211, -0.386805898571927, 1.71552656538722, 0.275328221752744, 2.02994352415182, 1.07663568476939, 0.228382003601172, 0.390102140204815, 0.340379950923291, 0.738712628609655, 0.885373469901976, 2.56588418923424, -1.22836269599088, 0.395721980641715, 1.44885536470328, -0.718575340648234, -0.261274458094324, -1.40711501166726, 0.92623231610411, -0.488403143636067, 0.282771601212941, -0.400604122336304, -0.7868449306334, 1.95735211307068, 1.85166749172791, 0.544275043060664, 0.763966643473498, 1.58439097899177, 0.9363491162808, -0.0967286449763419, -1.23270556746379, -0.0308666384725791, 1.14004130661234, 1.34442249722987, -0.587450058441313, -0.176777099836135, 3.51607390244184, 0.37600353151894, -0.261649459209895, 1.68691051158348, -0.600940680363445, 0.544700175898197, 0.606911799938202, 1.45687118827357, 2.04302970510225, 1.37620758260975, -1.09318343956831, -0.821157875645582, 0.545932551486481, 1.44452368463333, -0.765488825970351, -1.26200667142179, 1.58185896785161, 0.766167677917396, 0.547531837045145, 1.16679429362019, -0.462098450126613, -0.846741386217836, 1.8396750571272, -1.49586975663449, 2.43143457098105, 0.158023526346644, 1.09462945062449, -0.425110508599766, -0.0928451712336122, 0.810941249229375, 0.610671342031119, -0.856477078050643, -1.46999715858445, 0.927662368869704, -0.0219208507401088, 0.511766056326621, 1.52581559587261, -1.46247644534489, -0.114238905837884, 2.16694217700184, -0.455826747586499, -0.309780282744117, -0.914746498038337, 0.280346130541108, 1.45144389321729, 0.45460403789604, 0.853664301011682, 1.36900709842647, -0.871455537554603, 0.131458702786252, 1.54575394428789, 0.502077436281311, -0.152262059890523, 1.50919218127136, 2.46965677418696, 1.78213965748142, -0.495944781572716, -0.503576650251336, 2.81887224935298, 1.43964152486927, -0.342415145584542, 1.8559382912762, 1.26286882580134, -0.00296046981412345, 0.21679833086795, -1.18528228753655, 1.12124894688739, -1.83658328238979, -0.20850284929743, 1.66482898709132, 1.93302861080127, -0.0887758482777155, -0.603616732273484, 0.361383096303557, 1.42883205956617, 0.922174155230272, 0.852114570176507, 0.713287365275845, -0.228376400800387, 0.358437983843783, 1.86419590880574, 0.928849357807222, 0.213618525112922, 1.49402096695491, 0.682080675758735, 2.83345954163249, -1.28850902555996, 1.08158567499356, 0.892082565389806, 1.30862350475036, -0.27770471467966, 3.28854145744972, 0.904909765549941, 0.769135018116006, -0.35769930385805, 1.0446465719007, -0.616451638702021, 0.108196840535223, 1.21525381468705, -1.59618819538807, 1.55937310247805, 2.22600592631274, 0.462906378658113, 0.341765295358663, -0.721824936717283, -0.180503790643147, 3.04353758128121, -0.0657998686333718, 1.1743963075835, 2.4955300260492, 2.11182131660835, -0.334596883731015, 2.29865058821449, -0.949105363322911, -0.788836948834647, -0.532137801907274, -0.947427456218273, 0.599772263187581, 1.26178322316184, -0.685259821211785, 2.14823537980733, 0.931722162899815, 0.597924503971703, 2.91998083394124, 2.20788738429591, -0.00200401164980146, 0.624473335386282, 2.35887476859956, -0.0210442745032466, 0.29003394206072, -0.346029879617229, -0.697025586554841, 1.19849197839087, 1.39929617864627, 0.0920165049439733, 1.64394957483251, 0.0809314528722282, 0.0678586136105667, 1.7634290568491, 0.647476185140171, 2.02035893937167, 1.71622715601347, 1.07875574261333, -1.47084396712003, -1.20759497234956, 0.431538866418436, 0.285280123588504, 1.08510514456328, -0.54986429898914, -0.524325680312491, 0.667032640761389, 1.81550226289434, 0.0309999519557867, -1.29458047109387, -0.463215356320987, -1.59736318872092, -0.96408893496941, 2.54173077215311, -0.655974001181127, 0.61262463883011, -0.358222042884778, 0.867869385917155, 0.291813325237627, 1.67195555324481, -1.04520358870125, -0.105665515388377, 0.347551029094526, -1.83582761363813, 0.0727283617330544, -1.42700423338962, -0.486176441661296, 0.488698521979898, 1.71283452478623, 1.16225669435205, -0.815430842937563, 2.30692593642248, 0.0718950474341296, 0.485371131130325, -0.902247853206936, 0.370024156129422, 2.59969922094579, 1.32786187789326, -0.767105127548188, 0.343588297220095, 0.11250613812493, -0.122769019805536, 0.301895651063504, 0.136389195842935, 1.7030040966341, 1.83184889790609, -0.212360291184917, 1.45497374395769, 0.220793860448652, 0.434209856475945, -0.086174135386466, 2.56493615608129, 1.32439156263257, 0.963082413591927, 0.0889508928468383, 0.265090584734682, 0.486676583906566, 1.01124457224388, 1.09628167781407, 1.63268335969722, 1.31745311488043, 1.41141773483689, 0.673835840751529, 0.64051284637877, 1.76872302116098, 0.183492125956977, -0.880434910420462, -0.203350671270712, 1.62924038579941, 1.42282037908116, 0.708081173982421, 0.507390667100491, -0.0886270282179681, 0.0104375777077574, 0.824126781894502, 0.124251106028555, 0.743518876341133, 0.294518324069354, 2.41592464135367, 0.187762924036772, -0.278795271558073, 0.305327578272243, 3.25319818442068, -0.253957913963885, 2.24155933368445, 1.90381811271445, -0.949093367414038, 1.86354245597381, 0.731583165417231, 0.986699612199949, 0.807253914449216, -1.16221695824179, -0.261444160786038, -1.7626969480734, 2.70765038817996, 0.787634862681746, 0.816587321266941, 1.7679262097664, 0.855749059532086, -1.2109977230225, -0.281628960552952, 1.78640029107026, -0.108475881689369, -0.420055026009193, 0.417815649939849, 1.2236178217632, 0.915105904489554, 0.502201290187384, 2.03038334621565, 0.190254536202984, 0.687505178879096, -2.53765529278829, -0.474786312838316, 0.49349207997715, 0.47893852046198, -0.00747110099314827, -0.534504224889321, 0.933132962600192, 0.92508887006683, -1.02820166833859, 2.27007421938189, -0.702708343462408, -0.705161528200508, 0.439362631867077, 0.951908921654487, 1.36736396704872, 1.04468157398513, 1.44942103578182, 0.883637289675161, -0.427329412644942, -0.933415595136261, 1.26050926186266, 0.095911365374284, 0.172056031855768, -0.154318959387507, 2.21966174824789, 1.03108776641441, 0.262101360390249, 2.21689330342465, 2.50615620073145, -0.8801086478835, -0.631583817334271, 0.89389192788251, 0.14625093559316, 0.169241396110592, 2.16789605158672, 2.47233966202017, 0.388876738146613, -0.676877791529722, 0.90862680239711, 0.692636488721085, 0.558528487333624, 0.11390124188846, 1.57096753242376, 0.815944929730209, 1.88031848166726, 0.143647979149025, -1.12004339811017, -1.88476342552741, 0.195845873808905, 1.70044480682052, 1.21848827782614, 0.704081859256378, -0.64431505773636, 0.840629910520775, 0.350173891901036, 1.2501837829471, 1.29256175810572, 0.618080102066378, -1.39627651956395, 1.33329344499024, 0.510604082208722, -0.534763172279756, 0.357938095292742, -0.200241451084902, 2.51659621770402, -0.582329422212632, -0.640048834306582, 2.07687804649671, 0.737821864268443, 2.77314159872385, 1.14470186170279, 0.923325781459673, -1.36170170125609, -0.380905730431515, 0.354527866417252, -0.579047519067023, 0.924663943123913, 0.0130933114849956, -0.837300783373951, -0.258800035781998, 1.82534997573507, 1.41804419983984, -0.24814561012498, 0.303311534204408, -1.31274183197906, 1.7802936483779, 1.04504874698475, -0.216594602392661, 0.655433418315735, -0.574590543711138, 1.39287817123881, 2.88651435884829, 0.486716336790236, 1.1394668209712, -0.271385774077329, 3.3698613053027, 1.42129974628617, -0.409641788537513, 0.951130614741679, 2.12217100284729, -0.168971806871095, -0.195890326697831, 0.321167136742278, 1.59128684793884, 0.470963415701231, 4.29525340053988, 0.258433420434775, 3.36521283544368, -0.499268409123038, -0.360340983561164, -0.495270104170995, -0.918059780164284, -0.955096416324573, 0.669511077345973, -0.295942985554463, -1.32251517379185, -0.908906261166653, 0.33517541521802, -0.438427912234636, 0.177491799056667, -0.317511876831982, -0.00348622845465025, 0.916038655649805, 0.174698826281414, 3.11547445609589, 1.89688806550564, -0.770469263961367, 0.243211001412321, -0.195731304988662, -0.427396430761075, 2.74490675386327, -0.427027786734515, -2.10848246485934, 1.48298852034809, 0.284248565798298, -0.86029858982477, 0.492397383250047, -0.720305191113116, 0.715627778153054, 0.473973656076419, 0.536847513584191, -1.79292877006197, 0.304608604357422, 0.696957091636233, 1.36540262747795, 0.781464548833932, 0.942816997894703, 1.08511850610242, 3.10242487036611, 1.58020593942806, 0.896009254998366, 0.793162887877531, -0.304029344260909, 1.22437373667219, 0.479440135544257, 1.82739664333756, -0.552380793736534, -1.05363741631274, -0.994534598699998, 2.54322851208753, -0.553399673332943, 0.705449168637719, 3.07761790512683, 0.428466630751871, 1.34772180485892, 2.0959782842457, 0.515281901199478, -0.394969930058238, 0.250779620760821, 2.10669733701159, 1.2854089319904, 2.46617048041473, 0.944663346523459, 1.16277265028632, -0.169683023838771, -0.0811552736202906, -0.250991993075694, 0.83784529684053, 0.797415126853536, 1.07697674445326, 0.190909158305696, -1.76756894768189, 5.21956165567293, 1.72835797123458, -2.50074949545765, 3.03815062465966, -0.12174832294283, 0.67266702489097, 1.56471484780833, 0.496888120077751, 1.19954687851411, -0.0765814991405092, -0.5295670764015, 1.67844763739164, 0.855019245765018, 2.1064172085085, 0.624559855606197, 0.569195909104951, 1.79883995455118, 1.98377855425072, -0.916404816944118, -0.0583656458667862, -0.844313177478353, 0.41095499475689, 1.17327396244205, 1.23034423752529, -0.980344067180854, 2.17666161414724, 7.3825312150853, 2.40800865938884, -0.0809701650711216, 0.529842230475825, 0.388258066292143, 1.05633511718371, 1.52135409932905, 1.68149822956109, 1.81956167415809, 0.383285275756284, 0.385576576401411, 0.242845607778679, -0.317147257100245, 1.37402855841586, 1.39938961374693, 0.298198799577103, -1.63392487985617, 0.254501096417079, 2.05016753100236, 1.60765738709522, -0.807479676477176, -0.887566818000924, 0.242568843937427, 3.24521596151904, 2.43588799139241, 1.39011923065557, -1.30422820611593, -0.730576790505411, 0.540095708612317, 0.583339802288051, 1.7308686122466, 1.31711802204017, -1.65059375530925, 2.68389288380833, 0.305393304454963, 0.0253760769127131, -1.40178342558737, -0.682457887356139, -0.0294209269657636, 1.32834465840369, 1.75964209840848, 2.37928194231403, 0.371181237479415, -0.291091313831108, 1.63993214547326, 3.03099184589819, 0.355291799348822, 1.16671105979152, 0.443177150269353, -0.370734310707566, 0.252402701033803, 0.822838271329552, 3.05129094963027, 0.339606275963476, 0.611849281034099, 0.630321666572984, 1.35242161276917, -1.37574469825357, -1.95277356067565, -1.3721080835257, -0.959121930953709, -1.08379725640916, 1.36866448604596, 1.68257101396094, -1.57504251780845, -1.77222239091789, -0.0346436690830643, 1.28053533393237, -0.561387078281678, -1.14523157677744, 0.502057416166133, 2.22268739828922, 1.96926107394599, 0.846716523308797, 0.407503411034756, -0.0554247072385792, 0.0273668149988202, -1.93068786182995, 0.147249980940439, -1.21579547337842, -0.99153126446963, -1.29466778233216, 1.45754453230951, 1.73629479054975, 1.89079025696033, 1.7656024364973, -0.11449723916146, 2.27370172180962, 3.22027206968146, -0.753679753401901, -1.70402200578997, -2.29894369951741, 1.05093511814003, 1.56585158988078, 0.411694137243429, 2.3549269371019, 0.417408066679555, 1.12450423578555, 0.640910005387979, -0.109307494679577, 1.97756345274785, 3.02197735169633, 0.580931848659306, -1.49706137964149, 0.372404678665891, -0.835491600814045, 1.63316841043777, 0.289851741881563, -0.579217868052076, 2.4720832520438, -0.733327104840403, 1.36522043997721, 1.20445898688398, 1.06466863553739, 1.10218218027769, 0.295474523797312, -0.25632465537419, 2.20930710621711, 2.43851892517936, 1.2819920139068, 1.14245946240566, -0.296971401144781, 0.218953284455349, -1.15999946683288, 0.202758154135942, -0.946788243912813, 0.330789898435632, 1.5325150918905, 1.119785362872, -0.484435361316876, 0.200278247111615, -0.407451782213532, 2.09516126257152, 0.275877408212127, 2.11398113573404, -0.82290123656569, -0.685445631321013, -1.4318783811584, -0.16811305961268, 0.0781646744775894, -0.248794800299751, -0.427662627367356, 0.445177841186991, 1.81066282780194, 0.212940177448507, 2.05568272772088, 1.74914737833896, -0.773693274909678, 0.570771363406627, -0.432198624020687, -1.12426699183736, 0.267164759324961, -0.0812416094811051, 0.698616696165779, -0.591584349176509, -0.245625059516955, -0.0497652915820381, 1.78721843507108, 1.39537847824221, 0.029643827710171, -0.555351768384356, 0.49366293496606, 1.05623941799205, 0.468919606236077, 0.962512656924679, -1.97220712381594, -0.149713414227323, -1.94611832943513, 0.634633127039404, 1.88203907417765, 1.71075241116571, 1.14618461839113, 7.12211134453435, 0.465555045889567, 1.93720911564224, 1.13091879955628, 1.95422601850261, 1.0697440279972, -0.348102673701992, 1.17915301491599, 0.582603692926971, 0.629598305167005, 0.0405895375660763, -0.124378868155198, 0.610091499445504, 2.390882250899, -1.13363079358748, 0.816407115472195, 0.915979555891389, 0.226438297746389, 1.05956662928692, 0.684492653248824, 0.0346071928449778, 0.354903512754254, 0.669067330895339, -1.01838341205264, 0.352593612778701, -1.6536124400266, 0.127578474179559, 0.836870926906211, 0.0691183513272036, 1.0456885995343, 2.25647465029712, -0.399721969777828, 0.0382960304602149, -0.280741889534964, -1.51352138967837, 0.457086914634411, 0.292897436915741, 2.15151083718068, 0.452657193558212, 2.50768906588505, -1.80809607057477, 1.30466284817433, 0.692499919861043, 0.734119829720129, 0.323374800103266, 1.00578650819001, 1.47006809993987, 0.0563594191178222, 2.72066809437371, 2.24072023724159, 1.78611308368546, -0.918987219836239, 0.83407629294059, 0.252856913185328, 0.283190578254575, 0.644749751279374, 0.224279292652883, 1.12895501387143, 0.711586259760628, -0.971772931675215, 0.681752144006155, 1.59730598285044, 0.179353605381272, -1.18692138234801, 1.02060846053324, -0.419363208526493, 0.174600283244244, -0.682408679972899, -0.615922633775594, 1.83706914468446, -1.61513966052721, 1.34425278497106, 0.150696782146332, -0.171577135671504, -0.898759802144325, 0.218084937584043, 0.897149540411448, -0.133465696469627, 1.35588594983013, 0.854274695972545, -1.32855650837053, 1.26972666522595, 0.275408899156081, -0.975656846100444, 2.19454647451566, -0.280901555310166, 1.76255128366286, -0.952867233497333, 1.61754619781435, 1.38069671957793, 1.98601061311329, 0.306154890253245, -1.00785900653416, 0.376301785250132, -0.431497187138367, 1.06930679146752, -0.945219319711158, 1.82186316082919, 1.05833101290732, 0.275812727093442, 0.324071397403878, 0.427456984008214, 2.29793228803896, 2.54912447300993, 1.2322385621487, 0.753765156936497, 0.454935645525021, 0.156831615458216, 0.294717953465109, 0.430496846558356, 0.482143792771304, 0.205211747851167, 0.0565461910404753, 1.17573173609142, -0.017532811030858, 1.65477403156107, 1.05444176679911, 1.12012033185136, 1.66569806526782, 0.0117998783206043, 1.5812779691698, 0.520290567989046, 1.27705592839742, 0.024327381875387, 4.28213814878328, 0.972795880558411, -2.30453084543872, 2.26331477285559, 0.473219844737015, -1.10106031199892, 0.373549303496773, -0.478744790131591, 1.43309244866665, -0.306655980068881, -0.694900480598983, -0.0712376822220707, 0.557856363843336, 0.326902340611045, 0.460236907193785, 0.502566115167119, 0.562699516409934, -1.7633810432581, 3.12366471365185, 0.91037718092659, 0.565596228573686, -0.659194579609718, 0.736832818125156, 2.44257335711996, -0.188559182462022, 0.764829316329308, 1.34751513958817, 0.665452004757833, 1.57784721366535, -1.47591781156172, 1.00040709899432, -0.831448776460721, 0.875523881887278, 1.53173299502801, 1.02073966124151, -1.8254538404734, 0.417839361957676, 0.33514254609718, 1.63192034442221, 1.25340201906083, -0.669456517529033, 0.232277655622613, 1.77998425104405, -0.241235042612596, 0.69499174248795, 0.122276522892215, 2.24201934220174, -0.789802761510776, -0.0692277744884471, 1.01075457079311, 0.888559231230546, 1.34451752866074, 0.691477603157941, 0.139655758365076, -0.162839286606248, 1.34178402623352, 0.114822830743437, 0.713529844943438, -0.679206294893186, 1.14921907505675, 1.80255381348255, 1.82211131198235, -0.0607677017115662, 0.0333405452757199, 0.535503222897472, -0.263466459306351, 0.625865435455129, 0.486192119371492, 0.533900786889248, -0.621186661929115, -1.52964484489408, 2.71067125554615, 0.160228676918643, 1.25464570769812, 0.69480087804769, 0.0156674204756941, -0.467423964722999, -0.270990757124309, 0.227194626381947, 2.02377018985617, 1.18086589658694, 2.09654945590107, 1.12101527317715, 1.51478085695065, -1.28187852505273, 0.753834695516228, -2.39465446932636, -1.16420838836148, 1.11674292912356, -0.0827448167656152, 0.493791674616436, 1.39908406659205, -0.447712899023755, -0.177676971182085, 0.70830582554016, -1.03013581359005, 1.79768276012086, 0.221373488769072, 0.330449800597729, 0.227043764732, -0.786441363535116, -1.70460397809719, 1.52403987623465, 1.05529679672589, -0.289607380071175, -0.809608475359862, 0.568789384658756, 0.996038156666513, -0.277860299384618, 0.222107912916433, -0.730322729925633, 0.318327071308618, 0.285700328488902, -2.37359676348775, -1.56319332655669, 1.03136597697702, -0.8964789375147, -0.264641889418357, 0.491871177729437, 0.648671654301057, 0.547084466223993, -0.706469735313777, 1.36889934766756, 0.245915860840915, -0.649305103823086, 1.32790604307478, -0.0662319402888519, 1.50813615777346, 0.186151093176209, 0.402918737401559, -1.79308054241919, 0.483418765078878, 1.31953821513009, -0.459058902701279, 0.709597313121566, 0.512712181163222, 0.454201926888677, 2.63952976038753, -0.669940258284557, 0.33541819005609, -0.154281428365716, -0.703139993731223, 1.26569709038302, -1.45459413485007, 0.482652732323554, -0.536459962116078, -0.874233982106233, 0.860708279195228, 0.376467664340132, 0.411414015151828, -0.142600003508689, 0.469809463083589, -1.15902166857212, -0.409837506228186, 2.4251299473955, 0.761542523740674, -0.922377114930206, 1.77327498478109, 1.60395077819827, 0.167587639209391, -0.5050789967392, -1.10059679690716, 0.179646782569831, 0.924358137986901, 1.72397756856692, -0.643955217773223, -0.489379494872692, 2.23587102803928, -0.569109689095159, -0.114279585292066, -0.164985202964495, -1.08124944486948, -0.183104719238649, 1.00585232801172, -0.423466446109852, -0.936756734180237, 0.905620966999535, 1.17306097091984, -0.445005159447611, 2.43544894807345, -0.212958483990401, -0.0880997148345767, 1.69666164048081, -1.22094290598535, -0.101842777744942, 2.54583204010742, 1.43627684085589, -0.126549701236851, -1.04884890736406, 0.557769955781453, 2.64650987740289, 2.43488089039762, -0.385406960048412, 0.778250956272235, -0.765229495990445, 2.29704785564688, -0.760885946552481, -0.643449526958978, 0.0893511272116345, -0.278703852228934, -1.64349118879255, 5.92785495750786, 2.54382260548507, -0.443299334985856, 1.90519765444164, -1.36020045421536, -0.174893824070884, -1.09444911550965, -1.0909352045335, -0.928093378925528, 1.56182052903431, -0.547660266742223, 1.98031365692622, -0.392193393029043, 2.06337971562472, 1.09870851939731, -0.121751035234211, 0.0370328848442831, -1.24571844235033, 1.19289006645749, 3.91502617204725, 0.914967755017003, 1.471608456006, -2.06671640290455, -0.358896737399758, 1.06605272127653, -1.25032728833275, -0.796614901649643, -0.860187138067488, 0.977825427741821, -2.33151893570376, -0.573943498450783, 0.489718989055982, -0.640357456752218, 2.75207823856166, -2.15783364985778, 0.908110299276506, 2.07410581091208, -0.829705644873645, 0.693744662833274, -0.437097368206771, 0.274024629752154, -0.512000315792241, 0.642938910805753, 2.05770664678358, 0.894878991398458, 0.550496578960773, 0.221201787889671, 0.474172807730628, 1.21697211352313, -0.7765499470906, 0.300097663838313, -0.542646030395428, -0.123496659708717, 0.0942963147807556, -0.226106851744806, -1.06006135182173, -0.749321932334526, 2.14501769762263, -0.248838918982749, 1.27832479355742, -1.6473920129901, 1.97142009989872, -0.301832919381566, 1.62987031737184, 0.528103395847338, 0.467932411119645, 0.828868955110127, 1.75796314506479, 0.128585963122887, 1.00100806088619, 0.126175579743401, 2.51923667193589, 0.130387488696361, 1.99307948460032, -0.437424625625764, 2.45420729088645, 0.211491867567114, -0.701282081122978, -0.216421785115717, -1.54324294043205, 1.08815929135095, 0.480311940940649, 1.15380682615585, 0.862787795440946, -2.02001197374969, -1.14774807656163, 0.0393969294363458, 2.37091743358378, -0.43284994490385, -0.246786426399643, 0.867579473717359, 0.203084926415334, 1.16676571890101, -1.21347925324196, 0.736037303639654, 1.03581535696395, 0.296133780720732, -2.10663919759499, 0.751379718295487, 0.277983965218653, -0.494225598824657, 0.44461487077093, -0.135262114609702, 1.16935914152732, 0.0537051628892442, 1.71796286780148, -0.594003822596986, 3.0575899951725, 0.272151043685659, -0.865287261442757, 0.438446897994692, 0.508412160917704, 0.638576436276887, 1.29433921381695, 2.2092088816349, 0.600431683373056, -0.266035372578216, 0.549042443458124, -1.11499733171167, -0.228455817856755, -1.08966888324278, 0.395382125915721, 1.60873076301566, 0.00868566325149676, 1.4770621380254, -0.636511852078505, -0.0160573297288086, 0.511896385681888, 2.60626093792895, -0.640638681309771, 4.05971204355353, -0.0473703623484139, -0.252701584309821, 1.13248796505476, 1.83892612374609, -1.45180294890083, -0.567977283302321, 0.577953326867155, 0.938737004407181, -1.09501035364652, -1.4241804465178, -1.88466790554975, 1.42108524742454, 0.597442337510234, 0.768387446999175, 3.22175491802404, 1.87613462659984, 0.413520180019883, -0.0729625849324934, -0.285455131711179, -1.10951725521812, 1.03134426709051, 0.816818212836347, 0.425945111963694, 1.45128544374604, 0.89860230425624, 1.01381648289045, -0.700663713425111, 1.66951341990638, 0.763697850574787, 1.79414065473304, 1.52900209988382, -0.796787721589407, 0.68736304255652, 0.553964029661762, 3.63118583661427, -0.917943167962154, 0.677818870519307, 1.5239796689368, -0.444066058711405, 0.126081259517712, 1.41502607460091, 1.09754941822058, 1.08197164220827, 0.715493089809695, 0.400569466010561, -0.308872919338266, -2.78711102602481, 0.42360770312629, -0.555984395662063, -0.0125644464133146, 1.13974858383863, -1.01027041083009, 3.05162188930186, 1.01819728154106, 0.466766385798161, -0.355812446521074, -0.7581333053678, 0.112459943154997, -0.503588414994025, -0.358362091797034, 0.644747389994604, 0.11799638116144, -0.338102350313366, -0.42353263823309, 1.89691104647799, -2.40498578523371, 0.276302835677493, -0.213921857036925, -0.37383997510333, 1.30623733385664, 1.15771199152741, -0.2437459572586, 1.29126382395732, 1.60230891455518, -0.937439234044324, -0.571901276676727, 1.29897680920618, 1.8678519512372, -0.0815785715597988, 1.89827468284208, -0.114222281575555, 0.067566823313568, 0.790972468740432, 3.22324544861866, -0.681119396638106, 2.62586061258309, -1.42015472107569, -0.413877864006587, 2.66955646694339, -0.169538368825287, 0.573914931539252, 0.879979068558929, 0.598975420226513, 0.410874747556652, 0.869491214833206, 0.56196417377438, 1.87676647607329, -0.294535394700285, -0.214752993144434, 0.302386429903323, 1.4369837578525, 1.62290857833383, 2.1234562113696, 1.12168478629923, 0.284896396927904, 3.23446556998695, 4.69758028188423, -1.02838319556625, 0.210912219065509, -1.06316754035276, 3.25191321216205, -1.23553016303094, 0.220738297142598, 0.1245836405622, 1.19103416583567, 2.71345194176392, -1.68831388474309, 1.23279505295903, 1.39828590021468, -0.340353697232333, 0.994612612928941, 0.238416502788949, 0.211634204243669, 0.852797466703139, 1.10455459029496, -0.666353533992189, 0.522770675437389, 1.1489276485547, 1.08088539620171, 0.824463975253717, 2.02963787198968, -0.143950809670339, -0.891292645104018, 1.68203718314135, -1.40749338612285, 0.146551937627228, 1.26222035705114, 0.197168597517206, 0.663454184493582, 2.38469320202871, 0.773878231710596, -0.847309582502129, -0.131231273306233, 0.54737731972027, -1.64778150534772, 0.0661195996950283, 1.55419558678366, 0.526645031894696, -1.90481689167447, 0.265390408160661, 0.575027176966512, -1.4570870726569, -0.3998620727502, -0.189981310014298, -1.46638525904022, -0.388676731073504, -0.0980705745027813, 0.881595638885266, -0.0621413653427886, 1.33065669393777, 1.21949246386117, 1.37101982098668, 0.587306348657334, -0.0791020282219377, -0.793436009207845, -1.29615710849467, -0.733658270123904, 0.65325307470584, -1.4011636599194, 1.25530799933944, 1.44302195545336, 0.190787580761306, 1.30723860288168, -0.91475717485147, 0.636235411925856, 1.22514757169581, -0.252128620136495, 0.589706914625829, 0.969514640857719, 1.96951940543799, -1.2942917541534, -0.950064294577377, -0.315373693645459, 0.245246573652382, -0.466870495474214, -0.676627707759279, 0.922460115681555, -0.167259128187567, 1.16069649891765, 0.540616498542264, -1.17473589203829, 0.72106216176567, 1.64620719788313, 2.26602531613903, 0.0602440808173971, -0.13775393417564, -1.28617574386667, -0.601005235547623, -1.46814704687455, -1.98675643137028, -1.46371713477456, 1.25605688103184, 1.94218195890938, 1.19969405970808, 1.48202700596216, 0.190527546758125, -0.543566192041809, 1.22506351345719, 1.09881338261996, -0.443611309118775, 0.603887121805586, 0.251656919477093, 0.767049148382627, 0.771192158589932, 0.0874191866816905, -0.511186284652509, -0.583604117567373, -0.234442825167827, -0.920460920781681, -0.341256190408842, -0.522096443340076, -0.139263361496894, -1.27787778570847, 1.05010139804885, 0.407923289631276, 0.708755449219392, 0.219371486772857, 0.982466901936796, -0.255389071100478, 0.898903303955032, 0.315853287177908, 0.773991845531689, -0.0568616894865954, -1.27248152372829, -0.128204344972416, -0.301405791699653, 0.313476713318645, 0.138685029216478, -0.790813280942196, 1.55052799744283, 0.442227839726681, -0.430581022168761, 0.552564478230422, 0.998285205504035, -0.59177809872945, 0.401508029696958, 1.06147799099115, 0.593625805989449, 1.40260184320178, 1.10308047810791, -0.629700559258355, 0.230180199444114, -1.58674721671374, 1.27371242285609, -0.281891109103334, 1.50660917020276, 1.69301656948834, -0.344619801820332, 0.502901521342666, 1.12095960185226, 1.00115136819297, -0.859302712609057, 1.04836470126006, -0.440076828518342, 1.32658164261026, 0.277211584136094, -0.00340550029993902, -0.528806896965776, 0.358101474797842, -0.859188270205122, 2.40917068342075, -0.233070898879408, 0.821214820975242, 0.530215989075157, -0.414524547717428, 1.95937773999619, -0.31637636648441, 1.59061377708225, 0.85491464095897, 3.00848977288385, 0.31110984039717, 0.561774578883227, 2.72002265637445, 0.365794993796914, 3.00376232679713, 3.11323993706562, 0.78487297906203, -1.0937982429059, 2.06319745299424, 0.99940125775548, 0.940783624290638, 0.127462253896785, 1.18874351543676, 0.543612125029256, 1.60184486776756, -1.42427493931755, 0.92340227364286, -0.011842981289229, 3.90332146151109, 0.0074401202021698, 0.653956455116741, 0.376857842377593, 1.84033598194922, 2.18611439873324, 0.198743643742977, 0.592825769638117, 0.802819704942646, -0.852157849724791, 1.22778351351926, 0.466053010386867, 2.58210701655269, 0.370069031847681, 1.43578369982214, -1.34312371776821, 2.13165963712773, 1.29655749661337, 0.844647031050506, 0.762397979753491, -0.903097316449438, 0.850880521324793, 1.31583545089355, -1.8596995834388, 1.77086651263061, -0.418696802927514, 0.108397330873801, 1.71513428277485, 1.72650311105061, -0.171534598810939, 1.0210148061908, -0.95921030661116, 1.15276501084302, 1.28258443662658, 0.392063884350341, 0.987259371139681, 0.882623146302104, -0.27699479747292, -1.1770520483676, 0.764544307068252, -1.29748458762079, 4.93166885388979, -0.323879468174976, 0.270669394637915, 0.939330000547917, 0.232546777393071, 2.06241940191246, 0.893672943621461, 0.868353319024121, -0.890959808742889, 0.495448461602055, 2.13817794126607, -1.72516195505559, 1.45227926015267, 2.05322727499574, -0.0598476661966607, 4.56583475753443, -0.223786239035005, -0.505303747306019, -0.697383724938441, 1.57473678315689, 0.419664889386524, 1.61811900441189, -1.2445731481015, 1.64415047980353, 4.44541325908303, -0.118512389233858, 0.33778324018807, 0.645401207488332, -0.530887896985314, 3.48409782751957, 2.55157809824785, -0.487257340821106, 0.911602898367859, 0.529637722978747, 0.0158261489229185, 0.362123421087131, 0.182441606329207, 2.00650238541131, -0.775161761501705, -1.0976520076165, -0.273722496287697, 0.95542306658208, 0.871563109479288, 1.0693815929896, 2.42227414178032, 0.706707961855108, 1.26518904864382, 0.36043882046498, 1.04600856154064, 1.27303082234015, 0.0189313553482265, 1.46601961615649, 1.17834484202965, 2.89977849114582, -0.0109978574636697, 0.109029010084896, 1.75591114028086, -1.55627533441592, 2.18921898161372, -0.429471693599015, 0.239012246958699, 1.09844674816704, -0.63517581279449, -0.925829986433739, 1.35587490506366, 0.54167610538779, 2.05307444152271, 0.200750863097581, 0.833098688215281, 0.83540554750834, -0.602127147976569, -0.196332110159228, 0.199411802254476, -1.43797019810213, 1.61592466883547, 2.37124231331179, -0.472122685853005, 0.195524975465793, 1.37067569208643, 1.12896040759214, 0.832180196438864, 0.116326729804276, 0.456473371615986, -0.575758251200717, 1.11615485896098, 0.508008954619831, 0.0493457090388711, 2.71262482591911, -0.716390994593083, -1.27396988909029, 0.816709449967362, 0.0849386007821812, 0.198817872440067, -0.210448899035025, 1.34516468866521, -1.36961056349874, 0.226676951235678, 0.510424393925823, -0.325915698043339, 1.8701641803339, 0.431185272025827, 0.204473080604653, -1.02887766930769, 0.117519731182047, 1.56440162899034, 0.388894732198055, 0.399660525723922, 0.107143382866544, -1.02539507686943, 0.530291243338367, 0.136130358443079, 0.302895002936787, -0.841597545098063, -0.205117812131206, 2.10829713333989, -1.00102659101996, 0.90959310495541, 1.34770146636877, 2.87280859141198, 2.16821729533945, -0.0256476782044227, -0.278232214429803, 0.837227886060098, -0.328291817633503, 1.13769823944564, -0.978114451580864, 0.103148609291684, 1.22481861695584, 1.7894993642897, 1.15525374611458, 1.7545817634005, -0.64620256302245, 0.750491872290816, 0.798737549115557, 1.94083010485031, -0.620486935835173, 1.51429981302597, 2.40962716569504, 1.51254838477252, 0.820311329892761, -0.53952007672903, 0.743106840065636, -0.574926985818413, 0.848404177552161, 0.756338810308836, 0.227704178836982, -0.20204471371638, -0.0839021599097524, 2.14062142368087, 0.798020771327468, 0.36830828281102, 2.28924013190774, 1.16161490066692, 1.0021428804393, 0.319830105678902, -0.208534449144881, 1.38849947813382, 0.835405625269753, 0.749373155637211, 0.40869213065397, 1.80607650577143, 1.01014160116986, 1.09279704656658, 1.76028417520472, -0.519976120820538, 0.940225683443508, 2.26120370143731, 0.176279249542933, 0.636246940346498, 1.47512953995556, 0.849049649639233, -1.34512016945114, 0.372302492434952, -0.425050822821237, -0.0185655354865334, -0.312562974540073, 0.286885500434903, 1.05415878584709, 0.0907653887643029, 0.479571041716294, 0.193936878378265, -0.0355459738833423, 0.654613792536384, 0.640437358108362, -0.51211982143802, 1.25035311832771, -0.441794257362547, -0.950979455503757, 1.87252717820712, 0.598654177716385, 0.198259474414323, 2.09502246235362, -0.669106653005611, 4.67968174812352, 0.909723652251769, 0.60323493252869, -2.07124048674656, -0.670189169013084, -1.4769942801634, -0.36476812206821, -0.439562639238363, 1.63740886459801, -0.337837179410645, -0.561486850508642, 0.80508130216064, -0.902616382493715, 0.926987328515665, 0.490630382636676, 0.0757300136032932, -0.502632243583655, 1.52315793767518, 2.26253185093172, 1.33451442411178, 0.305239617846156, 5.24898745870767, 1.36562679737341, -0.398285518383693, 1.32266389205303, -0.287364465127207, 0.382611164347247, -0.763830437454023, -0.13092208954539, -0.364241093066238, 0.866023929538083, -1.87824026988618, 0.419108083219776, 1.29748226376989, 0.884379198824891, 1.48238516773126, -0.320920357526692, 1.92909381992867, 0.0535866851289411, 0.822909105166593, -0.958791584531913, 1.72106185871723, -0.344526065105062, -1.05231830108556, 0.65167336955415, -1.08902015898258, 1.23850352926293, 2.74844242820726, 1.21156217485269, 0.0434814950769333, 1.01286940820117, 0.219217954388066, -2.09312688828933, 0.714119721036855, -0.965566689409777, -0.0783568641424446, -1.50809311628651, 0.523698731528017, -1.2343793768928, 0.863812836258525, 2.30770520843593, 0.839402645937638, 1.37257249020196, 1.18466447952246, -0.185576872452789, 2.93334093300506, -1.5596721189461, 2.68630227383809, -0.307387722902488, 0.461101891867866, 0.206982738656607, -0.366754569912156, -0.0338472214161527, 0.0475595412888318, -1.10573344543519, 1.13015029909989, 2.27229259071425, 2.89951706013018, -0.145512647408783, -0.26939978224819, -0.691221119076502, 1.08944171870602, 1.6738840589179, 0.442594034843472, -0.224888831588269, 0.822060148921286, 0.145411184402615, 0.196342318599254, 0.787843470729458, -0.795934610144371, 3.01588789428762, 1.24481732680682, 1.82934930066134, 0.907487144029345, 1.63493938369009, 1.08100436046231, 1.76269832949965, 1.67812874260917, -0.72243384438829, -0.0380771182372652, 1.81909903601986, 0.751180755115976, 3.95667412594582, -0.911531085647766, 1.69370101860015, -1.10293849936902, 2.00011734325246, 0.489275633665614, 0.737058213407384, 0.18528713225849, -1.21958347946642, 1.18760855850729, -2.8069371399499, -2.01101268771497, -0.195864909927898, 0.136455980189474, 0.58659302803919, 1.25014131741435, -0.384139729885852, 0.767136021564546, 0.497151137879177, 0.358889067874536, -0.155544724321608, -0.20761367744285, -0.198488938424451, 1.31737440328861, 0.662113412254364, 0.391291846054538, 0.774379508848566, 2.41166657168008, 1.18992368951181, -0.457801146445488, 1.060919512098, 0.257981227329035, 2.09736732515552, 0.969336967552951, -0.603886208435524, -1.14779324404334, 2.65976659790581, 1.27937725309076, -0.0853500862015403, -1.45020292666591, 0.882934092771095, -2.47086702262969, 0.146098448737067, 0.50265757490661, 0.334013516364265, 1.90141078506308, -0.194444763654321, -0.567364991311611, -0.767578514038699, -1.55783687575187, 1.77892959234358, 1.27707208524013, 2.50673935412006, -0.200572966387006, 0.560777002671598, 0.130507081448872, 1.21429990358434, 0.964606934534334, -1.03447671705367, 0.149057451281367, -0.871526092535275, 3.32542864537341, -0.245237817146049, -0.244069217633529, 2.54731426192594, -1.78592947693364, 1.10209951739336, 0.00170173711104016, -1.98870590235364, -0.625105722649671, 2.02034157697311, 0.601844336957707, 0.246632954880783, 0.749161673345382, -0.780302578231639, 0.383681180479576, 0.000926710296805577, 0.972327931275503, 1.40768343206885, 2.90576836916579, -0.250506913850652, 0.272734980488079, 0.662339030826353, 1.21088016946188, -0.156845540267424, 0.389056609411201, 0.625531898467211, 1.6192336445132, 2.78392238258665, 1.54774059348448, 0.93555421655078, 1.50688269029688, 1.06699602833896, -0.565725217662758, 1.13933012539174, 0.876776083428385, 0.80715544164405, 1.28873622655447, 1.23639152110386, -0.437485689676046, 1.37122473524409, 1.01431586531115, 0.692592689064096, 1.53250073532806, -0.495622477851338, 5.00763760818841, -0.722743910903636, 0.297214501755641, -2.0060333899521, 1.06567932551173, -0.665587697120212, -0.579833577327347, -0.736065212107849, 0.674633945401004, 0.640249078853686, 2.22734299120419, -1.47700124948413, 0.0804863428771847, 0.751946342818014, 0.456062144743287, -0.0436019323692735, 3.08870661222838, -0.822223359192835, 0.756442435971995, 2.54680313397092, -0.19278728177782, 1.90129405039015, 2.72301477118778, -1.89062100031617, -0.566167819298431, 0.177456832936808, 0.290147230226539, -0.373477823582417, -0.730544688378838, 0.630252065232717, 1.13860211438254, -0.376220686199279, 0.288818709690576, 2.26339125642032, 1.8727541612529, 1.80353716278523, 0.0873366521503925, -0.212264250406986], + "kernel": "epa", + "description": "Half-normal d, quadratic m(d) with unit noise", + "c_bw": 0.310652508318044, + "bw_mp2": 3.07733693940484, + "bw_mp3": 2.57746169539688, + "b_mse_dpi": 1.41658479986558, + "h_mse_dpi": 0.765475885988503, + "bw_min": 0.0128666422523922, + "bw_max": 3.83211482317383, + "stage_d1": { + "V": 4754.3758258882344, + "B1": 0.0183348792379125, + "B2": 0.0800058855665905, + "R": 0, + "bw": 3.07733693940484 + }, + "stage_d2": { + "V": 91658.545488251752, + "B1": 0.0786358400824143, + "B2": 0.0395162750776006, + "R": 0, + "bw": 2.57746169539688 + }, + "stage_b": { + "V": 290.88602669749383, + "B1": 0.0635469527213075, + "B2": 0.035748103031776, + "R": 0.0277257586905589, + "bw": 1.41658479986558 + }, + "stage_h": { + "V": 5.15878314840927, + "B1": -0.0295154760116299, + "B2": -0.00581316567709607, + "R": 0.00158241380617748, + "bw": 0.765475885988503 + } + } +} diff --git a/diff_diff/__init__.py b/diff_diff/__init__.py index c2738edd..8120e2a9 100644 --- a/diff_diff/__init__.py +++ b/diff_diff/__init__.py @@ -45,10 +45,12 @@ ) from diff_diff.local_linear import ( KERNELS, + BandwidthResult, LocalLinearFit, epanechnikov_kernel, kernel_moments, local_linear_fit, + mse_optimal_bandwidth, triangular_kernel, uniform_kernel, ) @@ -412,6 +414,9 @@ "local_linear_fit", "triangular_kernel", "uniform_kernel", + # MSE-optimal bandwidth selector (Phase 1b for HeterogeneousAdoptionDiD) + "BandwidthResult", + "mse_optimal_bandwidth", # Datasets "load_card_krueger", "load_castle_doctrine", diff --git a/diff_diff/_nprobust_port.py b/diff_diff/_nprobust_port.py new file mode 100644 index 00000000..5f519ab7 --- /dev/null +++ b/diff_diff/_nprobust_port.py @@ -0,0 +1,923 @@ +"""In-house port of nprobust's MSE-DPI bandwidth selector. + +Faithful Python translation of the mse-dpi branch of +``nprobust::lpbwselect`` from the R package +``nprobust`` 0.5.0 (SHA ``36e4e532d2f7d23d4dc6e162575cca79e0927cda``, +``github.com/nppackages/nprobust``). This module implements Calonico, +Cattaneo, and Farrell (2018, JASA 113(522)) plug-in bandwidth selection +exactly as the reference R code does, so that per-stage bandwidths and +per-stage bias/variance components parity-check to 1% on deterministic +seeds (see ``benchmarks/R/generate_nprobust_golden.R`` and +``tests/test_nprobust_port.py``). + +Source mapping (every public function here pairs with one R function): + +======================================== ========================================= +Python R (npfunctions.R) +======================================== ========================================= +``kernel_W(u, kernel)`` ``W.fun`` (npfunctions.R:1-7) +``qrXXinv(x)`` ``qrXXinv`` (npfunctions.R:89-93) +``_precompute_nn_duplicates(x)`` npfunctions.R:518-529 (inline in mse.dpi) +``lprobust_res(...)`` ``lprobust.res`` (npfunctions.R:131-162) +``lprobust_vce(...)`` ``lprobust.vce`` (npfunctions.R:165-185) +``LprobustBwResult`` return list of ``lprobust.bw`` +``lprobust_bw(...)`` ``lprobust.bw`` (npfunctions.R:187-288) +``lpbwselect_mse_dpi(...)`` ``lpbwselect.mse.dpi`` (npfunctions.R:498-607) +======================================== ========================================= + +This module is nprobust-internal logic; the public wrapper is +``diff_diff.local_linear.mse_optimal_bandwidth``. Phase 1c's robust +variance and bias estimator will also compose these helpers. + +Deviations from nprobust (documented): + +* ``weights=`` is not supported here or in the public wrapper + (nprobust's ``lpbwselect`` has no weight argument, so Phase 1b has + no parity anchor). Weighted-data support is queued for Phase 2+ + (survey-design adaptation). The public wrapper + ``mse_optimal_bandwidth`` raises ``NotImplementedError`` when a + ``weights`` array is passed. +* ``vce="nn"`` is the default and is fully ported. ``vce in + {"hc0", "hc1", "hc2", "hc3"}`` is implemented in ``lprobust_res`` / + ``lprobust_vce`` but has not been separately golden-tested; use at + your own risk until Phase 1c. +* ``cluster=`` is supported in ``lprobust_vce`` and the ``lprobust_bw`` + wrapper but is only exercised by the HAD estimator via Phase 2. +* **Missing-data policy for cluster IDs:** nprobust's ``lpbwselect`` + complete-case-filters ``(x, y, cluster)`` before dispatch, dropping + rows where any of the three is missing. This port deliberately + rejects missing cluster IDs with a targeted ``ValueError`` instead + so callers see the missingness rather than silently losing rows. + (``x`` and ``y`` finiteness is also rejected up front for the same + reason; they could not be silently dropped in the nprobust way + without ambiguity.) +""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Optional + +import numpy as np +from scipy import optimize +from scipy.stats import norm as _scipy_norm + +__all__ = [ + "NPROBUST_VERSION", + "NPROBUST_SHA", + "LprobustBwResult", + "kernel_W", + "qrXXinv", + "lprobust_res", + "lprobust_vce", + "lprobust_bw", + "lpbwselect_mse_dpi", +] + +NPROBUST_VERSION = "0.5.0" +NPROBUST_SHA = "36e4e532d2f7d23d4dc6e162575cca79e0927cda" + +_VALID_KERNELS = ("epa", "uni", "tri", "gau") +_VALID_VCE = ("nn", "hc0", "hc1", "hc2", "hc3") + + +# ============================================================================= +# Kernel (W.fun, npfunctions.R:1-7) +# ============================================================================= + + +def kernel_W(u: np.ndarray, kernel: str) -> np.ndarray: + """Symmetric kernel evaluation matching ``nprobust::W.fun``. + + Parameters + ---------- + u : np.ndarray + Scaled argument ``(x - c) / h``. + kernel : str + One of "epa", "uni", "tri", "gau". + + Returns + ------- + np.ndarray + Kernel values, same shape as ``u``. Zero where ``|u| > 1`` for + compact-support kernels. + """ + u = np.asarray(u, dtype=np.float64) + if kernel == "epa": + return np.where(np.abs(u) <= 1.0, 0.75 * (1.0 - u * u), 0.0) + if kernel == "uni": + return np.where(np.abs(u) <= 1.0, 0.5, 0.0) + if kernel == "tri": + return np.where(np.abs(u) <= 1.0, 1.0 - np.abs(u), 0.0) + if kernel == "gau": + return _scipy_norm.pdf(u) + raise ValueError(f"Unknown kernel {kernel!r}. Expected one of {_VALID_KERNELS}.") + + +# ============================================================================= +# qrXXinv (npfunctions.R:89-93) +# ============================================================================= + + +def qrXXinv(x: np.ndarray) -> np.ndarray: + """Cholesky-based inverse of ``x.T @ x``. + + Mirrors ``chol2inv(chol(crossprod(x)))`` in R. ``x`` typically + represents a design matrix already scaled by ``sqrt(weights)``. + + Parameters + ---------- + x : np.ndarray, shape (n, k) + + Returns + ------- + np.ndarray, shape (k, k) + Inverse of ``x.T @ x``. + + Raises + ------ + ValueError + If ``x.T @ x`` is rank-deficient (Cholesky fails). Converts + the raw ``np.linalg.LinAlgError`` into a targeted message so + callers (``lprobust_bw``) can surface a clear failure reason + instead of an opaque linear-algebra error. + """ + xtx = x.T @ x + k = xtx.shape[0] + # Cholesky solve for the inverse. Matches R's chol2inv(chol(.)). + try: + L = np.linalg.cholesky(xtx) + except np.linalg.LinAlgError as exc: + raise ValueError( + f"qrXXinv: Cholesky decomposition of X'X ({k}x{k}) failed. " + f"The weighted design matrix is rank-deficient, likely " + f"because the in-window support has fewer than {k} distinct " + f"points. Increase sample size, widen the bandwidth, or pick " + f"a boundary with more distinct values nearby. " + f"(LinAlgError: {exc})" + ) from exc + Linv = np.linalg.solve(L, np.eye(k)) + return Linv.T @ Linv + + +# ============================================================================= +# Nearest-neighbor duplicate precomputation (inlined in mse.dpi, R:518-529) +# ============================================================================= + + +def _precompute_nn_duplicates(x: np.ndarray) -> tuple[np.ndarray, np.ndarray]: + """Compute ``dups`` and ``dupsid`` arrays for NN residuals. + + ``x`` must already be sorted ascending. + + Mirrors npfunctions.R:518-529: + + for (j in 1:N) dups[j] = sum(x == x[j]) + j = 1 + while (j <= N) { + dupsid[j:(j + dups[j] - 1)] = 1:dups[j] + j = j + dups[j] + } + """ + n = x.shape[0] + dups = np.empty(n, dtype=np.int64) + for j in range(n): + dups[j] = int(np.sum(x == x[j])) + dupsid = np.empty(n, dtype=np.int64) + j = 0 + while j < n: + k = int(dups[j]) + # 1-indexed in R: dupsid[j:(j+dups[j]-1)] = 1:dups[j] + dupsid[j : j + k] = np.arange(1, k + 1) + j += k + return dups, dupsid + + +# ============================================================================= +# lprobust.res (npfunctions.R:131-162) +# ============================================================================= + + +def lprobust_res( + X: np.ndarray, + y: np.ndarray, + m: np.ndarray, + hii: Optional[np.ndarray], + vce: str, + matches: int, + dups: Optional[np.ndarray], + dupsid: Optional[np.ndarray], + d: int, +) -> np.ndarray: + """Port of ``lprobust.res``. + + Parameters + ---------- + X : np.ndarray, shape (n,) + Regressor (one-column; the R code treats ``X`` as a scalar + series for NN distance comparisons). + y : np.ndarray, shape (n,) + Outcome. + m : np.ndarray, shape (n, 1) or (n,) + Fitted values from the local-polynomial regression. Unused + when ``vce="nn"``. + hii : np.ndarray or None + Hat-matrix diagonal, used by "hc2" / "hc3". Ignored for "nn", + "hc0", "hc1". + vce : str + One of "nn", "hc0", "hc1", "hc2", "hc3". + matches : int + ``nnmatch``, target number of nearest neighbors per observation. + dups, dupsid : np.ndarray or None + Precomputed (see ``_precompute_nn_duplicates``). Required when + ``vce="nn"``. + d : int + Polynomial-order-plus-one (``o + 1`` in lprobust.bw). Used for + the HC1 degrees-of-freedom correction. + + Returns + ------- + np.ndarray, shape (n, 1) + Column vector of residuals. + """ + if vce not in _VALID_VCE: + raise ValueError(f"Unknown vce {vce!r}. Expected one of {_VALID_VCE}.") + + n = y.shape[0] + res = np.empty((n, 1), dtype=np.float64) + + if vce == "nn": + if dups is None or dupsid is None: + raise ValueError("vce='nn' requires precomputed dups / dupsid") + # Port of npfunctions.R:134-153. R uses 1-based indexing; Python is + # 0-based, so every `pos`, `pos-lpos-1`, and `pos+rpos+1` translates + # to subtracting one from the R expression to land in [0, n). + for pos in range(n): + rpos = int(dups[pos] - dupsid[pos]) + lpos = int(dupsid[pos] - 1) + lim = min(matches, n - 1) + while lpos + rpos < lim: + # Guard conditions mirror R exactly; "pos-lpos-1" in R means + # 1-indexed position, so "pos-lpos-1 <= 0" in R corresponds to + # Python "(pos) - lpos - 1 < 0" where pos is 0-indexed. + left_idx = pos - lpos - 1 # R: pos-lpos-1 (1-indexed) + right_idx = pos + rpos + 1 # R: pos+rpos+1 (1-indexed) + # In Python 0-indexed, "pos-lpos-1 <= 0" means no more room left. + # Equivalent check: left_idx < 0 means index 0 already past. + if left_idx < 0: + rpos = rpos + int(dups[right_idx]) + elif right_idx > n - 1: + lpos = lpos + int(dups[left_idx]) + elif (X[pos] - X[left_idx]) > (X[right_idx] - X[pos]): + rpos = rpos + int(dups[right_idx]) + elif (X[pos] - X[left_idx]) < (X[right_idx] - X[pos]): + lpos = lpos + int(dups[left_idx]) + else: + rpos = rpos + int(dups[right_idx]) + lpos = lpos + int(dups[left_idx]) + # Indices of the neighbor group (inclusive bounds in R). + ind_J_start = pos - lpos + ind_J_end = min(n - 1, pos + rpos) # inclusive + y_J = float(np.sum(y[ind_J_start : ind_J_end + 1]) - y[pos]) + J_i = (ind_J_end - ind_J_start + 1) - 1 + res[pos, 0] = np.sqrt(J_i / (J_i + 1.0)) * (y[pos] - y_J / J_i) + return res + + # HC variants (vce != "nn") + m1 = m.reshape(-1) if m.ndim == 2 else m + if vce == "hc0": + w = np.ones(n, dtype=np.float64) + elif vce == "hc1": + w = np.full(n, np.sqrt(n / (n - d)), dtype=np.float64) + elif vce == "hc2": + if hii is None: + raise ValueError("vce='hc2' requires hii") + w = np.sqrt(1.0 / (1.0 - hii.reshape(-1))) + else: # hc3 + if hii is None: + raise ValueError("vce='hc3' requires hii") + w = 1.0 / (1.0 - hii.reshape(-1)) + res[:, 0] = w * (y - m1) + return res + + +# ============================================================================= +# lprobust.vce (npfunctions.R:165-185) +# ============================================================================= + + +def lprobust_vce( + RX: np.ndarray, + res: np.ndarray, + cluster: Optional[np.ndarray], +) -> np.ndarray: + """Port of ``lprobust.vce``. Meat of the sandwich. + + Parameters + ---------- + RX : np.ndarray, shape (n, k) + Weighted design matrix ``R * eW`` from the caller. + res : np.ndarray, shape (n, 1) or (n,) + Residuals from ``lprobust_res``. + cluster : np.ndarray or None + Cluster identifier, same length as ``res``. ``None`` for + unclustered. + + Returns + ------- + np.ndarray, shape (k, k) + Meat matrix. + """ + k = RX.shape[1] + r = res.reshape(-1) + + if cluster is None: + rRX = (r[:, None]) * RX + return rRX.T @ rRX + + clusters = np.unique(cluster) + M = np.zeros((k, k), dtype=np.float64) + for c in clusters: + ind = cluster == c + Xi = RX[ind, :] + ri = r[ind] + # R: M = M + crossprod(t(crossprod(Xi,ri)),t(crossprod(Xi,ri))) + # crossprod(Xi, ri) is a (k,) vector = Xi.T @ ri + v = Xi.T @ ri + M = M + np.outer(v, v) + # nprobust's lprobust.vce computes w = ((n-1)/(n-k))*(g/(g-1)) + # but does NOT apply it to the returned M (npfunctions.R:183; + # w is dead code in the R source). Match the R return exactly. + return M + + +# ============================================================================= +# lprobust.bw (npfunctions.R:187-288) +# ============================================================================= + + +@dataclass +class LprobustBwResult: + """Return value of ``lprobust_bw``. Mirrors the R list. + + Attributes + ---------- + V, B1, B2, R, r, rB, rV, bw : float + See npfunctions.R:276-287 for the exact formulas. + """ + + V: float + B1: float + B2: float + R: float + r: float + rB: float + rV: float + bw: float + + +def lprobust_bw( + Y: np.ndarray, + X: np.ndarray, + cluster: Optional[np.ndarray], + c: float, + o: int, + nu: int, + o_B: int, + h_V: float, + h_B1: float, + h_B2: float, + scale: float, + vce: str, + nnmatch: int, + kernel: str, + dups: Optional[np.ndarray], + dupsid: Optional[np.ndarray], +) -> LprobustBwResult: + """Port of ``lprobust.bw`` (npfunctions.R:187-288). + + The heart of the 3-stage DPI: one call produces one stage's + ``(V, B1, B2, R, bw)``. Called four times from ``lpbwselect_mse_dpi``. + + Parameters match the R signature argument-for-argument. + + Raises + ------ + ValueError + If any of the three local-polynomial fits has fewer in-window + observations than its required column count. Catches opaque + ``LinAlgError`` failures from downstream Cholesky inversion in + tiny-sample or mispositioned-boundary settings and surfaces a + targeted error naming the failing stage. + """ + N = X.shape[0] + eC: Optional[np.ndarray] = None + + # === Variance: local-poly fit of order o at bandwidth h_V === + u_V = (X - c) / h_V + w = kernel_W(u_V, kernel) / h_V + ind_V = w > 0.0 + eY = Y[ind_V] + eX = X[ind_V] + eW = w[ind_V] + n_V = int(np.sum(ind_V)) + if n_V < o + 1: + raise ValueError( + f"lprobust_bw: variance stage has n_V={n_V} in-window " + f"observations at h_V={h_V:.6g} (boundary={c}, kernel={kernel!r}), " + f"but needs at least o+1={o + 1}. Increase sample size, choose " + f"a valid lower boundary with sufficient data to the right, " + f"or disable bwcheck=None-driven narrow windows." + ) + # Design matrix R.V in R; rename to R_V to avoid Python builtin conflict. + R_V = np.empty((n_V, o + 1), dtype=np.float64) + for j in range(o + 1): + R_V[:, j] = (eX - c) ** j + sqrtW = np.sqrt(eW) + invG_V = qrXXinv(R_V * sqrtW[:, None]) + beta_V = invG_V @ (R_V.T @ (eW * eY)) + + if cluster is not None: + eC = cluster[ind_V] + + dups_V = dupsid_V = None + if vce == "nn": + if dups is None or dupsid is None: + raise ValueError("vce='nn' requires precomputed dups/dupsid") + dups_V = dups[ind_V] + dupsid_V = dupsid[ind_V] + + predicts_V = np.zeros(n_V, dtype=np.float64) + hii: Optional[np.ndarray] = None + if vce in ("hc0", "hc1", "hc2", "hc3"): + predicts_V = R_V @ beta_V + if vce in ("hc2", "hc3"): + hii = np.empty(n_V, dtype=np.float64) + RW = R_V * eW[:, None] + for i in range(n_V): + hii[i] = R_V[i, :] @ invG_V @ RW[i, :] + + res_V = lprobust_res( + eX, + eY, + predicts_V.reshape(-1, 1), + hii, + vce, + nnmatch, + dups_V, + dupsid_V, + o + 1, + ) + meat_V = lprobust_vce(R_V * eW[:, None], res_V, eC) + V_V = float((invG_V @ meat_V @ invG_V)[nu, nu]) + + # === Bias coefficient BConst1 / BConst2 === + # Hp (diag scaling in R). Hp[j] = h.V^((j-1)) for j=1..o+1, so at Python + # index i in [0, o], Hp[i] = h_V ** i. + Hp = np.array([h_V**j for j in range(o + 1)], dtype=np.float64) + v1 = (R_V * eW[:, None]).T @ ((eX - c) / h_V) ** (o + 1) + v2 = (R_V * eW[:, None]).T @ ((eX - c) / h_V) ** (o + 2) + # (Hp * (invG.V %*% v1))[nu+1] in R == Python index nu. + BConst1 = float((Hp * (invG_V @ v1))[nu]) + BConst2 = float((Hp * (invG_V @ v2))[nu]) + + # === B1 via a separate fit at h.B1, order o.B === + u_B1 = (X - c) / h_B1 + w1 = kernel_W(u_B1, kernel) + ind1 = w1 > 0.0 + eY1 = Y[ind1] + eX1 = X[ind1] + eW1 = w1[ind1] + n_B1 = int(np.sum(ind1)) + if n_B1 < o_B + 1: + raise ValueError( + f"lprobust_bw: B1 stage has n_B1={n_B1} in-window observations " + f"at h_B1={h_B1:.6g} (boundary={c}, kernel={kernel!r}), but " + f"needs at least o_B+1={o_B + 1}. Increase sample size or " + f"widen the pilot bandwidth." + ) + R_B1 = np.empty((n_B1, o_B + 1), dtype=np.float64) + for j in range(o_B + 1): + R_B1[:, j] = (eX1 - c) ** j + sqrtW1 = np.sqrt(eW1) + invG_B1 = qrXXinv(R_B1 * sqrtW1[:, None]) + beta_B1 = invG_B1 @ (R_B1.T @ (eW1 * eY1)) + + # === BWreg (only when scale > 0) === + BWreg = 0.0 + if scale > 0: + eC1: Optional[np.ndarray] = None + if cluster is not None: + eC1 = cluster[ind1] + dups_B = dupsid_B = None + hii_B = None + predicts_B = np.zeros(n_B1, dtype=np.float64) + if vce == "nn": + dups_B = dups[ind1] if dups is not None else None + dupsid_B = dupsid[ind1] if dupsid is not None else None + if vce in ("hc0", "hc1", "hc2", "hc3"): + predicts_B = R_B1 @ beta_B1 + if vce in ("hc2", "hc3"): + hii_B = np.empty(n_B1, dtype=np.float64) + RW1 = R_B1 * eW1[:, None] + for i in range(n_B1): + hii_B[i] = R_B1[i, :] @ invG_B1 @ RW1[i, :] + res_B = lprobust_res( + eX1, + eY1, + predicts_B.reshape(-1, 1), + hii_B, + vce, + nnmatch, + dups_B, + dupsid_B, + o_B + 1, + ) + V_B = float( + (invG_B1 @ lprobust_vce(R_B1 * eW1[:, None], res_B, eC1) @ invG_B1)[o + 1, o + 1] + ) + BWreg = 3.0 * BConst1 * BConst1 * V_B + + # === B2 via a separate fit at h.B2, order o.B+1 === + u_B2 = (X - c) / h_B2 + w2 = kernel_W(u_B2, kernel) + ind2 = w2 > 0.0 + eY2 = Y[ind2] + eX2 = X[ind2] + eW2 = w2[ind2] + n_B2 = int(np.sum(ind2)) + if n_B2 < o_B + 2: + raise ValueError( + f"lprobust_bw: B2 stage has n_B2={n_B2} in-window observations " + f"at h_B2={h_B2:.6g} (boundary={c}, kernel={kernel!r}), but " + f"needs at least o_B+2={o_B + 2}. Increase sample size or " + f"widen the pilot bandwidth." + ) + R_B2 = np.empty((n_B2, o_B + 2), dtype=np.float64) + for j in range(o_B + 2): + R_B2[:, j] = (eX2 - c) ** j + sqrtW2 = np.sqrt(eW2) + invG_B2 = qrXXinv(R_B2 * sqrtW2[:, None]) + beta_B2 = invG_B2 @ (R_B2.T @ (eW2 * eY2)) + + # === Compose final scalars (npfunctions.R:276-287) === + # R: B1 = BConst1 * beta.B1[o+2] (1-indexed); Python: beta_B1[o+1] + B1_val = float(BConst1 * beta_B1[o + 1]) + # R: B2 = BConst2 * beta.B2[o+3] (1-indexed); Python: beta_B2[o + 2] + B2_val = float(BConst2 * beta_B2[o + 2]) + V = float(N * h_V ** (2 * nu + 1) * V_V) + R_reg = float(BWreg) + r_val = 1.0 / (2.0 * o + 3.0) + rB = float(2 * (o + 1 - nu)) + rV = float(2 * nu + 1) + bw = (rV * V / (N * rB * (B1_val**2 + scale * R_reg))) ** r_val + + return LprobustBwResult( + V=V, + B1=B1_val, + B2=B2_val, + R=R_reg, + r=r_val, + rB=rB, + rV=rV, + bw=float(bw), + ) + + +# ============================================================================= +# lpbwselect.mse.dpi (npfunctions.R:498-607) +# ============================================================================= + + +@dataclass +class MseDpiStages: + """Return value of ``lpbwselect_mse_dpi``. Mirrors the R list plus + exposes per-stage diagnostics.""" + + h_mse_dpi: float + b_mse_dpi: float + c_bw: float + bw_mp2: float + bw_mp3: float + bw_max: float + bw_min: Optional[float] + stage_d1: LprobustBwResult + stage_d2: LprobustBwResult + stage_b: LprobustBwResult + stage_h: LprobustBwResult + + +def lpbwselect_mse_dpi( + y: np.ndarray, + x: np.ndarray, + cluster: Optional[np.ndarray] = None, + eval_point: float = 0.0, + p: int = 1, + q: Optional[int] = None, + deriv: int = 0, + kernel: str = "epa", + bwcheck: Optional[int] = 21, + bwregul: float = 1.0, + vce: str = "nn", + nnmatch: int = 3, + interior: bool = False, +) -> MseDpiStages: + """Port of ``lpbwselect.mse.dpi`` (npfunctions.R:498-607). + + The R source computes ``even = (p - deriv) %% 2 == 0`` and dispatches + each stage via ``if (even == FALSE | interior == TRUE) bw <- C$bw + else bw <- optimize(...)$minimum``. For the HAD use case + (``p=1, deriv=0``), ``(p - deriv) %% 2 == 1``, so ``even == FALSE`` and + every stage bandwidth comes from the closed-form ``C$bw`` expression + inside ``lprobust.bw``; the ``optimize()`` branch is taken only when + ``(p - deriv)`` is even AND ``interior == FALSE``. + + Parameters match the R signature. See the R source comments for + semantics. + + Raises + ------ + ValueError + If ``bwcheck`` is supplied and falls outside the valid range + ``[1, len(x)]``. + """ + # Front-door input contract (shape / emptiness / finiteness). + # Must run BEFORE the bwcheck range check so empty-array or + # non-finite inputs get targeted messages instead of "bwcheck + # exceeds sample size". + x = np.asarray(x, dtype=np.float64).ravel() + y = np.asarray(y, dtype=np.float64).ravel() + if x.shape != y.shape: + raise ValueError( + f"x and y must have the same 1-D shape; got " + f"{x.shape} and {y.shape}" + ) + if x.size == 0: + raise ValueError( + "x and y must be non-empty; lpbwselect_mse_dpi cannot " + "estimate a bandwidth from zero observations." + ) + if not np.all(np.isfinite(x)): + raise ValueError("x contains non-finite values (NaN or Inf)") + if not np.all(np.isfinite(y)): + raise ValueError("y contains non-finite values (NaN or Inf)") + if not np.isfinite(eval_point): + raise ValueError(f"eval_point must be finite; got {eval_point}") + if cluster is not None: + cluster = np.asarray(cluster).ravel() + if cluster.shape != x.shape: + raise ValueError( + f"cluster must have the same shape as x; got " + f"{cluster.shape} and {x.shape}" + ) + # Missing cluster IDs must be rejected, not silently dropped. + # nprobust::lpbwselect complete-case-filters (x, y, cluster) + # before dispatch; this port deliberately rejects instead so + # callers see the missingness rather than lose rows silently. + # The "reject" vs "filter" choice is documented in the module + # docstring deviations list. + has_missing = False + if cluster.dtype.kind in ("f", "c"): + has_missing = bool(np.any(~np.isfinite(cluster))) + else: + # object / string / None-containing arrays: treat None and + # NaN-like sentinels as missing. + try: + has_missing = bool(np.any([x is None for x in cluster])) + except TypeError: + has_missing = False + if not has_missing: + try: + # np.nan comparisons are False; use pd-style check. + cluster_f = cluster.astype(np.float64, copy=False) + has_missing = bool(np.any(~np.isfinite(cluster_f))) + except (TypeError, ValueError): + pass + if has_missing: + raise ValueError( + "cluster contains missing values (NaN / None). Unlike " + "nprobust::lpbwselect which complete-case-filters " + "(x, y, cluster), this port rejects missing cluster " + "IDs so the caller sees the missingness rather than " + "silently losing rows. Filter your data before the " + "call or drop missing observations explicitly." + ) + + N = x.shape[0] + if bwcheck is not None: + if bwcheck < 1: + raise ValueError( + f"bwcheck must be a positive integer (>= 1); got {bwcheck}" + ) + if bwcheck > N: + raise ValueError( + f"bwcheck={bwcheck} exceeds sample size N={N}. Either " + f"reduce bwcheck or increase sample size; pass " + f"bwcheck=None to skip the nearest-neighbor floor." + ) + if kernel not in _VALID_KERNELS: + raise ValueError(f"Unknown kernel {kernel!r}. Expected one of {_VALID_KERNELS}.") + if vce not in _VALID_VCE: + raise ValueError(f"Unknown vce {vce!r}. Expected one of {_VALID_VCE}.") + + if q is None: + q = p + 1 + + even = (p - deriv) % 2 == 0 + x_min = float(x.min()) + x_max = float(x.max()) + range_ = x_max - x_min + x_iq = float(np.percentile(x, 75) - np.percentile(x, 25)) + + C_c_table = {"epa": 2.34, "uni": 1.843, "tri": 2.576, "gau": 1.06} + C_c = C_c_table[kernel] + sd_x = float(np.std(x, ddof=1)) + c_bw = C_c * min(sd_x, x_iq / 1.349) * N ** (-1.0 / 5.0) + bw_max = max(abs(eval_point - x_min), abs(eval_point - x_max)) + c_bw = min(c_bw, bw_max) + + # Sort and precompute NN structure (npfunctions.R:518-529). + dups: Optional[np.ndarray] = None + dupsid: Optional[np.ndarray] = None + if vce == "nn": + order_x = np.argsort(x) + x = x[order_x] + y = y[order_x] + if cluster is not None: + cluster = cluster[order_x] + dups, dupsid = _precompute_nn_duplicates(x) + + bw_min: Optional[float] = None + if bwcheck is not None: + sorted_abs = np.sort(np.abs(x - eval_point)) + # R: bw.min <- sort(abs(x-eval))[bwcheck]. R is 1-indexed, so bwcheck-1 in Python. + bw_min = float(sorted_abs[bwcheck - 1]) + c_bw = max(c_bw, bw_min) + + def _optimize_amse( + C: LprobustBwResult, + exp_bias: float, + exp_var: float, + scale: float, + ) -> float: + """Minimize ``|H^exp_bias * (B1 + H*B2 + scale*R)^2 + V / (N * H^exp_var)|`` + over ``H`` in ``(eps, range)``. Matches ``optimize()`` in R. + + Only called on the even-and-boundary branch of the original R + conditional; for the HAD case (p=1, deriv=0) we take the + closed-form ``C.bw`` branch instead. + """ + + def _fun(H: float) -> float: + return abs(H**exp_bias * (C.B1 + H * C.B2 + scale * C.R) ** 2 + C.V / (N * H**exp_var)) + + res = optimize.minimize_scalar( + _fun, + bounds=(np.finfo(float).eps, range_), + method="bounded", + options={"xatol": 1e-10}, + ) + return float(res.x) + + # Stage 2: C.d1 -> bw.mp2 + C_d1 = lprobust_bw( + y, + x, + cluster, + eval_point, + o=q + 1, + nu=q + 1, + o_B=q + 2, + h_V=c_bw, + h_B1=range_, + h_B2=range_, + scale=0.0, + vce=vce, + nnmatch=nnmatch, + kernel=kernel, + dups=dups, + dupsid=dupsid, + ) + if (not even) or interior: + bw_mp2 = C_d1.bw + else: + bw_mp2 = _optimize_amse( + C_d1, + exp_bias=2 * (q + 1) + 2 - 2 * (q + 1), # = 2 + exp_var=1 + 2 * (q + 1), + scale=0.0, + ) + + # Stage 2: C.d2 -> bw.mp3 + C_d2 = lprobust_bw( + y, + x, + cluster, + eval_point, + o=q + 2, + nu=q + 2, + o_B=q + 3, + h_V=c_bw, + h_B1=range_, + h_B2=range_, + scale=0.0, + vce=vce, + nnmatch=nnmatch, + kernel=kernel, + dups=dups, + dupsid=dupsid, + ) + if (not even) or interior: + bw_mp3 = C_d2.bw + else: + bw_mp3 = _optimize_amse( + C_d2, + exp_bias=2 * (q + 2) + 2 - 2 * (q + 2), # = 2 + exp_var=1 + 2 * (q + 2), + scale=0.0, + ) + + # Clipping (npfunctions.R:559-565) + bw_mp2 = min(bw_mp2, bw_max) + bw_mp3 = min(bw_mp3, bw_max) + if bw_min is not None: + bw_mp2 = max(bw_mp2, bw_min) + bw_mp3 = max(bw_mp3, bw_min) + + # Stage 3: C.b -> b.mse.dpi + C_b = lprobust_bw( + y, + x, + cluster, + eval_point, + o=q, + nu=p + 1, + o_B=q + 1, + h_V=c_bw, + h_B1=bw_mp2, + h_B2=bw_mp3, + scale=bwregul, + vce=vce, + nnmatch=nnmatch, + kernel=kernel, + dups=dups, + dupsid=dupsid, + ) + if (not even) or interior: + b_mse_dpi = C_b.bw + else: + b_mse_dpi = _optimize_amse( + C_b, + exp_bias=2 * q + 2 - 2 * (p + 1), + exp_var=1 + 2 * (p + 1), + scale=bwregul, + ) + b_mse_dpi = min(b_mse_dpi, bw_max) + if bw_min is not None: + b_mse_dpi = max(b_mse_dpi, bw_min) + + # Stage 3 final: C.h -> h.mse.dpi + C_h = lprobust_bw( + y, + x, + cluster, + eval_point, + o=p, + nu=deriv, + o_B=q, + h_V=c_bw, + h_B1=b_mse_dpi, + h_B2=bw_mp2, + scale=bwregul, + vce=vce, + nnmatch=nnmatch, + kernel=kernel, + dups=dups, + dupsid=dupsid, + ) + if (not even) or interior: + h_mse_dpi = C_h.bw + else: + h_mse_dpi = _optimize_amse( + C_h, + exp_bias=2 * p + 2 - 2 * deriv, + exp_var=1 + 2 * deriv, + scale=bwregul, + ) + h_mse_dpi = min(h_mse_dpi, bw_max) + if bw_min is not None: + h_mse_dpi = max(h_mse_dpi, bw_min) + + return MseDpiStages( + h_mse_dpi=float(h_mse_dpi), + b_mse_dpi=float(b_mse_dpi), + c_bw=float(c_bw), + bw_mp2=float(bw_mp2), + bw_mp3=float(bw_mp3), + bw_max=float(bw_max), + bw_min=bw_min, + stage_d1=C_d1, + stage_d2=C_d2, + stage_b=C_b, + stage_h=C_h, + ) diff --git a/diff_diff/local_linear.py b/diff_diff/local_linear.py index 7a073c16..987d947c 100644 --- a/diff_diff/local_linear.py +++ b/diff_diff/local_linear.py @@ -13,11 +13,13 @@ the conditional mean ``m(d0) := E[Y | D = d0]`` at the boundary of ``D``'s support via kernel-weighted OLS. -This module is used by future :class:`HeterogeneousAdoptionDiD` phases: +This module is used by the :class:`HeterogeneousAdoptionDiD` phases: - Phase 1a ships the kernels and fitter (this module). -- Phase 1b will add an MSE-optimal bandwidth selector (Calonico-Cattaneo-Farrell - 2018) built on top of the fitter. +- Phase 1b ships the MSE-optimal bandwidth selector + ``mse_optimal_bandwidth`` / ``BandwidthResult`` (this module), a thin + wrapper over the Calonico-Cattaneo-Farrell (2018) plug-in selector + ported in ``diff_diff/_nprobust_port.py``. - Phase 1c will add the bias-corrected confidence interval per Equation 8 of de Chaisemartin, Ciccia, D'Haultfoeuille & Knau (2026, arXiv:2405.04465v6). @@ -45,6 +47,7 @@ from diff_diff.linalg import solve_ols __all__ = [ + "BandwidthResult", "epanechnikov_kernel", "triangular_kernel", "uniform_kernel", @@ -52,6 +55,7 @@ "kernel_moments", "LocalLinearFit", "local_linear_fit", + "mse_optimal_bandwidth", ] @@ -194,8 +198,7 @@ def kernel_moments(kernel: str = "epanechnikov") -> Dict[str, float]: """ if kernel not in _CLOSED_FORM_MOMENTS: raise ValueError( - f"Unknown kernel {kernel!r}. Expected one of " - f"{sorted(_CLOSED_FORM_MOMENTS.keys())}." + f"Unknown kernel {kernel!r}. Expected one of " f"{sorted(_CLOSED_FORM_MOMENTS.keys())}." ) kappas = dict(_CLOSED_FORM_MOMENTS[kernel]) @@ -314,16 +317,12 @@ def local_linear_fit( if bandwidth <= 0.0: raise ValueError(f"bandwidth must be positive; got {bandwidth}") if kernel not in KERNELS: - raise ValueError( - f"Unknown kernel {kernel!r}. Expected one of {sorted(KERNELS.keys())}." - ) + raise ValueError(f"Unknown kernel {kernel!r}. Expected one of {sorted(KERNELS.keys())}.") d = np.asarray(d, dtype=np.float64).ravel() y = np.asarray(y, dtype=np.float64).ravel() if d.shape != y.shape: - raise ValueError( - f"d and y must have the same shape; got {d.shape} and {y.shape}" - ) + raise ValueError(f"d and y must have the same shape; got {d.shape} and {y.shape}") # Explicit NaN / Inf validation at the API boundary so the caller gets a # targeted error rather than a downstream failure inside the kernel or OLS. @@ -338,8 +337,7 @@ def local_linear_fit( user_w = np.asarray(weights, dtype=np.float64).ravel() if user_w.shape != d.shape: raise ValueError( - f"weights must have the same shape as d; got " - f"{user_w.shape} vs {d.shape}" + f"weights must have the same shape as d; got " f"{user_w.shape} vs {d.shape}" ) if not np.all(np.isfinite(user_w)): raise ValueError("weights contains non-finite values (NaN or Inf)") @@ -392,3 +390,394 @@ def local_linear_fit( kernel_weights=np.asarray(k_in, dtype=np.float64), design_matrix=np.asarray(design, dtype=np.float64), ) + + +# ============================================================================= +# MSE-optimal bandwidth selector (Phase 1b) +# ============================================================================= +# +# Public wrapper around diff_diff._nprobust_port.lpbwselect_mse_dpi. The port +# is a faithful Python translation of nprobust::lpbwselect(bwselect="mse-dpi") +# (R package nprobust 0.5.0, SHA 36e4e53); see diff_diff/_nprobust_port.py for +# source mapping. +# +# The public API here is a thin wrapper that: +# 1. Accepts the diff-diff library's kernel naming convention (full words) and +# translates to nprobust's short codes ("epa", "tri", "uni"). +# 2. Converts the internal MseDpiStages dataclass to the user-facing +# BandwidthResult dataclass. +# 3. Enforces input validation consistent with local_linear_fit. +# 4. Rejects unsupported combinations (e.g. weights=) with NotImplementedError +# (nprobust has no weight support). + + +@dataclass +class BandwidthResult: + """MSE-optimal bandwidth selector output plus per-stage diagnostics. + + Returned by ``mse_optimal_bandwidth(..., return_diagnostics=True)``. + Mirrors the five-bandwidth + four-stage structure of + ``nprobust::lpbwselect.mse.dpi``; see + ``diff_diff/_nprobust_port.py`` for the source mapping. + + Attributes + ---------- + h_mse : float + Final MSE-optimal bandwidth ``h*`` for local-linear estimation at + ``boundary``. The argument to pass to + ``local_linear_fit(..., bandwidth=h_mse)``. + b_mse : float + Bias-correction bandwidth. Consumed by Phase 1c for the + bias-corrected confidence interval (CCF 2018 Equation 8). + c_bw : float + Stage 1 preliminary bandwidth used as ``h.V`` in every + ``lprobust.bw`` call downstream: + ``C_kernel * min(sd(d), IQR(d)/1.349) * G^{-1/5}``. + Kernel constants: ``epa=2.34``, ``uni=1.843``, ``tri=2.576``. + bw_mp2 : float + Stage 2 pilot bandwidth for the ``m^{(q+1)}`` derivative estimator. + bw_mp3 : float + Stage 2 pilot bandwidth for the ``m^{(q+2)}`` derivative estimator. + stage_d1_V, stage_d1_B1, stage_d1_B2, stage_d1_R : float + Variance and bias coefficients from the first Stage-2 + ``lprobust.bw`` call (order ``q+1``, reading the ``(q+1)``-th + derivative). Parity-checked to 1% against R. + stage_d2_V, stage_d2_B1, stage_d2_B2, stage_d2_R : float + Same for the second Stage-2 call (order ``q+2``). + stage_b_V, stage_b_B1, stage_b_B2, stage_b_R : float + Same for the Stage-3 bias-bandwidth call (order ``q``, nu ``p+1``). + stage_h_V, stage_h_B1, stage_h_B2, stage_h_R : float + Same for the final Stage-3 main-bandwidth call (order ``p``, + nu ``deriv``). + n : int + Sample size. + kernel : str + Kernel name as user supplied it ("epanechnikov" / "triangular" / + "uniform"). + boundary : float + Evaluation point ``d_0``. + """ + + h_mse: float + b_mse: float + c_bw: float + bw_mp2: float + bw_mp3: float + stage_d1_V: float + stage_d1_B1: float + stage_d1_B2: float + stage_d1_R: float + stage_d2_V: float + stage_d2_B1: float + stage_d2_B2: float + stage_d2_R: float + stage_b_V: float + stage_b_B1: float + stage_b_B2: float + stage_b_R: float + stage_h_V: float + stage_h_B1: float + stage_h_B2: float + stage_h_R: float + n: int + kernel: str + boundary: float + + +# Mapping between diff-diff's full kernel names and nprobust's short codes. +_KERNEL_NAME_TO_NPROBUST = { + "epanechnikov": "epa", + "triangular": "tri", + "uniform": "uni", +} + + +def mse_optimal_bandwidth( + d: np.ndarray, + y: np.ndarray, + boundary: float = 0.0, + kernel: str = "epanechnikov", + weights: Optional[np.ndarray] = None, + bwcheck: Optional[int] = 21, + bwregul: float = 1.0, + return_diagnostics: bool = False, +): + """MSE-optimal bandwidth for local-linear regression at a boundary. + + Port of ``nprobust::lpbwselect(bwselect="mse-dpi")`` (R package + ``nprobust`` 0.5.0, SHA ``36e4e53``). Implements the Calonico, + Cattaneo, and Farrell (2018, JASA 113(522)) direct-plug-in DPI + bandwidth selector for the local-linear boundary estimator used in + Design 1' of de Chaisemartin et al. (2026) (HAD). + + The three-stage algorithm produces five bandwidths (``c_bw``, + ``bw_mp2``, ``bw_mp3``, ``b_mse``, ``h_mse``); see + ``BandwidthResult`` for full diagnostics. + + **Public API scope (Phase 1b of HAD).** This wrapper is intentionally + restricted to the HAD configuration: ``p=1`` (local-linear), + ``deriv=0`` (mean regression), ``interior=False`` (boundary eval + point), ``vce="nn"`` (nearest-neighbor variance), and ``nnmatch=3`` + are hard-coded. The underlying ``diff_diff._nprobust_port`` supports + additional ``vce`` modes (``hc0`` / ``hc1`` / ``hc2`` / ``hc3``), + interior evaluation, and higher polynomial orders, but those paths + are NOT parity-tested against ``nprobust`` and are deferred to Phase + 1c / Phase 2. Do not rely on this public wrapper for anything + outside HAD Phase 1b; use the port directly if you need the broader + surface and accept that parity has not been separately verified. + + Parameters + ---------- + d : np.ndarray, shape (G,) + Regressor values (the dose ``D_{g,2}`` in HAD). + y : np.ndarray, shape (G,) + Outcome values (the first-difference ``Delta Y_g`` in HAD). + boundary : float, default=0.0 + Evaluation point ``d_0``. The Phase 1b wrapper accepts only + two values (within float tolerance): ``boundary = 0`` for + Design 1' or ``boundary = float(d.min())`` for Design 1 + continuous-near-``d_lower``. Use the sample minimum + ``d.min()`` (not a known theoretical lower bound of the + support), because the downstream selector operates on the + realized data. Any other value -- including + ``boundary < d.min()``, interior points, or + ``boundary > d.min()`` -- raises ``ValueError``. + kernel : str, default="epanechnikov" + One of ``"epanechnikov"``, ``"triangular"``, ``"uniform"``. + weights : np.ndarray or None, default=None + Not supported in Phase 1b (raises ``NotImplementedError``). + ``nprobust::lpbwselect`` has no weight argument and thus no + parity anchor. Weighted-data support is queued for Phase 2+. + bwcheck : int or None, default=21 + If set, clip ``c_bw`` (and all downstream bandwidths) below the + distance to the ``bwcheck``-th nearest neighbor of ``boundary``. + Matches ``nprobust::lpbwselect`` default. + bwregul : float, default=1.0 + Bias-regularization scale used in Stage 3. ``bwregul=0`` disables + the regularization term; ``bwregul=1`` matches ``nprobust`` + default. + return_diagnostics : bool, default=False + When ``False`` (default) return the final bandwidth as a + ``float``. When ``True`` return a ``BandwidthResult`` with all + five stage bandwidths plus per-stage ``(V, B1, B2, R)`` + diagnostics. + + Returns + ------- + float or BandwidthResult + The MSE-optimal bandwidth ``h*``, or (if + ``return_diagnostics=True``) a ``BandwidthResult`` dataclass. + + Raises + ------ + ValueError + Raised on: shape mismatch between ``d`` and ``y``; non-finite + values in ``d``, ``y``, or ``boundary``; unknown ``kernel`` + name; ``bwcheck`` outside ``[1, len(d)]``; ``boundary`` that + is not approximately 0 or approximately ``d.min()`` (the only + two supported HAD estimands in Phase 1b); or a rank-deficient + / under-determined pilot fit inside the DPI port (surfaced + from ``qrXXinv`` or the per-stage count guards in + ``lprobust_bw``). + NotImplementedError + Raised on: ``weights=`` passed (no nprobust parity anchor); + detected Design 1 mass-point design (``d.min() > 0`` and + modal fraction at ``d.min()`` exceeds 2%, per the paper's + Section 3.2.4 redirection to the 2SLS sample-average + estimator, queued for Phase 2). + + Notes + ----- + The port parity-tests at 1% relative error against R + ``nprobust::lpbwselect(bwselect="mse-dpi", vce="nn")`` on three + deterministic DGPs (see + ``benchmarks/R/generate_nprobust_golden.R``). In practice the + agreement is at machine precision (0.0000% on the golden tests); + the 1% tolerance is the hard gate before a deviation is considered + a regression. + """ + if weights is not None: + raise NotImplementedError( + "weights= is not supported in Phase 1b of the MSE-optimal " + "bandwidth selector. nprobust::lpbwselect has no weight " + "argument, so there is no parity anchor. Weighted-data " + "support is queued for Phase 2+ (survey-design adaptation)." + ) + + if kernel not in _KERNEL_NAME_TO_NPROBUST: + raise ValueError( + f"Unknown kernel {kernel!r}. Expected one of " + f"{sorted(_KERNEL_NAME_TO_NPROBUST.keys())}." + ) + nprobust_kernel = _KERNEL_NAME_TO_NPROBUST[kernel] + + d = np.asarray(d, dtype=np.float64).ravel() + y = np.asarray(y, dtype=np.float64).ravel() + if d.shape != y.shape: + raise ValueError(f"d and y must have the same shape; got {d.shape} and {y.shape}") + if d.size == 0: + raise ValueError( + "d and y must be non-empty; the selector cannot estimate a " + "bandwidth from zero observations." + ) + if not np.all(np.isfinite(d)): + raise ValueError("d contains non-finite values (NaN or Inf)") + if not np.all(np.isfinite(y)): + raise ValueError("y contains non-finite values (NaN or Inf)") + if not np.isfinite(boundary): + raise ValueError(f"boundary must be finite; got {boundary}") + + # HAD support restriction: de Chaisemartin et al. (2026) Assumption + # (dose definition in Section 2) treats ``D_{g,2}`` as the period-2 + # treatment dose with ``D_{g,2} >= 0``. Negative dose values are + # outside the HAD design and would silently calibrate the selector + # against a symmetric-kernel two-sided problem while the downstream + # fitter remains one-sided. Reject front-door rather than produce a + # plausible bandwidth on a malformed input. + d_neg = d < 0.0 + if np.any(d_neg): + n_neg = int(d_neg.sum()) + min_neg = float(d[d_neg].min()) + raise ValueError( + f"Negative dose values detected in d (n_neg={n_neg}, " + f"min={min_neg!r}). The HAD estimator (de Chaisemartin et " + f"al. 2026) requires the period-2 dose D_{{g,2}} >= 0. " + f"Nonnegative-dose data is required for both Design 1' " + f"(d_lower = 0) and Design 1 (d_lower > 0)." + ) + + # Boundary-applicability check (Phase 1b scope). + # The exported wrapper is scoped to the two documented HAD + # nonparametric estimands: + # - Design 1' evaluates m(0) = lim_{d down 0} E[Delta Y | D_2 <= d] + # with ``boundary = 0``. + # - Design 1 continuous-near-d_lower evaluates m(d_lower) with + # ``boundary = d_lower = min(D_2)``. + # Any other off-support boundary (interior, upper-boundary, or an + # arbitrary value between 0 and d.min()) would silently target an + # undocumented limit and is rejected. + d_min = float(d.min()) + _boundary_tol = 1e-12 * max(1.0, abs(d_min), abs(boundary)) + _at_zero = abs(boundary) <= _boundary_tol + _at_d_min = abs(boundary - d_min) <= _boundary_tol + if not (_at_zero or _at_d_min): + raise ValueError( + f"boundary={boundary!r} is not at a supported HAD estimand. " + f"The Phase 1b public wrapper accepts only boundary ~ 0 " + f"(Design 1') or boundary ~ d.min()={d_min!r} (Design 1 " + f"continuous-near-d_lower). Off-support values would " + f"silently target an undocumented limit. For interior or " + f"other boundary points, use " + f"diff_diff._nprobust_port.lpbwselect_mse_dpi directly and " + f"note that those paths are not separately parity-tested." + ) + + # Mass-point design check (paper Section 3.2.4, REGISTRY 2% rule). + # Must fire BEFORE the Design 1' support check: mass-point data is + # never appropriate for the CCF nonparametric selector regardless + # of the boundary the caller supplied. The correct remediation is + # the 2SLS sample-average path (Phase 2), not a boundary + # reclassification. + # + # The check explicitly excludes d_min ~ 0 (the Design 1' + # "untreated units present" subcase that the paper's simulations + # and the Garrett et al. (2020) application accept). + _MASS_POINT_THRESHOLD = 0.02 # REGISTRY rule: > 2% modal-min + if d_min > _boundary_tol: + eps_eq = 1e-12 * max(1.0, abs(d_min)) + at_d_min_mask = np.abs(d - d_min) <= eps_eq + modal_fraction = float(np.mean(at_d_min_mask)) + if modal_fraction > _MASS_POINT_THRESHOLD: + raise NotImplementedError( + f"Detected mass-point design at d.min()={d_min!r} " + f"(modal fraction {modal_fraction:.4f} > " + f"{_MASS_POINT_THRESHOLD:.2f}). Per de Chaisemartin et " + f"al. (2026) Section 3.2.4, Design 1 mass-point cases " + f"require the 2SLS sample-average estimator with " + f"instrument 1{{D_2 > d_lower}}, not the CCF " + f"nonparametric selector. That path is queued for " + f"Phase 2 (HeterogeneousAdoptionDiD). For continuous " + f"near-d_lower designs (modal fraction <= " + f"{_MASS_POINT_THRESHOLD:.2f}), this wrapper is " + f"applicable." + ) + + # Design 1' support check: boundary ~ 0 requires the realized + # sample minimum to be compatible with a population support + # infimum at 0. Otherwise the selector calibrates ``h_mse`` at + # an off-support limit. + # + # Rule: when boundary ~ 0 (not also at d.min()), require + # d.min() <= 5% * median(|d|). The 5% threshold is generous + # enough to accept Design 1' samples with vanishing boundary + # density (Beta(2,2): d.min/median ~ 3%) while rejecting samples + # substantially off-support (U(0.5, 1): d.min/median ~ 1.0). + # Samples just between these (e.g. U(0.05, 1), d.min/median ~ 10%) + # are directed to boundary=float(d.min()) for the continuous- + # near-d_lower path. + _DESIGN_1_PRIME_RATIO = 0.05 + if _at_zero and not _at_d_min: + d_median_abs = float(np.median(np.abs(d))) + effective_threshold = _DESIGN_1_PRIME_RATIO * max(d_median_abs, 1e-12) + if d_min > effective_threshold: + raise ValueError( + f"boundary ~ 0 selected but d.min()={d_min!r} is not " + f"compatible with a Design 1' support infimum at 0 " + f"(rule: d.min() <= " + f"{_DESIGN_1_PRIME_RATIO} * median(|d|) = " + f"{effective_threshold!r}). This sample is not " + f"Design 1'. Either: (a) pass boundary=float(d.min()) " + f"for the Design 1 continuous-near-d_lower path, or " + f"(b) verify the population support actually has " + f"infimum at 0 (in which case the realized d.min() " + f"would be closer to zero relative to the data scale)." + ) + + # Defer heavy import to call time to avoid import-cycle risk. + from diff_diff._nprobust_port import lpbwselect_mse_dpi + + stages = lpbwselect_mse_dpi( + y=y, + x=d, + cluster=None, + eval_point=float(boundary), + p=1, + q=2, + deriv=0, + kernel=nprobust_kernel, + bwcheck=bwcheck, + bwregul=bwregul, + vce="nn", + nnmatch=3, + interior=False, + ) + + if not return_diagnostics: + return stages.h_mse_dpi + + return BandwidthResult( + h_mse=stages.h_mse_dpi, + b_mse=stages.b_mse_dpi, + c_bw=stages.c_bw, + bw_mp2=stages.bw_mp2, + bw_mp3=stages.bw_mp3, + stage_d1_V=stages.stage_d1.V, + stage_d1_B1=stages.stage_d1.B1, + stage_d1_B2=stages.stage_d1.B2, + stage_d1_R=stages.stage_d1.R, + stage_d2_V=stages.stage_d2.V, + stage_d2_B1=stages.stage_d2.B1, + stage_d2_B2=stages.stage_d2.B2, + stage_d2_R=stages.stage_d2.R, + stage_b_V=stages.stage_b.V, + stage_b_B1=stages.stage_b.B1, + stage_b_B2=stages.stage_b.B2, + stage_b_R=stages.stage_b.R, + stage_h_V=stages.stage_h.V, + stage_h_B1=stages.stage_h.B1, + stage_h_B2=stages.stage_h.B2, + stage_h_R=stages.stage_h.R, + n=int(d.shape[0]), + kernel=kernel, + boundary=float(boundary), + ) diff --git a/docs/methodology/REGISTRY.md b/docs/methodology/REGISTRY.md index 091b3847..4b386237 100644 --- a/docs/methodology/REGISTRY.md +++ b/docs/methodology/REGISTRY.md @@ -2302,7 +2302,7 @@ Shipped as `did_had_pretest_workflow()` and surfaced via `practitioner_next_step - [x] Phase 1a: `vcov_type` enum threaded through `DifferenceInDifferences` (`MultiPeriodDiD`, `TwoWayFixedEffects` inherit); `robust=True` <=> `vcov_type="hc1"`, `robust=False` <=> `vcov_type="classical"`. Conflict detection at `__init__`. Results summary prints the variance-family label. - **Note (deviation from the fully-symmetric enum):** `MultiPeriodDiD(cluster=..., vcov_type="hc2_bm")` is intentionally **not supported** and raises `NotImplementedError`. The scalar-coefficient `DifferenceInDifferences` path handles the cluster + CR2 Bell-McCaffrey combination (`_compute_cr2_bm` returns a per-coefficient Satterthwaite DOF that is valid for the single-ATT contrast), but `MultiPeriodDiD` also reports a post-period-average ATT constructed as a *contrast* of the event-study coefficients. The cluster-aware CR2 BM DOF for that contrast (i.e., the Pustejovsky-Tipton 2018 per-cluster adjustment matrices applied to an arbitrary aggregation contrast) is not yet implemented. Pairing CR2 cluster-robust SEs with the one-way Imbens-Kolesar (2016) contrast DOF would be a broken hybrid, so the combination fails fast with a clear workaround message (drop the cluster for one-way HC2+BM, or use `vcov_type="hc1"` with cluster for CR1 Liang-Zeger). Tracked in `TODO.md` under Methodology/Correctness. Applies only to `MultiPeriodDiD`; `DifferenceInDifferences(cluster=..., vcov_type="hc2_bm")` works. - [x] Phase 1a: `clubSandwich::vcovCR(..., type="CR2")` parity harness committed: R script at `benchmarks/R/generate_clubsandwich_golden.R` plus a regression-anchor JSON at `benchmarks/data/clubsandwich_cr2_golden.json`. **Note:** the committed JSON currently has `"source": "python_self_reference"` and pins numerical stability only; authoritative R-produced values are generated by running the R script, which the TODO.md row under Methodology/Correctness tracks. The parity test at `tests/test_linalg_hc2_bm.py::TestCR2BMCluster::test_cr2_parity_with_golden` runs at 1e-6 tolerance (Phase 1a plan commits 6-digit parity once R regen completes). -- [ ] Phase 1b: Calonico-Cattaneo-Farrell (2018) MSE-optimal bandwidth selector. +- [x] Phase 1b: Calonico-Cattaneo-Farrell (2018) MSE-optimal bandwidth selector. In-house port of `nprobust::lpbwselect(bwselect="mse-dpi")` (nprobust 0.5.0, SHA `36e4e53`) as `diff_diff.mse_optimal_bandwidth` and `BandwidthResult`, backed by the private `diff_diff._nprobust_port` module (`kernel_W`, `lprobust_bw`, `lpbwselect_mse_dpi`). Three-stage DPI with four `lprobust.bw` calls at orders `q+1`, `q+2`, `q`, `p`. Python matches R to `0.0000%` relative error (i.e., bit-parity within float64 precision, ~8-13 digits agreement) on all five stage bandwidths (`c_bw`, `bw_mp2`, `bw_mp3`, `b_mse`, `h_mse`) across three deterministic DGPs (uniform, Beta(2,2), half-normal) via `benchmarks/R/generate_nprobust_golden.R` → `benchmarks/data/nprobust_mse_dpi_golden.json`. **Note:** `weights=` is currently unsupported (raises `NotImplementedError`); nprobust's `lpbwselect` has no weight argument so there is no parity anchor. Weighted-data support deferred to Phase 2 (survey-design adaptation). **Note (public API scope restriction):** the exported wrapper `mse_optimal_bandwidth` hard-codes the HAD Phase 1b configuration (`p=1`, `deriv=0`, `interior=False`, `vce="nn"`, `nnmatch=3`). The underlying port supports a broader surface (`hc0`/`hc1`/`hc2`/`hc3` variance, interior evaluation, higher `p`), but those paths are not parity-tested against `nprobust` and are deferred. Callers needing the broader surface should use `diff_diff._nprobust_port.lpbwselect_mse_dpi` directly and accept that parity has not been verified on non-HAD configurations. **Note (input contract):** the wrapper enforces HAD's support restriction `D_{g,2} >= 0` (front-door `ValueError` on negative doses and empty inputs). `boundary` must equal `0` (Design 1') or `float(d.min())` (Design 1 continuous-near-d_lower) within float tolerance; off-support values raise `ValueError`. When `boundary ~ 0`, the wrapper additionally requires `d.min() <= 0.05 * median(|d|)` as a Design 1' support plausibility heuristic, chosen to pass the paper's thin-boundary-density DGPs (Beta(2,2), d.min/median ~ 3%) while rejecting substantially off-support samples (U(0.5, 1.0), d.min/median ~ 1.0). Detected mass-point designs (`d.min() > 0` with modal fraction at `d.min() > 2%`) raise `NotImplementedError` pointing to the Phase 2 2SLS path per paper Section 3.2.4. - [ ] Phase 1c: First-order bias estimator `M̂_{ĥ*_G}` and robust variance `V̂_{ĥ*_G}`. - [ ] Phase 1c: Bias-corrected CI (Equation 8) with `nprobust` parity. - [ ] Phase 2: `HeterogeneousAdoptionDiD` class with separate code paths for Design 1', Design 1 mass-point, and Design 1 continuous-near-`d̲`. diff --git a/tests/test_bandwidth_selector.py b/tests/test_bandwidth_selector.py new file mode 100644 index 00000000..6326e93c --- /dev/null +++ b/tests/test_bandwidth_selector.py @@ -0,0 +1,557 @@ +"""End-to-end tests for ``diff_diff.local_linear.mse_optimal_bandwidth``. + +Parity against nprobust 0.5.0 (SHA 36e4e53) is the primary test. Golden +values live at ``benchmarks/data/nprobust_mse_dpi_golden.json``; see +``benchmarks/R/generate_nprobust_golden.R`` for the generator. + +Behavioural tests cover input validation, kernel dispatch, and +``return_diagnostics`` shape. +""" + +from __future__ import annotations + +import json +from pathlib import Path + +import numpy as np +import pytest + +from diff_diff import BandwidthResult, local_linear_fit, mse_optimal_bandwidth + +# ============================================================================= +# Golden-value parity: per-stage at 1% relative tolerance (DGP 1 / 2 / 3) +# ============================================================================= + + +GOLDEN_PATH = ( + Path(__file__).resolve().parents[1] / "benchmarks" / "data" / "nprobust_mse_dpi_golden.json" +) + +_PARITY_TOL = 0.01 # 1% relative error; commit criterion #4 + + +@pytest.fixture(scope="module") +def golden(): + """Load R-generated nprobust golden values. Skip if the file is + absent (e.g. in CI's isolated-install path where benchmarks/ is + not copied alongside tests/).""" + if not GOLDEN_PATH.exists(): + pytest.skip( + "Golden values file not found; " + "run: Rscript benchmarks/R/generate_nprobust_golden.R" + ) + with GOLDEN_PATH.open() as f: + return json.load(f) + + +@pytest.fixture(scope="module", params=["dgp1", "dgp2", "dgp3"]) +def dgp_case(request, golden): + name = request.param + d = np.array(golden[name]["d"], dtype=np.float64) + y = np.array(golden[name]["y"], dtype=np.float64) + return name, d, y, golden[name] + + +class TestNprobustParity: + """1% per-stage parity against R nprobust::lpbwselect(bwselect="mse-dpi").""" + + def test_c_bw_parity(self, dgp_case): + name, d, y, g = dgp_case + br = mse_optimal_bandwidth(d, y, return_diagnostics=True) + assert br.c_bw == pytest.approx(g["c_bw"], rel=_PARITY_TOL), name + + def test_bw_mp2_parity(self, dgp_case): + name, d, y, g = dgp_case + br = mse_optimal_bandwidth(d, y, return_diagnostics=True) + assert br.bw_mp2 == pytest.approx(g["bw_mp2"], rel=_PARITY_TOL), name + + def test_bw_mp3_parity(self, dgp_case): + name, d, y, g = dgp_case + br = mse_optimal_bandwidth(d, y, return_diagnostics=True) + assert br.bw_mp3 == pytest.approx(g["bw_mp3"], rel=_PARITY_TOL), name + + def test_b_mse_parity(self, dgp_case): + name, d, y, g = dgp_case + br = mse_optimal_bandwidth(d, y, return_diagnostics=True) + assert br.b_mse == pytest.approx(g["b_mse_dpi"], rel=_PARITY_TOL), name + + def test_h_mse_parity(self, dgp_case): + name, d, y, g = dgp_case + br = mse_optimal_bandwidth(d, y, return_diagnostics=True) + assert br.h_mse == pytest.approx(g["h_mse_dpi"], rel=_PARITY_TOL), name + + +class TestStageDiagnosticsParity: + """Per-stage (V, B1, B2, R) parity at 1% each. Catches formula + divergences that might cancel out in the final bandwidth.""" + + @pytest.mark.parametrize( + "stage", + ["stage_d1", "stage_d2", "stage_b", "stage_h"], + ) + def test_V_parity(self, dgp_case, stage): + name, d, y, g = dgp_case + br = mse_optimal_bandwidth(d, y, return_diagnostics=True) + actual = getattr(br, f"{stage}_V") + expected = g[stage]["V"] + assert actual == pytest.approx(expected, rel=_PARITY_TOL), f"{name} {stage}" + + @pytest.mark.parametrize( + "stage", + ["stage_d1", "stage_d2", "stage_b", "stage_h"], + ) + def test_B1_parity(self, dgp_case, stage): + name, d, y, g = dgp_case + br = mse_optimal_bandwidth(d, y, return_diagnostics=True) + actual = getattr(br, f"{stage}_B1") + expected = g[stage]["B1"] + if expected == 0: + assert actual == pytest.approx(0, abs=1e-10), f"{name} {stage}" + else: + assert actual == pytest.approx(expected, rel=_PARITY_TOL), f"{name} {stage}" + + @pytest.mark.parametrize( + "stage", + ["stage_d1", "stage_d2", "stage_b", "stage_h"], + ) + def test_B2_parity(self, dgp_case, stage): + name, d, y, g = dgp_case + br = mse_optimal_bandwidth(d, y, return_diagnostics=True) + actual = getattr(br, f"{stage}_B2") + expected = g[stage]["B2"] + if expected == 0: + assert actual == pytest.approx(0, abs=1e-10), f"{name} {stage}" + else: + assert actual == pytest.approx(expected, rel=_PARITY_TOL), f"{name} {stage}" + + @pytest.mark.parametrize( + "stage", + ["stage_d1", "stage_d2", "stage_b", "stage_h"], + ) + def test_R_parity(self, dgp_case, stage): + """R (BWreg) parity. stage_d1 / stage_d2 use scale=0 so R=0; + stage_b / stage_h use scale=bwregul=1 so R is non-trivial and + must match nprobust.""" + name, d, y, g = dgp_case + br = mse_optimal_bandwidth(d, y, return_diagnostics=True) + actual = getattr(br, f"{stage}_R") + expected = g[stage]["R"] + if expected == 0: + assert actual == pytest.approx(0, abs=1e-10), f"{name} {stage}" + else: + assert actual == pytest.approx(expected, rel=_PARITY_TOL), ( + f"{name} {stage}: py={actual!r} R={expected!r}" + ) + + +# ============================================================================= +# Behavioral tests +# ============================================================================= + + +class TestReturnShape: + def test_returns_float_by_default(self, dgp_case): + _, d, y, _ = dgp_case + h = mse_optimal_bandwidth(d, y) + assert isinstance(h, float) + assert h > 0.0 + + def test_return_diagnostics_true_returns_dataclass(self, dgp_case): + _, d, y, _ = dgp_case + br = mse_optimal_bandwidth(d, y, return_diagnostics=True) + assert isinstance(br, BandwidthResult) + assert br.h_mse > 0.0 + assert br.c_bw > 0.0 + assert br.b_mse > 0.0 + + def test_float_return_matches_h_mse(self, dgp_case): + _, d, y, _ = dgp_case + h = mse_optimal_bandwidth(d, y) + br = mse_optimal_bandwidth(d, y, return_diagnostics=True) + # Different code paths but same computation; should be bit-exact. + assert h == br.h_mse + + +class TestInputValidation: + def test_mismatched_shapes_raise(self): + rng = np.random.default_rng(0) + d = rng.uniform(size=100) + y = rng.normal(size=50) + with pytest.raises(ValueError, match="same shape"): + mse_optimal_bandwidth(d, y) + + def test_non_finite_d_raises(self): + d = np.array([0.1, np.nan, 0.3, 0.4]) + y = np.array([1.0, 2.0, 3.0, 4.0]) + with pytest.raises(ValueError, match="d contains non-finite"): + mse_optimal_bandwidth(d, y) + + def test_non_finite_y_raises(self): + d = np.array([0.1, 0.2, 0.3, 0.4]) + y = np.array([1.0, 2.0, np.inf, 4.0]) + with pytest.raises(ValueError, match="y contains non-finite"): + mse_optimal_bandwidth(d, y) + + def test_non_finite_boundary_raises(self): + d = np.array([0.1, 0.2, 0.3, 0.4]) + y = np.array([1.0, 2.0, 3.0, 4.0]) + with pytest.raises(ValueError, match="boundary"): + mse_optimal_bandwidth(d, y, boundary=np.nan) + + def test_unknown_kernel_raises(self): + rng = np.random.default_rng(0) + d = rng.uniform(size=100) + y = rng.normal(size=100) + with pytest.raises(ValueError, match="Unknown kernel"): + mse_optimal_bandwidth(d, y, kernel="gaussian") + + def test_weights_raises_not_implemented(self): + rng = np.random.default_rng(0) + d = rng.uniform(size=100) + y = rng.normal(size=100) + w = np.ones_like(d) + with pytest.raises(NotImplementedError, match="weights"): + mse_optimal_bandwidth(d, y, weights=w) + + def test_bwcheck_exceeds_sample_size_raises(self): + """bwcheck > N would cause IndexError inside the selector; guard it.""" + from diff_diff._nprobust_port import lpbwselect_mse_dpi + + d = np.array([0.1, 0.2, 0.3, 0.4, 0.5]) + y = np.array([1.0, 2.0, 3.0, 4.0, 5.0]) + with pytest.raises(ValueError, match="bwcheck"): + # Default bwcheck=21 exceeds N=5. + lpbwselect_mse_dpi(y, d, eval_point=0.0, bwcheck=21) + + def test_bwcheck_zero_raises(self): + from diff_diff._nprobust_port import lpbwselect_mse_dpi + + rng = np.random.default_rng(0) + d = rng.uniform(size=100) + y = rng.normal(size=100) + with pytest.raises(ValueError, match="bwcheck"): + lpbwselect_mse_dpi(y, d, eval_point=0.0, bwcheck=0) + + def test_bwcheck_negative_raises(self): + from diff_diff._nprobust_port import lpbwselect_mse_dpi + + rng = np.random.default_rng(0) + d = rng.uniform(size=100) + y = rng.normal(size=100) + with pytest.raises(ValueError, match="bwcheck"): + lpbwselect_mse_dpi(y, d, eval_point=0.0, bwcheck=-1) + + def test_public_wrapper_fixes_vce_nn_nnmatch_3(self): + """Pin the public API scope restriction documented in + REGISTRY.md and the mse_optimal_bandwidth docstring. + + The wrapper hard-codes vce='nn', nnmatch=3 for Phase 1b; users + needing other variance modes must go through the private port. + This test ensures the behavior is frozen: changing it would be + a scope expansion that should update REGISTRY.md and the + docstring in lockstep. + """ + from diff_diff._nprobust_port import lpbwselect_mse_dpi + + rng = np.random.default_rng(20260419) + G = 2000 + d = rng.uniform(0, 1, size=G) + y = d + d**2 + rng.normal(0, 0.5, size=G) + via_wrapper = mse_optimal_bandwidth( + d, y, kernel="epanechnikov", return_diagnostics=True + ) + via_port_nn = lpbwselect_mse_dpi( + y, + d, + eval_point=0.0, + p=1, + q=2, + deriv=0, + kernel="epa", + bwcheck=21, + bwregul=1.0, + vce="nn", + nnmatch=3, + interior=False, + ) + # vce/nnmatch/interior/p/deriv chosen by the wrapper must match + # what the port call explicitly sets. + assert via_wrapper.h_mse == via_port_nn.h_mse_dpi + assert via_wrapper.b_mse == via_port_nn.b_mse_dpi + assert via_wrapper.c_bw == via_port_nn.c_bw + + def test_bwcheck_none_on_tiny_sample_raises_valueerror(self): + """bwcheck=None on a tiny sample must raise a clear ValueError + from the per-stage support/rank guard in lprobust_bw, NOT an + opaque LinAlgError or IndexError.""" + from diff_diff._nprobust_port import lpbwselect_mse_dpi + + d = np.array([0.1, 0.2, 0.3, 0.4, 0.5]) + y = np.array([1.0, 2.0, 3.0, 4.0, 5.0]) + with pytest.raises(ValueError, match="lprobust_bw"): + lpbwselect_mse_dpi(y, d, eval_point=0.0, bwcheck=None) + + def test_interior_boundary_rejected(self): + """boundary strictly inside the support must be rejected by + the Phase 1b wrapper. Running the boundary selector at an + interior point would silently use a symmetric kernel and + produce a bandwidth incompatible with the one-sided fitter.""" + rng = np.random.default_rng(2026) + d = rng.uniform(0.0, 1.0, size=500) + y = d + d**2 + rng.normal(0, 0.5, size=500) + with pytest.raises(ValueError, match="boundary"): + mse_optimal_bandwidth(d, y, boundary=0.5) + + def test_upper_boundary_rejected(self): + """boundary at d.max() (upper support edge) must be rejected.""" + rng = np.random.default_rng(2026) + d = rng.uniform(0.0, 1.0, size=500) + y = d + d**2 + rng.normal(0, 0.5, size=500) + with pytest.raises(ValueError, match="boundary"): + mse_optimal_bandwidth(d, y, boundary=float(d.max())) + + def test_boundary_equal_to_min_d_accepted(self): + """Design 1 continuous-near-d_lower uses boundary = min(d) + exactly; this must pass the applicability check.""" + rng = np.random.default_rng(20260419) + d = rng.uniform(1.0, 2.0, size=1500) + y = 3.0 + 0.5 * (d - 1.0) ** 2 + rng.normal(0, 0.3, size=1500) + h = mse_optimal_bandwidth(d, y, boundary=float(d.min())) + assert np.isfinite(h) + assert h > 0.0 + + def test_boundary_zero_design_1_prime_accepted(self): + """Design 1' with support at 0: boundary=0 passes.""" + rng = np.random.default_rng(20260419) + d = rng.uniform(0.0, 1.0, size=3000) + y = d + d**2 + rng.normal(0, 0.5, size=3000) + h = mse_optimal_bandwidth(d, y, boundary=0.0) + assert np.isfinite(h) + assert h > 0.0 + + def test_boundary_zero_thin_boundary_density_accepted(self): + """Beta(2,2) Design 1' case: boundary density vanishes at 0 + but the estimand is well-defined. Must not be mistakenly + rejected by any design heuristic.""" + rng = np.random.default_rng(20260419) + d = rng.beta(2.0, 2.0, size=2000) # f_D(0) = 0 + y = d + d**2 + rng.normal(0, 0.5, size=2000) + h = mse_optimal_bandwidth(d, y, boundary=0.0) + assert np.isfinite(h) + assert h > 0.0 + + def test_boundary_zero_with_data_far_from_zero_rejected(self): + """boundary=0 with d.min() substantially positive fails the + Design 1' support check (d.min() > 5% of median(|d|)). The + caller must either pass boundary=float(d.min()) for the + continuous-near-d_lower path or confirm Design 1' applicability.""" + rng = np.random.default_rng(2026) + d = rng.uniform(0.5, 1.0, size=1500) # d.min() ~ 0.5 >> 5% of median + y = d + rng.normal(0, 0.3, size=1500) + with pytest.raises(ValueError, match="Design 1'"): + mse_optimal_bandwidth(d, y, boundary=0.0) + + def test_empty_input_rejected(self): + """Empty d/y must raise a targeted ValueError up front, not + leak a NumPy reduction error from d.min().""" + d = np.array([], dtype=np.float64) + y = np.array([], dtype=np.float64) + with pytest.raises(ValueError, match="non-empty"): + mse_optimal_bandwidth(d, y) + + def test_boundary_zero_with_d_min_mass_point_rejected(self): + """boundary=0 with d.min() > 0 AND mass at d.min() is a + Design 1 mass-point design and must be redirected to 2SLS.""" + rng = np.random.default_rng(2026) + n_mass = 300 # 15% at 0.1 + n_cont = 1700 + d_mass = np.full(n_mass, 0.1) + d_cont = rng.uniform(0.1, 1.0, size=n_cont) + d = np.concatenate([d_mass, d_cont]) + y = d + rng.normal(0, 0.5, size=d.size) + with pytest.raises(NotImplementedError, match="mass-point"): + mse_optimal_bandwidth(d, y, boundary=0.0) + + def test_off_support_boundary_rejected(self): + """boundary must equal 0 or d.min() within tolerance; any + other lower off-support value must be rejected.""" + rng = np.random.default_rng(2026) + d = rng.uniform(1.0, 2.0, size=1500) # d.min() ~ 1.0 + y = d + rng.normal(0, 0.3, size=1500) + # boundary = 0.5 is between 0 and d.min(); neither documented + # estimand. + with pytest.raises(ValueError, match="not at a supported HAD estimand"): + mse_optimal_bandwidth(d, y, boundary=0.5) + + def test_negative_boundary_rejected(self): + """boundary < 0 is off-support and rejected.""" + rng = np.random.default_rng(2026) + d = rng.uniform(0.0, 1.0, size=1500) + y = d + rng.normal(0, 0.3, size=1500) + with pytest.raises(ValueError, match="not at a supported HAD estimand"): + mse_optimal_bandwidth(d, y, boundary=-0.1) + + def test_negative_dose_rejected_boundary_zero(self): + """HAD requires D_{g,2} >= 0. Negative-dose samples must be + rejected at the wrapper level, even under boundary=0.""" + rng = np.random.default_rng(2026) + d = rng.uniform(-0.5, 0.5, size=1500) # mix of negative and positive + y = d + rng.normal(0, 0.3, size=1500) + with pytest.raises(ValueError, match="Negative dose values"): + mse_optimal_bandwidth(d, y, boundary=0.0) + + def test_negative_dose_rejected_boundary_at_d_min(self): + """Negative-dose samples must also be rejected when the caller + tries to pass boundary=d.min() < 0.""" + rng = np.random.default_rng(2026) + d = rng.uniform(-1.0, -0.1, size=1500) # entirely negative + y = d + rng.normal(0, 0.3, size=1500) + with pytest.raises(ValueError, match="Negative dose values"): + mse_optimal_bandwidth(d, y, boundary=float(d.min())) + + def test_mass_point_design_rejected(self): + """Design 1 mass-point case (boundary > 0, modal fraction > 2%) + must be rejected with NotImplementedError pointing to 2SLS.""" + rng = np.random.default_rng(2026) + n_mass = 200 # 10% mass at d_lower + n_cont = 1800 + d_mass = np.full(n_mass, 0.1) + d_cont = rng.uniform(0.1, 1.0, size=n_cont) + d = np.concatenate([d_mass, d_cont]) + y = d + rng.normal(0, 0.5, size=d.size) + with pytest.raises(NotImplementedError, match="mass-point"): + mse_optimal_bandwidth(d, y, boundary=float(d.min())) + + def test_continuous_near_d_lower_accepted(self): + """Design 1 continuous-near-d_lower (boundary > 0, modal + fraction <= 2%) must pass through to nonparametric.""" + rng = np.random.default_rng(20260419) + d = rng.uniform(0.1, 1.0, size=1500) # no mass point + y = d + rng.normal(0, 0.3, size=1500) + h = mse_optimal_bandwidth(d, y, boundary=float(d.min())) + assert np.isfinite(h) + assert h > 0.0 + + def test_untreated_at_zero_accepted(self): + """Paper Section 3.1.5 / Garrett et al. application: untreated + units at d=0 are OK for Design 1'. boundary=0 with mass at 0 + must NOT trigger the mass-point rejection.""" + rng = np.random.default_rng(2026) + # ~15% at d=0 (genuinely untreated), rest continuous on (0, 1). + d_zero = np.zeros(300) + d_pos = rng.uniform(0.01, 1.0, size=1700) + d = np.concatenate([d_zero, d_pos]) + y = d + rng.normal(0, 0.5, size=d.size) + h = mse_optimal_bandwidth(d, y, boundary=0.0) + assert np.isfinite(h) + assert h > 0.0 + + def test_rank_deficient_design_raises_valueerror(self): + """Duplicate-support windows must fail with a clear ValueError + from qrXXinv's Cholesky guard, not an opaque LinAlgError.""" + from diff_diff._nprobust_port import qrXXinv + + # Rank-1 X: all rows identical -> X.T @ X is rank-1. + X = np.tile([[1.0, 2.0, 3.0]], (10, 1)) + with pytest.raises(ValueError, match="qrXXinv"): + qrXXinv(X) + + def test_wrapper_rank_deficient_raises_valueerror(self): + """Public-wrapper regression: a continuous-near-d_lower sample + whose kernel window contains too few DISTINCT d values drives + a rank-deficient X'X in one of the DPI stages. The wrapper + must surface a clear ValueError from qrXXinv's Cholesky guard, + not an opaque LinAlgError. + + Construction: d.min() is unique (modal_fraction = 1/G < 2% so + mass-point check passes), but the remaining data concentrates + on a single value so the kernel window has only 2 distinct d + values and the design-matrix columns become linearly + dependent at higher polynomial orders. + """ + rng = np.random.default_rng(2026) + # G = 151: d.min=0.1 unique, 50 obs each at 0.15 / 0.3 / 0.4. + # Modal fraction = 1/151 < 2% passes mass-point check. + # The B1 / B2 auxiliary fits at stage d1 use h_B1 = h_B2 = + # range = 0.3, which retains all 4 distinct values (0.1, 0.15, + # 0.3, 0.4). The B1 design matrix has o_B+1 = 5 columns but + # only 4 independent rows -> rank-deficient X'X -> Cholesky + # fails in qrXXinv. + d = np.concatenate( + [[0.1], np.full(50, 0.15), np.full(50, 0.3), np.full(50, 0.4)] + ) + y = d + rng.normal(0, 0.01, size=d.size) + with pytest.raises(ValueError, match="qrXXinv"): + mse_optimal_bandwidth(d, y, boundary=float(d.min())) + + +class TestKernelDispatch: + """Different kernels produce different bandwidths.""" + + def test_kernel_epa_vs_uni_differ(self): + rng = np.random.default_rng(42) + G = 1000 + d = rng.uniform(0, 1, size=G) + y = d + d**2 + rng.normal(0, 0.5, size=G) + h_epa = mse_optimal_bandwidth(d, y, kernel="epanechnikov") + h_uni = mse_optimal_bandwidth(d, y, kernel="uniform") + # Different C_rot constants (2.34 vs 1.843) -> different c_bw -> cascade. + assert h_epa != h_uni + assert h_epa > 0 + assert h_uni > 0 + + def test_kernel_epa_vs_tri_differ(self): + rng = np.random.default_rng(42) + d = rng.uniform(0, 1, size=1000) + y = d + d**2 + rng.normal(0, 0.5, size=1000) + h_epa = mse_optimal_bandwidth(d, y, kernel="epanechnikov") + h_tri = mse_optimal_bandwidth(d, y, kernel="triangular") + assert h_epa != h_tri + + +class TestBoundary: + def test_nonzero_boundary(self): + """Design 1 continuous-near-d_lower case: boundary = d.min() + (not the theoretical infimum of the support). Under the + strict boundary-applicability check, the user must pass the + sample minimum, not a known theoretical lower bound like 1.0 + on U(1, 2) data.""" + rng = np.random.default_rng(2026) + d = rng.uniform(1.0, 2.0, size=1500) + y = 3.0 + 0.5 * (d - 1.0) ** 2 + rng.normal(0, 0.3, size=1500) + h = mse_optimal_bandwidth(d, y, boundary=float(d.min())) + assert np.isfinite(h) + assert h > 0.0 + + +class TestDownstreamIntegration: + """End-to-end: bandwidth feeds into local_linear_fit without error.""" + + def test_selector_feeds_local_linear_fit(self, dgp_case): + name, d, y, _ = dgp_case + h = mse_optimal_bandwidth(d, y) + fit = local_linear_fit(d, y, bandwidth=h, boundary=0.0, kernel="epanechnikov") + # Basic sanity -- fit returned finite intercept and slope. + assert np.isfinite(fit.intercept), name + assert np.isfinite(fit.slope), name + assert fit.n_effective > 0, name + + +class TestRateScaling: + """h* scales as G^{-1/5} in Monte Carlo (15% MC tolerance).""" + + def test_rate_scaling_across_g(self): + rng = np.random.default_rng(20260419) + ratios = [] + for G in [500, 2000, 8000]: + d = rng.uniform(0, 1, size=G) + y = d + d**2 + rng.normal(0, 0.5, size=G) + h = mse_optimal_bandwidth(d, y) + ratios.append((G, h)) + # h(G_2) / h(G_1) should be approx (G_1 / G_2)^{1/5}. + g1, h1 = ratios[0] + g2, h2 = ratios[-1] + expected_ratio = (g1 / g2) ** (1.0 / 5.0) + actual_ratio = h2 / h1 + # 15% MC tolerance; rate check, not parity. + assert actual_ratio == pytest.approx(expected_ratio, rel=0.15) diff --git a/tests/test_nprobust_port.py b/tests/test_nprobust_port.py new file mode 100644 index 00000000..ac1df0d8 --- /dev/null +++ b/tests/test_nprobust_port.py @@ -0,0 +1,421 @@ +"""Unit tests for the private port in ``diff_diff._nprobust_port``. + +These tests exercise the internal helpers directly (``kernel_W``, +``qrXXinv``, ``lprobust_bw``, etc.) so that when an end-to-end parity +test in ``tests/test_bandwidth_selector.py`` drifts, the root cause is +localised to a single helper. +""" + +from __future__ import annotations + +import numpy as np +import pytest + +from diff_diff._nprobust_port import ( + NPROBUST_SHA, + NPROBUST_VERSION, + kernel_W, + lprobust_bw, + qrXXinv, +) + +# ============================================================================= +# Metadata +# ============================================================================= + + +def test_pinned_nprobust_version(): + assert NPROBUST_VERSION == "0.5.0" + assert NPROBUST_SHA == "36e4e532d2f7d23d4dc6e162575cca79e0927cda" + + +# ============================================================================= +# kernel_W (W.fun port) +# ============================================================================= + + +class TestKernelW: + def test_epa_symmetric(self): + u = np.array([-0.7, -0.3, 0.0, 0.3, 0.7]) + w = kernel_W(u, "epa") + # Symmetric around 0. + np.testing.assert_allclose(w, w[::-1], atol=1e-14, rtol=1e-14) + # k(0) = 0.75. + assert w[2] == pytest.approx(0.75) + # Zero at |u| = 1. + assert kernel_W(np.array([1.0, -1.0]), "epa")[0] == pytest.approx(0.0) + # Zero outside. + assert kernel_W(np.array([1.5, -1.5]), "epa")[0] == 0.0 + + def test_epa_nonneg_matches_one_sided_phase1a(self): + """For u >= 0, nprobust symmetric epa = Phase 1a one-sided epa.""" + from diff_diff.local_linear import epanechnikov_kernel + + u = np.linspace(0.0, 1.0, 20) + assert np.allclose(kernel_W(u, "epa"), epanechnikov_kernel(u)) + + def test_uniform(self): + u = np.array([-0.9, 0.0, 0.5, 1.0, 1.1]) + w = kernel_W(u, "uni") + assert w[0] == 0.5 + assert w[1] == 0.5 + assert w[2] == 0.5 + assert w[3] == 0.5 # |u|=1 is inside + assert w[4] == 0.0 # |u|>1 is outside + + def test_triangular(self): + u = np.array([-0.3, 0.0, 0.7, 1.0, 1.5]) + w = kernel_W(u, "tri") + assert w[0] == pytest.approx(0.7) + assert w[1] == pytest.approx(1.0) + assert w[2] == pytest.approx(0.3) + assert w[3] == pytest.approx(0.0) + assert w[4] == 0.0 + + def test_gaussian(self): + from scipy.stats import norm + + u = np.array([-1.0, 0.0, 1.0, 2.0]) + np.testing.assert_allclose(kernel_W(u, "gau"), norm.pdf(u), atol=1e-14) + + def test_unknown_kernel_raises(self): + with pytest.raises(ValueError, match="Unknown kernel"): + kernel_W(np.array([0.5]), "cosine") + + +# ============================================================================= +# qrXXinv (chol2inv(chol(crossprod(.))) port) +# ============================================================================= + + +class TestQrXXinv: + def test_matches_numpy_inverse(self): + rng = np.random.default_rng(0) + X = rng.normal(size=(50, 5)) + expected = np.linalg.inv(X.T @ X) + actual = qrXXinv(X) + np.testing.assert_allclose(actual, expected, atol=1e-10, rtol=1e-10) + + def test_symmetric_output(self): + rng = np.random.default_rng(1) + X = rng.normal(size=(30, 3)) + A = qrXXinv(X) + np.testing.assert_allclose(A, A.T, atol=1e-14, rtol=1e-14) + + def test_identity_for_orthonormal_input(self): + # If X has orthonormal columns, X.T @ X = I, so inverse = I. + X = np.eye(4)[:, :3] + np.testing.assert_allclose(qrXXinv(X), np.eye(3), atol=1e-14, rtol=1e-14) + + +# ============================================================================= +# lprobust_bw: single-stage parity against the golden JSON +# ============================================================================= + + +def _precompute_for_test(x): + """Helper that sorts and builds dups/dupsid.""" + from diff_diff._nprobust_port import _precompute_nn_duplicates + + order = np.argsort(x) + x_sorted = x[order] + dups, dupsid = _precompute_nn_duplicates(x_sorted) + return order, x_sorted, dups, dupsid + + +class TestLprobustBwStageD1: + """First Stage-2 call (C.d1 with o=q+1=3, nu=q+1=3, o_B=q+2=4). + + Uses the DGP 1 golden values as reference. The c_bw input must + match R's clipped value, which is the raw rule-of-thumb bandwidth + when bwcheck does not bind (true for DGP 1 at G=2000). + """ + + def _setup(self): + import json + from pathlib import Path + + golden_path = ( + Path(__file__).resolve().parents[1] + / "benchmarks" + / "data" + / "nprobust_mse_dpi_golden.json" + ) + if not golden_path.exists(): + pytest.skip( + "Golden values file not found; " + "run: Rscript benchmarks/R/generate_nprobust_golden.R" + ) + with golden_path.open() as f: + golden = json.load(f) + dgp = golden["dgp1"] + d = np.array(dgp["d"], dtype=np.float64) + y = np.array(dgp["y"], dtype=np.float64) + _, d_sorted, dups, dupsid = _precompute_for_test(d) + order = np.argsort(d) + y_sorted = y[order] + c_bw = float(dgp["c_bw"]) + range_ = float(d_sorted.max() - d_sorted.min()) + return d_sorted, y_sorted, dups, dupsid, c_bw, range_, dgp["stage_d1"] + + def test_V_matches(self): + d, y, dups, dupsid, c_bw, range_, stage = self._setup() + C_d1 = lprobust_bw( + y, + d, + None, + 0.0, + o=3, + nu=3, + o_B=4, + h_V=c_bw, + h_B1=range_, + h_B2=range_, + scale=0.0, + vce="nn", + nnmatch=3, + kernel="epa", + dups=dups, + dupsid=dupsid, + ) + assert C_d1.V == pytest.approx(stage["V"], rel=0.01) + + def test_B1_matches(self): + d, y, dups, dupsid, c_bw, range_, stage = self._setup() + C_d1 = lprobust_bw( + y, + d, + None, + 0.0, + o=3, + nu=3, + o_B=4, + h_V=c_bw, + h_B1=range_, + h_B2=range_, + scale=0.0, + vce="nn", + nnmatch=3, + kernel="epa", + dups=dups, + dupsid=dupsid, + ) + assert C_d1.B1 == pytest.approx(stage["B1"], rel=0.01) + + def test_B2_matches(self): + d, y, dups, dupsid, c_bw, range_, stage = self._setup() + C_d1 = lprobust_bw( + y, + d, + None, + 0.0, + o=3, + nu=3, + o_B=4, + h_V=c_bw, + h_B1=range_, + h_B2=range_, + scale=0.0, + vce="nn", + nnmatch=3, + kernel="epa", + dups=dups, + dupsid=dupsid, + ) + assert C_d1.B2 == pytest.approx(stage["B2"], rel=0.01) + + def test_R_is_zero_when_scale_zero(self): + d, y, dups, dupsid, c_bw, range_, _stage = self._setup() + C_d1 = lprobust_bw( + y, + d, + None, + 0.0, + o=3, + nu=3, + o_B=4, + h_V=c_bw, + h_B1=range_, + h_B2=range_, + scale=0.0, + vce="nn", + nnmatch=3, + kernel="epa", + dups=dups, + dupsid=dupsid, + ) + # With scale=0, BWreg is never computed -> R stays 0. + assert C_d1.R == 0.0 + + +# ============================================================================= +# lpbwselect_mse_dpi: input validation on the advanced-use entry point +# ============================================================================= + + +class TestLpbwselectMseDpiValidation: + """The public wrapper is restricted to the HAD surface; the port is + the advertised advanced-use entry point. It must enforce its own + shape / emptiness / finiteness contract -- silently truncating a + longer y or cluster through sort-index reindexing would be a real + bug.""" + + def test_mismatched_shapes_raise(self): + from diff_diff._nprobust_port import lpbwselect_mse_dpi + + x = np.array([0.1, 0.2, 0.3]) + y = np.array([1.0, 2.0, 3.0, 4.0]) # length 4 != 3 + with pytest.raises(ValueError, match="same 1-D shape"): + lpbwselect_mse_dpi(y, x, eval_point=0.0) + + def test_longer_y_silent_truncation_rejected(self): + """Regression: len(y) > len(x) previously got truncated via + the sort-indexer under vce='nn'. Must now raise.""" + from diff_diff._nprobust_port import lpbwselect_mse_dpi + + rng = np.random.default_rng(0) + x = rng.uniform(0.0, 1.0, size=100) + y = rng.normal(size=200) # twice the length + with pytest.raises(ValueError, match="same 1-D shape"): + lpbwselect_mse_dpi(y, x, eval_point=0.0, vce="nn") + + def test_cluster_wrong_length_rejected(self): + from diff_diff._nprobust_port import lpbwselect_mse_dpi + + rng = np.random.default_rng(0) + x = rng.uniform(0.0, 1.0, size=100) + y = rng.normal(size=100) + cluster = np.arange(50) # wrong length + with pytest.raises(ValueError, match="cluster must have"): + lpbwselect_mse_dpi(y, x, cluster=cluster, eval_point=0.0) + + def test_empty_direct_port_input_rejected(self): + from diff_diff._nprobust_port import lpbwselect_mse_dpi + + x = np.array([], dtype=np.float64) + y = np.array([], dtype=np.float64) + with pytest.raises(ValueError, match="non-empty"): + lpbwselect_mse_dpi(y, x, eval_point=0.0) + + def test_non_finite_x_rejected(self): + from diff_diff._nprobust_port import lpbwselect_mse_dpi + + x = np.array([0.1, np.nan, 0.3]) + y = np.array([1.0, 2.0, 3.0]) + with pytest.raises(ValueError, match="x contains non-finite"): + lpbwselect_mse_dpi(y, x, eval_point=0.0) + + def test_non_finite_y_rejected(self): + from diff_diff._nprobust_port import lpbwselect_mse_dpi + + x = np.array([0.1, 0.2, 0.3]) + y = np.array([1.0, np.inf, 3.0]) + with pytest.raises(ValueError, match="y contains non-finite"): + lpbwselect_mse_dpi(y, x, eval_point=0.0) + + def test_non_finite_eval_point_rejected(self): + from diff_diff._nprobust_port import lpbwselect_mse_dpi + + rng = np.random.default_rng(0) + x = rng.uniform(0.0, 1.0, size=100) + y = rng.normal(size=100) + with pytest.raises(ValueError, match="eval_point"): + lpbwselect_mse_dpi(y, x, eval_point=np.nan) + + def test_missing_cluster_id_rejected_nan(self): + """Missing (NaN) cluster IDs must be rejected, not silently + dropped from block grouping (cluster == c is False for NaN). + Deviates from nprobust's complete-case filter -- documented + in the module docstring.""" + from diff_diff._nprobust_port import lpbwselect_mse_dpi + + rng = np.random.default_rng(0) + x = rng.uniform(0.0, 1.0, size=100) + y = rng.normal(size=100) + cluster = np.arange(100, dtype=np.float64) + cluster[7] = np.nan + cluster[42] = np.nan + with pytest.raises(ValueError, match="missing values"): + lpbwselect_mse_dpi(y, x, cluster=cluster, eval_point=0.0) + + def test_missing_cluster_id_rejected_none(self): + """``None`` sentinel in an object-dtype cluster array must + also be rejected.""" + from diff_diff._nprobust_port import lpbwselect_mse_dpi + + rng = np.random.default_rng(0) + x = rng.uniform(0.0, 1.0, size=10) + y = rng.normal(size=10) + cluster = np.array( + [1, 2, None, 3, 4, 5, 6, 7, 8, 9], dtype=object + ) + with pytest.raises(ValueError, match="missing values"): + lpbwselect_mse_dpi(y, x, cluster=cluster, eval_point=0.0) + + +# ============================================================================= +# lprobust_vce clustered branch: port fidelity vs R source +# ============================================================================= + + +class TestLprobustVceClustered: + """Pin the clustered lprobust_vce result against the R source + formula. R's lprobust.vce (npfunctions.R:165-185) returns M (the + sum over clusters of outer products of sum-of-scores), NOT a + finite-sample-scaled M. An earlier port mistakenly returned + ``w * M``; this test is the regression anchor.""" + + def test_clustered_meat_matches_unscaled_sum(self): + from diff_diff._nprobust_port import lprobust_vce + + rng = np.random.default_rng(123) + n, k = 40, 3 + RX = rng.normal(size=(n, k)) + res = rng.normal(size=(n, 1)) + cluster = np.repeat(np.arange(10), 4) + + # Manual computation: M = sum_g (X_g' r_g) outer (X_g' r_g), + # with NO ((n-1)/(n-k))*(g/(g-1)) scaling. + expected = np.zeros((k, k), dtype=np.float64) + for c in np.unique(cluster): + ind = cluster == c + v = RX[ind].T @ res[ind].ravel() + expected += np.outer(v, v) + + actual = lprobust_vce(RX, res, cluster) + np.testing.assert_allclose(actual, expected, atol=1e-14, rtol=1e-14) + + def test_clustered_is_symmetric(self): + """The meat is a sum of outer products of rank-1 vectors and + must be symmetric.""" + from diff_diff._nprobust_port import lprobust_vce + + rng = np.random.default_rng(7) + n, k = 30, 4 + RX = rng.normal(size=(n, k)) + res = rng.normal(size=(n, 1)) + cluster = np.array([0] * 10 + [1] * 10 + [2] * 10) + M = lprobust_vce(RX, res, cluster) + np.testing.assert_allclose(M, M.T, atol=1e-14, rtol=1e-14) + + def test_clustered_end_to_end_through_lprobust_bw(self): + """Smoke test: a clustered call through lpbwselect_mse_dpi + completes and returns finite stage bandwidths. Pins that the + clustered DPI path exercises lprobust_vce -> lprobust_bw -> + driver without rank / shape / indexing crashes.""" + from diff_diff._nprobust_port import lpbwselect_mse_dpi + + rng = np.random.default_rng(20260419) + G = 500 + d = rng.uniform(0.0, 1.0, size=G) + y = d + d**2 + rng.normal(0, 0.3, size=G) + # 50 clusters, balanced. + cluster = np.repeat(np.arange(50), G // 50) + res = lpbwselect_mse_dpi( + y, d, cluster=cluster, eval_point=0.0, + p=1, deriv=0, kernel="epa", vce="nn", + ) + assert np.isfinite(res.h_mse_dpi) + assert res.h_mse_dpi > 0.0 + assert np.isfinite(res.c_bw) + assert res.c_bw > 0.0