From 37875a3320e45ef7c7f92ffd3191beefeccc26d5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 26 Oct 2025 13:30:00 +0000 Subject: [PATCH 01/12] Initial plan From 0b2bb5e815725ff5c63c22bf9204c945a2049849 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 26 Oct 2025 13:47:24 +0000 Subject: [PATCH 02/12] feat: add `make_hex_lattice()` and `hex_lattice()` functions Expose igraph_triangular_lattice() as make_hex_lattice() with hex_lattice() constructor spec Co-authored-by: krlmlr <1741643+krlmlr@users.noreply.github.com> --- NAMESPACE | 2 + R/make.R | 62 ++++++++++ man/graph_from_atlas.Rd | 1 + man/graph_from_edgelist.Rd | 1 + man/graph_from_literal.Rd | 1 + man/make_.Rd | 1 + man/make_chordal_ring.Rd | 1 + man/make_empty_graph.Rd | 1 + man/make_full_citation_graph.Rd | 1 + man/make_full_graph.Rd | 1 + man/make_graph.Rd | 1 + man/make_hex_lattice.Rd | 77 ++++++++++++ man/make_lattice.Rd | 1 + man/make_ring.Rd | 1 + man/make_star.Rd | 1 + man/make_tree.Rd | 1 + tests/testthat/_snaps/make.new.md | 175 +++++++++++++++++++++++++++ tests/testthat/test-make.R | 42 +++++++ tests/testthat/testthat-problems.rds | Bin 46380 -> 49493 bytes 19 files changed, 371 insertions(+) create mode 100644 man/make_hex_lattice.Rd create mode 100644 tests/testthat/_snaps/make.new.md diff --git a/NAMESPACE b/NAMESPACE index 95be07fb203..c8f9a381456 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -487,6 +487,7 @@ export(has_eulerian_cycle) export(has_eulerian_path) export(head_of) export(head_print) +export(hex_lattice) export(hierarchical_sbm) export(hierarchy) export(hits_scores) @@ -658,6 +659,7 @@ export(make_full_bipartite_graph) export(make_full_citation_graph) export(make_full_graph) export(make_graph) +export(make_hex_lattice) export(make_kautz_graph) export(make_lattice) export(make_line_graph) diff --git a/R/make.R b/R/make.R index 7547b44e593..f525546623d 100644 --- a/R/make.R +++ b/R/make.R @@ -2001,6 +2001,68 @@ lattice <- function(...) constructor_spec(make_lattice, ...) ## ----------------------------------------------------------------- +#' Create a hexagonal lattice graph +#' +#' `make_hex_lattice()` creates a triangular lattice, also known as a hexagonal +#' lattice. This is a lattice where each vertex has up to three neighbors and +#' the structure forms a triangular/hexagonal tiling pattern. +#' +#' @details +#' A triangular (or hexagonal) lattice is a two-dimensional lattice where each +#' internal vertex has degree 3. The resulting graph structure resembles a +#' triangular or hexagonal tiling. +#' +#' The `dims` parameter determines the shape of the lattice: +#' \itemize{ +#' \item If `dims` is a single number, the lattice has a triangular shape +#' where each side contains `dims` vertices. +#' \item If `dims` is a vector of length 2, the lattice has a rectangular +#' shape with sides containing `dims[1]` and `dims[2]` vertices. +#' \item If `dims` is a vector of length 3, the lattice has a hexagonal +#' shape where the sides contain `dims[1]`, `dims[2]`, and `dims[3]` +#' vertices. +#' } +#' +#' @param dims Integer vector, defines the shape of the lattice. See details below. +#' @param directed Logical scalar, whether to create a directed graph. +#' @param mutual Logical scalar, if the graph is directed this parameter +#' controls whether edges are mutual (bidirectional). +#' @return An igraph graph. +#' +#' @family deterministic constructors +#' @export +#' @examples +#' # Triangular shape with 5 vertices on each side +#' g1 <- make_hex_lattice(5) +#' plot(g1) +#' +#' # Rectangular shape +#' g2 <- make_hex_lattice(c(3, 4)) +#' plot(g2) +#' +#' # Hexagonal shape +#' g3 <- make_hex_lattice(c(3, 3, 3)) +#' plot(g3) +#' @cdocs igraph_triangular_lattice +make_hex_lattice <- function(dims, directed = FALSE, mutual = FALSE) { + on.exit(.Call(R_igraph_finalizer)) + res <- triangular_lattice_impl(dims, directed, mutual) + if (igraph_opt("add.params")) { + res$name <- "Hexagonal lattice" + res$dims <- dims + res$directed <- directed + res$mutual <- mutual + } + res +} + +#' @rdname make_hex_lattice +#' @param ... Passed to `make_hex_lattice()`. +#' @export +hex_lattice <- function(...) constructor_spec(make_hex_lattice, ...) + +## ----------------------------------------------------------------- + #' Create a ring graph #' #' A ring is a one-dimensional lattice and this function is a special case diff --git a/man/graph_from_atlas.Rd b/man/graph_from_atlas.Rd index f54d1fc6466..9224881c646 100644 --- a/man/graph_from_atlas.Rd +++ b/man/graph_from_atlas.Rd @@ -48,6 +48,7 @@ Other deterministic constructors: \code{\link{make_full_citation_graph}()}, \code{\link{make_full_graph}()}, \code{\link{make_graph}()}, +\code{\link{make_hex_lattice}()}, \code{\link{make_lattice}()}, \code{\link{make_ring}()}, \code{\link{make_star}()}, diff --git a/man/graph_from_edgelist.Rd b/man/graph_from_edgelist.Rd index 453451315d3..dfa09fe6aef 100644 --- a/man/graph_from_edgelist.Rd +++ b/man/graph_from_edgelist.Rd @@ -44,6 +44,7 @@ Other deterministic constructors: \code{\link{make_full_citation_graph}()}, \code{\link{make_full_graph}()}, \code{\link{make_graph}()}, +\code{\link{make_hex_lattice}()}, \code{\link{make_lattice}()}, \code{\link{make_ring}()}, \code{\link{make_star}()}, diff --git a/man/graph_from_literal.Rd b/man/graph_from_literal.Rd index 191735aed37..a5088a9c119 100644 --- a/man/graph_from_literal.Rd +++ b/man/graph_from_literal.Rd @@ -135,6 +135,7 @@ Other deterministic constructors: \code{\link{make_full_citation_graph}()}, \code{\link{make_full_graph}()}, \code{\link{make_graph}()}, +\code{\link{make_hex_lattice}()}, \code{\link{make_lattice}()}, \code{\link{make_ring}()}, \code{\link{make_star}()}, diff --git a/man/make_.Rd b/man/make_.Rd index 1d988b9d4ac..307ee02d403 100644 --- a/man/make_.Rd +++ b/man/make_.Rd @@ -51,6 +51,7 @@ Other deterministic constructors: \code{\link{make_full_citation_graph}()}, \code{\link{make_full_graph}()}, \code{\link{make_graph}()}, +\code{\link{make_hex_lattice}()}, \code{\link{make_lattice}()}, \code{\link{make_ring}()}, \code{\link{make_star}()}, diff --git a/man/make_chordal_ring.Rd b/man/make_chordal_ring.Rd index 2b4127f4d01..abb1c2a564c 100644 --- a/man/make_chordal_ring.Rd +++ b/man/make_chordal_ring.Rd @@ -51,6 +51,7 @@ Other deterministic constructors: \code{\link{make_full_citation_graph}()}, \code{\link{make_full_graph}()}, \code{\link{make_graph}()}, +\code{\link{make_hex_lattice}()}, \code{\link{make_lattice}()}, \code{\link{make_ring}()}, \code{\link{make_star}()}, diff --git a/man/make_empty_graph.Rd b/man/make_empty_graph.Rd index 030f1ed1b97..823561a3f66 100644 --- a/man/make_empty_graph.Rd +++ b/man/make_empty_graph.Rd @@ -36,6 +36,7 @@ Other deterministic constructors: \code{\link{make_full_citation_graph}()}, \code{\link{make_full_graph}()}, \code{\link{make_graph}()}, +\code{\link{make_hex_lattice}()}, \code{\link{make_lattice}()}, \code{\link{make_ring}()}, \code{\link{make_star}()}, diff --git a/man/make_full_citation_graph.Rd b/man/make_full_citation_graph.Rd index 1b71a67b0ee..74cb6b511ba 100644 --- a/man/make_full_citation_graph.Rd +++ b/man/make_full_citation_graph.Rd @@ -37,6 +37,7 @@ Other deterministic constructors: \code{\link{make_empty_graph}()}, \code{\link{make_full_graph}()}, \code{\link{make_graph}()}, +\code{\link{make_hex_lattice}()}, \code{\link{make_lattice}()}, \code{\link{make_ring}()}, \code{\link{make_star}()}, diff --git a/man/make_full_graph.Rd b/man/make_full_graph.Rd index be28e7efc5b..03c97c9b0cc 100644 --- a/man/make_full_graph.Rd +++ b/man/make_full_graph.Rd @@ -38,6 +38,7 @@ Other deterministic constructors: \code{\link{make_empty_graph}()}, \code{\link{make_full_citation_graph}()}, \code{\link{make_graph}()}, +\code{\link{make_hex_lattice}()}, \code{\link{make_lattice}()}, \code{\link{make_ring}()}, \code{\link{make_star}()}, diff --git a/man/make_graph.Rd b/man/make_graph.Rd index 96d8bf78c0d..884a1ea0ebd 100644 --- a/man/make_graph.Rd +++ b/man/make_graph.Rd @@ -247,6 +247,7 @@ Other deterministic constructors: \code{\link{make_empty_graph}()}, \code{\link{make_full_citation_graph}()}, \code{\link{make_full_graph}()}, +\code{\link{make_hex_lattice}()}, \code{\link{make_lattice}()}, \code{\link{make_ring}()}, \code{\link{make_star}()}, diff --git a/man/make_hex_lattice.Rd b/man/make_hex_lattice.Rd new file mode 100644 index 00000000000..4b5f17f3cef --- /dev/null +++ b/man/make_hex_lattice.Rd @@ -0,0 +1,77 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/make.R +\name{make_hex_lattice} +\alias{make_hex_lattice} +\alias{hex_lattice} +\title{Create a hexagonal lattice graph} +\usage{ +make_hex_lattice(dims, directed = FALSE, mutual = FALSE) + +hex_lattice(...) +} +\arguments{ +\item{dims}{Integer vector, defines the shape of the lattice. See details below.} + +\item{directed}{Logical scalar, whether to create a directed graph.} + +\item{mutual}{Logical scalar, if the graph is directed this parameter +controls whether edges are mutual (bidirectional).} + +\item{...}{Passed to \code{make_hex_lattice()}.} +} +\value{ +An igraph graph. +} +\description{ +\code{make_hex_lattice()} creates a triangular lattice, also known as a hexagonal +lattice. This is a lattice where each vertex has up to three neighbors and +the structure forms a triangular/hexagonal tiling pattern. +} +\details{ +A triangular (or hexagonal) lattice is a two-dimensional lattice where each +internal vertex has degree 3. The resulting graph structure resembles a +triangular or hexagonal tiling. + +The \code{dims} parameter determines the shape of the lattice: +\itemize{ +\item If \code{dims} is a single number, the lattice has a triangular shape +where each side contains \code{dims} vertices. +\item If \code{dims} is a vector of length 2, the lattice has a rectangular +shape with sides containing \code{dims[1]} and \code{dims[2]} vertices. +\item If \code{dims} is a vector of length 3, the lattice has a hexagonal +shape where the sides contain \code{dims[1]}, \code{dims[2]}, and \code{dims[3]} +vertices. +} +} +\examples{ +# Triangular shape with 5 vertices on each side +g1 <- make_hex_lattice(5) +plot(g1) + +# Rectangular shape +g2 <- make_hex_lattice(c(3, 4)) +plot(g2) + +# Hexagonal shape +g3 <- make_hex_lattice(c(3, 3, 3)) +plot(g3) +} +\seealso{ +Other deterministic constructors: +\code{\link{graph_from_atlas}()}, +\code{\link{graph_from_edgelist}()}, +\code{\link{graph_from_literal}()}, +\code{\link{make_}()}, +\code{\link{make_chordal_ring}()}, +\code{\link{make_empty_graph}()}, +\code{\link{make_full_citation_graph}()}, +\code{\link{make_full_graph}()}, +\code{\link{make_graph}()}, +\code{\link{make_lattice}()}, +\code{\link{make_ring}()}, +\code{\link{make_star}()}, +\code{\link{make_tree}()} +} +\concept{deterministic constructors} +\section{Related documentation in the C library}{\href{https://igraph.org/c/html/latest/igraph-Generators.html#igraph_triangular_lattice}{\code{triangular_lattice()}}.} + diff --git a/man/make_lattice.Rd b/man/make_lattice.Rd index 52e2dfe39cb..c013d26b072 100644 --- a/man/make_lattice.Rd +++ b/man/make_lattice.Rd @@ -68,6 +68,7 @@ Other deterministic constructors: \code{\link{make_full_citation_graph}()}, \code{\link{make_full_graph}()}, \code{\link{make_graph}()}, +\code{\link{make_hex_lattice}()}, \code{\link{make_ring}()}, \code{\link{make_star}()}, \code{\link{make_tree}()} diff --git a/man/make_ring.Rd b/man/make_ring.Rd index 25cadf9e45a..dbaa3e64a9f 100644 --- a/man/make_ring.Rd +++ b/man/make_ring.Rd @@ -45,6 +45,7 @@ Other deterministic constructors: \code{\link{make_full_citation_graph}()}, \code{\link{make_full_graph}()}, \code{\link{make_graph}()}, +\code{\link{make_hex_lattice}()}, \code{\link{make_lattice}()}, \code{\link{make_star}()}, \code{\link{make_tree}()} diff --git a/man/make_star.Rd b/man/make_star.Rd index 59dd345bedb..b7723a59e9d 100644 --- a/man/make_star.Rd +++ b/man/make_star.Rd @@ -44,6 +44,7 @@ Other deterministic constructors: \code{\link{make_full_citation_graph}()}, \code{\link{make_full_graph}()}, \code{\link{make_graph}()}, +\code{\link{make_hex_lattice}()}, \code{\link{make_lattice}()}, \code{\link{make_ring}()}, \code{\link{make_tree}()} diff --git a/man/make_tree.Rd b/man/make_tree.Rd index 42446786e14..51949bb8664 100644 --- a/man/make_tree.Rd +++ b/man/make_tree.Rd @@ -45,6 +45,7 @@ Other deterministic constructors: \code{\link{make_full_citation_graph}()}, \code{\link{make_full_graph}()}, \code{\link{make_graph}()}, +\code{\link{make_hex_lattice}()}, \code{\link{make_lattice}()}, \code{\link{make_ring}()}, \code{\link{make_star}()} diff --git a/tests/testthat/_snaps/make.new.md b/tests/testthat/_snaps/make.new.md new file mode 100644 index 00000000000..7038eb8c85b --- /dev/null +++ b/tests/testthat/_snaps/make.new.md @@ -0,0 +1,175 @@ +# error messages are proper + + Code + make_() + Condition + Error in `.extract_constructor_and_modifiers()`: + ! Don't know how to make_, nothing given + Code + make_(1:10) + Condition + Error in `.extract_constructor_and_modifiers()`: + ! Don't know how to make_, nothing given + Code + graph_() + Condition + Error in `.extract_constructor_and_modifiers()`: + ! Don't know how to graph_, nothing given + Code + graph_(1:10) + Condition + Error in `.extract_constructor_and_modifiers()`: + ! Don't know how to graph_, nothing given + Code + graph_(directed_graph(), directed_graph()) + Condition + Error in `.extract_constructor_and_modifiers()`: + ! Don't know how to graph_, multiple constructors given + Code + sample_() + Condition + Error in `.extract_constructor_and_modifiers()`: + ! Don't know how to sample_, nothing given + Code + sample_(1:10) + Condition + Error in `.extract_constructor_and_modifiers()`: + ! Don't know how to sample_, nothing given + Code + sample_(directed_graph(), directed_graph()) + Condition + Error in `.extract_constructor_and_modifiers()`: + ! Don't know how to sample_, multiple constructors given + +# graph_from_literal() and simple undirected graphs + + Code + graph_from_literal(A - B) + Output + IGRAPH UN-- 2 1 -- + + attr: name (v/c) + + edge (vertex names): + [1] A--B + Code + graph_from_literal(A - B - C) + Output + IGRAPH UN-- 3 2 -- + + attr: name (v/c) + + edges (vertex names): + [1] A--B B--C + Code + graph_from_literal(A - B - C - A) + Output + IGRAPH UN-- 3 3 -- + + attr: name (v/c) + + edges (vertex names): + [1] A--B A--C B--C + +# graph_from_literal() and undirected explosion + + Code + graph_from_literal(A:B:C - D:E, B:D - C:E) + Output + IGRAPH 955d723 UN-- 5 8 -- + + attr: name (v/c) + + edges from 955d723 (vertex names): + [1] A--D A--E B--C B--D B--E C--D C--E D--E + Code + graph_from_literal(A:B:C - D:E - F:G:H - I - J:K:L:M) + Output + IGRAPH f2b917b UN-- 13 19 -- + + attr: name (v/c) + + edges from f2b917b (vertex names): + [1] A--D A--E B--D B--E C--D C--E D--F D--G D--H E--F E--G E--H F--I G--I H--I + [16] I--J I--K I--L I--M + +# graph_from_literal() and simple directed graphs + + Code + graph_from_literal(A - +B) + Output + IGRAPH 850fbcf DN-- 2 1 -- + + attr: name (v/c) + + edge from 850fbcf (vertex names): + [1] A->B + Code + graph_from_literal(A - +B - +C) + Output + IGRAPH 56752a8 DN-- 3 2 -- + + attr: name (v/c) + + edges from 56752a8 (vertex names): + [1] A->B B->C + Code + graph_from_literal(A - +B - +C - +A) + Output + IGRAPH 481388c DN-- 3 3 -- + + attr: name (v/c) + + edges from 481388c (vertex names): + [1] A->B B->C C->A + Code + graph_from_literal(A - +B + -C - +A) + Output + IGRAPH 7598ca0 DN-- 3 3 -- + + attr: name (v/c) + + edges from 7598ca0 (vertex names): + [1] A->B C->A C->B + +# graph_from_literal() and directed explosion + + Code + graph_from_literal(A:B:C - +D:E, B:D + -C:E) + Output + IGRAPH eb1e38e DN-- 5 9 -- + + attr: name (v/c) + + edges from eb1e38e (vertex names): + [1] A->D A->E B->D B->E C->B C->D C->E E->B E->D + Code + graph_from_literal(A:B:C - +D:E + -F:G:H - +I + -J:K:L:M) + Output + IGRAPH 8293246 DN-- 13 19 -- + + attr: name (v/c) + + edges from 8293246 (vertex names): + [1] A->D A->E B->D B->E C->D C->E F->D F->E F->I G->D G->E G->I H->D H->E H->I + [16] J->I K->I L->I M->I + +# graph_from_literal(simplify = FALSE) + + Code + graph_from_literal(1 - 1, 1 - 2, 1 - 2) + Output + IGRAPH bb97a6c UN-- 2 1 -- + + attr: name (v/c) + + edge from bb97a6c (vertex names): + [1] 1--2 + Code + graph_from_literal(1 - 1, 1 - 2, 1 - 2, simplify = FALSE) + Output + IGRAPH 09745ac UN-- 2 3 -- + + attr: name (v/c) + + edges from 09745ac (vertex names): + [1] 1--1 1--2 1--2 + +# make_empty_graph gives an error for invalid arguments + + Code + make_empty_graph(NULL) + Condition + Error in `make_empty_graph()`: + ! `n` must be numeric, not NULL. + +--- + + Code + make_empty_graph("spam") + Condition + Error in `make_empty_graph()`: + ! `n` must be numeric, not a string. + +--- + + Code + make_empty_graph(10, "spam") + Condition + Error in `make_empty_graph()`: + ! `directed` must be a logical, not a string. + diff --git a/tests/testthat/test-make.R b/tests/testthat/test-make.R index 396bf65dc43..8694c82540a 100644 --- a/tests/testthat/test-make.R +++ b/tests/testthat/test-make.R @@ -456,3 +456,45 @@ test_that("graph_from_lcf() works", { g2 <- make_graph("Franklin") expect_isomorphic(g1, g2) }) + +test_that("make_hex_lattice works", { + # Test triangular shape (1D) + g1 <- make_hex_lattice(3) + expect_equal(vcount(g1), 6) + expect_equal(ecount(g1), 9) + expect_false(is_directed(g1)) + + # Test rectangular shape (2D) + g2 <- make_hex_lattice(c(3, 4)) + expect_equal(vcount(g2), 12) + expect_true(ecount(g2) > 0) + + # Test hexagonal shape (3D) + g3 <- make_hex_lattice(c(2, 2, 2)) + expect_equal(vcount(g3), 7) + expect_equal(ecount(g3), 12) + + # Test directed graph + g4 <- make_hex_lattice(3, directed = TRUE, mutual = FALSE) + expect_true(is_directed(g4)) + + # Test mutual edges + g5 <- make_hex_lattice(3, directed = TRUE, mutual = TRUE) + expect_true(is_directed(g5)) + # Check that edges come in pairs (mutual) + expect_equal(ecount(g5), 18) # Should have double the edges +}) + +test_that("hex_lattice works with make_()", { + # Test basic usage with make_() + g1 <- make_(hex_lattice(3)) + expect_equal(vcount(g1), 6) + expect_equal(ecount(g1), 9) + + # Test with different dimensions + g2 <- make_(hex_lattice(c(3, 4))) + expect_equal(vcount(g2), 12) + + g3 <- make_(hex_lattice(c(2, 2, 2))) + expect_equal(vcount(g3), 7) +}) diff --git a/tests/testthat/testthat-problems.rds b/tests/testthat/testthat-problems.rds index 95cf1759297186292377247df7cb3d1a15c7620e..353aa03f4d4e0aeee51f340189b28897612981da 100644 GIT binary patch literal 49493 zcmYg%2{@GP7q?weDMq$3y{U}0Nfe?PDpb-~DvC^z&^Dp6jTw>@%3Bm7V@X=6kbTC| zAYn))Dr3u7VrCl5KF@bQ-v9M|-+R5+RXy{}^W5jY&-tC-`JFS!q(yQI|0(`CsY-nC zRY+a;&l&b^g65jV2V#^O-CUK9DDjIG_g31Pugkdc`^AaZQC?H8PVk?3dGW_-cXv$& zzV@0r_v_f}(tapvCYl+V6U7$$+uC-`_VyZ68PPeVj4&#jbUSK;kVw_V|KyyeW_XIa z)16I!vXXY_;_lg*w(GE*p8WKyxl*=y%I9<62-|yRuanef{iX=GXtQ z=d8#;Qu?%`m`|{}xKe5v+W)72+t9L4Q4hDU?|r$k*vX*veCIc7#`jwmH z;7%Ro#QiGoS*wM4Cv7|>sK$>%W7>x7r$r^s_J(%-MreOCO7$?TcXD3t7W zQmCzOp3i5iy$V!+wWO!wY6h1u9ptql5I?OEE%z(Xs_66Q!@1w@HNKLbL=6jAmYwcf zw>Dptr>^*Q@^w;wzoKLXkA^d$vK|+tk;fLLHox-LrBVdVDPEte%(oSvk8pI%J^!<< zvskg^YPmA&jeXDenc&Z7G+0B^7gxv5{40FJu(bMhYs}!NbKyj~kmPO~R!1v6e>(Tm zpHo{-CZ(g7UYWfj*17iCd@?usqKR|6t%rXdwEWuheES^(w4gX_;M-ci(_S9A<;HI= zlioz`xYMKG()-uZvD?vL+VT7>qb*^RL{|U8e;+-dV$CLxy{@#L3;U>?$1k+ z@zqqvyqqUlLW8WrGNM<5_Up%=tRt^~4JkYFbmxVxZ><$8q6@OT6g#Fb9j|`1dmAms z;vCs2DlFj5T-Ud=G}_C@568=brXN4`uuh*VyL##e3QtM97$5qZp= zzER`Ez{>IGuT~4LyngsFv`{6g@mt%Cxmo-V6R%C~#}4Y29oV!!`KjiHN1A&^${(II zH$8Xm-{?@nyyBm{XMGpdGL)2GT~u|RWSVPSxq9`Qa6xXI1o9Opj6`ca^n>Fv5rTMnp4$J8uIyz%O(0doHK_`TW5+1Y;& zZ+QEpw5i9_*U$1Rls|mu&zneD#S$JN?`?lOZK|`TV~qHU$==;Lx2J#jC?EFg8!+^L~7PAOB^wS4T$0rwbW~ds_Hc2kS1$ zJ?rz@lUj#8GgC9Ttw*eCa<(;LB+xB_|MjVKV$=A#bEm93;ydqN?ZNq}UejrN@%%h7 z>T3z+5hg}h=5y9PlP~D4nmF=xs;C|N=f;Z(alshUOe7Rm-@L`(572rz^NbkU*Er-dKx!rqu;;(Q(N}?#gBAF zlLq!~?38m3G*NSkadzRS@e|sc(O38itL+SeZ$0!2=P*az+L0TRYws)~JsZGcM2hlK z#cu7*Nwse$XM!dYU-;Z+GT(7xgjb3TUYx>t{CJ^X{nI%YO7hE*whuV>+zR~JOMHK? zZ&lc@KQrF_edQMpc)iS~{hjV>L-_3NZ+m~Ytv@ma#8z3E%B~Y03|8Xhw{9ye6K9W| zv%B*A@uw*7xA(L*zW8qF#gTK`nzFU;WSh70hPl#TbF#v*w;NYqfB62@izAboyC;o| z9HYDcUchE zd@~&P{8@T~^z>%;<6~Z|#`oV^rLPAvmHU5GM}1k{W;2sQUy6L8q8fYYjrm3aq5Pgv-ARF5XN8|x*S#fM4a4?o zA3IkzrLiOb&OM5!@m?F#zgl&7tB!20O*6T7|LOjZX9W8cD(tf?CRXrn_I!01-jVR< zR-bbVZ)C{mXUVkx)82Vao8<1LHDrG$4@a*SUubQ$5RZ`LiN zARz20TkmJIiwDlRN5CC9f6*){`Bezi*JVSaeR!@-yL2Vwa?QXjo%9*H#gS!yU#t0r^*#n^*6LkXdhYC zaZCiw*K}m5Ufjwq?07vh?-X5je`b0N6|UpdJ3M}u39mR-_G@TYrd~fWGb`&j>i$?Xt{=(o|3I33 z)O)6H!z=X(#k#Af>aOMrPh~a-ITzn4ABs-8sW{d5GTcpdXot9o&r1kUh;lTdQ>_x}U zV2*AJDGHh}G^if_Hv5J1+Bv%QIYv^fN!@%$aMtF1Q~$>VBhv(`fk`vB)b+wVkU89MyrsX_?tPKvtA1m8?U8qiz!@Rrglf@~x=+>iDcOVUUDs}%qb9zNPg4~{c zp3D0&&=q}-L;AMU=woa9CCi8ogO$6#6c{B`Up)}eyQezvN~ZJ4h&`)ErxROnPA?sm z*pH@P@51g=$H>m@z%lf*Cihm%j2*6i+kIi#*@HVx=3d{awDZyR{HeX@i;~m&lOCsz zcRU$%GFJ?53-S^EtyFz+|5t~30LiiR;@LM5PubJ2PZSW%167e%=Xad;S(BWDK7DMC zbX50OS%2%(Elb+*UFEgYG0RfsyMq~|CyRZ2)Y8A2H^}rh1Wh{owv?E>N;~zkY#^4g zZ|AFu9S;n$XIIF!_iitExKc}7vd*|{_YG3u{nrY}!@oK1`OCHXy*F%6NV#Ef&XU*gtd%JtKKuWo2L z@@vbdhvg;36U$ba({^{c_H=)(+WzzUWLaQ@BWJOD$BPp`MhDlQE;K!HV0YcRL#6x| zkq}j;7K%Su5!n6kf@|RB{*}V>do)g;JNE6J3YEQR_tDgXLmr&)eKVV;5sNU(b|)Wp z`6d5y#3MwoIgnPSPW8T$Ax>}N^j)7GeN*%0R&4t1+SkENnpa&Eh<&*Z#Tf zfB8aw(Y4a7lSh#57S(AcM#yhBp8ZI;<-BUuRMQ5+Zl-O!1v-KsvA^#L-pRhoKb6@-1 zAZw3PJKoA7aK*;F=cliqoUnfpXp&tzi@RdmfDxRrW)IAJ zLH+FR**CL%?+cR?TDjjO6N5>O*Z7|_f?7J&NE2UAm<6}lYz*}I{`MKZ;3LQ%0-@os=oqX-Ptz%f0aK}>)-?LwFQ~%l=&!e3M*(W1rGb7pp`nhHW zk;12UF&@Y(tis@xnw*1K? z1bPLF1hI7_oBjNv$Ib6Cf*|&_nOkfkk6+U8@Dc06>b#bUmyy*c2Ca$$dW?J=Ki@=M z(9J5ynbog${rbJ7eeHm^wnfCPA(P$aQENsur9yx-OdzAEK?y%{uE5D|Kp zg50&OqhxVT#?CmuN}#J>tE}*88^E7|6Pm2x{Rjkp{P(4=8q@h@*rlnwfYuv?@$A?)b4%cen0Hq(SmG zeV%tnt<}5F4-jO=OTMBp^~TTYXHR!d)>rup(9gf)uAzgxzG#V#Q8SB6mUi$2pM=d% zBN|wk*oSL&fAk6e)JQT;3(I>wZYZh0#{0a5{K7N(NZ&1*Yj29ttmY$aAGFECOmxY$ z^|7>~m#+)`xPPxz>rME4ez$qBBq&>XE(Tw&MANT9KX6!bORDW;rsRWEt50~^me4kx zu(G@?O!ZuU^)x!{5w8EHSbDhr;x%tnW>{O#3M?+^Y-z_snX zhi_Wt8PBOYMwko6pHIFmI?|eq*=rGaQN3d_XEh=m-LB%9;d*}iY(_GfX(};H&!XiP z*1Y~o`zi4~`#s?ov7UKa1OFtBcJP4eox}8T0L~Ui~=MbGda*!B-tw#d3$uY|A$Vq5cUtNK2J_@t0S; z?9U#zZ3c<0xb^ccgsc3r%_klFpXm8ECuJeY0`6|-dt}qR^18w-$oIOChtAvhr?P2l z==_E0du!t$HF9VJ4{g0JgSO~&F=NHWgF8dZ8?KCfe|$Adw$Ib`c~bu|<&~F^o+jkK zdA&29-#&j`o$>W^kEZCn4vngYxvQe26tw2yv(Vnb(E-=J4?ybU7zS9F^fg3n#-ON-VyV#rkWp<1}-aS^A#WcEpi=| z!#8*?mQ^7l)X=hs+!6(I+1Wd+O>>UXv7cod2c6Pnjsus&OpRklyc#GL!f=OGc=vQ? zM4iAxp3<5z89HKp-`AYgBj-o&khQe5>jb?DY}GXG z>bU4pr@N77JJib+^%c{ z4_YeN=K%iU{^z66+*XgW8}$&rswKDru12~3=@5q4av?oB3G66eWk3TZrKRMz$e0?F z9`Y!jABJ-@<{hac_Cj7`5^bp8607MlpCHF6&~=Q1)+W-y{wCSsm!hWe`CpK87pddi zmns97@9|V4nlgn}jjZC;mDCzkq$OSnHFAELpCfoRTb`P+qL&|%_#hjtoW}JU%F}@! z)Tf(?8kpJlmW>dVb7$FkhLK$Cp&(>2+o%dUL)dX^O6-|9a{7X1^w5;pGSLZaKT@Ms zshF*WIy_9&&rN3BMx>*_cNPn-*k;m<-Lv!IL&?l$$feB%Z{%bqA0H&^(Ky5m}QBVM@hp95_}{CxBi4F@y;1+m4%l1>G_-18R_EfL-vG9u@zDgHCOXPheS51 z9cQyB5gn>4*mz`q_zm8HnC&Euo|GQoq*w*wb|a>aD)^)@JegMxJ|WM8clp)#%C||U z@Z*l54)iGXpIFM%@NYV#YYkGKULs$+E)Ckud1o;U?l8&WRf)arCTKL*+LvJER)e49 z{mEi$I!_H9*;LmUfzACxL4zQ=#Vjlsjsy#5?LBMNASj1qB{ z>Agx2V^r;(zwDed(kqAJmph{s#Lt5?xBVjmDo~%Uy92= zQ;A*V7HRs&T02i#lW&#b1|(zARPP_tri0qM#Rji`|4w%K(;T21vCN56#oB+}2Gg($ zu_=;^lcOU36%#zyvd!+*jyoHixzHvTAzkLALe1{hkeMK!1HX8lTOv0qG~Mj{96Q+) zTcR*JXT8}#;2Kj)O86~@??Cmcx|1KdH~j?`G8Ch?tYMU#7Pbk#T&H?wB3sk{N)NR*|-rE4gJn;rki zLJUhi9r~a{P-HpQSwi8ULNk53)3OW2T)D&6X{$*oQPUUGQOMs+Pj6H*!bcZCC zn{D6jAEJ|2EI8as0NPT`LMeyXaoJUxLR3v5$n%s}j6^NBw_uIv1ruvfhmXt-GnW$A z8u?%&QO7Q06kVFbtms^@9UgL&kK?M)1H?-!5PY(isJq8zhiUqPgSL9iIFn_r;oVug zCl_^k$hS$X5Q2Nj1@%mCqh%i9Tb%zcAfx5t1Fs2=|xzI0RDw7JZ7vo%t{q zrA$8xV;Q&V{;(l%Di3)ye;J8Gdo+9ktt6Esh>ilo zD&>I>zatUyDvu7)DV3+gE|bi2|7cXm<2!EgRV&;jK0|bfpIf4wHV@eWbJ;G<8f=Xj z*D;O1e6D2k>47!HY*iCk3eP@fJC*z-`~)x$lE=3LM8+XBLW>bD&Fp_P04OaXS`{EA z9lQ$T1*8*K0;Hq3z(^M~L)%UfUo!0FGfjL3Yl(btErKE>RP39gL&}3%05oa)x!YN0 zAm94r3o3xs>9Gu@G@)3H{t^Jv@Xfl9!p*kFktOn!jtoUviMwPkSTr)1p`0e<-gF~> zp)Ib>cK$6s(1V4Zgs1bqg3Jiz3v9tsYwCMJT8_kZkBFpllOF0Qk;VgV)0`Nze%3&G z3`PhgszRxkuY5(NW;Ep4S_Tewtk{ zr09yQHpKBJVr(#`v!RC`07I7y(u-C}f;v8&2?eQFR`$@Z4S-^RVoJl5_04a-hl=3< z$ynQYRN=2|MXG9Tncq4=&!a>WmvAmxPKvV4M8<{Pv3Dzyea`so2TR@!vg zm8U3lwSh)|ZH#+E@;j6~1d|KO^QJRkL4GmmrP{BU8M_iyI@1;Yitaq;cO{V(Ilq%h z9Kw@~<)-tMq%0diH|&Ctoh2WCk_9t*#mo-WPJTS?$MvbOU34E1UKXmDdn(A{36lC0E3Xjw-ZCG8AoYzG6^tkQ7VJRi@lv!tzz0F3GF zXG}I(H3T|pMp)j71cjt+Cpel<>~83^`K#CJWKixPa5Sv~Up#E0(L&%n2o zIeIbM$sTU6+`_xHbV4&2(foC&DZd?@!4D$pv>&0*uVd650OLD)k)$js-Kx2|jUv_+;>KQLS8mkj(MDNJPDWq|0 zZa*sD1LCHm-q@^>A8K0R^0Qgk4FaGd5-eip;CZ<_1Fxp7Z(&iR+JDG#@34<#RY}7> zoyObXyTcSIqoK@u2cVyd|K$>2!yzID7#>}(vv31nG39jlWKo7H$R&%I47$yJE;*Z^ z0>ao4BohdVNl~ujq+Et}ZX;~d60w34jjbrksA=-`Gpc|&lJ7^jR}29h!mS_-{DW*6 z+0_}q>{fpWEurJBC<>_GSSN0nJ^DAKEjR)a7|kRy9Qt;-L3Ag8MBFF!$q$d`nZ&r! z(oJNAz!>d8clqBU{zm$F7-M_~U>@m>$E#u2l{#+McvDJeh1xiE4Vj0twSOTcl?(tH&LP%Eh1v%?r z@Rbx!YrfndyLgsrRZI2@V%&8eB5qv6Cv1LQ_+1S=(xkq~bY&big8np=s^lU$pp^xT z!>$&%+0IbDFR|BP>*#iVD_Qby3FU2Hy;#p6S9WDf;+9c~r|om>$y8q_L|qzwk;KyW zIr&~bQdOk+j2Uj*oxX9z%y3rQMwXgE8Ev-sj@h;8!?94zQkQy9E zHtQyvuTKGMX6KH##F31j;f->~!vINLF8+&QNjxFQg2oE?`bGTox5n~#4HS=mX0T;@qtyS838E;Nst0iD zxnbmUz*btW`v^)a$rYyt*4RMFyAy_OI$HpNVSEoYxdZ@ZVZP2esWMqE38cBJ%|aB z($a>{fe6K`$bPGltpLR6|#05 z9Cmul0#Q7VfCd+c;uIi?P{L=-Pdsx>mh~~``iAztiIZc$f3B?^zpb7_fSqfSAB&bq z*4K_>hbRFctueyzE=0O;9Y_`Epc*eYg=`v3)wAGL@e(3rb6Z$Nifw}E5%4xbEK{Lt zyhAuc{!r1y@Ct?uZt#w;I-Nbrldp;%(@3Wmq9V641GnJoTg4PB3Y{*Gm$%$}1(Rg3 zjHqoy#sy-6f(%ntNHf!;; z;XriaCimH4yb^J7uAnDJ%cCt~pB_c?8FG?NJ7R(qZZDKxjs~?8nY9gToKNmp^=cvW zlw>xg!di_SUJf;Faq-m%U_rC!U!OkQfgh&2@G!#_77uy;F~bDk>i|yP9u&5wDAple z+K{;J4?;D-E*!>@Uy{gL0v(h@sSp|xovs`dT>2z=zhb0jG5u^d1IR#yVrk`S@FIc= zQ9iefGCx_l1=c*IIDTAkDF_LI{KBguj4o|peUhV7ii?7Ofcl8?JS|1Cxl1fxNUYBJ zaIr&p(AI=9-%}X@6Dbu)A)cu+YXm;jXIEBbBb8CS^Ip1OEs!?{?IMV16Eq3CFEuw<<}C(4sn_$UJ4obvGGt>~}SK!DTcS@CZMs zj-`Pc>?OSUc5v#h-q!Z2a6K8lrSOt7Tvo{ww~rj5>_*bBx~=*k42mIQ61~QN&&0(r z5iZ5FPq$Olqj!FXRDvPT18*O}kV8F+a5RZDA@ATQCx>Hp=?c_rt&pn~fT!f7EGx7; z1e~PF7O#jJAy>MQZIG+!(o!Ry3YR$RlsIAua=kQkGo25tPf-LiO*1Q8jVJwknA#=! zY2r&f{KPU7yu(d)08z0i(gZp)s4nLZS;Y^Vcj_qUlOH7n7rAA_soi`qNsbO(Ni?&< zFG0xyT(S$m#Y2U}QHDbF;@mW7QzAZ;y2NFkUuv=y4#V^Cc81!5D)cX-(2@d6Ycd{c zs~dm@4Cg`2Fj<~Xu*55)#4YjLWY2UUChE5lc|}=??GRc8as`y)6RLO+)Z0POZ$vLR zR+@s~oGq7jfB0NyuR@!^$3D0ec-G4YfA7&$fH>kND@V{qh`V#k*t-(5fOkO41S;VE zoMDH~6y-GOw8}Uc9P%CDiA<$wgF=qQCb2q^7FanbD>nn=5UNfczSPN5Y?EEpp$CA? zVyjT)TtqCxM6o4)5lTu%(~-aznX16q1xy@w4J%2W4#_7bfQ#5?z~hj1c)*q*Bzm9)Q* zJ@+0sjj#sVfgz@%6ahdzI#I(4tL;)uK-SArfVImdSqPbtE>j^M@~n~#O1}mWqkqtK zb}`i-i87;7(3#9`on5^P(hQ57nxdFCA3dT@BQN)vW%8sSi(jo6{hQFT4b6{kEFHMq zAl{prA`h-;q*Ri%eP%<@HP$?pAz66%F8d82+JqvEP28|P*w0Krx-Siv@>`lpQ6ZKz z6Cm0o1VjNgrz)6;alrBMO+km3STIxA4N}7LPIS}6iQTm~;Go0oQeT2B950k;4yxpi)VK5m|76+i;X)YOzZ}xmXWM zFsf`x(e41j5nzQ@3|hrJvgca=%LLpI(Ihtw*L!^^)d~-Yuf^iY6!6vU0-a3~M4_w| zcT}V?Krr{dOe8f+7;E7Y@(}FTf(r-U)_^n0tk(fmV|)JhL|A^nl$wme$~Y*_fsXy! zWDM5D+n6_fy*kqs4+=w3*WhIReh~kP6Z$}8gw>Ep|Konc#PzvfDD%=G>kz7%%UJKS zF6deM-!LUIt&y!Xx5-8D_yIS8PhO&vjgJDUlcf_)5@29h7urJ@Vij0ObPO8QSAFTe z7*Lb>6Zr*;VDQ!;ngZonhETV{tD$~ZxRixZSGly|ZG&?`&%&#L<~gLZan2DVCnMQD z2V%LRC4Mn#4u7b-S$GdDY&}91>?3WdM5;!X`vQVULkY$b=vtzGc8N-wD2pY2oLwTH zHrFlBQ=M}o84FU}1pY2Gg?Q}#Oj>xfPv?{$a%}0a$kRD^5jYwD=v9Y;AA-g1U0AGD z+VEwVYX}~hO?HF$&`_o70zhRUXoK*fkd^4J*=SXS^d7<(1+WywK_3&~QFD&6Kn`E= zpg1MZG6yg=Hwf>xss*e!ANz3F93*C>s*DtmHJtRwI2+yP3Tb&2kl z0NJNT&SYT0{^H~zS2glR*fN~^7`iy6G(5TsV`xKGYm@d^wSTH|hs$Ui$|K?`0E9%m zKzMB70+!vPZ)XCzjs2$XgD=#QO@+E3NI}^ueZa}5-6RiCBI3fKYyYcRr9&GiXc8KD zo`oW%y_KPHoljUOTTNm@pldH-!CjH0pZgQ})2_BE;NpjG<&p3^^|x&WLU@cLWp8RzYyKB1hgFF3CnKty=lW zv58U`?gKy#AB$E1=;$hW%%cO4T}A%{jteRV$i>S=%cuRt=Z4<~{3Jvges6d+FcTe1 zj%}nZ5rqI@v33tv17_G#pTh9R;JiL#OI&MT10?8epm`5L@}iAk=awc`Ec9(C7N=#o z04ZUHO*Rk}*$y$~p>B}A_$bUEIKo+m7(oG!4avc{4gEXp*O?-p#ueWhHUO_hZUSh( zczjCEUnb2O#%2@bKv{c`YsG3&I4H&z2u^f62`O>p$BmHc>JbXY4 zdz}{#1T!ud@eyo`qa0vWvc-r4*=Q96dDr<5MXc;7~Z#Xsb0PG{KU@RSR1+e!_qPGpz|^^|2Nm;QUwv$tP`$>g-YQfUWWEFF_QN zA31Tqg7@*@ZB)-Ct0Ab%C5`}@x;$GxRel8<9<-I79ztE|B1&oANOc3Y7Y<@i41Kc2 zfJ@RfB8VqJ%fV+~!~irzOn zRb_!&MzyggffpX(P@ZvmY-uoH`_l={5&Njr7J^zY7BG>s@VAPZBq$d_$Ac-fgp@i2 zdJ?=PJ6HZo(fB~SkqMi(rjX^QYAgH>Og)Rj28hQwTsR~6<_%e)#(-rXYt>8~< zI1hqnJw|*24II1*5Ek{IxHQqoT&NYFArIIu`0%C4vLWJ15C#nhGF;y-T8QZcH=DiK zEcWu7X2XJ2hl7di;l}g2xeYm6)xC zmDvD$-eI;DgnNU-{S7BlaY=5a+mJoZTXHoUt&k?GQxj+c*7;~yA3W>4Ey!U!)(P+| zkp4peYB&ID3d9RKvlAwQ%#L~w`9x?7q5^cbnQEeYfa?DMoo(5*K}V2$!`yxrE-aI@ zu*?}1(h@*D_Xd{$5v?w_1TdsuK+l@vD>Ca_SR|!v)MVmKE+8uwA7=L;DnI|UHCBP5#9|wE@7{J zwE}>ouTQ5lES3)n+eZBW{CGqUv9Lq-kP1|r3=o?t(V<7d5~p7v_I}pYYgvHo$3_`2MgLa9q4R*vS!bIcTB_k3Gl!Wd=i6ObOe5ePxp^yBq;X$56(kt`Mh)&h3+D@qm2z7fcJ_ zuWH1Vhn9!MjVp~8C!y>@s!UQsO=`Qafd$Q#?Xokro zs|1@J`e^MkNIlWdk^*8~9H>#3Mo#{WSw$JigZ=`c$#@%i(bUp5X~hK1-Q+L}xUPtA zo)`*LT>v23$sE$?Ei+W-FmY*a8FUDEH>EHQv@@6LT%cqcy#j7s@Hziy4GS_snVU-RD?*N{4-WG0n zvrY__>iUySd183lfdaHsGMIK~qa6ssV>lIdkTyt~mjYz0S3t%SZ%vGXo4&HTtl?k) z*GxqKg#xBiFct`KbO^Ihsxmbe^d+P>R>MVdj|YO9jGP5?4#)?8hlF>BE{G=qZmuXK z4+@_RU6+z?pv@s=d+5vu5vao$9Fg^XP%2AzJ92GUq2Q~~VNp0Rh+#%X0E3EYIwn42 zutBta++tu*I;>~U@fSLdA`d&*An^`h(2%h0mW9c{7(90bc^Lv8cd;;AKl~mI6?T&|*tYeVF=GgrI~{VSz3aP*JQZX-PpX#gSsb z)#i-IEhWsHq^VHvz13@G86-j>BoJqe3Lwfd$q!_)d?b*<$-5ktShO`_;}82@X$;vT z8B=WCZ;Sp)Blc+WLYTlk-378Q3yAmSmN;O@9v$$@53njeYw?vW`%$Ar%{2^)QuWGp z64&k|pxAy)en;*RtV6h_U8ZXO%fjt>3s&V6gIwGSzClvs5oMM${1M`5K7R3$V~zVe zK^sUKp)ftMIBO%Q+}3e|lHZUwBz8*9hU+W}9N zTB`^YY`I7$)59RLRxQLX5Icd$mcusRR4cHETZr9th0vhv$3pBrwZYyE7&v7E4?vk& zVijDP3F?U#LEHenflRkpsqXv+?sREh9--;rGYjlVO^H zJ=`vysb>L<{A2gF2n=Q500^~-zN>@Mpo)}LPJ>lqqSWa-Tpb8xW~VW9nHqZT2Xgi+ z5RXr!$zrD}hAu#GmR@N})|>*<8jo?B%bs|)fpMB-oHacUfFE9ssBDyt)7*u67z{f_ zFFXt4U!QUsO!(~403HFljf%`x6x;aG6!K)c*0ErcmhA-e0CtIuh2)*`GM5=BH9Bw3 z2qjB!e1!&Bfhb|RTY^4jFWThp2)qTzlPOxVT%fdAj^TcbDEdRVxr3IsVJmUGEki^Q z1jh0JYp3G+vo0rsl!}1ulvrs4JH2TEfG~mKoXvwTb%&%CHx}rJ8?Dq1mh8mm;b6N1 z8wn`?)>AU`ZwhfEwl84n`G9cXw+OUu|uo28LEL||M zSebgyb%3&MioYvy%8CYu7TadljWz{4y)kflsOLWuD;!`GAypq*z#9jb8T8CqpU#f| zvV8x7&x?seEHb#mQ6}6BYGEn80Fe@mS?n^#piFpT?7@-x0Ur6VL11&3yN(5>oMbj| zJHv{{bOKNjb8bI9vHCQb3dhp6GY{f(kZJ$a0KjQ(4 zZ6e8jJ*Y1iI+96lC3o_~7si&h@phQeXio%>c$vxJWUls>UM~sm!Y7?kne&sX`x$whe1=@K&6*O%heLx}KbnRUC~9vq_6)MjtT3}f#Ld6hobhY4fjx`3RT=BB73pk4nx?ZoX7 z5a2Cwm=!J(gG?-CYCTGpirN4`1*Z~ilPkcu zp~T~WIF#BV!K_7TEKUvqSs{J^LQ7B=?E?+PPm*|Vv>lgu&(|2d_3^@O)`}E4lnjhd z=5dB;s^eOKgy6==O>>$EDB5J+Jsiw9&2qttk+2bjLeFR5w&k!5$WyYl#p$^MB+!EZ z3yxi|;TmiMS&wc9mZ2I8n^2QM%YaSTWO59!h!O?Zgc23lgb70w_cB;VlO1IdN`?)P zX)Zj@IT%cg{clU~3h?5LU9!Pj$!p=oLF>lIpTOeC)s#av@R-b!t`@~aprjeYV?wH$ z3|BDTqzbQ(yp@+8Ql~_xd~+JM2g}ik#TdFs&VWk;MrZ)i3fgg+4&l_aa0_}JEOp81S^)j!Z~WcF+tJiF{}mKY zA|uY#b`>czTy_$OoWy646QblY^|Uf@9u6wFkHl8=ZuNSdvX{JFOy?;G4Zc<7`iG*3Szn0EQNzoj1pa8QG2vs1r7*d`L)mzB_6|Cznw+y-gR%>L7mH)TJ*u?HRq|~LA zzFF20BO$Igc_4floj3K;E}VLQUvKr3L!HKear^&Ess!4lSu9Qk0c{3)Ns(M4c_;Sp zZP5Q(22JhorsmEP4DG3nNf;#X`dUn?S`3IH@(Ha2pu~_B=E5PqeXL|5#I@=Bf%o29 z@OxL-|7e+e{SY8@V_?6Z%Anna{eHwmAB3}k9UPL*|9PqQ{r^QX5cF}UWnl|3ne1B) z-2TdfH;?^y-;VodLCAof4!DnTRu&0|$N#Ms0I+~+Ve$W0Ex>OLJ1bLxZ(}c{cqnIK zadof_|1X+h{GkX9ssR4b{#~2P83qa<2uid99F!WlmM$PNY++a-Tk|Y}K?Ff-61M_N zx58^9TP(cuzV8FD+Kmg~b8d_<27}KK0t;rHAS)R2phYkcK!J(yhNQ^D7C`rfUNGkU zrw_=C7s3&@5RSMa%l|?d#jN%rM zis54O5=^*kUO=jnc4h-?hz`o$l`LR9)F64h@VJCw3b+U< z!G{5oTi*#R=Wk;e~_vghKZ(z|CwR#vHCxMdiJH3o_zm!afCba+b(vi^lNW-ZKq5#9ry z9h&yn5j3`^U#g4>A9%M)qF>R_`O-1jH->PDZ4lYYz8nOf6buaCy*cmUawM3l@6wNl z8REu5VmLLZ@|1Xn#nnMT{kMew)Q%g3%XZi6+i4}N=xwd74Ks$}nMw)xYYH^yeRzR5 z4scjCNa8rQw2}AtOejDC0N|JN z2rx?|V9OC#7Dz~mnNijX6xG1+M=c+%{}makD}qDQ~;X&yJ=v)@uof^3E}&Z=Ib`*7B-knOe0YzuU^(lB`@P@rNt7+*?9) zof?9RlAY=`4AaDD(lBA}>;pAnhJg?;zN9zTj8A#q2{%{A*=~ ztXexNRjF6?aa3x_5OHULH@01r8+!Gx6dZbqJSOF>LNotFA~Tq(>C)V5L#gxtB$*B5 z(KO!6OmeRx_%R2MtulCC-krFrP#N7*bPPYEQm)5Hmz2NL6jR@CRK{|I4KfviBy zaBXgB$MGbiE8rf3jQkzAUWy!^VYyWDyzV0|1TK4M#_*8ilh0J=81hXq`@lRR4d}?A zb97{(QAB&RFwUq9I!7nMyJ?MBEWOswhPKcG297Qn_$zdK?*g8%6I8wHF=5p3gkk)` zZ%)KTAQ&NKpvGo1v18TZs%~JB|tnq4vh)h$-pha9~R)r=D&MvoMj4v?ad(^=>G5~fPN+LRDqCR z4&+~QK^ap+!aoQp5-JA;n5No>BNkMXG$*}I;g#kk;IHPY?k_+HX{ch7Rutn+xQNBs zB}$`QXVa^#U>JiUN7P<}N4jaoB9&Wv6VlcVzSKMaQ&8CT=)eKja1*TZYjM# z>1oK^JF%>0*=5f~?(bp zplM#rG_iL5(CRz_%1jQcB}@l3k(x5qoag>MukrqV9*^H&yY89px$orJt1x#N~_1z1ZizyHDnHEG@L2 zh8blWV@8X`yR0puuj?LQO zKY9Z6hx3X-h+>XCh1lh9A%A90`(_*IFvTQH&_2G}FKF^n4!uxRL zc%RP72In%&{wLur~G$ReZe&_3F5X<=GmtH1BCl!5~Rf>!1u{ z!1-eyaOiumGmiRniwENN8l^7dc$S8Er4h=l%lKY)_$W8^(qt6#QY4IL->2}B(Dc`-L3R6nrbUr4f6KB5MKv`k4G;EAq4`rtqvY5hP5( zVtCZaN&k5A?4P8}GdCHkhzr^s4-1XiZI$vTVBT5;~iAtUx)z z7BwM1dG!?7HtYX;BmUf41Obcd8;m}ySIh{gvKXKqEPZ12UgycYgM{jhr106@fRB!% zBA4yTH`;=m7ew%VoS{I%Z_z8~#(nz$mD^0}Lh5)J5NLg7j;(=~AY|GKW>*G*v)b_O z?J*Z#PAgC2TB*OsRr5l91m7k2SL}!_QQ=6%5$bMAR7w&LMwp zc9&%OVM#!yi_wnlQ2=BcVGPRw=$t0*P!^yZVj(-O|W&7=b$p;?O>Crho0_FTB&Jq*e@au~EfI|AElJFFGpA zFzu5!-z|+SfzSA-5>~1E@MDrUp6^0xY7@^s?-P}1!WI8(q~Cs=brqn5TSv9YI416> zri>Io^GjIo*mE#q$fo(nA*Sk<46~Wb`JHn@Dv7NdU-w(D2VwI;8mEc9SQMb$fE5fe z)vOv-O%<=k1?~Rn|U+yE(Srk@R6P++F2f0ev^HN&uU`67hhz%`I1RACVd~D!T6i7)n}xl9 zh@TWM*Bz^)D)r{Q>R(-iS4i1W6>TYefY}K*^U9q4T-uJ!fR>`zTqkIBng9!DVw6)f!+ekjxkYS)@{^d)IeZz=kDqR8l{1 zvpWSJv(&QVng;9*CZ!rC=&m2>X zdbC5@zyn1LYB`NYkL2tbX39v|M}pdYhN;pi{B^kKN@CZbAZ1S`Nc%k z)!FM`({p>;>gh&2W=4C^%Z7P*tc#b!-}}h*y-x5O+LPOB{%GaRbKuc}Wzq9z0K-Qu z-gDW$isf?mCw2F(WwVAq()f&f@=wV!3~xvR-d=B8)X}ULM(l`o=URsKUFcq2N3~n# zu!r5(`Hbrl?l|QJ_D6sCg);>Rbyh$tg6prhCSA-HBUAC-IeQmjj9sjhq5?2)=Z~X^ z=i9N7P@`UoFA&iV?vgY5*#&~GTEvaSig`lnqn7Y|%x1SnS{U!l**>k+RAKeo^;W_l z2-%o)*vplk*dLwAWb20CS2^tRNU|sXNgf)TWQG+GgTxa8F-W|ky)2O#t+Cc1&XCv= z&Y|Q7$35#1+-KahLD6oT{*yUxrh`cQ)@cAJgv7K@1p(H;x6mNp#l-0nQHdBs@>V}v z)-7sQ@W0w4?`@WS5}e@0E2Iq4_HNFz(`)SrKQWWD%X%7|8Ow--9Gq1izi)AZd9-Qk zyJ3)pl?}7km@x+(Z@Y6KHz}>fX8hJybHSKCsgYR@SkGCcD)BzUJhYh~1QLrpv%rl7 zp|-~x2(`gsNo^6(*txDUt&VG&NTpoTYb^l?z%j;V+|7w*PVAW|d`z;uD%m%r1UpQ- zJ$_lZx_kG~=TdGoLlW$q6}{7tMf++*=ODjXslp9kY<3G7r)18y1f%Gc1faTF#fIpP@-$}`$qOGO%XOxvxSoYon*wL z=r$mhfRv~!^wl)$%pSbb&wz+BW^_**$a0bPsBlFwy&fq3v}qik>pPu(S-bb5WOyFS z47KNF+w@H;`T8>g@KWMRXEQTUcUFww9`|lVq?OL&?Gy_s4R%W@srgRXqC2ulX|Xqs zU#*hynmgr0E9x~0M&)hILYzXKQOU~qkhyvJ_Kt5||_=|AhNcolN(lCV^G=r^X4qc`1 z@lw1u(rn&lscCJpKC3?U!L8Mc4#^WYBz>5j?HA?P>5?-`w|A*nzig*!>#}|PCAzFN zOs-e9{FHr-@_aRsB)atk+SjNYaz38q@BZWRkIeY@(t-zJxkXc4IKb2$cmwL(HHwcP zK4klCeLs*T9si-krZC8H|3&Wn9;X!Bdb%%q{}`!@{cC-p;CU?!J=9pxw)Q1=e%GWA z?kLgQ)rWeN=meI$tKOY{p~w0rB3PSPFLh5-Wp27$VkPqVE%_t&{j|N>mdw=Dv7Fb@ z&wQex?yOE7IN3+!UOuLRmin6l{0n5ExMMA;+Ob!e!3Jb$_wCa~sja*TAzm-2=>`dC zwK4aRqlUiNxHoCCD9F7;UVOq31+A`3-Fn%A8Djk;J3Jyxw`0ZyF(~$uVcPE!UkU~e z^f_g-r1k3On@&~`&aG2rYG|77ULOaqkQGt!DnEyQj!cF=8o+ny$@11rb}!LybkrTx zNTzo%k4JQ=bB1fbU8dx-<37kH zS;N(D(^RS23FQ@EL8UT69?DA6xe1!y{P%?A=!qjuJL2+kdruN$$8=_dK= zm?j_h65aT`@6Pv};|@|k#r2u%Ut370JTTL+kE+fe(RZGAJ0iEm^%(_jgnhLL_u0by z>faYpQIp?A{{kPNFyfH^U1xm>jPOf~IIr=KgXsgC8GDf~qi&mXjcTUOvAs?Ee+r+f z{29zxARR0BK4r1gk!Q+J{Q`{-^bR7`H;H?+YYLQvO8NoCPEnKi?Da-l>(EI4N_-+B zLFI-@aa5Q%M!L5CZr5LPx|unG*os{rsR=@}Y<$od<0YJd;xuhUQYikW<&h($m+ZbL z%C3Brkta6!IDgh1b)R;gyQ+7isKKqIl{$*}fVu=K33qsCV^C-PadA3)=;!`_-cT2~ zmb?P*GG-O_t|5R<_N!%(i@}Zb=LtU5-(<|UX(u1lkI7|ys4McROO*t^xu=?r2h}g^ zO~bT%#EZ8-R7Fk^zRfO<3e(BXDGPA*4i@mE)=|M+#o9O3s@WLZH=URZP1@&bBgQ9; zo8#@l(OW6am)TM-oC(JK1Nip@vx-drcdS|RRC!Web^O(P5nmzozlFD&B-_N@mJ|4O1*5 zPI_cu2W{o#6@WqU$&=Kk|4U)vsP-tXV;`2W01CR3Fq+G~3hqvzO~b)pHQw4}+n zjraSaE>Yiex;=uC9^$>{WiHYzS~gi4XxpZmbHn9e)wF_dvF&75hR!c*Enw5kaJM&N7ql_q~-8p=1`+*&- zNZa&mab#Gd->)J!Kj7q(VvKPk3H()hzu5{_ZQa zVNJZ--W#dFsts^A;bdB*W zS-qNF*nwz9W)xR|FAdQSN_u^N5`Cf(=b!w3 z#$7lPuj3QXKkFT<^9XpwZPtx>@JbguD)ATkt&Y zIf|Lpnl%^P0KM~z{(ARmAM8}KCi#{Zgs9h*>Y#_}bAxrSDtbDj{SWCqEA%!*JQzgh z-#R0|n6kIx_K}wPFaR4G2tIxo=vrV|o^=jI;_bjGxXI}B{Fdf%|e;&6SBW%P}gdgOm;U6P< z{=whJTFVe6(^l$nxW8#rHS9>RR=W{5ljIfS&K$Ffdzi!nEh}ML>_wcH`EMyY;H9f4 z*E#zwr^>ygUvqq)OXzPNX`Qj#hxItv)$}iL8KYd1_^hJNEvb2^xZfrFpDFHX>TOjn zGO613klbgxbI%S$C;`yA;$Ii`@lRgp383ddkUX+;t(xQFu!Vsj*_{{n$JV%QhrHM= z>UFmH?3T`g;OlL#P8@x3WLn6kTq{twIUJ6&YHZ?7ZPF3xM&zG@!V#xJuNLq&i^a}6 zu7=Kw@OqpdOgTRp`|c`o5)#+$xRmKJC&Q&W8pGkisUjhaXHS8Bjr{tm`JJKftj|un zr+0OfXU#e#`kWc)CU`Vh*0A;21~0h{HX4BmZ)nJnK2}bfi)%CQBK*wm^!QSE@`$!uel~c4&QVz<1F(z?0u{K?L$}n-= z*0C@QnX%dvOWUu>5{4G%H~_m>K8Z$CKfz(q@l<|Kx#YS$JCgdB&@*P!8@)v{LcR|VH^e%Wq#7fYyk(h^c6H=eLZ@tYWSB;_m1G*{uoM~F`ig+WJ^Gv> z=+Kf4XJBY|HO>C@fWSMF0AFG=ge5tGcGY7QMqIv#^DO@gV^*2E{Sc~QLiE)F_+bL8 zzR6IRN~{{hqwA>~Bd+Lux9OYJWv8XCl2L(IY2%odtcZ zv&y8ij!0eQyk>NYa7XxH^~2TQzF@Xnmt}I>wR>1X(`+oSY6TyU%`t+@9ncO;sd#g| zP4D_h;~k+}u&UP)Oushu&!X_uwb~!BS*4l?9vqRDasoX?ssKFQgaRd@rdE@6Tx{iM zB#R;cF@Y1mno6(rECe+bW-GkQs7K`QNne{e$VW4v(mKil~huoneL-YL_)h{9mVP z>05WI;6ZZ*+bjHf|0|8Qdp$rc>?JKwtP;fA()xG3W=0C9kaulRRKw*lgV1>BUmBG1 zd#YuLHz|flve{{f1mhm)s&fzQq4c@?UQvfa?=~OMoO)dChV?%@`CkrjmmcI9?>(j+ z{EHL%H1|w;4FW-D{)XM{HEIN%)KnC`qAJeo+>=GV8*HL9pd&rvC2o^|Pfu$RL82 z_`@C3W0gN8{!MQObh-|BFxzZFUYEq#;POgN|NSQx*rkPBX}yR(;j8($kXz8l{v5Jb zdp0xt_*l-_h7HjAh>o=SG#tEai;=E276^~Dy5^ocDlf2q-CNL~c7uffld;Dln^B#e z>)*VTGZLF@mvXKtrz*c+;5&OYm|f#KI_+NfHZIx0IxcSaWhQbCR)>EjKgHWjNnCf1 z5w6b`Z%)%VxbUw#K^NFUkM2>WxbZgz)-`Lx5N+Pf{}+T<#tuca@%j43fVx)RDfppi z!esYzqK7E$(+3=A7lq6kNlw4(POGH5ZUU@f$}dR@7b6pvt3;GrfhRq$OOmyPE0WGH zkw>#&ys}#D9Q=tc=A}u};cTQKof2O|V0*YS6kCFEk}zA0eZq& z@VCoDx!0(#7dxo^VBP_Q1}m-+0-J3I2?`Fz`|SzSWdvSE^iLr1)cS37BXJ!q0T}lY+*(5 z6_xmWv~nVLtyM|aF?S%;AW}lRfR(r zz}Bz(f_XCbc^E96Y>?OU{C-z)OgDa(w(8q}ztmMCcF;3Ey@Zv=x%N)GX3=Hu*f`3q zMGg3c)!Lc*xZ1r$UF~p{i;&r=!fTE6bCFLPvkHXM{YzA6$YGI1q8bbIva3_sB@U<+ zUkUGgS>zelvUN{XO{0?<+~6;&rRy+-v^j5*LoWU9{N612YRpG@8 zVs{N(z-tC36h}B}g67?r>+u88|Lhqdon~)dTeM(`hpBQZ0%i4lkCn|rj%A;NeU0{! zh&1`LLnEg9y2yF`zwSZj$BO@8{q0gM1&P;Atbc#%2Xm~JeHA%BjLkx za`JXbwpZ4Al`Ke+4Qq60_5{97BA9^bx?MK)V*i1l_tMY$ z1<9a;Q-K?=$Gqp6J9JB`LP%8?OqC~YBia>ftnWnd%e_75i|oHCvN~;$ySW}#%Y3hS zNL{1DG~upffnQCtq6I(Q`UC#KN+Da1f~4ZX-y0pjcSrBgLApEfeJe2LFzwB0y|Z9nfKm2!)_>z%KUq>2w=ghfdauQp7^{g7GUbtz+k*8LAqG7AJkJb2l%YX1# zU6ny-Z6f?sXq}VI>Z(`Ati232gJcMAZb2|rr<_^P(Sqb*kKX=0%yVX;c1UG${J?5B zfS{>5myvym3mI3B5{)DuT$5~3mrH0dIOEl-C-ABsUnytUnfLD&J@Oi=1W=)a@_rR| z+#YvFmleJkZHMAdT=le`^We zX$7*zG2S}A3vTK1Nh1#GV@Jgd6}n>({LCs|;B}6*3=?ILZT~i@92>op&H6)OhZV1lePh~$Dv#(%ZZxpNo;pPQ$2dDqMJ;Mx;(vQkEqC_MBV7v?GIXd zV*;{KjY44^69MPcCE<`Qe?%d#T>n*u?rVsF+Ef`ESPBz?6p@C;u^UfMv-(sRSEzAp z`mIcme|C$hb9t1n z>m_}T$D&eO98lwkWhr+fDDhg`=f>f*sGqdzGi{!71kUWPQJeY%57gtX_HaMz%W~Me zsmd@Ny?K+!k5sRS2Co&7Pn=DpKKTX1ZsD=_w-1Ms``_c8w0(&{8{IOo8=WlU7C+Sa zeIt0N2x@ep@3KGXD(%MAX73guRM#Z9&#{RjdVfC)uSEac@Tc0xkMkb2@Q!(Ba^1h( zF1iW(x_(BIpsD`RS$S&mlvKIXh%20~b?(RTfjr)CTb&X0Iyq{ny8uc2^G&B)q3Gle z29TVM@Q_{O)XdBD_RtFvg0cN;*rvI+vdu*rK(Nz_Oq9OMZZWm_!J_4&)IGp4LZ4|ru++zR7=-L-_pmxYu5mu{ zK+*OZ^-|sL_L!~j@_0|EGJZ?U?WwBH5VWt9nu?yHdhZ#g$Pp+fbVqygwt2wR9JB*WZ+QN;Y1Bi-b}x zC4yf!TdWupUGXn4+GK*!j#UO!jqBkUiYyqHJ#d?Bvx?&k$1Vgz*n@L=n$AibGu*~b@)ldIJJn`aRnDW3${n@j(?5Nljg81h zd7oy0ocbj4?QUA2bf#&`Hnajh3Gcn;d}ID zV5oNTh&G-edUEgfH;VUqS2vS(NwFjU2^5}t`MJ^agr-PRnYleqm@M=Jo`BpEPBWv$ z3tm}jOzmp5ub2T3%?$Fs5Hg&VqaGVAL}qKVd=AM4eUMUl`TF*$j#)&}N>8tr|#EUpIK zq>MLlVrSDfmsu_pliKoM(G)CVwBqz5)sw;Kw(7|-_!cbUfdwt_3_j_fBjf&)As+#8 z%Qk&hKl2S#Er-|A$cUb(CMJI7Es#2)Z!hYtb9#h`u{qwom&qE=ZgA(e%=%70r$s-M z=M*w21@Nd|q?(G@Ik#Z%I^H~7J;-qdxLYI%PY!#8ejd4p_P#$!*Pj)H7nBV z9|T8MD>#AJUVKos-2N9`=0&aQ4Ht#ZFVQqiA(@jaUZkvvVG-wzx&cLmJ?sSbkJC*k zxxO(bn~jK>AtNl^;53NVXJt=O?727QA`-H9;+qnq z@=x9y4|4iEnc|I?H5MP*)RZurGz-kBi{9NWfQBB;&rzGfiICHRFN z>ZH1Zle*lvZELTx%5XCd&~MrvICryJaA$$=cy=*XOt=M!c?R?BTitq!G#}o)b?3ap z+`J{r{LZtA-b!ZG2kv`Cb8lnDzJooy$)$(SrIX-*nVF}|K_0ihT_Hc5E1CU0VT`SY;}!9!C{*A`FX;WnToGPp>D&}&v}o!26>&DZSk>m zn6kMNm6Up_Y($r~a|_?AQ|i+v^G*6EJ2fUu6Ej)}iESEs`;JWc%oBd%SOnUUeE23m zk?hrLn*zr^uVe-%6}Z87sab?lT>z?6o%xscCU#hy-{Cb`7ARvGD+Nm;he|Cmt3=mK z4F$!nu!%AkZXi2{PW+{wqOqNJkFiUVWAy5;3P{>W@9rirA$^O z@nk)@J50F>3vG@f3c+8q?)Ntk(|!x=KmBr1+^k#l?AHTa`)i~zprluSJ6>g0(WC31 zoV1ZV>s4`m0?pus2Okl1{J1Xp4kyCuaOX z1w3X~yHwyb0UcU6=14Yg>QhYxRp?OZ=kIw1{QWr{*GU8tFWx-eh><$#LG)o_>TTwi z=*6boy6?>O?7(tldCX7)rVb_CkB1b~q9u8I1Cf`muE(aTlbBTec5Q?f&6v>QmbsHx z923^i5L=`D(?aJniyCkDS{+x%i|;p&q;z%|y*-r93d{W#eOAiiPDL$e<;&;pY{S^a zeHlC1Uh0SY+ON3(>d*R=l{X{vM%gv>YUI9SNx8aX^B$E(G9~x4^Y(v#YTr?0O<}rG zj>`~w`wgl%f|l967p{N1X{fXo_1Lyaq~(&CawuNg)_MbhYC8Qwa)N+-ax9fotA6@} zb8O$HnbMtjMk%ZdCHdJYp3D=~H>v9R#b@NhM{Lu-AC0w3f475+p1So^2B5i7=rKz#a~GD zi$8GX+ATXp4IU+}*9mE})SQ3$L0)cm+~@XyGqQ~NWz6sz{ZB8e_gH&GpnCv|K$tiKj; z1rwSV4unne4lFjE^Mj@R?9Vei`L$gl^pV5y5;?{;Iyi)cjh3jX&cjRoT3zEOPM_OVqFA&$A@)u=n z=Lav2bb^O@t=C+^>moEdb8V1X;hS^`zY>&yq^V1CDShCcd=hHP#fhriBlTgH&( ztc!6G5+;ARF=k97Tc6bEj_hJUvI{#EZ4a*LCmOXAv|E*!sR=0Bz5aEgE{3C!M9n<) zG*_%o-RDjXCf$Igqlh)tQlx7snv|vhfreWPUGyvI}^t#PaSKZ%98p+q?%J{uZ#TOkbX;mwv=CKbC0I@jj zHBTSJ6pxPkZwH;A9*s0qF{5Wv%3elmXykn_KP7eFKWqPqR-xA}6`>=|$VP0}H}&*B zE}EMzs8j7uboNq}RDDi{nM^?yY;fx-zv!u)WAd^Q+jyTpTuv9DM$Q?oMDYN9bRNiO zJb0yU^GNG`EFM%*pMSZS_vcQ2?)_wHLPs+4s@foR@!&q8r&r=EYWYKDTHv=4C{Nh4 zI7>;DduWr(*hpSjv556p6^zs_tXRwAswt|Z)9_$`{a*7Vn2&T+E7j)(U%1EHfkTwdh=a}7YS zJzCfNGZ%65Ku`=fQ?*60SF}&ux$lt$@5WXbj{Z|R*T5Z|&)3T+t5AK<5&c`zX|392 z3nR*RBhC13lGdv_uAamYf={#l)!#ju<#Wv!pX{kDnzg-Bxy$dG1L36fx=cW;vtG$a z<@Bnb|6mBr0#Nb_BeK>YYL%FwVz)=vH591i9sQo7e<5|Ftmis(jH`Hr6%0=`qT7(U_FhTWXCZW6t+36r;)QVO?^*Q z8*x*Y4uZ%Jf7Y?x1mi^_$y6XiKUAhhg>{xL-oWb7WjCLDIpwp3T+O(n8Kv4svs5o8 zY0g#F=V{tv%#6SV{U!Q%@A9;9RxX_5=aptsAJj8BHDHR-KkAngVYWjcZD4?%McJ}- z1#=jGHtGx~sWT=G&S1)CzjJPf<{3JTz0&u2``uO;hMNQLiDG@z!acOMdI{b+P8ABbbXzyaU{vn2qT`;Hu7(Mk{ z%LY6}=prrvXC_@$5SOnz{8T+EgE@!iP0sT}d7ojdLyz zJ&9jFwGdIAdWtD0DRPeT`G!BghDmZv`%vX2q~ny3N=OO( z$w&zL&Hg8Z#e~#Cm9om1`q+73D&BBveG#@v2L#>(nV4qz6XqAaGJsB`8hd5Uw$N4w zqyY0q4{qd&D5k1X%$hhS&VjH-+ZyVS-#}Hl?~=>IcfHF|Cb+%zGeKN;L0Ij|3h3qkH~q5dAf5!=)`wpk-NkmIz6 z5E;z+hU2fV)-lg)z89EB>bjTqy5NTd30_Z8VjYj7Z!j%)8UVT_Vf9_aSXlM|Uua?x zCR7V_LS$yPAi|B*O<4XEA)#c1;Z2^mHCDX4;ax3PiH#d(1bq((grb9Ds)b zGZv>0a8g>nNZv`|ov}lwjbM8BrWtPEV+O`1BGc|zh!K)A$e3!P-k{dMS`C(SX#)N-LE<&z?Ce|HfZApw!`!d$= zW;R9q{}xo%|GtTlq~>-+O`9>`iHlGy zR&z|WW0xs)hfHwS|1B>Ba{4HSpUp1uLfgkejr;%&hA}hRP+pP1*zjDz_mVLL>;p)k z`>7!~wrUu%HpPJk7#r6j4%`XG$}mOGbg}n5@J(5~R|8lHQ~ozecbiP{1Xc?PV}=?G zuIwg?JXRns`Yj>`N0}Q8j$HgAZzB_h_7kK3_sv**Q?>}?wtj|16O^R1ct%^-^1?=SuRrSImG*cZR*7;pDIRYny>FOG;Ccc_2k^60y>kS9R;codd0 zrspxKa&g2kJF!Jvl6NPnl5h)t(bxXM>Zh&yKHyunJup5_m+J63ywbWnG3><0ggC(G z!A_S^$uBmG1M!h#uH>QG(Jis8#v({HjZ46_38eBxu4Q3}vKDdSh5SqiY>i>NzZz@Y z)i^E_Tmh#Z_&~}s$riuhvXH!W_>l6tQU6jyF%}U!@!D4muPrfG{2tch4``AXy`cuqDKl|hyikB~mkkGQmCZ8Tm%=S{ ziv$?>(*Lv2TVIaHae*-kD??pc^a~ZT!(Di+t~@bFMj0jo@nC7=eVOvoSlE#38ulwo0ThhFjjiE&s{$Lz-A@?3F%JOa^W*t8z4Xk(_@F-*sw0vSpo;UTpyhbS|LtR#Z0uu}w!OS4j?feXWEBsHvY+~oGT_S$ z_55$S0TbYupfS(?{``MDAyme|6Y`mTUlDWoi*TJSp#|?P?{XiK8bn|jm7zFj5JV_a zS0N|AB1x_j)TvKx*42BhQ;q|Ac+m5o>pj0VJ-0L87kzV{LK+_B^>*`Lya)86-lM32 z(L+##x|&+*_zs;<>EY_16L0EdMuOTSovjOSU>9~ki?|AJ4=h1e>N~#+7Ey9-Dah^iRKYAIk&xz8pVO zsaZ6c)w;HZopem8n}qB!R`(Yg>YwRo_Z!)DaVcoUQI7JWBkGc{AY^5PM*2&Y;F!bl z_Er94q(vTSD*rSBnoMshjTrlawb<@S`b71czg&<(-q$2A-TiXf)E1seL5bk?h9$Av zpN1hOvmrUCH0U{}Bx6i^6r4;KXMX4CW01O_2hxOsZ1!r<3^%@)@{R(AZ$tK?n1;3= zGaf9x!BRbaLx;|$)-Pes&VLcapw-=$iZnP%=cQD|Hv|rnn_m(o+ce3pAQ@24%b{nyHVOMJWo;h*h?T z-n*n2QB@^EH$}txq0v;-Oa;9t7=5~h*?vDh?5B^M+lX8|If3|fV9Q2^S8iAq`8xtj zQ-fSH{{wC6bUKPulD}Z=>uM4;eug3ZrCTCD!(pGJg4SNf)Hn>Ve^4YJCs_YbY~-IL z|5ztRkV(NoSjS19^T9Z*=3hE7z)qz42}5W_M2gM6s(&dTr!Mpa#@#Z}H@EYeb#*kd zja^KnbtnJfkMX_=Q{PI2Z%}lYfhg zF)THK*>rxv&hXB3qf<9&;}qK@AKT08w@C5;)D7Ukp5)MhPAsvXVk%ym-z`Z7Gu*g~ zaS#gJ5UAb6=?|Mov)?Ib4A-WAnIiGFPK~ID_a9)n@T~&Nad;3j5<%KFU6y(Q5jG(5 z>StVp$uKsSDSu9geToDu#HfmQ`8kXq0VY>8RnJe8vX+XC0IGU2j{C9QA-lCC-q*yhn^`Sdw7(<>gakG}QYwwLW<`LyxRFsfRgjS|hBz~l&tKjERIKHE)t6q1T{y*9KCn%Bshc;xzrLT_Q+NiQWs2_8GTGU95|JZ z=Zb+I=S}Z#mLjplnQ81%ZCJJQuf2ni2G%IYJiqbBEyD5}jAz@-AM<=}F$&3MDYH1q zAHM%C7*CD%Qd^dt5eRp$MpJ36BM>+zYjV_QU;^vOVEJ{oV-pX``$uf!k0~M;ovHE~ z`P*nbAXw0mGf__3#y@+lpkgWt$WACAKL?#*>dduji}nmig~Ge*Kd!_h#$`HF5&ZR^ zwdHB5m2sP;nk~;Q=4P{_fco@p{(tiIW*+zF*ATD6EAXl@RUoqut@3Z;96xu0(3JG! z|0i9Kpthlp`VUpwZRp7veQxh4kqy)VuE(~JmdRO=eIC)3Ith1^#i1)D9RQ1vYTz2_ zWd|Ho6Mg~LLP=B3MzlDHYGUY78WUOu{|LzqJZWyU0W!e57FR$%Q*Ar5+{HTXe+2I)Lr=jU*3rnM$(I=9WD{v^}{cX`9LcVCxt*RGOZQ_d$v40)|5bK4t_)d1%8 z5qW0}c_w-1{w833y=4h4%TVP!I<4ZEd?|)iGKe=jWQbC-Dw4#6GxFF#8l~$=170u_ z_c9F;_j>aYDA7RuuO86>iR)?Wg7Z;rW#`rzhn#tYPA3^90gZL1vs%3;VntrHr}7!cjyI{h^swl z^ucpIY(wGldl0ZaD1oWh0|fJivqAOZgCIb>r8lhwL&zq>eguIroW7FF~pxhqPGT!UtGH>w6I_6O2{fwJKJhG297cjhWWFJoA}4%UVPL$BM_ zXr2B${lxxl9%;Hu-&6t4!2vL@DzltVg6_BWWzY%}s8G$;(o33L;%%63I_SlTQF_M} z=0I#sv^y^Qp65=puTeYYJFoOb0ZK50m+qY@ne-xP(kt@#zC+!>roAjU2|Cs6n9S7QqJf@VEXn8P2 zfj=XQr`vC?L{DBZDMS>ha|I-hsyN2=1@hg^n+-opG*-!&2 zJaGPBfCYkECv|Q>_PS|~X$3i{wSC;RR4f&*JS=1l#l=#=nReX0x($_b#h$C93Ops# zH#{u&qz$pLK$dBc<;~+Nn`z$hrZH5$0!XoXx7h$HfWa7)P?L3-HM7(c}||;nPt;pErtvP&RK3H*`VInpCpK z_kR@50=w7p50lVtoY_bYS$!UHlky=R%Xb?ulDajf-4DY-Uk%a!@^bt`xoJ+!%3qp^ zSD=5n@FlP^GPt?*gr=nWb-V$TuIF$19Bc4%WmyJ4hu(i^fl;wxvBv*#4zjSA14ys! z1$T&d{iTpW-Gq}WUQki5uLYEtVxTsAkJQ9`!wlxKxo47PyS3WXa+;rI@WMhyB8DQX(MIwK{?tG$y_k$7`V?n3DEQ#L=&t>xsIw;2DnH7mY z7xZkv2B~88K5!FstsSs&dGRNyasJ7>Ma>D`VFK1UT+%TMuZ)qoR;P~}d719*^^4a} z+wIsOd$t5nl`nJp+1VNCk<%g_bsK#{*3I|Fmi3`B!?{MjC@|*F=!<=g%M<_hTDfET z%9VJEP-EmlmjwYIJD=GRfq3CFHk2Of=}*j%dGw159(}=Pj(Kko6q;cqxqpD}dIKFNXvnDc3k=R?KK4YRj`j_75O2vj(tfB+_sWRHi zSsd0NBi(~pAmT}8INro+Ly*{vv3hlK%NS{^JvdV&cA5^)NZDT99VAMP2$M?fnnu~Z zR$ZGR3?>_&FSw!S;Qrc;1@D2}_*}aSmoq@n2&rTQ-i~(oVkgfQxWP^~arT%3qPQAf zc*m4wS*{!vblXZAjqD)#Xj{U46HzFE<%(vgO2s&l)^DW%V`Z0>S|W$+jq z4S>GQ+Uf6!!b#$bLu70iaK;f$0%5IF{frvPbkYiEOCisb`=6lK_ec?kUt%h#9V{+d z3Dn29Tp6>F8SPQhAXo$L_G^9Dh3`ZvXN>U^`BNN1mPXqtqpF7Xa2H)mLg;ga-siPH z1wXQ`l4x{e=L+vZ{&A4VKe`0o@q}^8WVZ~)cIB{;aK!`;gaO?$wu6Qggij9w*0YfY z=?XQ8DOdaEh#K6%HCR#E;4&|sd2C%opdu6XH4>?aXLJWGnIcf^rHSf%LWuQ85 z*zejyls(<~w^A{9_@BbPIQ2u$M)JLF6PbEdaK;J5{vt2yrodxqz@$H=>fb zjhWl3;3mo31+sdP3|*axw>q2>p`TH(bH@fdsloXO_jkOKgcZED5LctwGtG(4Oo{Sx zT)EkxdG$J0oN9ms*b7?JGs-*4iW3)zw5=6?$rst)xOn*t3}BnK=8r3FYyc3bsAnQN z+BV4=hbBSr8nm9UVVzN$PQ%yZZe|bM+Uys>aGIlOiBIsWCG&l6EZQ=5}Al05Ws zfR{)zxls4W@4a4UNfN2MKa+|p=A}!p_}X3A=0&ig+YfNwhNSJPQK32v)F~6|+||rW zFfy0U*tP7MyMY3b^@Y0ixmgp6p0_AacZQ5XJ+4a`?mZi-P-;X6*0MVMQXeOnGYq82 zqBGRgExecu|9+ua$re8)RP`W3={Tm~--8BOShux?R9sCV3$v3faN<{~P(P&xi2o3$ zeU9WQ4w7GL^cOL{% z^(>K&nJyR4kLywYI!8`{Qo4yYa4~vQ_Uh&zZwWvK2`a`!hfVYv!Z9Z`?(F4}wTJ`kv3hRWr2Cq7{+?X1_p#YP@~=Edn? z$LlXeg!S7@)mbSNza@{O-m}|O{jTH)E&4#qR5Ew1(UXJ=FiFKGUI#}i6qlT?wiybj z!-Y@CRWfyo7`gW2evu7gJ%tCNT5d5kcA6*k6%#?le`CTM;!w^F7>G^czyUJGkj?DU z$=0e_ilW%PJON7cQ~MZGYwA66twzQwz_SSJCbhE2r9GZu{5>C{?EjMaKQ^al6>qGB zbUx-Kpq8CV5F`IWo*mUvlZz%(4}Mg=4;uK!U@On|{rSlWuDXa+1z$2d3Mqdk#o5b^ z%5CkXa#hmJ`pnMS+BzCdUC>&=6f16kCe&M-*9Vw5QT?2T+D^EE)Ipg1>KN;#a}BH3mNYW@36mk2AI3d_FsHvVW7d7u zd7kIe0#vme2%kmm>ZG%hjv~J_x}Dow)_LcHW_2c&zVBc}+*C>S7ISGU-r(B`Ghqc0 z#Tvu#g9SB)G_l$l2 z%sZ232Hz_cc72iW1+i% zDS6{A6I5>f=#TT!#YFpM6%{EQ?5nIk@lO-&B?^WRg6bWMHWW zokq0rJRQ1OiR5g~LalcK3{clPD+xzs)PoKq*GdT?m}3DLEQj$~Ye#yae$^+$*6%r# zRBt%^Aw*$j|NM^GbC$zEkxL1Iy)7(FJszMn8Fuqq);`6 zij|IyXOU!ZQ<8>MCU&6_v(+>-FVsP+d-=Bk&ca?F(w#%zx(I%W@pq!lm5KRrH}Fgj zHOhYupgSZh#O{0Ds2c47#VMS2NQXyf*&f_{bpaK!se)re3Q9EB)u02H#x+YAOEkLh z=8Vuxk(-a&%-cavqmm6s;j{gH95O&NAZ9D0>NI9;-wHlcQ5B;69EprLDM6*H+pv#M zZZL5zs~IL49lp#m!bLVLXJ#fj>$P__j!FUWAWimL&Iv{kr5_H{@AeY}@I;28;yA=z z#tIjMEAg=N0p(cno(Gx=V`exRmL7zi=dPZ=v=?PU{Z3MAm&?aPjl<_zbxr#4|FTzI+Jh$qs6&RE{F0b&?$} zqZbz1iw)uYBV^xRocN5=6E;++W7`Amtn6J_=^JQ$aMMb_M!lyp=r0XY3t?u->H6y4 z8PeW3flA>}RhqQLngsXyqMg4{XYnfj_^}q{v$>DC4@fK^xVlb{97t;*6ZFm{T~f*Z zTt$H9HBPMR7`u{UaJnSDm3X^WkN?L4AwM+5NtfE{ajaV54bGA3Fb+$Vvu5L@rWmL< zUyHqc4K|m;?bK(`K{6Z>1z#)&0X-J()(W78!y==HH=tKQS zg}<6rA()+Q50=$>$+tVEY_Q1TLnWONMucDE5oWjTg+CmKO*3RJ(Bq_F7T+{DW#M)Q~yWhOO2r zP|fP5h<1d6;!{x?;&fa}98Gw&{~K}!_THvZwvm)aLJMpG@lWhT;c!fYpNUt_NJZ%> za*`$CLk$(qC0ET1A&x=428K~lU@$1akWV8V>*btknGOc*1|rXpHWV9%L>iD?)Pq*+ z7!p*x6OfGP;4{7hqP(R(b$6IlHVG$H>FDN9%9NyKf=H{jY`KRK(qHj?^*BI-Ayg1?R8_cLL_B{s#=j z$voaqXI18&-S?ZF*iUD*r*!`KAg{8saxutB5}<{c{Q7WM*%J@HpnsA)9O{@~cxz;- zJ+|g%;|hwHdaE}JJL)@$n}YTWPvY`!x{!3$D=NP&$jlxrONIW!y=`2;^1=30 zZU@jO7M;sPJ_d%DigN1bLTl?MpqvCiP)03%`<<`p_d2%kWQ@htrgOvJS&RnTzDepL zlvphELz4OLqh@JDNL<+C?_DBvn~y>-({;UtlsU2soBP31zHb4e9l{GfV<`+egRU>XnN$YlC0G?Izu@mGb?WBOuRgtwg_x7X`-*HawE0>byzi0&>T%(v77BeY1dfsX zt+szPwELUnttf?gW?d#3qnW9JEdc(Z!;z!X=W^(V@>d7SRqIo2z$q_+BZuNx$iPWYEQ*f0N>%6VVcw9gevb+7oE~e|3+DtwOS%DzEMH| zZnMU;Ryl5XVZiNgr=N{DMY>O<;kQs-C9mzUA(+$601$spOd(shi38hvF5|iI{I-5a z{UKXM+^#+WtO|m%b24Jx+Z@-bshpR(){Q$I!!re}xB`I@+sJ5;2Q9M+TYDm;Dqht_ z>y>*|FinPILKX5Gwjq!|__|^*)XI*|m)rm_8!2>G#v%A@D?KJikHvt6fSqlAgOUiu6c6r6J~GY`($n@8pKQrM!w+tA&Uw1N6#wqcax zT6Hh@i!Kx9O?H@O?&xKLb^$gkNS(LtW75)<)EiKxgt3vFbW$ZCNhj52Tz z6TMbo(3^&q?0JGo#okBewjAB_Bc2eMf$w@M!{s1tb`^5&Ye-^HZM|5l(S{-z0Xslp zsHTIX$YOi>s`+DoZ9U+ljuG}y!dIZ=bAVPm*iEnb$k*`XYadL*d3O;H5Z5mne2lHi zBd2r!a`$jav(cTgm_>+VGL#ZvFppy&Ctu{=#@z0ad3ZvPbI%vmfIL zoLW+(480_zsxF%Jsw&NnNpBAMJSaIr7PmHNw9mtaAoaD8oXXMy9D7c`{*HquKerUw zntRN6Iqh0fM7XEO*awm@=cw6tp-rhxmyiH=-msDC{zw;hH7?7@0OLTLe6Z%FRm_Ma ztU~gA-ayxDPAB*P7Fb?RgX$gwyB=ht`)d}83~DRq&GO?M2IrJv3->5oBx2;~Xx zv!{73(cx@S0wJSH1~;jd@6t8!9{+#JU4Rpc@cqB_@c)x|8))3>y_1~-g>Ezj@KZ=> zIhd`Lp5`1YPZ*e!$h0>oZe{%iN)kgjFMExKT@Z|ezs!m{wFYi#S=%i?y&tP`jk=1{ zx@$;im2sQ+$zh2Y+!hghKC2b$&}NTtYYsNZGVlz@uV)Ic(^H}B9uvg)h)g$#D*1xz zyH}+w)bW{y5`(`sf5~25G&IgFki!jp^q79nI-2dwM0pA2nBiH!odC^kjhuy1Bj|{2 zFa*O*Kf^X#eT}{&rOQXPqsi>pGR<{kI8mw+?Uvetq^NCH-&+pe*M(b_Y_LNJGFa&R zD~X2}Y#FaRe6dbGBaHHHMn7VAg#nL9P7S(wE`c9Z_{0DCfrIzKTutXPxdvZ$v8fdk z$S0bT#J7=%98p6A+gxTvhywAgK=2DA7-BuznVokf*}JY3-G8%?(O83r+KH_0yp43r@t~LS_Qs%0d7K=nK$8;)+2Iaa-x0V#vVybZ3W4LxiNJ1DTIy5?1j0r;-W!fsH?*uPDZBd(>(DB@YQTE@ z&}n`YIg`0oe-tzZ;q?x5?ZbZ=CiH}74On@#2~*2}5fFE`9~rw=Xu8tB;GHy7AWBKd zr|Xv0iwK>$xW4kz25e#KpF;E(R6uB)hZ$YVG9qns(lS$er9{R=RkQNGs!&IQO67{L z4W?XA4NH<)>E7j}Zm;!EAELo@L}=cSC2OVAx$+TN6C|%Q0gE-c=>EjD2h}6z8=Jw; z@}W@0l;#TqsQlW-3J<7jTvDm7XQ*9%Nlg`rbj0kC+z)cI!nHtoYY*vd^INC4Mgt61 z1Mc+Byv@}UlbJXLe*_A2CbLJI)>t4p`!9VF!Bbx~SAWRRkL8S5c_9M&j|M`aLAz;u zm`1xZ{1~<}fQMUC+3&`_iH4{xW(Te@))G_Qh$cFEc2sW?OUTLfCL)AO8GYU29`@B& z&8kBJe-#YYuF%wa^LQ)tk_^&O4O3NhS1X$nPkQ+E&EM8lS${ysDrVESmfu%ref3+D z|0S@oGLg7$9~f%vc;AGzamJfrRCk{qq?mfz)*~LHlhzM`P>%+p>R^fUg1fRquGTqw z=N&R9Z%RV{rjJ{Jo00Xm>h*)-KMVZ`mFxnO9Lv*>rVJ*3E5?(Dst3qKceEV#*7oaj z;6O(6JO8^qMar(yE#6B4 zxsVZUHbV!>;>>y}kQ7!f1yL>95vqFFnpcB3;pIVF*}1BM=u!?mpH;S~kv_kqQjxek zb43Ifc7xG!`Frp#yIIZWMb2^&DsSq~unScm^urWuk}>RIho+ZzPU%zCt8ivM+5>lh z293{L^28Pjdi>!}BB+5&+l71ji`W#w9dQhgMZf8s{$!i|dnsi-#wrJwB zLX@;>NR+o--2^tn;0I%b^BRpQy*w(E`}l=N2q=rsoT`b4bnQzRk?*RrueGU-#G41X zIWE=YjuyZY2L!^|A>Yr9tYhyP9PK|62{^OYdjOkpe1!~hb{c(Cxw_NxDEaw8YTf5n z@uJ=VfmEWNGJq{zctTk~Bpo|qtAL}vUGcV?zp3?1sFo)2m|`%yOSBGIja`+#nqUhU zW-1Y3eQS~*U*?>k+f2@G%wZb?ygUdsm%tT3=@ienj#@>%GAXNZ{NSRM@%Hd`)(S_95SP1!Awves^Mu8L;|)zTRUH01e{5*wcg?jdnbO+l3d8^^{TAp#n)TFB ze+-Z8s@r?5Zx#^*5MU)~w}9<8xDmvO^=)4Llv|S2I(BLH3>u}ht$@MSifJ`=DMw5X zYwLZ<~L-&vj9-oTvSq0 zp*cWSmWwekAivRLycez8{(gJq7rN*paVEmy1o<4rdaCx~qiMZMsfRHWI${_bZRAy_ zr0${V+c3L&#*=ZbIebL*gJ9Og;>(`dkAI_M;(2qmm)ms3tW_mZ9&wB>89(@ZNn(c} zrX#A2TW#PWiIIs$DM;U(=F82>ta|r95plpOCLuQGh+2(-r1i5msdbt3hx#5?@+ z6wawBXft&I(9fLs*4!CrI@Ls7&?7eyn?TcmL`L{zRHbgS?>Zvj=yHT209!AV{0k!a ziYx?W+3hLXVRR;R&alMx_ZTrKsxGtYv+V@C0Ayy+^6Am+KS!CW83LKEUdhT=!2#cZ zBn%?=q89U&uT}YTpBAvpu~1f{&XPM)h7o<1*psGAJr)>DJF$EbN43U077tq35(%BM z79%e0NhvrMo=&_75 z*gCv^%v&1pgTkGpX+cQLtU?k)l1*CqD#yQMvP8)$i^OF@Zg|-34W^5nWOh_l%)-9fwkeI z)oxz!VhG<_xKWK(a>zZ{{we(7WbiY{l%VSYIfv4v0N3jUlPu4kOst-JiTAH}x6^Je z!k&DVDZc)N^lvrdAsZ=&E(Q&NhKx)Da969J5L{4;VN%nmOF|P5zYD>=CTLn;-{1AY zdz5>YQI5I-sQFP6{u!YJT#es)+JeOAyZOk>MQb1d1RK+ z%4?LBV@iSWc-Mj4CEu4>?U{OcC!pY>z?3De>v3#%aYOi7yi)Ve?{BVuAe0INxfP?b zqyXFs*vw~zp?Y_0<4>E8FeKuY^cVy59I=sJiV9e&NzFwc2Cstk%Gio&hjgZKv~+{x z?i_`Nv)ITzp4?&uZf}2)$z)jZF0X+6lVcjH)&nC`qUqNnH$MNXh?lQ>0@P^vhH{%} zPhIGa?ml(dG-pbwS*wZBnESUvU|(m$G@Z{otc5`r))V_*$?oUD&lYUE@lq06s$&~8muwQlFewUDG zNu3es=uY`~S*k@mBM#MSKoDz^fR=lDK_mx8OR?BDc-kq;F~eW_!S$#e7iR=;bLY>R zo3aUudxjnRf&o;qrdHb^)Q1J8e`;cjN}7uru?`d~(Tu*`0HS*gF%G*;d={Ib43*yD3NTEoqOw8rKb$DR^fw!@rJkdp_9` zOI6NUEAzRW{QO$J_1Dk6!+@SiVT$m&l zOovWj*(1c_P4}XgCXM+OSgcQFUz|Q;5vlq-WxTeju%4`6Fkb6p!}3-QyB9p2zq=YO ztg2sGSQap!uTheA`DFaQ_QGc`)?_=CT|fo73E3@;%eGk!8O??gpHZdgF>~L$bZq69 zY5!gb?&TP>0K3z4--{h}%I~(`?+{~4fB&edy2dy3B4liwV0F8#F^sL%3%kNBe@SLM z@QdDFyX~4{yq=bpYq31MkM7FXfBT|Qn$A@4Obp7HIB=#pYYBN(WKG}s?GnO)U0Nm7 z2J~LqWIXw*Bq4_T*aKcV_w)3<9AU&3_0u5gy*G9O_Kfx|7I-L~JT$!77NK_?orbVe zRSgI+7^T`Ym)Ao^nuFs@n`>mW&r_{u*%Jp^dc;xBT*N{gF8PoX(zRg(fCsH9{tA;j zVJ4IIonz6yX<86@uDmHu1MMHX`1)4W@X3SRU6VgJ7!=y zvKHgl^07f4{`mIUxD9*c*l}4+B5_!e?2I5Bke@9jG$TeH5@GH z-ZNgfjgQ(|?&WFKR(`lpLv4xM9at2%wteA_4ag+;CmBB|O`-Twz3fgvEk#D3GSXQVU zOE^1_G?+VyueF5xDc1V?TA5IzO>8k|wtKbR*)lu4{MDY^Xx^(~KLZYgT@4eyeG9)N zm2T4wx0BTn=v9>ne$DY|`<`2QX6H8?=QWsjw0gV8?{*J153c3>L!BPk7CB9Sw;ZL( zyevzG^qWOHhloQdwS++S#OQdXZm4$6M}j02ocu`31WF$0J#d)atHc zy2IS-mUmJK5ieaS21-g~UKIy4^7kHLc=F6)Zi*H*baG{gVWj=oy<+1L_$4rG`z{UJ zKE^1PwRogXbL$g{XkG$HgsV?;I0Ol-cip~&%uFFywERctyEU8Dos?+wZL~mk#mG}c#Y^mFN6@7VbVPoXa@(rR+u|zZ?T9E*o_J|`6>gLtP%@} zOy4~>JUQuKOK9pFT%J9C3Fm!- zXFvqB&Uu_yWoc}1^c^@Mat6XUlBp7%N(t+Hyd2!E9#2?4@$~t;B|ur4A6*aKVinkN z9d-hFB{g>{C#YL{9aTqE3Wjk9xSP037W*BbiR9r?{7`jBD9j`c3wzj86NN4Ivjo3j zHIZarztXFZX^k*fYhl#ib9%tc?TLuIgU3qHIa*6m-lFt~LaX;@P(M}6jJVrC#$J~P z9Q3^6!I#gA34V#`8m4MqO=3RW%YB)9IZ@Hvly|K;p%GO(z!v_*k&6K-VVG3d_Vc{! zRWyliTK6_r3?CnQa^MPDNtlx+8+z<<)YWOWHB7DeXJ%9Ek4o-yYlq}QS{#<7s!*N< z{>If@?hNdkw~?Jpl&Sio9uM1veE>yDe_RfY#0^p*>c3S1BwnI6l4itL^N3Y1X|_^U zdgVe^qwa_>d`uOovdu~MkhF~xp%~oP4`CA-d1iLW(li?kH<=b5ag&WrxFm#H7j@CGK|MzUcB`UdSlGd! z^T&INJz>&)B|g4DfX1c72^zlC_p>pv3U;(KF%w|-Fba;a91{dBf~}}u&_TBAJ(dC9 zhe||K#yW?MF$d$b>s2+onBf+pUJHxLXx(3(TthcreS-IYE)c>9A9vVwP1~BSabPva zeKqb~y)$Q6PPQ}Tn@Uk{jO-Wha>|lFJWpkO&tI8%A-Exq@-{j##_8>i0E>7}s8qms z!P`M+j^J6MXFaOX0r`mU(YyWnO=do;Ul$IKJHmgv^V=QAYk%`{|i|sfNdnbLMcBl6-z0A52m5pHges1U`(q~Lw*(Y`KMl| zOubHJQZ@t7q|lDU$sG?cd0-l{q0Kz1n=NtSVqf(A=&Ps1w&XSUZ|y^0rtU46U3x6Q z?tu5b^Q(A9JTaQgPD}SMt$Ta3^z=8+_Y0>f=6A1LGELr}z2`O9 z!{NC*c05COlTJHse=5E@sQ9zjbyEb_X1aBZV(xtG(Ibgja%gBA93CLzdTzxuOP*_5 zzpGqP5$&d@Il9n-#RS3OW+eunHyBDs*Y*C40k;6rr@_%FPE54$b%KLkOJ5E2! zH!#h0P2tp)?XPc&#2|C;jxU-An3e#&IEz&;(@98M9b#a(FRTlifAO(lsEp%5jpgCZ_Z@)Ynyd-6=gBr_coC*9jdvr5 z^N-Irji+BIcRTZ4=OW)!b>IWRlXV{`AH?7BTzC>#5aKU`fK8SnFy|S!F-8%A2;WmW z_M@WExSq22-Y5&{-;`oXAZgvVgtnm*5F*(>u~J?VczY#kjHg<_S?pf+7CKgxoL+gS zLZn;hVtw>PVNAvE10WM5$`kkwsh1Q3o+@nRrSJOinhh(5?CfN~$hc+MqA~ntBa5ku9j$8C*UMbud0OyeTBI!Fj1we+eQJTB|A+&T|@* z&5li`hq29{hsXXkgF78g@9Bt|P2ciA?*42rK-#3MTUm+pekP|uP4!CZr|2!{R^&D} ZvERxmFt#;aFdNHr7^LJr_x{j<{|BGb3giF) literal 46380 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 Date: Sun, 26 Oct 2025 13:52:00 +0000 Subject: [PATCH 03/12] docs: clarify triangular/hexagonal lattice naming convention Co-authored-by: krlmlr <1741643+krlmlr@users.noreply.github.com> --- R/make.R | 8 +- man/make_hex_lattice.Rd | 8 +- tests/testthat/_snaps/make.new.md | 175 --------------------------- tests/testthat/testthat-problems.rds | Bin 49493 -> 0 bytes 4 files changed, 10 insertions(+), 181 deletions(-) delete mode 100644 tests/testthat/_snaps/make.new.md delete mode 100644 tests/testthat/testthat-problems.rds diff --git a/R/make.R b/R/make.R index f525546623d..24abd2cdabf 100644 --- a/R/make.R +++ b/R/make.R @@ -2004,13 +2004,15 @@ lattice <- function(...) constructor_spec(make_lattice, ...) #' Create a hexagonal lattice graph #' #' `make_hex_lattice()` creates a triangular lattice, also known as a hexagonal -#' lattice. This is a lattice where each vertex has up to three neighbors and -#' the structure forms a triangular/hexagonal tiling pattern. +#' lattice. The name "hexagonal lattice" refers to the hexagonal tiling pattern +#' created when vertices are arranged in this structure, while "triangular +#' lattice" refers to the fact that edges form triangles. Both terms describe +#' the same graph structure. #' #' @details #' A triangular (or hexagonal) lattice is a two-dimensional lattice where each #' internal vertex has degree 3. The resulting graph structure resembles a -#' triangular or hexagonal tiling. +#' triangular or hexagonal tiling pattern, which is why it's known by both names. #' #' The `dims` parameter determines the shape of the lattice: #' \itemize{ diff --git a/man/make_hex_lattice.Rd b/man/make_hex_lattice.Rd index 4b5f17f3cef..ad1f98b2bd9 100644 --- a/man/make_hex_lattice.Rd +++ b/man/make_hex_lattice.Rd @@ -24,13 +24,15 @@ An igraph graph. } \description{ \code{make_hex_lattice()} creates a triangular lattice, also known as a hexagonal -lattice. This is a lattice where each vertex has up to three neighbors and -the structure forms a triangular/hexagonal tiling pattern. +lattice. The name "hexagonal lattice" refers to the hexagonal tiling pattern +created when vertices are arranged in this structure, while "triangular +lattice" refers to the fact that edges form triangles. Both terms describe +the same graph structure. } \details{ A triangular (or hexagonal) lattice is a two-dimensional lattice where each internal vertex has degree 3. The resulting graph structure resembles a -triangular or hexagonal tiling. +triangular or hexagonal tiling pattern, which is why it's known by both names. The \code{dims} parameter determines the shape of the lattice: \itemize{ diff --git a/tests/testthat/_snaps/make.new.md b/tests/testthat/_snaps/make.new.md deleted file mode 100644 index 7038eb8c85b..00000000000 --- a/tests/testthat/_snaps/make.new.md +++ /dev/null @@ -1,175 +0,0 @@ -# error messages are proper - - Code - make_() - Condition - Error in `.extract_constructor_and_modifiers()`: - ! Don't know how to make_, nothing given - Code - make_(1:10) - Condition - Error in `.extract_constructor_and_modifiers()`: - ! Don't know how to make_, nothing given - Code - graph_() - Condition - Error in `.extract_constructor_and_modifiers()`: - ! Don't know how to graph_, nothing given - Code - graph_(1:10) - Condition - Error in `.extract_constructor_and_modifiers()`: - ! Don't know how to graph_, nothing given - Code - graph_(directed_graph(), directed_graph()) - Condition - Error in `.extract_constructor_and_modifiers()`: - ! Don't know how to graph_, multiple constructors given - Code - sample_() - Condition - Error in `.extract_constructor_and_modifiers()`: - ! Don't know how to sample_, nothing given - Code - sample_(1:10) - Condition - Error in `.extract_constructor_and_modifiers()`: - ! Don't know how to sample_, nothing given - Code - sample_(directed_graph(), directed_graph()) - Condition - Error in `.extract_constructor_and_modifiers()`: - ! Don't know how to sample_, multiple constructors given - -# graph_from_literal() and simple undirected graphs - - Code - graph_from_literal(A - B) - Output - IGRAPH UN-- 2 1 -- - + attr: name (v/c) - + edge (vertex names): - [1] A--B - Code - graph_from_literal(A - B - C) - Output - IGRAPH UN-- 3 2 -- - + attr: name (v/c) - + edges (vertex names): - [1] A--B B--C - Code - graph_from_literal(A - B - C - A) - Output - IGRAPH UN-- 3 3 -- - + attr: name (v/c) - + edges (vertex names): - [1] A--B A--C B--C - -# graph_from_literal() and undirected explosion - - Code - graph_from_literal(A:B:C - D:E, B:D - C:E) - Output - IGRAPH 955d723 UN-- 5 8 -- - + attr: name (v/c) - + edges from 955d723 (vertex names): - [1] A--D A--E B--C B--D B--E C--D C--E D--E - Code - graph_from_literal(A:B:C - D:E - F:G:H - I - J:K:L:M) - Output - IGRAPH f2b917b UN-- 13 19 -- - + attr: name (v/c) - + edges from f2b917b (vertex names): - [1] A--D A--E B--D B--E C--D C--E D--F D--G D--H E--F E--G E--H F--I G--I H--I - [16] I--J I--K I--L I--M - -# graph_from_literal() and simple directed graphs - - Code - graph_from_literal(A - +B) - Output - IGRAPH 850fbcf DN-- 2 1 -- - + attr: name (v/c) - + edge from 850fbcf (vertex names): - [1] A->B - Code - graph_from_literal(A - +B - +C) - Output - IGRAPH 56752a8 DN-- 3 2 -- - + attr: name (v/c) - + edges from 56752a8 (vertex names): - [1] A->B B->C - Code - graph_from_literal(A - +B - +C - +A) - Output - IGRAPH 481388c DN-- 3 3 -- - + attr: name (v/c) - + edges from 481388c (vertex names): - [1] A->B B->C C->A - Code - graph_from_literal(A - +B + -C - +A) - Output - IGRAPH 7598ca0 DN-- 3 3 -- - + attr: name (v/c) - + edges from 7598ca0 (vertex names): - [1] A->B C->A C->B - -# graph_from_literal() and directed explosion - - Code - graph_from_literal(A:B:C - +D:E, B:D + -C:E) - Output - IGRAPH eb1e38e DN-- 5 9 -- - + attr: name (v/c) - + edges from eb1e38e (vertex names): - [1] A->D A->E B->D B->E C->B C->D C->E E->B E->D - Code - graph_from_literal(A:B:C - +D:E + -F:G:H - +I + -J:K:L:M) - Output - IGRAPH 8293246 DN-- 13 19 -- - + attr: name (v/c) - + edges from 8293246 (vertex names): - [1] A->D A->E B->D B->E C->D C->E F->D F->E F->I G->D G->E G->I H->D H->E H->I - [16] J->I K->I L->I M->I - -# graph_from_literal(simplify = FALSE) - - Code - graph_from_literal(1 - 1, 1 - 2, 1 - 2) - Output - IGRAPH bb97a6c UN-- 2 1 -- - + attr: name (v/c) - + edge from bb97a6c (vertex names): - [1] 1--2 - Code - graph_from_literal(1 - 1, 1 - 2, 1 - 2, simplify = FALSE) - Output - IGRAPH 09745ac UN-- 2 3 -- - + attr: name (v/c) - + edges from 09745ac (vertex names): - [1] 1--1 1--2 1--2 - -# make_empty_graph gives an error for invalid arguments - - Code - make_empty_graph(NULL) - Condition - Error in `make_empty_graph()`: - ! `n` must be numeric, not NULL. - ---- - - Code - make_empty_graph("spam") - Condition - Error in `make_empty_graph()`: - ! `n` must be numeric, not a string. - ---- - - Code - make_empty_graph(10, "spam") - Condition - Error in `make_empty_graph()`: - ! `directed` must be a logical, not a string. - diff --git a/tests/testthat/testthat-problems.rds b/tests/testthat/testthat-problems.rds deleted file mode 100644 index 353aa03f4d4e0aeee51f340189b28897612981da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49493 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 ZvERxmFt#;aFdNHr7^LJr_x{j<{|BGb3giF) From dab839948c32b3a23c210de97114cd332f52515b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 26 Oct 2025 13:56:30 +0000 Subject: [PATCH 04/12] docs: improve clarity on lattice structure and terminology Co-authored-by: krlmlr <1741643+krlmlr@users.noreply.github.com> --- R/make.R | 19 +++++++++++-------- man/make_hex_lattice.Rd | 19 +++++++++++-------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/R/make.R b/R/make.R index 24abd2cdabf..3a21c72759e 100644 --- a/R/make.R +++ b/R/make.R @@ -2007,21 +2007,24 @@ lattice <- function(...) constructor_spec(make_lattice, ...) #' lattice. The name "hexagonal lattice" refers to the hexagonal tiling pattern #' created when vertices are arranged in this structure, while "triangular #' lattice" refers to the fact that edges form triangles. Both terms describe -#' the same graph structure. +#' the same graph structure. The term "triangular lattice" is more common in +#' graph theory, while "hexagonal lattice" is often used in crystallography +#' and physics. #' #' @details -#' A triangular (or hexagonal) lattice is a two-dimensional lattice where each -#' internal vertex has degree 3. The resulting graph structure resembles a -#' triangular or hexagonal tiling pattern, which is why it's known by both names. +#' A triangular (or hexagonal) lattice is a lattice structure where each +#' internal vertex has degree 3. The fundamental structure is based on +#' triangular tiling, but the function supports creating lattices with +#' different boundary shapes. #' -#' The `dims` parameter determines the shape of the lattice: +#' The `dims` parameter determines the boundary shape of the lattice: #' \itemize{ -#' \item If `dims` is a single number, the lattice has a triangular shape +#' \item If `dims` is a single number, the lattice has a triangular boundary #' where each side contains `dims` vertices. #' \item If `dims` is a vector of length 2, the lattice has a rectangular -#' shape with sides containing `dims[1]` and `dims[2]` vertices. +#' boundary with sides containing `dims[1]` and `dims[2]` vertices. #' \item If `dims` is a vector of length 3, the lattice has a hexagonal -#' shape where the sides contain `dims[1]`, `dims[2]`, and `dims[3]` +#' boundary where the sides contain `dims[1]`, `dims[2]`, and `dims[3]` #' vertices. #' } #' diff --git a/man/make_hex_lattice.Rd b/man/make_hex_lattice.Rd index ad1f98b2bd9..2cb34a0b470 100644 --- a/man/make_hex_lattice.Rd +++ b/man/make_hex_lattice.Rd @@ -27,21 +27,24 @@ An igraph graph. lattice. The name "hexagonal lattice" refers to the hexagonal tiling pattern created when vertices are arranged in this structure, while "triangular lattice" refers to the fact that edges form triangles. Both terms describe -the same graph structure. +the same graph structure. The term "triangular lattice" is more common in +graph theory, while "hexagonal lattice" is often used in crystallography +and physics. } \details{ -A triangular (or hexagonal) lattice is a two-dimensional lattice where each -internal vertex has degree 3. The resulting graph structure resembles a -triangular or hexagonal tiling pattern, which is why it's known by both names. +A triangular (or hexagonal) lattice is a lattice structure where each +internal vertex has degree 3. The fundamental structure is based on +triangular tiling, but the function supports creating lattices with +different boundary shapes. -The \code{dims} parameter determines the shape of the lattice: +The \code{dims} parameter determines the boundary shape of the lattice: \itemize{ -\item If \code{dims} is a single number, the lattice has a triangular shape +\item If \code{dims} is a single number, the lattice has a triangular boundary where each side contains \code{dims} vertices. \item If \code{dims} is a vector of length 2, the lattice has a rectangular -shape with sides containing \code{dims[1]} and \code{dims[2]} vertices. +boundary with sides containing \code{dims[1]} and \code{dims[2]} vertices. \item If \code{dims} is a vector of length 3, the lattice has a hexagonal -shape where the sides contain \code{dims[1]}, \code{dims[2]}, and \code{dims[3]} +boundary where the sides contain \code{dims[1]}, \code{dims[2]}, and \code{dims[3]} vertices. } } From 12ddd04dcd9d8a3ccc875b0d25cec789d1c3e0b1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 26 Oct 2025 13:58:38 +0000 Subject: [PATCH 05/12] docs: clarify that degree 3 applies to interior vertices only Co-authored-by: krlmlr <1741643+krlmlr@users.noreply.github.com> --- R/make.R | 6 +++--- man/make_hex_lattice.Rd | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/R/make.R b/R/make.R index 3a21c72759e..8f6bbbbcbcf 100644 --- a/R/make.R +++ b/R/make.R @@ -2013,9 +2013,9 @@ lattice <- function(...) constructor_spec(make_lattice, ...) #' #' @details #' A triangular (or hexagonal) lattice is a lattice structure where each -#' internal vertex has degree 3. The fundamental structure is based on -#' triangular tiling, but the function supports creating lattices with -#' different boundary shapes. +#' interior vertex (not on the boundary) has degree 3. The fundamental structure +#' is based on triangular tiling, but the function supports creating lattices +#' with different boundary shapes. #' #' The `dims` parameter determines the boundary shape of the lattice: #' \itemize{ diff --git a/man/make_hex_lattice.Rd b/man/make_hex_lattice.Rd index 2cb34a0b470..ed42c8654ff 100644 --- a/man/make_hex_lattice.Rd +++ b/man/make_hex_lattice.Rd @@ -33,9 +33,9 @@ and physics. } \details{ A triangular (or hexagonal) lattice is a lattice structure where each -internal vertex has degree 3. The fundamental structure is based on -triangular tiling, but the function supports creating lattices with -different boundary shapes. +interior vertex (not on the boundary) has degree 3. The fundamental structure +is based on triangular tiling, but the function supports creating lattices +with different boundary shapes. The \code{dims} parameter determines the boundary shape of the lattice: \itemize{ From 125b6ba1cd57c8a9318868a430f009b8e8868a31 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 26 Oct 2025 23:05:50 +0000 Subject: [PATCH 06/12] Changes before error encountered Co-authored-by: krlmlr <1741643+krlmlr@users.noreply.github.com> --- R/aaa-auto.R | 22 +++ R/make.R | 27 ++-- man/make_hex_lattice.Rd | 21 ++- src/cpp11.cpp | 2 + src/cpp11.dd | 252 ++++++++++++++++++++++++++++++ src/rinterface.c | 35 +++++ src/rinterface.dd | 108 +++++++++++++ tests/testthat/_snaps/aaa-auto.md | 30 ++++ tests/testthat/test-aaa-auto.R | 23 +++ 9 files changed, 497 insertions(+), 23 deletions(-) diff --git a/R/aaa-auto.R b/R/aaa-auto.R index a019de8c302..345e5ff5c5f 100644 --- a/R/aaa-auto.R +++ b/R/aaa-auto.R @@ -274,6 +274,28 @@ triangular_lattice_impl <- function( res } +hexagonal_lattice_impl <- function( + dimvector, + directed = FALSE, + mutual = FALSE +) { + # Argument checks + dimvector <- as.numeric(dimvector) + directed <- as.logical(directed) + mutual <- as.logical(mutual) + + on.exit(.Call(R_igraph_finalizer)) + # Function call + res <- .Call( + R_igraph_hexagonal_lattice, + dimvector, + directed, + mutual + ) + + res +} + path_graph_impl <- function( n, directed = FALSE, diff --git a/R/make.R b/R/make.R index 56b6f2db063..687a8197784 100644 --- a/R/make.R +++ b/R/make.R @@ -2024,18 +2024,17 @@ lattice <- function(...) constructor_spec(make_lattice, ...) #' Create a hexagonal lattice graph #' -#' `make_hex_lattice()` creates a triangular lattice, also known as a hexagonal -#' lattice. The name "hexagonal lattice" refers to the hexagonal tiling pattern -#' created when vertices are arranged in this structure, while "triangular -#' lattice" refers to the fact that edges form triangles. Both terms describe -#' the same graph structure. The term "triangular lattice" is more common in -#' graph theory, while "hexagonal lattice" is often used in crystallography -#' and physics. +#' `r lifecycle::badge("experimental")` +#' +#' `make_hex_lattice()` creates a hexagonal lattice. In graph theory, this is +#' also sometimes referred to as a "triangular lattice" due to the triangular +#' faces formed by the edges. The name "hexagonal lattice" refers to the +#' hexagonal tiling pattern created when vertices are arranged in this structure, +#' and is more commonly used in crystallography and physics. #' #' @details -#' A triangular (or hexagonal) lattice is a lattice structure where each -#' interior vertex (not on the boundary) has degree 3. The fundamental structure -#' is based on triangular tiling, but the function supports creating lattices +#' A hexagonal lattice is a lattice structure where each interior vertex +#' (not on the boundary) has degree 3. The function supports creating lattices #' with different boundary shapes. #' #' The `dims` parameter determines the boundary shape of the lattice: @@ -2069,10 +2068,14 @@ lattice <- function(...) constructor_spec(make_lattice, ...) #' # Hexagonal shape #' g3 <- make_hex_lattice(c(3, 3, 3)) #' plot(g3) -#' @cdocs igraph_triangular_lattice +#' @cdocs igraph_hexagonal_lattice make_hex_lattice <- function(dims, directed = FALSE, mutual = FALSE) { on.exit(.Call(R_igraph_finalizer)) - res <- triangular_lattice_impl(dims, directed, mutual) + res <- hexagonal_lattice_impl( + dimvector = dims, + directed = directed, + mutual = mutual + ) if (igraph_opt("add.params")) { res$name <- "Hexagonal lattice" res$dims <- dims diff --git a/man/make_hex_lattice.Rd b/man/make_hex_lattice.Rd index ed42c8654ff..08ad7d95035 100644 --- a/man/make_hex_lattice.Rd +++ b/man/make_hex_lattice.Rd @@ -23,18 +23,17 @@ controls whether edges are mutual (bidirectional).} An igraph graph. } \description{ -\code{make_hex_lattice()} creates a triangular lattice, also known as a hexagonal -lattice. The name "hexagonal lattice" refers to the hexagonal tiling pattern -created when vertices are arranged in this structure, while "triangular -lattice" refers to the fact that edges form triangles. Both terms describe -the same graph structure. The term "triangular lattice" is more common in -graph theory, while "hexagonal lattice" is often used in crystallography -and physics. +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} } \details{ -A triangular (or hexagonal) lattice is a lattice structure where each -interior vertex (not on the boundary) has degree 3. The fundamental structure -is based on triangular tiling, but the function supports creating lattices +\code{make_hex_lattice()} creates a hexagonal lattice. In graph theory, this is +also sometimes referred to as a "triangular lattice" due to the triangular +faces formed by the edges. The name "hexagonal lattice" refers to the +hexagonal tiling pattern created when vertices are arranged in this structure, +and is more commonly used in crystallography and physics. + +A hexagonal lattice is a lattice structure where each interior vertex +(not on the boundary) has degree 3. The function supports creating lattices with different boundary shapes. The \code{dims} parameter determines the boundary shape of the lattice: @@ -78,5 +77,5 @@ Other deterministic constructors: \code{\link{make_tree}()} } \concept{deterministic constructors} -\section{Related documentation in the C library}{\href{https://igraph.org/c/html/latest/igraph-Generators.html#igraph_triangular_lattice}{\code{triangular_lattice()}}.} +\section{Related documentation in the C library}{\href{https://igraph.org/c/html/latest/igraph-Generators.html#igraph_hexagonal_lattice}{\code{hexagonal_lattice()}}.} diff --git a/src/cpp11.cpp b/src/cpp11.cpp index 61d8955f03d..07898abb095 100644 --- a/src/cpp11.cpp +++ b/src/cpp11.cpp @@ -227,6 +227,7 @@ extern SEXP R_igraph_harmonic_centrality_cutoff(SEXP, SEXP, SEXP, SEXP, SEXP, SE extern SEXP R_igraph_has_loop(SEXP); extern SEXP R_igraph_has_multiple(SEXP); extern SEXP R_igraph_has_mutual(SEXP, SEXP); +extern SEXP R_igraph_hexagonal_lattice(SEXP, SEXP, SEXP); extern SEXP R_igraph_hrg_consensus(SEXP, SEXP, SEXP, SEXP); extern SEXP R_igraph_hrg_create(SEXP, SEXP); extern SEXP R_igraph_hrg_fit(SEXP, SEXP, SEXP, SEXP); @@ -704,6 +705,7 @@ static const R_CallMethodDef CallEntries[] = { {"R_igraph_has_loop", (DL_FUNC) &R_igraph_has_loop, 1}, {"R_igraph_has_multiple", (DL_FUNC) &R_igraph_has_multiple, 1}, {"R_igraph_has_mutual", (DL_FUNC) &R_igraph_has_mutual, 2}, + {"R_igraph_hexagonal_lattice", (DL_FUNC) &R_igraph_hexagonal_lattice, 3}, {"R_igraph_hrg_consensus", (DL_FUNC) &R_igraph_hrg_consensus, 4}, {"R_igraph_hrg_create", (DL_FUNC) &R_igraph_hrg_create, 2}, {"R_igraph_hrg_fit", (DL_FUNC) &R_igraph_hrg_fit, 4}, diff --git a/src/cpp11.dd b/src/cpp11.dd index 9abbae1fcad..de42af19ba0 100644 --- a/src/cpp11.dd +++ b/src/cpp11.dd @@ -2,3 +2,255 @@ cpp11.o: \ cpp11.cpp \ igraph_types.hpp \ + /home/runner/work/_temp/Library/cpp11/include/cpp11.hpp \ + /home/runner/work/_temp/Library/cpp11/include/cpp11/R.hpp \ + /home/runner/work/_temp/Library/cpp11/include/cpp11/altrep.hpp \ + /home/runner/work/_temp/Library/cpp11/include/cpp11/as.hpp \ + /home/runner/work/_temp/Library/cpp11/include/cpp11/attribute_proxy.hpp \ + /home/runner/work/_temp/Library/cpp11/include/cpp11/data_frame.hpp \ + /home/runner/work/_temp/Library/cpp11/include/cpp11/declarations.hpp \ + /home/runner/work/_temp/Library/cpp11/include/cpp11/doubles.hpp \ + /home/runner/work/_temp/Library/cpp11/include/cpp11/environment.hpp \ + /home/runner/work/_temp/Library/cpp11/include/cpp11/external_pointer.hpp \ + /home/runner/work/_temp/Library/cpp11/include/cpp11/function.hpp \ + /home/runner/work/_temp/Library/cpp11/include/cpp11/integers.hpp \ + /home/runner/work/_temp/Library/cpp11/include/cpp11/list.hpp \ + /home/runner/work/_temp/Library/cpp11/include/cpp11/list_of.hpp \ + /home/runner/work/_temp/Library/cpp11/include/cpp11/logicals.hpp \ + /home/runner/work/_temp/Library/cpp11/include/cpp11/matrix.hpp \ + /home/runner/work/_temp/Library/cpp11/include/cpp11/named_arg.hpp \ + /home/runner/work/_temp/Library/cpp11/include/cpp11/protect.hpp \ + /home/runner/work/_temp/Library/cpp11/include/cpp11/r_bool.hpp \ + /home/runner/work/_temp/Library/cpp11/include/cpp11/r_string.hpp \ + /home/runner/work/_temp/Library/cpp11/include/cpp11/r_vector.hpp \ + /home/runner/work/_temp/Library/cpp11/include/cpp11/raws.hpp \ + /home/runner/work/_temp/Library/cpp11/include/cpp11/sexp.hpp \ + /home/runner/work/_temp/Library/cpp11/include/cpp11/strings.hpp \ + /opt/R/4.5.1/lib/R/include/R_ext/Arith.h \ + /opt/R/4.5.1/lib/R/include/R_ext/Boolean.h \ + /opt/R/4.5.1/lib/R/include/R_ext/Complex.h \ + /opt/R/4.5.1/lib/R/include/R_ext/Error.h \ + /opt/R/4.5.1/lib/R/include/R_ext/Memory.h \ + /opt/R/4.5.1/lib/R/include/R_ext/Print.h \ + /opt/R/4.5.1/lib/R/include/R_ext/Rdynload.h \ + /opt/R/4.5.1/lib/R/include/R_ext/Utils.h \ + /opt/R/4.5.1/lib/R/include/R_ext/Visibility.h \ + /opt/R/4.5.1/lib/R/include/R_ext/libextern.h \ + /opt/R/4.5.1/lib/R/include/Rconfig.h \ + /opt/R/4.5.1/lib/R/include/Rinternals.h \ + /opt/R/4.5.1/lib/R/include/Rversion.h \ + /usr/include/asm-generic/errno.h \ + /usr/include/c++/13/algorithm \ + /usr/include/c++/13/backward/auto_ptr.h \ + /usr/include/c++/13/backward/binders.h \ + /usr/include/c++/13/bits/algorithmfwd.h \ + /usr/include/c++/13/bits/align.h \ + /usr/include/c++/13/bits/alloc_traits.h \ + /usr/include/c++/13/bits/allocated_ptr.h \ + /usr/include/c++/13/bits/allocator.h \ + /usr/include/c++/13/bits/atomic_base.h \ + /usr/include/c++/13/bits/atomic_lockfree_defines.h \ + /usr/include/c++/13/bits/basic_ios.h \ + /usr/include/c++/13/bits/basic_ios.tcc \ + /usr/include/c++/13/bits/basic_string.h \ + /usr/include/c++/13/bits/basic_string.tcc \ + /usr/include/c++/13/bits/char_traits.h \ + /usr/include/c++/13/bits/charconv.h \ + /usr/include/c++/13/bits/concept_check.h \ + /usr/include/c++/13/bits/cpp_type_traits.h \ + /usr/include/c++/13/bits/cxxabi_forced.h \ + /usr/include/c++/13/bits/cxxabi_init_exception.h \ + /usr/include/c++/13/bits/exception.h \ + /usr/include/c++/13/bits/exception_defines.h \ + /usr/include/c++/13/bits/exception_ptr.h \ + /usr/include/c++/13/bits/functexcept.h \ + /usr/include/c++/13/bits/functional_hash.h \ + /usr/include/c++/13/bits/hash_bytes.h \ + /usr/include/c++/13/bits/locale_classes.h \ + /usr/include/c++/13/bits/locale_classes.tcc \ + /usr/include/c++/13/bits/locale_facets.h \ + /usr/include/c++/13/bits/locale_facets.tcc \ + /usr/include/c++/13/bits/localefwd.h \ + /usr/include/c++/13/bits/memory_resource.h \ + /usr/include/c++/13/bits/memoryfwd.h \ + /usr/include/c++/13/bits/move.h \ + /usr/include/c++/13/bits/nested_exception.h \ + /usr/include/c++/13/bits/new_allocator.h \ + /usr/include/c++/13/bits/ostream.tcc \ + /usr/include/c++/13/bits/ostream_insert.h \ + /usr/include/c++/13/bits/postypes.h \ + /usr/include/c++/13/bits/predefined_ops.h \ + /usr/include/c++/13/bits/ptr_traits.h \ + /usr/include/c++/13/bits/range_access.h \ + /usr/include/c++/13/bits/refwrap.h \ + /usr/include/c++/13/bits/requires_hosted.h \ + /usr/include/c++/13/bits/shared_ptr.h \ + /usr/include/c++/13/bits/shared_ptr_atomic.h \ + /usr/include/c++/13/bits/shared_ptr_base.h \ + /usr/include/c++/13/bits/specfun.h \ + /usr/include/c++/13/bits/std_abs.h \ + /usr/include/c++/13/bits/stl_algobase.h \ + /usr/include/c++/13/bits/stl_bvector.h \ + /usr/include/c++/13/bits/stl_construct.h \ + /usr/include/c++/13/bits/stl_function.h \ + /usr/include/c++/13/bits/stl_heap.h \ + /usr/include/c++/13/bits/stl_iterator.h \ + /usr/include/c++/13/bits/stl_iterator_base_funcs.h \ + /usr/include/c++/13/bits/stl_iterator_base_types.h \ + /usr/include/c++/13/bits/stl_pair.h \ + /usr/include/c++/13/bits/stl_raw_storage_iter.h \ + /usr/include/c++/13/bits/stl_vector.h \ + /usr/include/c++/13/bits/stream_iterator.h \ + /usr/include/c++/13/bits/streambuf.tcc \ + /usr/include/c++/13/bits/streambuf_iterator.h \ + /usr/include/c++/13/bits/string_view.tcc \ + /usr/include/c++/13/bits/uniform_int_dist.h \ + /usr/include/c++/13/bits/uses_allocator.h \ + /usr/include/c++/13/bits/uses_allocator_args.h \ + /usr/include/c++/13/bits/vector.tcc \ + /usr/include/c++/13/cctype \ + /usr/include/c++/13/clocale \ + /usr/include/c++/13/compare \ + /usr/include/c++/13/csetjmp \ + /usr/include/c++/13/cstdint \ + /usr/include/c++/13/cstdio \ + /usr/include/c++/13/cstring \ + /usr/include/c++/13/debug/assertions.h \ + /usr/include/c++/13/ext/aligned_buffer.h \ + /usr/include/c++/13/ext/alloc_traits.h \ + /usr/include/c++/13/ext/atomicity.h \ + /usr/include/c++/13/ext/concurrence.h \ + /usr/include/c++/13/ext/numeric_traits.h \ + /usr/include/c++/13/ext/string_conversions.h \ + /usr/include/c++/13/ext/type_traits.h \ + /usr/include/c++/13/initializer_list \ + /usr/include/c++/13/limits \ + /usr/include/c++/13/math.h \ + /usr/include/c++/13/memory \ + /usr/include/c++/13/ostream \ + /usr/include/c++/13/pstl/execution_defs.h \ + /usr/include/c++/13/pstl/glue_algorithm_defs.h \ + /usr/include/c++/13/pstl/glue_memory_defs.h \ + /usr/include/c++/13/pstl/pstl_config.h \ + /usr/include/c++/13/streambuf \ + /usr/include/c++/13/string \ + /usr/include/c++/13/system_error \ + /usr/include/c++/13/tr1/bessel_function.tcc \ + /usr/include/c++/13/tr1/beta_function.tcc \ + /usr/include/c++/13/tr1/ell_integral.tcc \ + /usr/include/c++/13/tr1/exp_integral.tcc \ + /usr/include/c++/13/tr1/hypergeometric.tcc \ + /usr/include/c++/13/tr1/legendre_function.tcc \ + /usr/include/c++/13/tr1/modified_bessel_func.tcc \ + /usr/include/c++/13/tr1/poly_hermite.tcc \ + /usr/include/c++/13/tr1/poly_laguerre.tcc \ + /usr/include/c++/13/tr1/riemann_zeta.tcc \ + /usr/include/c++/13/tr1/special_function_util.h \ + /usr/include/c++/13/utility \ + /usr/include/c++/13/vector \ + /usr/include/errno.h \ + /usr/include/features-time64.h \ + /usr/include/inttypes.h \ + /usr/include/limits.h \ + /usr/include/linux/errno.h \ + /usr/include/linux/limits.h \ + /usr/include/pthread.h \ + /usr/include/wchar.h \ + /usr/include/wctype.h \ + /usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h \ + /usr/include/x86_64-linux-gnu/bits/byteswap.h \ + /usr/include/x86_64-linux-gnu/bits/cpu-set.h \ + /usr/include/x86_64-linux-gnu/bits/endian.h \ + /usr/include/x86_64-linux-gnu/bits/endianness.h \ + /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ + /usr/include/x86_64-linux-gnu/bits/floatn.h \ + /usr/include/x86_64-linux-gnu/bits/flt-eval-method.h \ + /usr/include/x86_64-linux-gnu/bits/fp-fast.h \ + /usr/include/x86_64-linux-gnu/bits/fp-logb.h \ + /usr/include/x86_64-linux-gnu/bits/iscanonical.h \ + /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ + /usr/include/x86_64-linux-gnu/bits/libm-simd-decl-stubs.h \ + /usr/include/x86_64-linux-gnu/bits/local_lim.h \ + /usr/include/x86_64-linux-gnu/bits/locale.h \ + /usr/include/x86_64-linux-gnu/bits/long-double.h \ + /usr/include/x86_64-linux-gnu/bits/math-vector.h \ + /usr/include/x86_64-linux-gnu/bits/mathcalls-helper-functions.h \ + /usr/include/x86_64-linux-gnu/bits/mathcalls-narrow.h \ + /usr/include/x86_64-linux-gnu/bits/mathcalls.h \ + /usr/include/x86_64-linux-gnu/bits/posix2_lim.h \ + /usr/include/x86_64-linux-gnu/bits/pthread_stack_min-dynamic.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ + /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ + /usr/include/x86_64-linux-gnu/bits/sched.h \ + /usr/include/x86_64-linux-gnu/bits/select.h \ + /usr/include/x86_64-linux-gnu/bits/setjmp.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-intn.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-least.h \ + /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h \ + /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ + /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ + /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h \ + /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ + /usr/include/x86_64-linux-gnu/bits/time.h \ + /usr/include/x86_64-linux-gnu/bits/time64.h \ + /usr/include/x86_64-linux-gnu/bits/timesize.h \ + /usr/include/x86_64-linux-gnu/bits/timex.h \ + /usr/include/x86_64-linux-gnu/bits/types.h \ + /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/cookie_io_functions_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/error_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/mbstate_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct___jmp_buf_tag.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ + /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ + /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ + /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ + /usr/include/x86_64-linux-gnu/bits/typesizes.h \ + /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ + /usr/include/x86_64-linux-gnu/bits/uio_lim.h \ + /usr/include/x86_64-linux-gnu/bits/waitflags.h \ + /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ + /usr/include/x86_64-linux-gnu/bits/wchar.h \ + /usr/include/x86_64-linux-gnu/bits/wordsize.h \ + /usr/include/x86_64-linux-gnu/bits/xopen_lim.h \ + /usr/include/x86_64-linux-gnu/c++/13/bits/atomic_word.h \ + /usr/include/x86_64-linux-gnu/c++/13/bits/c++allocator.h \ + /usr/include/x86_64-linux-gnu/c++/13/bits/c++config.h \ + /usr/include/x86_64-linux-gnu/c++/13/bits/c++locale.h \ + /usr/include/x86_64-linux-gnu/c++/13/bits/cpu_defines.h \ + /usr/include/x86_64-linux-gnu/c++/13/bits/ctype_base.h \ + /usr/include/x86_64-linux-gnu/c++/13/bits/ctype_inline.h \ + /usr/include/x86_64-linux-gnu/c++/13/bits/error_constants.h \ + /usr/include/x86_64-linux-gnu/c++/13/bits/gthr-default.h \ + /usr/include/x86_64-linux-gnu/c++/13/bits/gthr.h \ + /usr/include/x86_64-linux-gnu/c++/13/bits/os_defines.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ + /usr/include/x86_64-linux-gnu/gnu/stubs.h \ + /usr/include/x86_64-linux-gnu/sys/cdefs.h \ + /usr/include/x86_64-linux-gnu/sys/select.h \ + /usr/include/x86_64-linux-gnu/sys/single_threaded.h \ + /usr/include/x86_64-linux-gnu/sys/types.h \ + /usr/lib/gcc/x86_64-linux-gnu/13/include/limits.h \ + /usr/lib/gcc/x86_64-linux-gnu/13/include/stdarg.h \ + /usr/lib/gcc/x86_64-linux-gnu/13/include/stdbool.h \ + /usr/lib/gcc/x86_64-linux-gnu/13/include/stddef.h \ + /usr/lib/gcc/x86_64-linux-gnu/13/include/stdint.h \ + /usr/lib/gcc/x86_64-linux-gnu/13/include/syslimits.h \ + vendor/cigraph/include/igraph_decls.h \ + vendor/cigraph/include/igraph_types.h \ + vendor/igraph_config.h \ diff --git a/src/rinterface.c b/src/rinterface.c index d1bd108609a..ec87cfc9c67 100644 --- a/src/rinterface.c +++ b/src/rinterface.c @@ -504,6 +504,41 @@ SEXP R_igraph_triangular_lattice(SEXP dimvector, SEXP directed, SEXP mutual) { return(r_result); } +/*-------------------------------------------/ +/ igraph_hexagonal_lattice / +/-------------------------------------------*/ +SEXP R_igraph_hexagonal_lattice(SEXP dimvector, SEXP directed, SEXP mutual) { + /* Declarations */ + igraph_t c_graph; + igraph_vector_int_t c_dimvector; + igraph_bool_t c_directed; + igraph_bool_t c_mutual; + SEXP graph; + + SEXP r_result; + /* Convert input */ + IGRAPH_R_CHECK(R_SEXP_to_vector_int_copy(dimvector, &c_dimvector)); + IGRAPH_FINALLY(igraph_vector_int_destroy, &c_dimvector); + IGRAPH_R_CHECK_BOOL(directed); + c_directed = LOGICAL(directed)[0]; + IGRAPH_R_CHECK_BOOL(mutual); + c_mutual = LOGICAL(mutual)[0]; + /* Call igraph */ + IGRAPH_R_CHECK(igraph_hexagonal_lattice(&c_graph, &c_dimvector, c_directed, c_mutual)); + + /* Convert output */ + IGRAPH_FINALLY(igraph_destroy, &c_graph); + PROTECT(graph=R_igraph_to_SEXP(&c_graph)); + IGRAPH_I_DESTROY(&c_graph); + IGRAPH_FINALLY_CLEAN(1); + igraph_vector_int_destroy(&c_dimvector); + IGRAPH_FINALLY_CLEAN(1); + r_result = graph; + + UNPROTECT(1); + return(r_result); +} + /*-------------------------------------------/ / igraph_path_graph / /-------------------------------------------*/ diff --git a/src/rinterface.dd b/src/rinterface.dd index 4e60bfc2463..571daf68b19 100644 --- a/src/rinterface.dd +++ b/src/rinterface.dd @@ -2,3 +2,111 @@ rinterface.o: \ rinterface.c \ rinterface.h \ + /opt/R/4.5.1/lib/R/include/R_ext/Arith.h \ + /opt/R/4.5.1/lib/R/include/R_ext/Boolean.h \ + /opt/R/4.5.1/lib/R/include/R_ext/Complex.h \ + /opt/R/4.5.1/lib/R/include/R_ext/Constants.h \ + /opt/R/4.5.1/lib/R/include/R_ext/Error.h \ + /opt/R/4.5.1/lib/R/include/R_ext/Memory.h \ + /opt/R/4.5.1/lib/R/include/R_ext/Print.h \ + /opt/R/4.5.1/lib/R/include/R_ext/RS.h \ + /opt/R/4.5.1/lib/R/include/R_ext/Random.h \ + /opt/R/4.5.1/lib/R/include/R_ext/Rdynload.h \ + /opt/R/4.5.1/lib/R/include/R_ext/Utils.h \ + /opt/R/4.5.1/lib/R/include/R_ext/libextern.h \ + /opt/R/4.5.1/lib/R/include/Rconfig.h \ + /opt/R/4.5.1/lib/R/include/Rdefines.h \ + /opt/R/4.5.1/lib/R/include/Rinternals.h \ + vendor/cigraph/include/igraph_adjlist.h \ + vendor/cigraph/include/igraph_arpack.h \ + vendor/cigraph/include/igraph_array.h \ + vendor/cigraph/include/igraph_array_pmt.h \ + vendor/cigraph/include/igraph_attributes.h \ + vendor/cigraph/include/igraph_attributes.h \ + vendor/cigraph/include/igraph_bipartite.h \ + vendor/cigraph/include/igraph_bitset.h \ + vendor/cigraph/include/igraph_bitset_list.h \ + vendor/cigraph/include/igraph_blas.h \ + vendor/cigraph/include/igraph_centrality.h \ + vendor/cigraph/include/igraph_cliques.h \ + vendor/cigraph/include/igraph_cocitation.h \ + vendor/cigraph/include/igraph_cohesive_blocks.h \ + vendor/cigraph/include/igraph_coloring.h \ + vendor/cigraph/include/igraph_community.h \ + vendor/cigraph/include/igraph_complex.h \ + vendor/cigraph/include/igraph_components.h \ + vendor/cigraph/include/igraph_constants.h \ + vendor/cigraph/include/igraph_constants.h \ + vendor/cigraph/include/igraph_constructors.h \ + vendor/cigraph/include/igraph_conversion.h \ + vendor/cigraph/include/igraph_cycles.h \ + vendor/cigraph/include/igraph_datatype.h \ + vendor/cigraph/include/igraph_datatype.h \ + vendor/cigraph/include/igraph_decls.h \ + vendor/cigraph/include/igraph_dqueue.h \ + vendor/cigraph/include/igraph_dqueue_pmt.h \ + vendor/cigraph/include/igraph_eigen.h \ + vendor/cigraph/include/igraph_embedding.h \ + vendor/cigraph/include/igraph_epidemics.h \ + vendor/cigraph/include/igraph_error.h \ + vendor/cigraph/include/igraph_error.h \ + vendor/cigraph/include/igraph_eulerian.h \ + vendor/cigraph/include/igraph_flow.h \ + vendor/cigraph/include/igraph_foreign.h \ + vendor/cigraph/include/igraph_games.h \ + vendor/cigraph/include/igraph_graph_list.h \ + vendor/cigraph/include/igraph_graphicality.h \ + vendor/cigraph/include/igraph_graphlets.h \ + vendor/cigraph/include/igraph_heap.h \ + vendor/cigraph/include/igraph_heap_pmt.h \ + vendor/cigraph/include/igraph_hrg.h \ + vendor/cigraph/include/igraph_interface.h \ + vendor/cigraph/include/igraph_interrupt.h \ + vendor/cigraph/include/igraph_iterators.h \ + vendor/cigraph/include/igraph_lapack.h \ + vendor/cigraph/include/igraph_layout.h \ + vendor/cigraph/include/igraph_lsap.h \ + vendor/cigraph/include/igraph_matching.h \ + vendor/cigraph/include/igraph_matrix.h \ + vendor/cigraph/include/igraph_matrix_list.h \ + vendor/cigraph/include/igraph_matrix_pmt.h \ + vendor/cigraph/include/igraph_microscopic_update.h \ + vendor/cigraph/include/igraph_mixing.h \ + vendor/cigraph/include/igraph_motifs.h \ + vendor/cigraph/include/igraph_neighborhood.h \ + vendor/cigraph/include/igraph_nongraph.h \ + vendor/cigraph/include/igraph_operators.h \ + vendor/cigraph/include/igraph_paths.h \ + vendor/cigraph/include/igraph_pmt.h \ + vendor/cigraph/include/igraph_pmt_off.h \ + vendor/cigraph/include/igraph_progress.h \ + vendor/cigraph/include/igraph_psumtree.h \ + vendor/cigraph/include/igraph_qsort.h \ + vendor/cigraph/include/igraph_random.h \ + vendor/cigraph/include/igraph_reachability.h \ + vendor/cigraph/include/igraph_scan.h \ + vendor/cigraph/include/igraph_separators.h \ + vendor/cigraph/include/igraph_sparsemat.h \ + vendor/cigraph/include/igraph_stack.h \ + vendor/cigraph/include/igraph_stack_pmt.h \ + vendor/cigraph/include/igraph_statusbar.h \ + vendor/cigraph/include/igraph_structural.h \ + vendor/cigraph/include/igraph_strvector.h \ + vendor/cigraph/include/igraph_strvector.h \ + vendor/cigraph/include/igraph_topology.h \ + vendor/cigraph/include/igraph_transitivity.h \ + vendor/cigraph/include/igraph_typed_list_pmt.h \ + vendor/cigraph/include/igraph_types.h \ + vendor/cigraph/include/igraph_types.h \ + vendor/cigraph/include/igraph_vector.h \ + vendor/cigraph/include/igraph_vector.h \ + vendor/cigraph/include/igraph_vector_list.h \ + vendor/cigraph/include/igraph_vector_pmt.h \ + vendor/cigraph/include/igraph_vector_ptr.h \ + vendor/cigraph/include/igraph_vector_type.h \ + vendor/cigraph/include/igraph_visitor.h \ + vendor/cigraph/src/graph/attributes.h \ + vendor/cigraph/src/graph/internal.h \ + vendor/igraph_config.h \ + vendor/igraph_export.h \ + vendor/igraph_version.h \ diff --git a/tests/testthat/_snaps/aaa-auto.md b/tests/testthat/_snaps/aaa-auto.md index 8fdfd147c22..92bfe83b6c5 100644 --- a/tests/testthat/_snaps/aaa-auto.md +++ b/tests/testthat/_snaps/aaa-auto.md @@ -236,6 +236,36 @@ Error in `triangular_lattice_impl()`: ! At vendor/cigraph/src/constructors/lattices.c:xx : Invalid dimension vector. Invalid value +# hexagonal_lattice_impl basic + + Code + hexagonal_lattice_impl(dimvector = c(2, 2)) + Output + IGRAPH U--- 16 19 -- + + edges: + [1] 1-- 2 1-- 7 2-- 3 3-- 4 3-- 9 4-- 5 5--11 6-- 7 6--12 7-- 8 + [11] 8-- 9 8--14 9--10 10--11 10--16 12--13 13--14 14--15 15--16 + +--- + + Code + hexagonal_lattice_impl(dimvector = c(2, 2), directed = TRUE, mutual = TRUE) + Output + IGRAPH D--- 16 38 -- + + edges: + [1] 1-> 2 2-> 1 1-> 7 7-> 1 2-> 3 3-> 2 3-> 4 4-> 3 3-> 9 9-> 3 + [11] 4-> 5 5-> 4 5->11 11-> 5 6-> 7 7-> 6 6->12 12-> 6 7-> 8 8-> 7 + [21] 8-> 9 9-> 8 8->14 14-> 8 9->10 10-> 9 10->11 11->10 10->16 16->10 + [31] 12->13 13->12 13->14 14->13 14->15 15->14 15->16 16->15 + +# hexagonal_lattice_impl errors + + Code + x + Condition + Error in `hexagonal_lattice_impl()`: + ! At vendor/cigraph/src/constructors/lattices.c:xx : Invalid dimension vector. Invalid value + # path_graph_impl basic Code diff --git a/tests/testthat/test-aaa-auto.R b/tests/testthat/test-aaa-auto.R index c756c104b6f..0114535695d 100644 --- a/tests/testthat/test-aaa-auto.R +++ b/tests/testthat/test-aaa-auto.R @@ -255,6 +255,29 @@ test_that("triangular_lattice_impl errors", { )) }) +# 11b. hexagonal_lattice_impl + +test_that("hexagonal_lattice_impl basic", { + withr::local_seed(20250909) + local_igraph_options(print.id = FALSE) + expect_snapshot(hexagonal_lattice_impl( + dimvector = c(2, 2) + )) + expect_snapshot(hexagonal_lattice_impl( + dimvector = c(2, 2), + directed = TRUE, + mutual = TRUE + )) +}) + +test_that("hexagonal_lattice_impl errors", { + withr::local_seed(20250909) + local_igraph_options(print.id = FALSE) + expect_snapshot_igraph_error(hexagonal_lattice_impl( + dimvector = -1 + )) +}) + # 12. path_graph_impl test_that("path_graph_impl basic", { From 80fc3957874fbd97b7000e24ac0711fe697f4c7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kirill=20M=C3=BCller?= Date: Sat, 1 Nov 2025 12:11:19 +0100 Subject: [PATCH 07/12] Update R/make.R --- R/make.R | 1 - 1 file changed, 1 deletion(-) diff --git a/R/make.R b/R/make.R index 687a8197784..d9fef97dfda 100644 --- a/R/make.R +++ b/R/make.R @@ -2070,7 +2070,6 @@ lattice <- function(...) constructor_spec(make_lattice, ...) #' plot(g3) #' @cdocs igraph_hexagonal_lattice make_hex_lattice <- function(dims, directed = FALSE, mutual = FALSE) { - on.exit(.Call(R_igraph_finalizer)) res <- hexagonal_lattice_impl( dimvector = dims, directed = directed, From 617ba774bc6870db4824f8d272b11f56997ed105 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 1 Nov 2025 11:28:42 +0000 Subject: [PATCH 08/12] fix: merge main and update hex_lattice to use hexagonal_lattice_impl with correct test expectations Co-authored-by: krlmlr <1741643+krlmlr@users.noreply.github.com> --- man/make_circulant.Rd | 1 + man/make_full_multipartite.Rd | 1 + man/make_graph.Rd | 2 +- man/make_hex_lattice.Rd | 5 +- man/make_turan.Rd | 1 + src/cpp11.dd | 252 ---------------------------------- src/rinterface.dd | 108 --------------- 7 files changed, 8 insertions(+), 362 deletions(-) diff --git a/man/make_circulant.Rd b/man/make_circulant.Rd index f3d3afcb949..32b6376d3ec 100644 --- a/man/make_circulant.Rd +++ b/man/make_circulant.Rd @@ -51,6 +51,7 @@ Other deterministic constructors: \code{\link{make_full_graph}()}, \code{\link{make_full_multipartite}()}, \code{\link{make_graph}()}, +\code{\link{make_hex_lattice}()}, \code{\link{make_lattice}()}, \code{\link{make_ring}()}, \code{\link{make_star}()}, diff --git a/man/make_full_multipartite.Rd b/man/make_full_multipartite.Rd index e0cedcb7102..7fb27a21ac4 100644 --- a/man/make_full_multipartite.Rd +++ b/man/make_full_multipartite.Rd @@ -53,6 +53,7 @@ Other deterministic constructors: \code{\link{make_full_citation_graph}()}, \code{\link{make_full_graph}()}, \code{\link{make_graph}()}, +\code{\link{make_hex_lattice}()}, \code{\link{make_lattice}()}, \code{\link{make_ring}()}, \code{\link{make_star}()}, diff --git a/man/make_graph.Rd b/man/make_graph.Rd index c321b8edf51..49be839160b 100644 --- a/man/make_graph.Rd +++ b/man/make_graph.Rd @@ -248,8 +248,8 @@ Other deterministic constructors: \code{\link{make_empty_graph}()}, \code{\link{make_full_citation_graph}()}, \code{\link{make_full_graph}()}, -\code{\link{make_hex_lattice}()}, \code{\link{make_full_multipartite}()}, +\code{\link{make_hex_lattice}()}, \code{\link{make_lattice}()}, \code{\link{make_ring}()}, \code{\link{make_star}()}, diff --git a/man/make_hex_lattice.Rd b/man/make_hex_lattice.Rd index 08ad7d95035..2f4f7e70600 100644 --- a/man/make_hex_lattice.Rd +++ b/man/make_hex_lattice.Rd @@ -67,14 +67,17 @@ Other deterministic constructors: \code{\link{graph_from_literal}()}, \code{\link{make_}()}, \code{\link{make_chordal_ring}()}, +\code{\link{make_circulant}()}, \code{\link{make_empty_graph}()}, \code{\link{make_full_citation_graph}()}, \code{\link{make_full_graph}()}, +\code{\link{make_full_multipartite}()}, \code{\link{make_graph}()}, \code{\link{make_lattice}()}, \code{\link{make_ring}()}, \code{\link{make_star}()}, -\code{\link{make_tree}()} +\code{\link{make_tree}()}, +\code{\link{make_turan}()} } \concept{deterministic constructors} \section{Related documentation in the C library}{\href{https://igraph.org/c/html/latest/igraph-Generators.html#igraph_hexagonal_lattice}{\code{hexagonal_lattice()}}.} diff --git a/man/make_turan.Rd b/man/make_turan.Rd index 6431e0f76ba..921369d2ff8 100644 --- a/man/make_turan.Rd +++ b/man/make_turan.Rd @@ -53,6 +53,7 @@ Other deterministic constructors: \code{\link{make_full_graph}()}, \code{\link{make_full_multipartite}()}, \code{\link{make_graph}()}, +\code{\link{make_hex_lattice}()}, \code{\link{make_lattice}()}, \code{\link{make_ring}()}, \code{\link{make_star}()}, diff --git a/src/cpp11.dd b/src/cpp11.dd index de42af19ba0..9abbae1fcad 100644 --- a/src/cpp11.dd +++ b/src/cpp11.dd @@ -2,255 +2,3 @@ cpp11.o: \ cpp11.cpp \ igraph_types.hpp \ - /home/runner/work/_temp/Library/cpp11/include/cpp11.hpp \ - /home/runner/work/_temp/Library/cpp11/include/cpp11/R.hpp \ - /home/runner/work/_temp/Library/cpp11/include/cpp11/altrep.hpp \ - /home/runner/work/_temp/Library/cpp11/include/cpp11/as.hpp \ - /home/runner/work/_temp/Library/cpp11/include/cpp11/attribute_proxy.hpp \ - /home/runner/work/_temp/Library/cpp11/include/cpp11/data_frame.hpp \ - /home/runner/work/_temp/Library/cpp11/include/cpp11/declarations.hpp \ - /home/runner/work/_temp/Library/cpp11/include/cpp11/doubles.hpp \ - /home/runner/work/_temp/Library/cpp11/include/cpp11/environment.hpp \ - /home/runner/work/_temp/Library/cpp11/include/cpp11/external_pointer.hpp \ - /home/runner/work/_temp/Library/cpp11/include/cpp11/function.hpp \ - /home/runner/work/_temp/Library/cpp11/include/cpp11/integers.hpp \ - /home/runner/work/_temp/Library/cpp11/include/cpp11/list.hpp \ - /home/runner/work/_temp/Library/cpp11/include/cpp11/list_of.hpp \ - /home/runner/work/_temp/Library/cpp11/include/cpp11/logicals.hpp \ - /home/runner/work/_temp/Library/cpp11/include/cpp11/matrix.hpp \ - /home/runner/work/_temp/Library/cpp11/include/cpp11/named_arg.hpp \ - /home/runner/work/_temp/Library/cpp11/include/cpp11/protect.hpp \ - /home/runner/work/_temp/Library/cpp11/include/cpp11/r_bool.hpp \ - /home/runner/work/_temp/Library/cpp11/include/cpp11/r_string.hpp \ - /home/runner/work/_temp/Library/cpp11/include/cpp11/r_vector.hpp \ - /home/runner/work/_temp/Library/cpp11/include/cpp11/raws.hpp \ - /home/runner/work/_temp/Library/cpp11/include/cpp11/sexp.hpp \ - /home/runner/work/_temp/Library/cpp11/include/cpp11/strings.hpp \ - /opt/R/4.5.1/lib/R/include/R_ext/Arith.h \ - /opt/R/4.5.1/lib/R/include/R_ext/Boolean.h \ - /opt/R/4.5.1/lib/R/include/R_ext/Complex.h \ - /opt/R/4.5.1/lib/R/include/R_ext/Error.h \ - /opt/R/4.5.1/lib/R/include/R_ext/Memory.h \ - /opt/R/4.5.1/lib/R/include/R_ext/Print.h \ - /opt/R/4.5.1/lib/R/include/R_ext/Rdynload.h \ - /opt/R/4.5.1/lib/R/include/R_ext/Utils.h \ - /opt/R/4.5.1/lib/R/include/R_ext/Visibility.h \ - /opt/R/4.5.1/lib/R/include/R_ext/libextern.h \ - /opt/R/4.5.1/lib/R/include/Rconfig.h \ - /opt/R/4.5.1/lib/R/include/Rinternals.h \ - /opt/R/4.5.1/lib/R/include/Rversion.h \ - /usr/include/asm-generic/errno.h \ - /usr/include/c++/13/algorithm \ - /usr/include/c++/13/backward/auto_ptr.h \ - /usr/include/c++/13/backward/binders.h \ - /usr/include/c++/13/bits/algorithmfwd.h \ - /usr/include/c++/13/bits/align.h \ - /usr/include/c++/13/bits/alloc_traits.h \ - /usr/include/c++/13/bits/allocated_ptr.h \ - /usr/include/c++/13/bits/allocator.h \ - /usr/include/c++/13/bits/atomic_base.h \ - /usr/include/c++/13/bits/atomic_lockfree_defines.h \ - /usr/include/c++/13/bits/basic_ios.h \ - /usr/include/c++/13/bits/basic_ios.tcc \ - /usr/include/c++/13/bits/basic_string.h \ - /usr/include/c++/13/bits/basic_string.tcc \ - /usr/include/c++/13/bits/char_traits.h \ - /usr/include/c++/13/bits/charconv.h \ - /usr/include/c++/13/bits/concept_check.h \ - /usr/include/c++/13/bits/cpp_type_traits.h \ - /usr/include/c++/13/bits/cxxabi_forced.h \ - /usr/include/c++/13/bits/cxxabi_init_exception.h \ - /usr/include/c++/13/bits/exception.h \ - /usr/include/c++/13/bits/exception_defines.h \ - /usr/include/c++/13/bits/exception_ptr.h \ - /usr/include/c++/13/bits/functexcept.h \ - /usr/include/c++/13/bits/functional_hash.h \ - /usr/include/c++/13/bits/hash_bytes.h \ - /usr/include/c++/13/bits/locale_classes.h \ - /usr/include/c++/13/bits/locale_classes.tcc \ - /usr/include/c++/13/bits/locale_facets.h \ - /usr/include/c++/13/bits/locale_facets.tcc \ - /usr/include/c++/13/bits/localefwd.h \ - /usr/include/c++/13/bits/memory_resource.h \ - /usr/include/c++/13/bits/memoryfwd.h \ - /usr/include/c++/13/bits/move.h \ - /usr/include/c++/13/bits/nested_exception.h \ - /usr/include/c++/13/bits/new_allocator.h \ - /usr/include/c++/13/bits/ostream.tcc \ - /usr/include/c++/13/bits/ostream_insert.h \ - /usr/include/c++/13/bits/postypes.h \ - /usr/include/c++/13/bits/predefined_ops.h \ - /usr/include/c++/13/bits/ptr_traits.h \ - /usr/include/c++/13/bits/range_access.h \ - /usr/include/c++/13/bits/refwrap.h \ - /usr/include/c++/13/bits/requires_hosted.h \ - /usr/include/c++/13/bits/shared_ptr.h \ - /usr/include/c++/13/bits/shared_ptr_atomic.h \ - /usr/include/c++/13/bits/shared_ptr_base.h \ - /usr/include/c++/13/bits/specfun.h \ - /usr/include/c++/13/bits/std_abs.h \ - /usr/include/c++/13/bits/stl_algobase.h \ - /usr/include/c++/13/bits/stl_bvector.h \ - /usr/include/c++/13/bits/stl_construct.h \ - /usr/include/c++/13/bits/stl_function.h \ - /usr/include/c++/13/bits/stl_heap.h \ - /usr/include/c++/13/bits/stl_iterator.h \ - /usr/include/c++/13/bits/stl_iterator_base_funcs.h \ - /usr/include/c++/13/bits/stl_iterator_base_types.h \ - /usr/include/c++/13/bits/stl_pair.h \ - /usr/include/c++/13/bits/stl_raw_storage_iter.h \ - /usr/include/c++/13/bits/stl_vector.h \ - /usr/include/c++/13/bits/stream_iterator.h \ - /usr/include/c++/13/bits/streambuf.tcc \ - /usr/include/c++/13/bits/streambuf_iterator.h \ - /usr/include/c++/13/bits/string_view.tcc \ - /usr/include/c++/13/bits/uniform_int_dist.h \ - /usr/include/c++/13/bits/uses_allocator.h \ - /usr/include/c++/13/bits/uses_allocator_args.h \ - /usr/include/c++/13/bits/vector.tcc \ - /usr/include/c++/13/cctype \ - /usr/include/c++/13/clocale \ - /usr/include/c++/13/compare \ - /usr/include/c++/13/csetjmp \ - /usr/include/c++/13/cstdint \ - /usr/include/c++/13/cstdio \ - /usr/include/c++/13/cstring \ - /usr/include/c++/13/debug/assertions.h \ - /usr/include/c++/13/ext/aligned_buffer.h \ - /usr/include/c++/13/ext/alloc_traits.h \ - /usr/include/c++/13/ext/atomicity.h \ - /usr/include/c++/13/ext/concurrence.h \ - /usr/include/c++/13/ext/numeric_traits.h \ - /usr/include/c++/13/ext/string_conversions.h \ - /usr/include/c++/13/ext/type_traits.h \ - /usr/include/c++/13/initializer_list \ - /usr/include/c++/13/limits \ - /usr/include/c++/13/math.h \ - /usr/include/c++/13/memory \ - /usr/include/c++/13/ostream \ - /usr/include/c++/13/pstl/execution_defs.h \ - /usr/include/c++/13/pstl/glue_algorithm_defs.h \ - /usr/include/c++/13/pstl/glue_memory_defs.h \ - /usr/include/c++/13/pstl/pstl_config.h \ - /usr/include/c++/13/streambuf \ - /usr/include/c++/13/string \ - /usr/include/c++/13/system_error \ - /usr/include/c++/13/tr1/bessel_function.tcc \ - /usr/include/c++/13/tr1/beta_function.tcc \ - /usr/include/c++/13/tr1/ell_integral.tcc \ - /usr/include/c++/13/tr1/exp_integral.tcc \ - /usr/include/c++/13/tr1/hypergeometric.tcc \ - /usr/include/c++/13/tr1/legendre_function.tcc \ - /usr/include/c++/13/tr1/modified_bessel_func.tcc \ - /usr/include/c++/13/tr1/poly_hermite.tcc \ - /usr/include/c++/13/tr1/poly_laguerre.tcc \ - /usr/include/c++/13/tr1/riemann_zeta.tcc \ - /usr/include/c++/13/tr1/special_function_util.h \ - /usr/include/c++/13/utility \ - /usr/include/c++/13/vector \ - /usr/include/errno.h \ - /usr/include/features-time64.h \ - /usr/include/inttypes.h \ - /usr/include/limits.h \ - /usr/include/linux/errno.h \ - /usr/include/linux/limits.h \ - /usr/include/pthread.h \ - /usr/include/wchar.h \ - /usr/include/wctype.h \ - /usr/include/x86_64-linux-gnu/bits/atomic_wide_counter.h \ - /usr/include/x86_64-linux-gnu/bits/byteswap.h \ - /usr/include/x86_64-linux-gnu/bits/cpu-set.h \ - /usr/include/x86_64-linux-gnu/bits/endian.h \ - /usr/include/x86_64-linux-gnu/bits/endianness.h \ - /usr/include/x86_64-linux-gnu/bits/floatn-common.h \ - /usr/include/x86_64-linux-gnu/bits/floatn.h \ - /usr/include/x86_64-linux-gnu/bits/flt-eval-method.h \ - /usr/include/x86_64-linux-gnu/bits/fp-fast.h \ - /usr/include/x86_64-linux-gnu/bits/fp-logb.h \ - /usr/include/x86_64-linux-gnu/bits/iscanonical.h \ - /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \ - /usr/include/x86_64-linux-gnu/bits/libm-simd-decl-stubs.h \ - /usr/include/x86_64-linux-gnu/bits/local_lim.h \ - /usr/include/x86_64-linux-gnu/bits/locale.h \ - /usr/include/x86_64-linux-gnu/bits/long-double.h \ - /usr/include/x86_64-linux-gnu/bits/math-vector.h \ - /usr/include/x86_64-linux-gnu/bits/mathcalls-helper-functions.h \ - /usr/include/x86_64-linux-gnu/bits/mathcalls-narrow.h \ - /usr/include/x86_64-linux-gnu/bits/mathcalls.h \ - /usr/include/x86_64-linux-gnu/bits/posix2_lim.h \ - /usr/include/x86_64-linux-gnu/bits/pthread_stack_min-dynamic.h \ - /usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \ - /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \ - /usr/include/x86_64-linux-gnu/bits/sched.h \ - /usr/include/x86_64-linux-gnu/bits/select.h \ - /usr/include/x86_64-linux-gnu/bits/setjmp.h \ - /usr/include/x86_64-linux-gnu/bits/stdint-intn.h \ - /usr/include/x86_64-linux-gnu/bits/stdint-least.h \ - /usr/include/x86_64-linux-gnu/bits/stdint-uintn.h \ - /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \ - /usr/include/x86_64-linux-gnu/bits/stdlib-float.h \ - /usr/include/x86_64-linux-gnu/bits/struct_mutex.h \ - /usr/include/x86_64-linux-gnu/bits/struct_rwlock.h \ - /usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \ - /usr/include/x86_64-linux-gnu/bits/time.h \ - /usr/include/x86_64-linux-gnu/bits/time64.h \ - /usr/include/x86_64-linux-gnu/bits/timesize.h \ - /usr/include/x86_64-linux-gnu/bits/timex.h \ - /usr/include/x86_64-linux-gnu/bits/types.h \ - /usr/include/x86_64-linux-gnu/bits/types/FILE.h \ - /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \ - /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \ - /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \ - /usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \ - /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \ - /usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \ - /usr/include/x86_64-linux-gnu/bits/types/clock_t.h \ - /usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \ - /usr/include/x86_64-linux-gnu/bits/types/cookie_io_functions_t.h \ - /usr/include/x86_64-linux-gnu/bits/types/error_t.h \ - /usr/include/x86_64-linux-gnu/bits/types/locale_t.h \ - /usr/include/x86_64-linux-gnu/bits/types/mbstate_t.h \ - /usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \ - /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \ - /usr/include/x86_64-linux-gnu/bits/types/struct___jmp_buf_tag.h \ - /usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h \ - /usr/include/x86_64-linux-gnu/bits/types/struct_sched_param.h \ - /usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \ - /usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \ - /usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \ - /usr/include/x86_64-linux-gnu/bits/types/time_t.h \ - /usr/include/x86_64-linux-gnu/bits/types/timer_t.h \ - /usr/include/x86_64-linux-gnu/bits/typesizes.h \ - /usr/include/x86_64-linux-gnu/bits/uintn-identity.h \ - /usr/include/x86_64-linux-gnu/bits/uio_lim.h \ - /usr/include/x86_64-linux-gnu/bits/waitflags.h \ - /usr/include/x86_64-linux-gnu/bits/waitstatus.h \ - /usr/include/x86_64-linux-gnu/bits/wchar.h \ - /usr/include/x86_64-linux-gnu/bits/wordsize.h \ - /usr/include/x86_64-linux-gnu/bits/xopen_lim.h \ - /usr/include/x86_64-linux-gnu/c++/13/bits/atomic_word.h \ - /usr/include/x86_64-linux-gnu/c++/13/bits/c++allocator.h \ - /usr/include/x86_64-linux-gnu/c++/13/bits/c++config.h \ - /usr/include/x86_64-linux-gnu/c++/13/bits/c++locale.h \ - /usr/include/x86_64-linux-gnu/c++/13/bits/cpu_defines.h \ - /usr/include/x86_64-linux-gnu/c++/13/bits/ctype_base.h \ - /usr/include/x86_64-linux-gnu/c++/13/bits/ctype_inline.h \ - /usr/include/x86_64-linux-gnu/c++/13/bits/error_constants.h \ - /usr/include/x86_64-linux-gnu/c++/13/bits/gthr-default.h \ - /usr/include/x86_64-linux-gnu/c++/13/bits/gthr.h \ - /usr/include/x86_64-linux-gnu/c++/13/bits/os_defines.h \ - /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \ - /usr/include/x86_64-linux-gnu/gnu/stubs.h \ - /usr/include/x86_64-linux-gnu/sys/cdefs.h \ - /usr/include/x86_64-linux-gnu/sys/select.h \ - /usr/include/x86_64-linux-gnu/sys/single_threaded.h \ - /usr/include/x86_64-linux-gnu/sys/types.h \ - /usr/lib/gcc/x86_64-linux-gnu/13/include/limits.h \ - /usr/lib/gcc/x86_64-linux-gnu/13/include/stdarg.h \ - /usr/lib/gcc/x86_64-linux-gnu/13/include/stdbool.h \ - /usr/lib/gcc/x86_64-linux-gnu/13/include/stddef.h \ - /usr/lib/gcc/x86_64-linux-gnu/13/include/stdint.h \ - /usr/lib/gcc/x86_64-linux-gnu/13/include/syslimits.h \ - vendor/cigraph/include/igraph_decls.h \ - vendor/cigraph/include/igraph_types.h \ - vendor/igraph_config.h \ diff --git a/src/rinterface.dd b/src/rinterface.dd index 571daf68b19..4e60bfc2463 100644 --- a/src/rinterface.dd +++ b/src/rinterface.dd @@ -2,111 +2,3 @@ rinterface.o: \ rinterface.c \ rinterface.h \ - /opt/R/4.5.1/lib/R/include/R_ext/Arith.h \ - /opt/R/4.5.1/lib/R/include/R_ext/Boolean.h \ - /opt/R/4.5.1/lib/R/include/R_ext/Complex.h \ - /opt/R/4.5.1/lib/R/include/R_ext/Constants.h \ - /opt/R/4.5.1/lib/R/include/R_ext/Error.h \ - /opt/R/4.5.1/lib/R/include/R_ext/Memory.h \ - /opt/R/4.5.1/lib/R/include/R_ext/Print.h \ - /opt/R/4.5.1/lib/R/include/R_ext/RS.h \ - /opt/R/4.5.1/lib/R/include/R_ext/Random.h \ - /opt/R/4.5.1/lib/R/include/R_ext/Rdynload.h \ - /opt/R/4.5.1/lib/R/include/R_ext/Utils.h \ - /opt/R/4.5.1/lib/R/include/R_ext/libextern.h \ - /opt/R/4.5.1/lib/R/include/Rconfig.h \ - /opt/R/4.5.1/lib/R/include/Rdefines.h \ - /opt/R/4.5.1/lib/R/include/Rinternals.h \ - vendor/cigraph/include/igraph_adjlist.h \ - vendor/cigraph/include/igraph_arpack.h \ - vendor/cigraph/include/igraph_array.h \ - vendor/cigraph/include/igraph_array_pmt.h \ - vendor/cigraph/include/igraph_attributes.h \ - vendor/cigraph/include/igraph_attributes.h \ - vendor/cigraph/include/igraph_bipartite.h \ - vendor/cigraph/include/igraph_bitset.h \ - vendor/cigraph/include/igraph_bitset_list.h \ - vendor/cigraph/include/igraph_blas.h \ - vendor/cigraph/include/igraph_centrality.h \ - vendor/cigraph/include/igraph_cliques.h \ - vendor/cigraph/include/igraph_cocitation.h \ - vendor/cigraph/include/igraph_cohesive_blocks.h \ - vendor/cigraph/include/igraph_coloring.h \ - vendor/cigraph/include/igraph_community.h \ - vendor/cigraph/include/igraph_complex.h \ - vendor/cigraph/include/igraph_components.h \ - vendor/cigraph/include/igraph_constants.h \ - vendor/cigraph/include/igraph_constants.h \ - vendor/cigraph/include/igraph_constructors.h \ - vendor/cigraph/include/igraph_conversion.h \ - vendor/cigraph/include/igraph_cycles.h \ - vendor/cigraph/include/igraph_datatype.h \ - vendor/cigraph/include/igraph_datatype.h \ - vendor/cigraph/include/igraph_decls.h \ - vendor/cigraph/include/igraph_dqueue.h \ - vendor/cigraph/include/igraph_dqueue_pmt.h \ - vendor/cigraph/include/igraph_eigen.h \ - vendor/cigraph/include/igraph_embedding.h \ - vendor/cigraph/include/igraph_epidemics.h \ - vendor/cigraph/include/igraph_error.h \ - vendor/cigraph/include/igraph_error.h \ - vendor/cigraph/include/igraph_eulerian.h \ - vendor/cigraph/include/igraph_flow.h \ - vendor/cigraph/include/igraph_foreign.h \ - vendor/cigraph/include/igraph_games.h \ - vendor/cigraph/include/igraph_graph_list.h \ - vendor/cigraph/include/igraph_graphicality.h \ - vendor/cigraph/include/igraph_graphlets.h \ - vendor/cigraph/include/igraph_heap.h \ - vendor/cigraph/include/igraph_heap_pmt.h \ - vendor/cigraph/include/igraph_hrg.h \ - vendor/cigraph/include/igraph_interface.h \ - vendor/cigraph/include/igraph_interrupt.h \ - vendor/cigraph/include/igraph_iterators.h \ - vendor/cigraph/include/igraph_lapack.h \ - vendor/cigraph/include/igraph_layout.h \ - vendor/cigraph/include/igraph_lsap.h \ - vendor/cigraph/include/igraph_matching.h \ - vendor/cigraph/include/igraph_matrix.h \ - vendor/cigraph/include/igraph_matrix_list.h \ - vendor/cigraph/include/igraph_matrix_pmt.h \ - vendor/cigraph/include/igraph_microscopic_update.h \ - vendor/cigraph/include/igraph_mixing.h \ - vendor/cigraph/include/igraph_motifs.h \ - vendor/cigraph/include/igraph_neighborhood.h \ - vendor/cigraph/include/igraph_nongraph.h \ - vendor/cigraph/include/igraph_operators.h \ - vendor/cigraph/include/igraph_paths.h \ - vendor/cigraph/include/igraph_pmt.h \ - vendor/cigraph/include/igraph_pmt_off.h \ - vendor/cigraph/include/igraph_progress.h \ - vendor/cigraph/include/igraph_psumtree.h \ - vendor/cigraph/include/igraph_qsort.h \ - vendor/cigraph/include/igraph_random.h \ - vendor/cigraph/include/igraph_reachability.h \ - vendor/cigraph/include/igraph_scan.h \ - vendor/cigraph/include/igraph_separators.h \ - vendor/cigraph/include/igraph_sparsemat.h \ - vendor/cigraph/include/igraph_stack.h \ - vendor/cigraph/include/igraph_stack_pmt.h \ - vendor/cigraph/include/igraph_statusbar.h \ - vendor/cigraph/include/igraph_structural.h \ - vendor/cigraph/include/igraph_strvector.h \ - vendor/cigraph/include/igraph_strvector.h \ - vendor/cigraph/include/igraph_topology.h \ - vendor/cigraph/include/igraph_transitivity.h \ - vendor/cigraph/include/igraph_typed_list_pmt.h \ - vendor/cigraph/include/igraph_types.h \ - vendor/cigraph/include/igraph_types.h \ - vendor/cigraph/include/igraph_vector.h \ - vendor/cigraph/include/igraph_vector.h \ - vendor/cigraph/include/igraph_vector_list.h \ - vendor/cigraph/include/igraph_vector_pmt.h \ - vendor/cigraph/include/igraph_vector_ptr.h \ - vendor/cigraph/include/igraph_vector_type.h \ - vendor/cigraph/include/igraph_visitor.h \ - vendor/cigraph/src/graph/attributes.h \ - vendor/cigraph/src/graph/internal.h \ - vendor/igraph_config.h \ - vendor/igraph_export.h \ - vendor/igraph_version.h \ From acab512d41b99dcbba0ff9b5fe3af812e5a3ad07 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 1 Nov 2025 16:06:03 +0000 Subject: [PATCH 09/12] docs: clarify hexagonal vs triangular lattice distinction and update snapshots Co-authored-by: krlmlr <1741643+krlmlr@users.noreply.github.com> --- R/make.R | 9 ++++----- man/make_hex_lattice.Rd | 9 ++++----- tests/testthat/_snaps/aaa-auto.md | 2 +- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/R/make.R b/R/make.R index ab38add82d3..638d546676d 100644 --- a/R/make.R +++ b/R/make.R @@ -2032,11 +2032,10 @@ lattice <- function(...) constructor_spec(make_lattice, ...) #' #' `r lifecycle::badge("experimental")` #' -#' `make_hex_lattice()` creates a hexagonal lattice. In graph theory, this is -#' also sometimes referred to as a "triangular lattice" due to the triangular -#' faces formed by the edges. The name "hexagonal lattice" refers to the -#' hexagonal tiling pattern created when vertices are arranged in this structure, -#' and is more commonly used in crystallography and physics. +#' `make_hex_lattice()` creates a hexagonal lattice where each interior vertex +#' has degree 3. The hexagonal lattice and triangular lattice are different +#' structures; they are planar duals of each other. See `igraph_triangular_lattice()` +#' in the C library for the triangular lattice. #' #' @details #' A hexagonal lattice is a lattice structure where each interior vertex diff --git a/man/make_hex_lattice.Rd b/man/make_hex_lattice.Rd index 2f4f7e70600..6b5d53b507b 100644 --- a/man/make_hex_lattice.Rd +++ b/man/make_hex_lattice.Rd @@ -26,11 +26,10 @@ An igraph graph. \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} } \details{ -\code{make_hex_lattice()} creates a hexagonal lattice. In graph theory, this is -also sometimes referred to as a "triangular lattice" due to the triangular -faces formed by the edges. The name "hexagonal lattice" refers to the -hexagonal tiling pattern created when vertices are arranged in this structure, -and is more commonly used in crystallography and physics. +\code{make_hex_lattice()} creates a hexagonal lattice where each interior vertex +has degree 3. The hexagonal lattice and triangular lattice are different +structures; they are planar duals of each other. See \code{igraph_triangular_lattice()} +in the C library for the triangular lattice. A hexagonal lattice is a lattice structure where each interior vertex (not on the boundary) has degree 3. The function supports creating lattices diff --git a/tests/testthat/_snaps/aaa-auto.md b/tests/testthat/_snaps/aaa-auto.md index a6ccb5fe098..b09357c6b0f 100644 --- a/tests/testthat/_snaps/aaa-auto.md +++ b/tests/testthat/_snaps/aaa-auto.md @@ -261,7 +261,7 @@ # hexagonal_lattice_impl errors Code - x + hexagonal_lattice_impl(dimvector = -1) Condition Error in `hexagonal_lattice_impl()`: ! At vendor/cigraph/src/constructors/lattices.c:xx : Invalid dimension vector. Invalid value From 77ec3fc4cb4837afaa7d1b15b552c212a38cac85 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 1 Nov 2025 19:14:33 +0000 Subject: [PATCH 10/12] refactor: use set_graph_attr() for attributes in make_hex_lattice() per updated guidelines Co-authored-by: krlmlr <1741643+krlmlr@users.noreply.github.com> --- R/make.R | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/R/make.R b/R/make.R index 638d546676d..155a1aac10a 100644 --- a/R/make.R +++ b/R/make.R @@ -2075,18 +2075,19 @@ lattice <- function(...) constructor_spec(make_lattice, ...) #' plot(g3) #' @cdocs igraph_hexagonal_lattice make_hex_lattice <- function(dims, directed = FALSE, mutual = FALSE) { - res <- hexagonal_lattice_impl( + graph <- hexagonal_lattice_impl( dimvector = dims, directed = directed, mutual = mutual ) + if (igraph_opt("add.params")) { - res$name <- "Hexagonal lattice" - res$dims <- dims - res$directed <- directed - res$mutual <- mutual + graph <- set_graph_attr(graph, "name", "Hexagonal lattice") + graph <- set_graph_attr(graph, "dims", dims) + graph <- set_graph_attr(graph, "directed", directed) + graph <- set_graph_attr(graph, "mutual", mutual) } - res + graph } #' @rdname make_hex_lattice From 7f3318821361c4be96ba6c8deb5d4cbd1998f433 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 1 Nov 2025 19:57:43 +0000 Subject: [PATCH 11/12] refactor: use explicit args and ellipsis in make_hex_lattice() and hex_lattice() Co-authored-by: krlmlr <1741643+krlmlr@users.noreply.github.com> --- R/make.R | 10 +++++++--- man/make_hex_lattice.Rd | 8 ++++---- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/R/make.R b/R/make.R index 155a1aac10a..e7f567a49d8 100644 --- a/R/make.R +++ b/R/make.R @@ -2054,6 +2054,7 @@ lattice <- function(...) constructor_spec(make_lattice, ...) #' } #' #' @param dims Integer vector, defines the shape of the lattice. See details below. +#' @param ... These dots are for future extensions and must be empty. #' @param directed Logical scalar, whether to create a directed graph. #' @param mutual Logical scalar, if the graph is directed this parameter #' controls whether edges are mutual (bidirectional). @@ -2074,7 +2075,9 @@ lattice <- function(...) constructor_spec(make_lattice, ...) #' g3 <- make_hex_lattice(c(3, 3, 3)) #' plot(g3) #' @cdocs igraph_hexagonal_lattice -make_hex_lattice <- function(dims, directed = FALSE, mutual = FALSE) { +make_hex_lattice <- function(dims, ..., directed = FALSE, mutual = FALSE) { + check_dots_empty() + graph <- hexagonal_lattice_impl( dimvector = dims, directed = directed, @@ -2091,9 +2094,10 @@ make_hex_lattice <- function(dims, directed = FALSE, mutual = FALSE) { } #' @rdname make_hex_lattice -#' @param ... Passed to `make_hex_lattice()`. #' @export -hex_lattice <- function(...) constructor_spec(make_hex_lattice, ...) +hex_lattice <- function(dims, ..., directed = FALSE, mutual = FALSE) { + constructor_spec(make_hex_lattice, dims = dims, directed = directed, mutual = mutual) +} ## ----------------------------------------------------------------- diff --git a/man/make_hex_lattice.Rd b/man/make_hex_lattice.Rd index 6b5d53b507b..729d4fe02ec 100644 --- a/man/make_hex_lattice.Rd +++ b/man/make_hex_lattice.Rd @@ -5,19 +5,19 @@ \alias{hex_lattice} \title{Create a hexagonal lattice graph} \usage{ -make_hex_lattice(dims, directed = FALSE, mutual = FALSE) +make_hex_lattice(dims, ..., directed = FALSE, mutual = FALSE) -hex_lattice(...) +hex_lattice(dims, ..., directed = FALSE, mutual = FALSE) } \arguments{ \item{dims}{Integer vector, defines the shape of the lattice. See details below.} +\item{...}{These dots are for future extensions and must be empty.} + \item{directed}{Logical scalar, whether to create a directed graph.} \item{mutual}{Logical scalar, if the graph is directed this parameter controls whether edges are mutual (bidirectional).} - -\item{...}{Passed to \code{make_hex_lattice()}.} } \value{ An igraph graph. From a5e6b2fd823a2b0119bf16ea841f76b0f9e27e31 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 1 Nov 2025 20:18:33 +0000 Subject: [PATCH 12/12] refactor: add check_dots_empty() to hex_lattice(), specify GATTR, use dimvector for attr name Co-authored-by: krlmlr <1741643+krlmlr@users.noreply.github.com> --- R/make.R | 3 ++- tools/stimulus/functions-R.yaml | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/R/make.R b/R/make.R index e7f567a49d8..78e26c6f29b 100644 --- a/R/make.R +++ b/R/make.R @@ -2086,7 +2086,7 @@ make_hex_lattice <- function(dims, ..., directed = FALSE, mutual = FALSE) { if (igraph_opt("add.params")) { graph <- set_graph_attr(graph, "name", "Hexagonal lattice") - graph <- set_graph_attr(graph, "dims", dims) + graph <- set_graph_attr(graph, "dimvector", dims) graph <- set_graph_attr(graph, "directed", directed) graph <- set_graph_attr(graph, "mutual", mutual) } @@ -2096,6 +2096,7 @@ make_hex_lattice <- function(dims, ..., directed = FALSE, mutual = FALSE) { #' @rdname make_hex_lattice #' @export hex_lattice <- function(dims, ..., directed = FALSE, mutual = FALSE) { + check_dots_empty() constructor_spec(make_hex_lattice, dims = dims, directed = directed, mutual = mutual) } diff --git a/tools/stimulus/functions-R.yaml b/tools/stimulus/functions-R.yaml index 7470eaf8f5d..02811c97b8e 100644 --- a/tools/stimulus/functions-R.yaml +++ b/tools/stimulus/functions-R.yaml @@ -131,6 +131,12 @@ igraph_turan: name: Turan graph GATTR-PARAM: n, r +igraph_hexagonal_lattice: + R: + GATTR: + name: Hexagonal lattice + GATTR-PARAM: dimvector, directed, mutual + # TODO: temporarily disabled igraph_weighted_sparsemat: IGNORE: RR, RC