An example from the Linear Models for the Prediction of Animal Breeding Values, 3rd Edition ( Example 4.3 p67)

The matrix notation of the models is:
y = Xb + Za + Wc + e
where c is the common environment effect and W relates the records to the common environment effects.

Start by installing or loading the MASS packages if they are already installed.

if (!("MASS" %in% installed.packages())){ install.packages('MASS', dependencies = TRUE)
}
require(MASS)

Two functions will be required;
(i) To create design matrices (desgn)
(ii) To create the inverse of the Numerator Relationship Matrix(ainv)

Function (desgn)

desgn <- function(v)
  { 
  if (is.numeric(v)) { 
     va = v 
     mrow = length(va) 
     mcol = max(va) 
  } 
  if (is.character(v)) 
    { vf = factor(v) # save the index value
  va = as.numeric(vf) 
  mrow = length(va) 
  mcol = length(levels(vf))
  }

  X = matrix(data = c(0), nrow = mrow, ncol = mcol) 
  for (i in 1:mrow) { 
    ic = va[i] 
    X[i, ic] = 1 } 
  return(X) 
 }

Function(ainv)

ainv = function(ped) {
  n = nrow(ped)
  Ainv = matrix(c(0), nrow = n, ncol = n)
  
  for (i in 1:n) {
    animal = ped[i, 1]
    sire = ped[i, 2]
    dam = ped[i, 3]
    
    if (sire == 0 & dam == 0) {
      # both parents unknown
      alpha = 1
      Ainv[animal, animal] = alpha + Ainv[animal, animal]
    } else if (sire != 0 & dam == 0) {
      # sire known
      alpha = 4/3
      Ainv[animal, animal] = alpha + Ainv[animal, animal]
      Ainv[animal, sire] = -alpha/2 + Ainv[animal, sire]
      Ainv[sire, animal] = -alpha/2 + Ainv[sire, animal]
      Ainv[sire, sire] = alpha/4 + Ainv[sire, sire]
    } else if (sire == 0 & dam != 0) {
      # dam known
      alpha = 4/3
      Ainv[animal, animal] = alpha + Ainv[animal, animal]
      Ainv[animal, dam] = -alpha/2 + Ainv[animal, dam]
      Ainv[dam, animal] = -alpha/2 + Ainv[dam, animal]
      Ainv[dam, dam] = alpha/4 + Ainv[dam, dam]
    } else {
      # both parents known
      alpha = 2
      Ainv[animal, animal] = alpha + Ainv[animal, animal]
      Ainv[animal, sire] = -alpha/2 + Ainv[animal, sire]
      Ainv[sire, animal] = -alpha/2 + Ainv[sire, animal]
      Ainv[animal, dam] = -alpha/2 + Ainv[animal, dam]
      Ainv[dam, animal] = -alpha/2 + Ainv[dam, animal]
      Ainv[sire, sire] = alpha/4 + Ainv[sire, sire]
      Ainv[sire, dam] = alpha/4 + Ainv[sire, dam]
      Ainv[dam, sire] = alpha/4 + Ainv[dam, sire]
      Ainv[dam, dam] = alpha/4 + Ainv[dam, dam]
    }
  }
  return(Ainv)
}

Set the working directory

setwd("F:/R/RMME")

Print working directory

getwd()
[1] "F:/R/RMME"

The next step is to load the pedgree and data files. Read the pedigree file and sort by the animal column as follows;

ped <- read.csv("F:/R/RMME/ped.txt", sep="")
ped <- ped[order(ped[,1]),]

Read the data file

data <- read.csv("F:/R/RMME/data.txt", sep="")

The variance components are given below:

sigma_2_a = 20
sigma_2_e = 65
sigma_2_c = 15
sigma_2_y = 100
alpha_1   = sigma_2_e/sigma_2_a
alpha_2   = sigma_2_e/sigma_2_c
alpha_1
[1] 3.25
alpha_2
[1] 4.333333

Formulation fo the design matrices
- design matrix for the sex effect

X = desgn(data[,4])
X
      [,1] [,2]
 [1,]    1    0
 [2,]    0    1
 [3,]    0    1
 [4,]    0    1
 [5,]    1    0
 [6,]    0    1
 [7,]    0    1
 [8,]    1    0
 [9,]    0    1
[10,]    1    0
t(X)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    0    0    0    1    0    0    1    0     1
[2,]    0    1    1    1    0    1    1    0    1     0

The number of levels for the sex effect will be:

no_levels_sex = ncol(X)
no_levels_sex
[1] 2
Z = desgn(data[,1])
Z
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15]
 [1,]    0    0    0    0    0    1    0    0    0     0     0     0     0     0     0
 [2,]    0    0    0    0    0    0    1    0    0     0     0     0     0     0     0
 [3,]    0    0    0    0    0    0    0    1    0     0     0     0     0     0     0
 [4,]    0    0    0    0    0    0    0    0    1     0     0     0     0     0     0
 [5,]    0    0    0    0    0    0    0    0    0     1     0     0     0     0     0
 [6,]    0    0    0    0    0    0    0    0    0     0     1     0     0     0     0
 [7,]    0    0    0    0    0    0    0    0    0     0     0     1     0     0     0
 [8,]    0    0    0    0    0    0    0    0    0     0     0     0     1     0     0
 [9,]    0    0    0    0    0    0    0    0    0     0     0     0     0     1     0
[10,]    0    0    0    0    0    0    0    0    0     0     0     0     0     0     1

The number of animals is:

no_animals = ncol(Z)
no_animals
[1] 15
W = desgn(data[,3])[,unique(data[,3])]
W
      [,1] [,2] [,3]
 [1,]    1    0    0
 [2,]    1    0    0
 [3,]    1    0    0
 [4,]    0    1    0
 [5,]    0    1    0
 [6,]    0    1    0
 [7,]    0    1    0
 [8,]    0    0    1
 [9,]    0    0    1
[10,]    0    0    1

The number of animals (levels) will be:

no_animals_ce = ncol(W)
no_animals_ce
[1] 3

The matrix of observations(y) is given by:

y = data[,5]
y
 [1]  90  70  65  98 106  60  80 100  85  68

The inverse of the numerator relationship matrix is obtained from the function ainv as:

A = ainv(ped)
A
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15]
 [1,]  4.0  1.5    0    0  1.5   -1   -1   -1    0     0     0     0    -1    -1    -1
 [2,]  1.5  2.5    0    0  0.0   -1   -1   -1    0     0     0     0     0     0     0
 [3,]  0.0  0.0    3    2  0.0    0    0    0   -1    -1    -1    -1     0     0     0
 [4,]  0.0  0.0    2    3  0.0    0    0    0   -1    -1    -1    -1     0     0     0
 [5,]  1.5  0.0    0    0  2.5    0    0    0    0     0     0     0    -1    -1    -1
 [6,] -1.0 -1.0    0    0  0.0    2    0    0    0     0     0     0     0     0     0
 [7,] -1.0 -1.0    0    0  0.0    0    2    0    0     0     0     0     0     0     0
 [8,] -1.0 -1.0    0    0  0.0    0    0    2    0     0     0     0     0     0     0
 [9,]  0.0  0.0   -1   -1  0.0    0    0    0    2     0     0     0     0     0     0
