## -----------------------------------------------------------------------------
library(gpindex)

p2 <- price6[[2]]
p1 <- price6[[1]]
q2 <- quantity6[[2]]
q1 <- quantity6[[1]]

rel <- p2 / p1

s1 <- scale_weights(p1 * q1)
s2 <- scale_weights(p2 * q2)

quadratic_mean <- generalized_mean(2)
quadratic_decomposition <- transmute_weights(2, 1)

v <- quadratic_decomposition(rel, s1)

all.equal(
  quadratic_mean(rel, s1),
  arithmetic_mean(rel, v)
)


## -----------------------------------------------------------------------------
(v - s1)[order(rel)]


## -----------------------------------------------------------------------------
all.equal(
  transmute_weights(1, 0)(rel, v),
  transmute_weights(2, 0)(rel, s1)
)


## -----------------------------------------------------------------------------
v1 <- nested_transmute(0, c(1, -1), 1)(rel, s1, s2)

all.equal(fisher_mean(rel, s1, s2), arithmetic_mean(rel, v1))

all.equal(
  v1,
  quadratic_decomposition(rel, nested_transmute(0, c(1, -1), 2)(rel, s1, s2))
)


## -----------------------------------------------------------------------------
v2 <- nested_transmute2(0, c(1, -1), 1)(rel, s1, s2)

all.equal(fisher_mean(rel, s1, s2), arithmetic_mean(rel, v2))

all.equal(
  v2,
  quadratic_decomposition(rel, nested_transmute2(0, c(1, -1), 2)(rel, s1, s2))
)


## -----------------------------------------------------------------------------
summary(v1 - v2)


## -----------------------------------------------------------------------------
group <- rep(c("a", "b"), each = 3)

s1_by_group <- split(s1, group)
rel_by_group <- split(rel, group)

index_a <- quadratic_mean(rel_by_group$a, s1_by_group$a)
index_b <- geometric_mean(rel_by_group$b)

quadratic_mean(c(index_a, index_b), sapply(s1_by_group, sum))

decomp_a <- quadratic_decomposition(rel_by_group$a, s1_by_group$a)
decomp_b <- transmute_weights(0, 1)(rel_by_group$b)

v <- Map(
  `*`,
  quadratic_decomposition(c(index_a, index_b), sapply(s1_by_group, sum)),
  list(decomp_a, decomp_b)
) |>
  unlist()

arithmetic_mean(rel, v)


## -----------------------------------------------------------------------------
V <- sum(p2 * q2) / sum(p1 * q1)

v <- nested_transmute2(0, c(1, -1), -1)(rel, s1, s2)

all.equal(
  arithmetic_mean(V / rel, v),
  fisher_mean(q2 / q1, s1, s2)
)

V / rel * v


## -----------------------------------------------------------------------------
# Arithmetic hybrid index
all.equal(
  arithmetic_mean(p2 / p1, p2 * q1),
  contraharmonic_mean(p2 / p1, p1 * q1)
)

# Palgrave index
all.equal(
  arithmetic_mean(p2 / p1, p2 * q2),
  contraharmonic_mean(p2 / p1, p1 * q2)
)