[10,]  0.0  0.0   -1   -1  0.0    0    0    0    0     2     0     0     0     0     0
[11,]  0.0  0.0   -1   -1  0.0    0    0    0    0     0     2     0     0     0     0
[12,]  0.0  0.0   -1   -1  0.0    0    0    0    0     0     0     2     0     0     0
[13,] -1.0  0.0    0    0 -1.0    0    0    0    0     0     0     0     2     0     0
[14,] -1.0  0.0    0    0 -1.0    0    0    0    0     0     0     0     0     2     0
[15,] -1.0  0.0    0    0 -1.0    0    0    0    0     0     0     0     0     0     2

Construction of the Left Hand Side (LHS)

LHS = rbind(
  cbind(t(X) %*% X, t(X) %*% Z,  t(X) %*% W), 
  cbind(t(Z) %*% X, t(Z) %*% Z + A * alpha_1, t(Z) %*% W),
  cbind(t(W) %*% X, t(W) %*% Z, t(W) %*% W + diag(no_animals_ce) * alpha_2))
LHS
      [,1] [,2]   [,3]   [,4]  [,5]  [,6]   [,7]  [,8]  [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17]    [,18]    [,19]    [,20]
 [1,]    4    0  0.000  0.000  0.00  0.00  0.000  1.00  0.00  0.00  0.00  1.00  0.00  0.00  1.00  0.00  1.00 1.000000 1.000000 2.000000
 [2,]    0    6  0.000  0.000  0.00  0.00  0.000  0.00  1.00  1.00  1.00  0.00  1.00  1.00  0.00  1.00  0.00 2.000000 3.000000 1.000000
 [3,]    0    0 13.000  4.875  0.00  0.00  4.875 -3.25 -3.25 -3.25  0.00  0.00  0.00  0.00 -3.25 -3.25 -3.25 0.000000 0.000000 0.000000
 [4,]    0    0  4.875  8.125  0.00  0.00  0.000 -3.25 -3.25 -3.25  0.00  0.00  0.00  0.00  0.00  0.00  0.00 0.000000 0.000000 0.000000
 [5,]    0    0  0.000  0.000  9.75  6.50  0.000  0.00  0.00  0.00 -3.25 -3.25 -3.25 -3.25  0.00  0.00  0.00 0.000000 0.000000 0.000000
 [6,]    0    0  0.000  0.000  6.50  9.75  0.000  0.00  0.00  0.00 -3.25 -3.25 -3.25 -3.25  0.00  0.00  0.00 0.000000 0.000000 0.000000
 [7,]    0    0  4.875  0.000  0.00  0.00  8.125  0.00  0.00  0.00  0.00  0.00  0.00  0.00 -3.25 -3.25 -3.25 0.000000 0.000000 0.000000
 [8,]    1    0 -3.250 -3.250  0.00  0.00  0.000  7.50  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00 1.000000 0.000000 0.000000
 [9,]    0    1 -3.250 -3.250  0.00  0.00  0.000  0.00  7.50  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00 1.000000 0.000000 0.000000
[10,]    0    1 -3.250 -3.250  0.00  0.00  0.000  0.00  0.00  7.50  0.00  0.00  0.00  0.00  0.00  0.00  0.00 1.000000 0.000000 0.000000
[11,]    0    1  0.000  0.000 -3.25 -3.25  0.000  0.00  0.00  0.00  7.50  0.00  0.00  0.00  0.00  0.00  0.00 0.000000 1.000000 0.000000
[12,]    1    0  0.000  0.000 -3.25 -3.25  0.000  0.00  0.00  0.00  0.00  7.50  0.00  0.00  0.00  0.00  0.00 0.000000 1.000000 0.000000
[13,]    0    1  0.000  0.000 -3.25 -3.25  0.000  0.00  0.00  0.00  0.00  0.00  7.50  0.00  0.00  0.00  0.00 0.000000 1.000000 0.000000
[14,]    0    1  0.000  0.000 -3.25 -3.25  0.000  0.00  0.00  0.00  0.00  0.00  0.00  7.50  0.00  0.00  0.00 0.000000 1.000000 0.000000
[15,]    1    0 -3.250  0.000  0.00  0.00 -3.250  0.00  0.00  0.00  0.00  0.00  0.00  0.00  7.50  0.00  0.00 0.000000 0.000000 1.000000
[16,]    0    1 -3.250  0.000  0.00  0.00 -3.250  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  7.50  0.00 0.000000 0.000000 1.000000
[17,]    1    0 -3.250  0.000  0.00  0.00 -3.250  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00  7.50 0.000000 0.000000 1.000000
[18,]    1    2  0.000  0.000  0.00  0.00  0.000  1.00  1.00  1.00  0.00  0.00  0.00  0.00  0.00  0.00  0.00 7.333333 0.000000 0.000000
[19,]    1    3  0.000  0.000  0.00  0.00  0.000  0.00  0.00  0.00  1.00  1.00  1.00  1.00  0.00  0.00  0.00 0.000000 8.333333 0.000000
[20,]    2    1  0.000  0.000  0.00  0.00  0.000  0.00  0.00  0.00  0.00  0.00  0.00  0.00  1.00  1.00  1.00 0.000000 0.000000 7.333333

RHS construction

RHS = rbind(t(X) %*% y, t(Z) %*% y, t(W) %*% y)
RHS
      [,1]
 [1,]  364
 [2,]  458
 [3,]    0
 [4,]    0
 [5,]    0
 [6,]    0
 [7,]    0
 [8,]   90
 [9,]   70
[10,]   65
[11,]   98
[12,]  106
[13,]   60
[14,]   80
[15,]  100
[16,]   85
[17,]   68
[18,]  225
[19,]  344
[20,]  253

Solutions to the Mixed Model Equations

gi_LHS = ginv(LHS)
gi_LHS
             [,1]        [,2]         [,3]         [,4]         [,5]         [,6]         [,7]        [,8]         [,9]        [,10]       [,11]       [,12]
 [1,]  0.44292085  0.13589744 -0.105239688 -0.041248606 -0.048606466 -0.048606466 -0.063991081 -0.11428465 -0.073348198 -0.073348198 -0.05052397 -0.09146042
 [2,]  0.13589744  0.34358974 -0.087179487 -0.051282051 -0.066666667 -0.066666667 -0.035897436 -0.06786325 -0.095555556 -0.095555556 -0.09025641 -0.06256410
 [3,] -0.10523969 -0.08717949  0.286733556 -0.011148272  0.020958751  0.020958751 -0.009810479  0.13568190  0.133273876  0.133273876  0.02559643  0.02800446
 [4,] -0.04124861 -0.05128205 -0.011148272  0.285395764  0.011148272  0.011148272  0.011148272  0.12879970  0.130137495  0.130137495  0.01426979  0.01293200
 [5,] -0.04860647 -0.06666667  0.020958751  0.011148272  0.286733556 -0.020958751  0.009810479  0.01816425  0.020572278  0.020572278  0.12824972  0.12584169
 [6,] -0.04860647 -0.06666667  0.020958751  0.011148272 -0.020958751  0.286733556  0.009810479  0.01816425  0.020572278  0.020572278  0.12824972  0.12584169
 [7,] -0.06399108 -0.03589744 -0.009810479  0.011148272  0.009810479  0.009810479  0.286733556  0.00688220  0.003136381  0.003136381  0.01132664  0.01507246
 [8,] -0.11428465 -0.06786325  0.135681903  0.128799703  0.018164251  0.018164251  0.006882200  0.26818927  0.128666419  0.128666419  0.02115793  0.02734745
 [9,] -0.07334820 -0.09555556  0.133273876  0.130137495  0.020572278  0.020572278  0.003136381  0.12866642  0.264960733  0.131627400  0.02645559  0.02349461
[10,] -0.07334820 -0.09555556  0.133273876  0.130137495  0.020572278  0.020572278  0.003136381  0.12866642  0.131627400  0.264960733  0.02645559  0.02349461
[11,] -0.05052397 -0.09025641  0.025596433  0.014269788  0.128249721  0.128249721  0.011326644  0.02115793  0.026455593  0.026455593  0.26163657  0.12300557
[12,] -0.09146042 -0.06256410  0.028004459  0.012931996  0.125841695  0.125841695  0.015072464  0.02734745  0.023494612  0.023494612  0.12300557  0.26019175
[13,] -0.05052397 -0.09025641  0.025596433  0.014269788  0.128249721  0.128249721  0.011326644  0.02115793  0.026455593  0.026455593  0.12830323  0.12300557
[14,] -0.05052397 -0.09025641  0.025596433  0.014269788  0.128249721  0.128249721  0.011326644  0.02115793  0.026455593  0.026455593  0.12830323  0.12300557
[15,] -0.11959123 -0.06427350  0.135994054  0.003270160  0.017852100  0.017852100  0.132723894  0.07563929  0.068263595  0.068263595  0.02047120  0.02784690
[16,] -0.07865478 -0.09196581  0.133586027  0.004607952  0.020260126  0.020260126  0.128978075  0.06944977  0.071224576  0.071224576  0.02576886  0.02399405
[17,] -0.11959123 -0.06427350  0.135994054  0.003270160  0.017852100  0.017852100  0.132723894  0.07563929  0.068263595  0.068263595  0.02047120  0.02784690
[18,] -0.06187291 -0.07692308 -0.016722408 -0.033444816  0.016722408  0.016722408  0.016722408 -0.03756968 -0.035562988 -0.035562988  0.02140468  0.01939799
[19,] -0.07290970 -0.10000000  0.031438127  0.016722408 -0.031438127 -0.031438127  0.014715719  0.02724638  0.030858417  0.030858417 -0.03839465 -0.04200669
[20,] -0.09598662 -0.05384615 -0.014715719  0.016722408  0.014715719  0.014715719 -0.031438127  0.01032330  0.004704571  0.004704571  0.01698997  0.02260870
            [,13]       [,14]       [,15]        [,16]       [,17]        [,18]       [,19]        [,20]
 [1,] -0.05052397 -0.05052397 -0.11959123 -0.078654775 -0.11959123 -0.061872910 -0.07290970 -0.095986622
 [2,] -0.09025641 -0.09025641 -0.06427350 -0.091965812 -0.06427350 -0.076923077 -0.10000000 -0.053846154
 [3,]  0.02559643  0.02559643  0.13599405  0.133586027  0.13599405 -0.016722408  0.03143813 -0.014715719
 [4,]  0.01426979  0.01426979  0.00327016  0.004607952  0.00327016 -0.033444816  0.01672241  0.016722408
 [5,]  0.12824972  0.12824972  0.01785210  0.020260126  0.01785210  0.016722408 -0.03143813  0.014715719
 [6,]  0.12824972  0.12824972  0.01785210  0.020260126  0.01785210  0.016722408 -0.03143813  0.014715719
 [7,]  0.01132664  0.01132664  0.13272389  0.128978075  0.13272389  0.016722408  0.01471572 -0.031438127
 [8,]  0.02115793  0.02115793  0.07563929  0.069449771  0.07563929 -0.037569677  0.02724638  0.010323300
 [9,]  0.02645559  0.02645559  0.06826359  0.071224576  0.06826359 -0.035562988  0.03085842  0.004704571
[10,]  0.02645559  0.02645559  0.06826359  0.071224576  0.06826359 -0.035562988  0.03085842  0.004704571
[11,]  0.12830323  0.12830323  0.02047120  0.025768859  0.02047120  0.021404682 -0.03839465  0.016989967
[12,]  0.12300557  0.12300557  0.02784690  0.023994054  0.02784690  0.019397993 -0.04200669  0.022608696
[13,]  0.26163657  0.12830323  0.02047120  0.025768859  0.02047120  0.021404682 -0.03839465  0.016989967
[14,]  0.12830323  0.26163657  0.02047120  0.025768859  0.02047120  0.021404682 -0.03839465  0.016989967
[15,]  0.02047120  0.02047120  0.26994773  0.129238697  0.13661439  0.004905240  0.02677815 -0.031683389
[16,]  0.02576886  0.02576886  0.12923870  0.264346835  0.12923870  0.006911929  0.03039019 -0.037302118
[17,]  0.02047120  0.02047120  0.13661439  0.129238697  0.26994773  0.004905240  0.02677815 -0.031683389
[18,]  0.02140468  0.02140468  0.00490524  0.006911929  0.00490524  0.180602007  0.02508361  0.025083612
[19,] -0.03839465 -0.03839465  0.02677815  0.030390190  0.02677815  0.025083612  0.18361204  0.022073579
[20,]  0.01698997  0.01698997 -0.03168339 -0.037302118 -0.03168339  0.025083612  0.02207358  0.183612040

solution

sol = gi_LHS %*% RHS
sol
            [,1]
 [1,] 91.4931401
 [2,] 75.7644444
 [3,] -1.4407729
 [4,] -1.1748792
 [5,]  1.4407729
 [6,]  1.4407729
 [7,] -0.2658937
 [8,] -1.0975588
 [9,] -1.6670660
[10,] -2.3337327
[11,]  3.9252560
[12,]  2.8947633
[13,] -1.1414106
[14,]  1.5252560
[15,]  0.4478712
[16,]  0.5450306
[17,] -3.8187955
[18,] -1.7623188
[19,]  2.1611594
[20,] -0.3988406
round(sol,3)
        [,1]
 [1,] 91.493
 [2,] 75.764
 [3,] -1.441
 [4,] -1.175
 [5,]  1.441
 [6,]  1.441
 [7,] -0.266
 [8,] -1.098
 [9,] -1.667
[10,] -2.334
[11,]  3.925
[12,]  2.895
[13,] -1.141
[14,]  1.525
[15,]  0.448
[16,]  0.545
[17,] -3.819
[18,] -1.762
[19,]  2.161
[20,] -0.399
sol_sex = sol[1:no_levels_sex]
sol_sex
[1] 91.49314 75.76444
sol_animal = sol[(no_levels_sex+1):(no_levels_sex+no_animals)]
sol_animal
 [1] -1.4407729 -1.1748792  1.4407729  1.4407729 -0.2658937 -1.0975588 -1.6670660 -2.3337327  3.9252560  2.8947633 -1.1414106  1.5252560  0.4478712  0.5450306
[15] -3.8187955
sol_ce = sol[(no_levels_sex+no_animals+1):(no_levels_sex+no_animals+no_animals_ce)]
sol_ce
[1] -1.7623188  2.1611594 -0.3988406

Reliability(r2), Accuracy(r), Standard Error of Prediction(SEP)

The diagonal elements of the generalized inverse of LHS for animal equation (D)

D = diag(gi_LHS[(no_levels_sex + 1) : (no_levels_sex + no_animals), (no_levels_sex + 1) : (no_levels_sex + no_animals)]) 
D
 [1] 0.2867336 0.2853958 0.2867336 0.2867336 0.2867336 0.2681893 0.2649607 0.2649607 0.2616366 0.2601918 0.2616366 0.2616366 0.2699477 0.2643468 0.2699477

The Reliability is calculated as:

r2 = 1 - D * alpha_1 
r2
 [1] 0.06811594 0.07246377 0.06811594 0.06811594 0.06811594 0.12838486 0.13887762 0.13887762 0.14968116 0.15437681 0.14968116 0.14968116 0.12266989 0.14087279
[15] 0.12266989

The accuracy is calculated as:

r = sqrt(r2) 

The standard error of prediction(SEP)

sep = sqrt(D * sigma_2_e) 
sep
 [1] 4.317138 4.307055 4.317138 4.317138 4.317138 4.175201 4.149994 4.149994 4.123879 4.112477 4.123879 4.123879 4.188866 4.145183 4.188866

Partitioning of Breeding values

Yield Deviations for the 10 animals with records

yd1 = ginv(t(Z) %*% Z) %*% t(Z) %*% (y - X %*% sol_sex - W %*% sol_ce)
yd1
             [,1]
 [1,]   0.0000000
 [2,]   0.0000000
 [3,]   0.0000000
 [4,]   0.0000000
 [5,]   0.0000000
 [6,]   0.2691787
 [7,]  -4.0021256
 [8,]  -9.0021256
 [9,]  20.0743961
[10,]  12.3457005
[11,] -17.9256039
[12,]   2.0743961
[13,]   8.9057005
[14,]   9.6343961
[15,] -23.0942995

The numerator of n2 (z’Z-number of records the animal has)

a2 = diag(t(Z) %*% Z)

Parents Average (PA) and Progeny Contribution (PC)

parents avearge

pa1 = rep(0, no_animals) 
# progeny contribution numerator 
pc0 = rep(0, no_animals) 
# numerator of n3, denominator of progeny contribution 
a3 = rep(0, no_animals)
# numerator of n1 
a1 = rep(0, no_animals) 

Lopping through the pedigree


for (i in 1 : no_animals) { 
  sire = ped[i, 2] 
  dam = ped[i, 3] 
  if (sire == 0 & dam == 0) {
    # both parents unknown 
    # PA 
    a1[i] = 1 * alpha_1 
  } else if (sire != 0 & dam == 0) {

    # PA 
    a1[i] = 4/3 * alpha_1 
    pa1[i] = sol_animal[sire]/2 
    # PC for sire 
    a3[sire] = a3[sire] + 0.5 * alpha_1 * (2/3) 
    pc0[sire] = pc0[sire] + 0.5 * alpha_1 * (2/3) * (2 * sol_animal[i]) 
  } else if (sire == 0 & dam != 0) { 
    # dam known 
    # PA 
    a1[i] = 4/3 * alpha_1 
    pa1[i] = sol_animal[dam]/2 
    # PC for dam 
    a3[dam] = a3[dam] + 0.5 * alpha_1 * (2/3) 
    pc0[dam] = pc0[dam] + 0.5 * alpha_1 * (2/3) * (2 * sol_animal[i]) 
  } else {
    # both parents known 
        # PA 
    a1[i] = 2 * alpha_1
    pa1[i] = (sol_animal[sire] + sol_animal[dam])/2
    # PC for sire 
    a3[sire] = a3[sire] + 0.5 * alpha_1 
    pc0[sire] = pc0[sire] + 0.5 * alpha_1 * (2 * sol_animal[i] - sol_animal[dam]) 
    # PC for dam 
    a3[dam] = a3[dam] + 0.5 * alpha_1
    pc0[dam] = pc0[dam] + 0.5 * alpha_1 * (2 * sol_animal[i] - sol_animal[sire]) 
  }
}
a1
 [1] 3.25 3.25 3.25 3.25 3.25 6.50 6.50 6.50 6.50 6.50 6.50 6.50 6.50 6.50 6.50
pa1
 [1]  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000 -1.3078261 -1.3078261 -1.3078261  1.4407729  1.4407729  1.4407729  1.4407729 -0.8533333 -0.8533333
[15] -0.8533333
a3
 [1] 9.750 4.875 6.500 6.500 4.875 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
pc0
 [1] -18.730048  -9.545894  14.047536  14.047536  -2.160386   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000   0.000000
[15]   0.000000

The sum of the denominators of n1, n2, n3 is:

n_D = a1 +a2 + a3
n_D
 [1] 13.000  8.125  9.750  9.750  8.125  7.500  7.500  7.500  7.500  7.500  7.500  7.500  7.500  7.500  7.500

The PA fraction of the breeeding values

PA = pa1 * (a1/n_D)
PA
 [1]  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000 -1.1334493 -1.1334493 -1.1334493  1.2486699  1.2486699  1.2486699  1.2486699 -0.7395556 -0.7395556
[15] -0.7395556

Yield Deviation (YD) fraction of the breeding values

YD = yd1 * (a2/n_D)
YD
            [,1]
 [1,]  0.0000000
 [2,]  0.0000000
 [3,]  0.0000000
 [4,]  0.0000000
 [5,]  0.0000000
 [6,]  0.0358905
 [7,] -0.5336167
 [8,] -1.2002834
 [9,]  2.6765862
[10,]  1.6460934
[11,] -2.3900805
[12,]  0.2765862
[13,]  1.1874267
[14,]  1.2845862
[15,] -3.0792399

Progeny Contribution (PC)

pc1 = pc0/a3
pc1[is.nan(pc1)==TRUE]=0
pc1
 [1] -1.9210306 -1.9581320  2.1611594  2.1611594 -0.4431562  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000
[15]  0.0000000
PC = pc1 * (a3/n_D)
PC
 [1] -1.4407729 -1.1748792  1.4407729  1.4407729 -0.2658937  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000
[15]  0.0000000

Progeny(Daughter) Yield Deviation(PYD, DYD)

# n2 of the offspring
n2prog = a2/(a1+a2)
n2prog
 [1] 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.1333333 0.1333333 0.1333333 0.1333333 0.1333333 0.1333333 0.1333333 0.1333333 0.1333333 0.1333333

The numerator of the DYD:
Summation of u of the progeny * n2 progeny * (2DYD-BV of the mate)
thus;

dyd_n = rep(0,no_animals)
# denominator of dyd : summation of u of progeny * n2 of progeny
dyd_d = rep(0, no_animals)

Looping through the pedigree gives:

 for (i in 1 : no_animals) { 
   sire = ped[i, 2] 
   dam = ped[i, 3] 
   if (sire == 0 & dam == 0) { 
     # both parents unknown 
    } else if (sire != 0 & dam == 0) { 
     # dyd_n
       dyd_n[sire] = dyd_n[sire] + n2prog[i] * 2 / 3 * 2 * yd1[i] 
       # dyd_d 
       dyd_d[sire] = dyd_d[sire] + n2prog[i] * 2 / 3
    } else if (sire == 0 & dam != 0) { 
         # dam known 
         # dyd_n 
         dyd_n[dam] = dyd_n[dam] + n2prog[i] * 2 / 3 * 2 * yd1[i] 
         # dyd_d 
         dyd_d[dam] = dyd_d[dam] + n2prog[i] * 2 / 3
    } else { 
        # both parents known 
         # dyd_n 
             dyd_n[sire] = dyd_n[sire] + n2prog[i] * (2 * yd1[i] - sol_animal[dam]) 
             dyd_n[dam] = dyd_n[dam] + n2prog[i] * (2 * yd1[i] - sol_animal[sire]) 
            # dyd_d 
             dyd_d[sire] = dyd_d[sire] + n2prog[i] 
             dyd_d[dam] = dyd_d[dam] + n2prog[i] 
    }
 }
dyd_n
 [1] -4.0341643 -2.8197101  3.6499581  3.6499581 -0.6381449  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000
[15]  0.0000000
dyd_d
 [1] 0.8000000 0.4000000 0.5333333 0.5333333 0.4000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
DYD = dyd_n/dyd_d
DYD[is.nan(DYD) == TRUE] = 0
DYD
 [1] -5.042705 -7.049275  6.843671  6.843671 -1.595362  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000

Breeeding values and the partitions

BV_result  = data.frame(animal = ped[,1], animal_bv = sol_animal, r2 = r2, r
           = r, SEP = sep, PA = PA, YD = YD, PC = PC, sum_of_fr = PA + YD+ PC, 
           DYD = DYD)
round(BV_result,3)
BV_result
LS0tDQp0aXRsZTogIkNvbW1vbiBFbnZpcm9ubWVudCBFZmZlY3QgTW9kZWwiDQphdXRob3I6ICIqSnVsaXVzIE11Z2FtYmUqIg0KZGF0ZTogIjUvMTYvMjAyMSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiBBbiBleGFtcGxlIGZyb20gdGhlIExpbmVhciBNb2RlbHMgZm9yIHRoZSBQcmVkaWN0aW9uIG9mIEFuaW1hbCBCcmVlZGluZyBWYWx1ZXMsIDNyZCBFZGl0aW9uDQooIEV4YW1wbGUgNC4zIHA2NykgIA0KDQpUaGUgbWF0cml4IG5vdGF0aW9uIG9mIHRoZSBtb2RlbHMgaXM6ICANCioqX3kgPSBYYiArIFphICsgV2MgKyBlXyoqICANCndoZXJlICoqYyoqIGlzIHRoZSBjb21tb24gZW52aXJvbm1lbnQgZWZmZWN0IGFuZCBXIHJlbGF0ZXMgdGhlIHJlY29yZHMgdG8gdGhlIGNvbW1vbiBlbnZpcm9ubWVudCBlZmZlY3RzLg0KDQpTdGFydCBieSBpbnN0YWxsaW5nIG9yIGxvYWRpbmcgdGhlIE1BU1MgcGFja2FnZXMgaWYgdGhleSBhcmUgYWxyZWFkeSBpbnN0YWxsZWQuICANCmBgYHtyfQ0KaWYgKCEoIk1BU1MiICVpbiUgaW5zdGFsbGVkLnBhY2thZ2VzKCkpKXsgaW5zdGFsbC5wYWNrYWdlcygnTUFTUycsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQp9DQpgYGANCg0KYGBge3J9DQpyZXF1aXJlKE1BU1MpDQpgYGANCg0KVHdvIGZ1bmN0aW9ucyB3aWxsIGJlIHJlcXVpcmVkOyAgDQooaSkgIFRvIGNyZWF0ZSBkZXNpZ24gbWF0cmljZXMgKCpkZXNnbiopICANCihpaSkgVG8gY3JlYXRlIHRoZSBpbnZlcnNlIG9mIHRoZSBOdW1lcmF0b3IgUmVsYXRpb25zaGlwIE1hdHJpeCgqYWludiopICANCg0KRnVuY3Rpb24gKGRlc2duKQ0KYGBge3J9DQpkZXNnbiA8LSBmdW5jdGlvbih2KQ0KICB7IA0KICBpZiAoaXMubnVtZXJpYyh2KSkgeyANCiAgICAgdmEgPSB2IA0KICAgICBtcm93ID0gbGVuZ3RoKHZhKSANCiAgICAgbWNvbCA9IG1heCh2YSkgDQogIH0gDQogIGlmIChpcy5jaGFyYWN0ZXIodikpIA0KICAgIHsgdmYgPSBmYWN0b3IodikgIyBzYXZlIHRoZSBpbmRleCB2YWx1ZQ0KICB2YSA9IGFzLm51bWVyaWModmYpIA0KICBtcm93ID0gbGVuZ3RoKHZhKSANCiAgbWNvbCA9IGxlbmd0aChsZXZlbHModmYpKQ0KICB9DQoNCiAgWCA9IG1hdHJpeChkYXRhID0gYygwKSwgbnJvdyA9IG1yb3csIG5jb2wgPSBtY29sKSANCiAgZm9yIChpIGluIDE6bXJvdykgeyANCiAgICBpYyA9IHZhW2ldIA0KICAgIFhbaSwgaWNdID0gMSB9IA0KICByZXR1cm4oWCkgDQogfQ0KYGBgDQoNCkZ1bmN0aW9uKGFpbnYpDQpgYGB7cn0NCmFpbnYgPSBmdW5jdGlvbihwZWQpIHsNCiAgbiA9IG5yb3cocGVkKQ0KICBBaW52ID0gbWF0cml4KGMoMCksIG5yb3cgPSBuLCBuY29sID0gbikNCiAgDQogIGZvciAoaSBpbiAxOm4pIHsNCiAgICBhbmltYWwgPSBwZWRbaSwgMV0NCiAgICBzaXJlID0gcGVkW2ksIDJdDQogICAgZGFtID0gcGVkW2ksIDNdDQogICAgDQogICAgaWYgKHNpcmUgPT0gMCAmIGRhbSA9PSAwKSB7DQogICAgICAjIGJvdGggcGFyZW50cyB1bmtub3duDQogICAgICBhbHBoYSA9IDENCiAgICAgIEFpbnZbYW5pbWFsLCBhbmltYWxdID0gYWxwaGEgKyBBaW52W2FuaW1hbCwgYW5pbWFsXQ0KICAgIH0gZWxzZSBpZiAoc2lyZSAhPSAwICYgZGFtID09IDApIHsNCiAgICAgICMgc2lyZSBrbm93bg0KICAgICAgYWxwaGEgPSA0LzMNCiAgICAgIEFpbnZbYW5pbWFsLCBhbmltYWxdID0gYWxwaGEgKyBBaW52W2FuaW1hbCwgYW5pbWFsXQ0KICAgICAgQWludlthbmltYWwsIHNpcmVdID0gLWFscGhhLzIgKyBBaW52W2FuaW1hbCwgc2lyZV0NCiAgICAgIEFpbnZbc2lyZSwgYW5pbWFsXSA9IC1hbHBoYS8yICsgQWludltzaXJlLCBhbmltYWxdDQogICAgICBBaW52W3NpcmUsIHNpcmVdID0gYWxwaGEvNCArIEFpbnZbc2lyZSwgc2lyZV0NCiAgICB9IGVsc2UgaWYgKHNpcmUgPT0gMCAmIGRhbSAhPSAwKSB7DQogICAgICAjIGRhbSBrbm93bg0KICAgICAgYWxwaGEgPSA0LzMNCiAgICAgIEFpbnZbYW5pbWFsLCBhbmltYWxdID0gYWxwaGEgKyBBaW52W2FuaW1hbCwgYW5pbWFsXQ0KICAgICAgQWludlthbmltYWwsIGRhbV0gPSAtYWxwaGEvMiArIEFpbnZbYW5pbWFsLCBkYW1dDQogICAgICBBaW52W2RhbSwgYW5pbWFsXSA9IC1hbHBoYS8yICsgQWludltkYW0sIGFuaW1hbF0NCiAgICAgIEFpbnZbZGFtLCBkYW1dID0gYWxwaGEvNCArIEFpbnZbZGFtLCBkYW1dDQogICAgfSBlbHNlIHsNCiAgICAgICMgYm90aCBwYXJlbnRzIGtub3duDQogICAgICBhbHBoYSA9IDINCiAgICAgIEFpbnZbYW5pbWFsLCBhbmltYWxdID0gYWxwaGEgKyBBaW52W2FuaW1hbCwgYW5pbWFsXQ0KICAgICAgQWludlthbmltYWwsIHNpcmVdID0gLWFscGhhLzIgKyBBaW52W2FuaW1hbCwgc2lyZV0NCiAgICAgIEFpbnZbc2lyZSwgYW5pbWFsXSA9IC1hbHBoYS8yICsgQWludltzaXJlLCBhbmltYWxdDQogICAgICBBaW52W2FuaW1hbCwgZGFtXSA9IC1hbHBoYS8yICsgQWludlthbmltYWwsIGRhbV0NCiAgICAgIEFpbnZbZGFtLCBhbmltYWxdID0gLWFscGhhLzIgKyBBaW52W2RhbSwgYW5pbWFsXQ0KICAgICAgQWludltzaXJlLCBzaXJlXSA9IGFscGhhLzQgKyBBaW52W3NpcmUsIHNpcmVdDQogICAgICBBaW52W3NpcmUsIGRhbV0gPSBhbHBoYS80ICsgQWludltzaXJlLCBkYW1dDQogICAgICBBaW52W2RhbSwgc2lyZV0gPSBhbHBoYS80ICsgQWludltkYW0sIHNpcmVdDQogICAgICBBaW52W2RhbSwgZGFtXSA9IGFscGhhLzQgKyBBaW52W2RhbSwgZGFtXQ0KICAgIH0NCiAgfQ0KICByZXR1cm4oQWludikNCn0NCmBgYA0KU2V0IHRoZSB3b3JraW5nIGRpcmVjdG9yeQ0KYGBge3J9DQpzZXR3ZCgiRjovUi9STU1FIikNCmBgYA0KUHJpbnQgd29ya2luZyBkaXJlY3RvcnkNCmBgYHtyfQ0KZ2V0d2QoKQ0KYGBgDQpUaGUgbmV4dCBzdGVwIGlzIHRvIGxvYWQgdGhlIHBlZGdyZWUgYW5kIGRhdGEgZmlsZXMuDQpSZWFkIHRoZSBwZWRpZ3JlZSBmaWxlIGFuZCBzb3J0IGJ5IHRoZSBhbmltYWwgY29sdW1uIGFzIGZvbGxvd3M7DQpgYGB7cn0NCnBlZCA8LSByZWFkLmNzdigiRjovUi9STU1FL3BlZC50eHQiLCBzZXA9IiIpDQpwZWQgPC0gcGVkW29yZGVyKHBlZFssMV0pLF0NCmBgYA0KUmVhZCB0aGUgZGF0YSBmaWxlDQpgYGB7cn0NCmRhdGEgPC0gcmVhZC5jc3YoIkY6L1IvUk1NRS9kYXRhLnR4dCIsIHNlcD0iIikNCmBgYA0KVGhlIHZhcmlhbmNlIGNvbXBvbmVudHMgYXJlIGdpdmVuIGJlbG93Og0KYGBge3J9DQpzaWdtYV8yX2EgPSAyMA0Kc2lnbWFfMl9lID0gNjUNCnNpZ21hXzJfYyA9IDE1DQpzaWdtYV8yX3kgPSAxMDANCmFscGhhXzEgICA9IHNpZ21hXzJfZS9zaWdtYV8yX2ENCmFscGhhXzIgICA9IHNpZ21hXzJfZS9zaWdtYV8yX2MNCmFscGhhXzENCmFscGhhXzINCmBgYA0KRm9ybXVsYXRpb24gZm8gdGhlIGRlc2lnbiBtYXRyaWNlcyAgDQotIGRlc2lnbiBtYXRyaXggZm9yIHRoZSBzZXggZWZmZWN0DQpgYGB7cn0NClggPSBkZXNnbihkYXRhWyw0XSkNClgNCnQoWCkNCmBgYA0KVGhlIG51bWJlciBvZiBsZXZlbHMgZm9yIHRoZSBzZXggZWZmZWN0IHdpbGwgYmU6DQpgYGB7cn0NCm5vX2xldmVsc19zZXggPSBuY29sKFgpDQpub19sZXZlbHNfc2V4DQpgYGANCi0gZGVzaWduIG1hdHJpeCBmb3IgdGhlIGFuaW1hbCBlZmZlY3QNCmBgYHtyfQ0KWiA9IGRlc2duKGRhdGFbLDFdKQ0KWg0KYGBgDQpUaGUgbnVtYmVyIG9mIGFuaW1hbHMgaXM6DQpgYGB7cn0NCm5vX2FuaW1hbHMgPSBuY29sKFopDQpub19hbmltYWxzDQpgYGANCi0gRGVzaWduIG1hdHJpeCBmb3IgdGhlIGNvbW1vbiBlbnZpcm9ubWVudGFsIGVmZmVjdC4NClRoaXMgaXMgdW5pcXVlIHRvIHRoZSBkYW1zIHdpdGggb2Zmc3ByaW5nIGJlY2F1c2UgdGhlIGNvbW1vbiBlbnZpcm9ubWVudA0KZWZmZWN0cyBhcmUgY2FsY3VsYXRlZCBmb3IgZnVsbC1zaWJsaW5ncyBvciBvZmZzcHJpbmcgb2YgdGhlIHNhbWUgZGFtLg0KYGBge3J9DQpXID0gZGVzZ24oZGF0YVssM10pWyx1bmlxdWUoZGF0YVssM10pXQ0KVw0KYGBgDQpUaGUgbnVtYmVyIG9mIGFuaW1hbHMgKGxldmVscykgd2lsbCBiZToNCmBgYHtyfQ0Kbm9fYW5pbWFsc19jZSA9IG5jb2woVykNCm5vX2FuaW1hbHNfY2UNCmBgYA0KVGhlIG1hdHJpeCBvZiBvYnNlcnZhdGlvbnMoeSkgaXMgZ2l2ZW4gYnk6DQpgYGB7cn0NCnkgPSBkYXRhWyw1XQ0KeQ0KYGBgDQpUaGUgaW52ZXJzZSBvZiB0aGUgbnVtZXJhdG9yIHJlbGF0aW9uc2hpcCBtYXRyaXggaXMgb2J0YWluZWQgZnJvbSB0aGUgZnVuY3Rpb24gYWludiBhczoNCmBgYHtyfQ0KQSA9IGFpbnYocGVkKQ0KQQ0KYGBgDQoNCkNvbnN0cnVjdGlvbiBvZiB0aGUgTGVmdCBIYW5kIFNpZGUgKExIUykNCmBgYHtyfQ0KTEhTID0gcmJpbmQoDQogIGNiaW5kKHQoWCkgJSolIFgsIHQoWCkgJSolIFosICB0KFgpICUqJSBXKSwgDQogIGNiaW5kKHQoWikgJSolIFgsIHQoWikgJSolIFogKyBBICogYWxwaGFfMSwgdChaKSAlKiUgVyksDQogIGNiaW5kKHQoVykgJSolIFgsIHQoVykgJSolIFosIHQoVykgJSolIFcgKyBkaWFnKG5vX2FuaW1hbHNfY2UpICogYWxwaGFfMikpDQpMSFMNCg0KDQpgYGANClJIUyBjb25zdHJ1Y3Rpb24NCmBgYHtyfQ0KUkhTID0gcmJpbmQodChYKSAlKiUgeSwgdChaKSAlKiUgeSwgdChXKSAlKiUgeSkNClJIUw0KYGBgDQoNClNvbHV0aW9ucyB0byB0aGUgTWl4ZWQgTW9kZWwgRXF1YXRpb25zDQoNCi0gZ2VuZXJhbGl6ZWQgaW52ZXJzZSBvZiBMSFMNCmBgYHtyfQ0KZ2lfTEhTID0gZ2ludihMSFMpDQpnaV9MSFMNCmBgYA0Kc29sdXRpb24NCmBgYHtyfQ0Kc29sID0gZ2lfTEhTICUqJSBSSFMNCnNvbA0Kcm91bmQoc29sLDMpDQpzb2xfc2V4ID0gc29sWzE6bm9fbGV2ZWxzX3NleF0NCnNvbF9zZXgNCnNvbF9hbmltYWwgPSBzb2xbKG5vX2xldmVsc19zZXgrMSk6KG5vX2xldmVsc19zZXgrbm9fYW5pbWFscyldDQpzb2xfYW5pbWFsDQpzb2xfY2UgPSBzb2xbKG5vX2xldmVsc19zZXgrbm9fYW5pbWFscysxKToobm9fbGV2ZWxzX3NleCtub19hbmltYWxzK25vX2FuaW1hbHNfY2UpXQ0Kc29sX2NlDQpgYGANCiMjIFJlbGlhYmlsaXR5KHIyKSwgQWNjdXJhY3kociksIFN0YW5kYXJkIEVycm9yIG9mIFByZWRpY3Rpb24oU0VQKQ0KDQpUaGUgZGlhZ29uYWwgZWxlbWVudHMgb2YgdGhlIGdlbmVyYWxpemVkIGludmVyc2Ugb2YgTEhTIGZvciBhbmltYWwgZXF1YXRpb24gKEQpICANCmBgYHtyfQ0KRCA9IGRpYWcoZ2lfTEhTWyhub19sZXZlbHNfc2V4ICsgMSkgOiAobm9fbGV2ZWxzX3NleCArIG5vX2FuaW1hbHMpLCAobm9fbGV2ZWxzX3NleCArIDEpIDogKG5vX2xldmVsc19zZXggKyBub19hbmltYWxzKV0pIA0KRA0KYGBgDQpUaGUgUmVsaWFiaWxpdHkgaXMgY2FsY3VsYXRlZCBhczoNCmBgYHtyfQ0KcjIgPSAxIC0gRCAqIGFscGhhXzEgDQpyMg0KYGBgDQpUaGUgYWNjdXJhY3kgaXMgY2FsY3VsYXRlZCBhczoNCmBgYHtyfQ0KciA9IHNxcnQocjIpIA0KYGBgDQpUaGUgc3RhbmRhcmQgZXJyb3Igb2YgcHJlZGljdGlvbihTRVApDQpgYGB7cn0NCnNlcCA9IHNxcnQoRCAqIHNpZ21hXzJfZSkgDQpzZXANCmBgYA0KIyMgUGFydGl0aW9uaW5nIG9mIEJyZWVkaW5nIHZhbHVlcw0KWWllbGQgRGV2aWF0aW9ucyBmb3IgdGhlIDEwIGFuaW1hbHMgd2l0aCByZWNvcmRzDQpgYGB7cn0NCnlkMSA9IGdpbnYodChaKSAlKiUgWikgJSolIHQoWikgJSolICh5IC0gWCAlKiUgc29sX3NleCAtIFcgJSolIHNvbF9jZSkNCnlkMQ0KYGBgDQpUaGUgbnVtZXJhdG9yIG9mIG4yICh6J1otbnVtYmVyIG9mIHJlY29yZHMgdGhlIGFuaW1hbCBoYXMpDQpgYGB7cn0NCmEyID0gZGlhZyh0KFopICUqJSBaKQ0KYGBgDQpQYXJlbnRzIEF2ZXJhZ2UgKFBBKSBhbmQgUHJvZ2VueSBDb250cmlidXRpb24gKFBDKQ0KDQpwYXJlbnRzIGF2ZWFyZ2UgDQpgYGB7cn0NCnBhMSA9IHJlcCgwLCBub19hbmltYWxzKSANCiMgcHJvZ2VueSBjb250cmlidXRpb24gbnVtZXJhdG9yIA0KcGMwID0gcmVwKDAsIG5vX2FuaW1hbHMpIA0KIyBudW1lcmF0b3Igb2YgbjMsIGRlbm9taW5hdG9yIG9mIHByb2dlbnkgY29udHJpYnV0aW9uIA0KYTMgPSByZXAoMCwgbm9fYW5pbWFscykNCiMgbnVtZXJhdG9yIG9mIG4xIA0KYTEgPSByZXAoMCwgbm9fYW5pbWFscykgDQpgYGANCkxvcHBpbmcgdGhyb3VnaCB0aGUgcGVkaWdyZWUNCmBgYHtyfQ0KDQpmb3IgKGkgaW4gMSA6IG5vX2FuaW1hbHMpIHsgDQogIHNpcmUgPSBwZWRbaSwgMl0gDQogIGRhbSA9IHBlZFtpLCAzXSANCiAgaWYgKHNpcmUgPT0gMCAmIGRhbSA9PSAwKSB7DQogICAgIyBib3RoIHBhcmVudHMgdW5rbm93biANCiAgICAjIFBBIA0KICAgIGExW2ldID0gMSAqIGFscGhhXzEgDQogIH0gZWxzZSBpZiAoc2lyZSAhPSAwICYgZGFtID09IDApIHsNCg0KICAgICMgUEEgDQogICAgYTFbaV0gPSA0LzMgKiBhbHBoYV8xIA0KICAgIHBhMVtpXSA9IHNvbF9hbmltYWxbc2lyZV0vMiANCiAgICAjIFBDIGZvciBzaXJlIA0KICAgIGEzW3NpcmVdID0gYTNbc2lyZV0gKyAwLjUgKiBhbHBoYV8xICogKDIvMykgDQogICAgcGMwW3NpcmVdID0gcGMwW3NpcmVdICsgMC41ICogYWxwaGFfMSAqICgyLzMpICogKDIgKiBzb2xfYW5pbWFsW2ldKSANCiAgfSBlbHNlIGlmIChzaXJlID09IDAgJiBkYW0gIT0gMCkgeyANCiAgICAjIGRhbSBrbm93biANCiAgICAjIFBBIA0KICAgIGExW2ldID0gNC8zICogYWxwaGFfMSANCiAgICBwYTFbaV0gPSBzb2xfYW5pbWFsW2RhbV0vMiANCiAgICAjIFBDIGZvciBkYW0gDQogICAgYTNbZGFtXSA9IGEzW2RhbV0gKyAwLjUgKiBhbHBoYV8xICogKDIvMykgDQogICAgcGMwW2RhbV0gPSBwYzBbZGFtXSArIDAuNSAqIGFscGhhXzEgKiAoMi8zKSAqICgyICogc29sX2FuaW1hbFtpXSkgDQogIH0gZWxzZSB7DQogICAgIyBib3RoIHBhcmVudHMga25vd24gDQogICAgICAgICMgUEEgDQogICAgYTFbaV0gPSAyICogYWxwaGFfMQ0KICAgIHBhMVtpXSA9IChzb2xfYW5pbWFsW3NpcmVdICsgc29sX2FuaW1hbFtkYW1dKS8yDQogICAgIyBQQyBmb3Igc2lyZSANCiAgICBhM1tzaXJlXSA9IGEzW3NpcmVdICsgMC41ICogYWxwaGFfMSANCiAgICBwYzBbc2lyZV0gPSBwYzBbc2lyZV0gKyAwLjUgKiBhbHBoYV8xICogKDIgKiBzb2xfYW5pbWFsW2ldIC0gc29sX2FuaW1hbFtkYW1dKSANCiAgICAjIFBDIGZvciBkYW0gDQogICAgYTNbZGFtXSA9IGEzW2RhbV0gKyAwLjUgKiBhbHBoYV8xDQogICAgcGMwW2RhbV0gPSBwYzBbZGFtXSArIDAuNSAqIGFscGhhXzEgKiAoMiAqIHNvbF9hbmltYWxbaV0gLSBzb2xfYW5pbWFsW3NpcmVdKSANCiAgfQ0KfQ0KYGBgDQpgYGB7cn0NCmExDQpwYTENCmEzDQpwYzANCmBgYA0KVGhlIHN1bSBvZiB0aGUgZGVub21pbmF0b3JzIG9mIG4xLCBuMiwgbjMgaXM6DQpgYGB7cn0NCm5fRCA9IGExICthMiArIGEzDQpuX0QNCmBgYA0KVGhlIFBBIGZyYWN0aW9uIG9mIHRoZSBicmVlZWRpbmcgdmFsdWVzDQpgYGB7cn0NClBBID0gcGExICogKGExL25fRCkNClBBDQpgYGANCllpZWxkIERldmlhdGlvbiAoWUQpIGZyYWN0aW9uIG9mIHRoZSBicmVlZGluZyB2YWx1ZXMNCmBgYHtyfQ0KWUQgPSB5ZDEgKiAoYTIvbl9EKQ0KWUQNCmBgYA0KUHJvZ2VueSBDb250cmlidXRpb24gKFBDKQ0KYGBge3J9DQpwYzEgPSBwYzAvYTMNCnBjMVtpcy5uYW4ocGMxKT09VFJVRV09MA0KcGMxDQpQQyA9IHBjMSAqIChhMy9uX0QpDQpQQw0KYGBgDQpQcm9nZW55KERhdWdodGVyKSBZaWVsZCBEZXZpYXRpb24oUFlELCBEWUQpDQpgYGB7cn0NCiMgbjIgb2YgdGhlIG9mZnNwcmluZw0KbjJwcm9nID0gYTIvKGExK2EyKQ0KbjJwcm9nDQpgYGANClRoZSBudW1lcmF0b3Igb2YgdGhlIERZRDogIA0KU3VtbWF0aW9uIG9mIHUgb2YgdGhlIHByb2dlbnkgKiBuMiBwcm9nZW55ICogKDJEWUQtQlYgb2YgdGhlIG1hdGUpICANCnRodXM7DQpgYGB7cn0NCmR5ZF9uID0gcmVwKDAsbm9fYW5pbWFscykNCiMgZGVub21pbmF0b3Igb2YgZHlkIDogc3VtbWF0aW9uIG9mIHUgb2YgcHJvZ2VueSAqIG4yIG9mIHByb2dlbnkNCmR5ZF9kID0gcmVwKDAsIG5vX2FuaW1hbHMpDQpgYGANCkxvb3BpbmcgdGhyb3VnaCB0aGUgcGVkaWdyZWUgZ2l2ZXM6DQpgYGB7cn0NCiBmb3IgKGkgaW4gMSA6IG5vX2FuaW1hbHMpIHsgDQogICBzaXJlID0gcGVkW2ksIDJdIA0KICAgZGFtID0gcGVkW2ksIDNdIA0KICAgaWYgKHNpcmUgPT0gMCAmIGRhbSA9PSAwKSB7IA0KICAgICAjIGJvdGggcGFyZW50cyB1bmtub3duIA0KICAgIH0gZWxzZSBpZiAoc2lyZSAhPSAwICYgZGFtID09IDApIHsgDQogICAgICMgZHlkX24NCiAgICAgICBkeWRfbltzaXJlXSA9IGR5ZF9uW3NpcmVdICsgbjJwcm9nW2ldICogMiAvIDMgKiAyICogeWQxW2ldIA0KICAgICAgICMgZHlkX2QgDQogICAgICAgZHlkX2Rbc2lyZV0gPSBkeWRfZFtzaXJlXSArIG4ycHJvZ1tpXSAqIDIgLyAzDQogICAgfSBlbHNlIGlmIChzaXJlID09IDAgJiBkYW0gIT0gMCkgeyANCiAgICAgICAgICMgZGFtIGtub3duIA0KICAgICAgICAgIyBkeWRfbiANCiAgICAgICAgIGR5ZF9uW2RhbV0gPSBkeWRfbltkYW1dICsgbjJwcm9nW2ldICogMiAvIDMgKiAyICogeWQxW2ldIA0KICAgICAgICAgIyBkeWRfZCANCiAgICAgICAgIGR5ZF9kW2RhbV0gPSBkeWRfZFtkYW1dICsgbjJwcm9nW2ldICogMiAvIDMNCiAgICB9IGVsc2UgeyANCiAgICAgICAgIyBib3RoIHBhcmVudHMga25vd24gDQogICAgICAgICAjIGR5ZF9uIA0KICAgICAgICAgICAgIGR5ZF9uW3NpcmVdID0gZHlkX25bc2lyZV0gKyBuMnByb2dbaV0gKiAoMiAqIHlkMVtpXSAtIHNvbF9hbmltYWxbZGFtXSkgDQogICAgICAgICAgICAgZHlkX25bZGFtXSA9IGR5ZF9uW2RhbV0gKyBuMnByb2dbaV0gKiAoMiAqIHlkMVtpXSAtIHNvbF9hbmltYWxbc2lyZV0pIA0KICAgICAgICAgICAgIyBkeWRfZCANCiAgICAgICAgICAgICBkeWRfZFtzaXJlXSA9IGR5ZF9kW3NpcmVdICsgbjJwcm9nW2ldIA0KICAgICAgICAgICAgIGR5ZF9kW2RhbV0gPSBkeWRfZFtkYW1dICsgbjJwcm9nW2ldIA0KICAgIH0NCiB9DQpkeWRfbg0KZHlkX2QNCkRZRCA9IGR5ZF9uL2R5ZF9kDQpEWURbaXMubmFuKERZRCkgPT0gVFJVRV0gPSAwDQpEWUQNCmBgYA0KIyMgQnJlZWVkaW5nIHZhbHVlcyBhbmQgdGhlIHBhcnRpdGlvbnMgDQoNCmBgYHtyfQ0KQlZfcmVzdWx0ICA9IGRhdGEuZnJhbWUoYW5pbWFsID0gcGVkWywxXSwgYW5pbWFsX2J2ID0gc29sX2FuaW1hbCwgcjIgPSByMiwgcg0KICAgICAgICAgICA9IHIsIFNFUCA9IHNlcCwgUEEgPSBQQSwgWUQgPSBZRCwgUEMgPSBQQywgc3VtX29mX2ZyID0gUEEgKyBZRCsgUEMsIA0KICAgICAgICAgICBEWUQgPSBEWUQpDQpyb3VuZChCVl9yZXN1bHQsMykNCkJWX3Jlc3VsdA0KYGBgDQo=