Step 1:collecting data—-

To identify rules for distinguishing poisonous mushrooms, we will utilize the Mushroom dataset by Jeff Schlimmer of Carnegie Mellon University. The raw dataset is available freely at the UCI Machine Learning Repository (http://archive.ics.uci.edu/ml).The dataset includes information on 8,124 mushroom samples from 23 species of gilled mushrooms listed in Audubon Society Field Guide to North American Mushrooms(1981). In the Field Guide, each of the mushroom species is identified “definitely edible,” “definitely poisonous,” or “likely poisonous, and not recommended to beeaten.” For the purposes of this dataset, the latter group was combined with the“definitely poisonous” group to make two classes: poisonous and nonpoisonous.The data dictionary available on the UCI website describes the 22 features of the mushroom samples, including characteristics such as cap shape, cap color, odor, gill size and color, stalk shape, and habitat.

Step2:Exploring and preparing the data —-

mushrooms <- read.csv(file="mushrooms.csv",stringsAsFactors = TRUE)
cannot open file 'mushrooms.csv': No such file or directoryError in file(file, "rt") : cannot open the connection

examine the structure of the data frame

str(mushrooms)
'data.frame':   8124 obs. of  22 variables:
 $ type                    : Factor w/ 2 levels "edible","poisonous": 2 1 1 2 1 1 1 1 2 1 ...
 $ cap_shape               : Factor w/ 6 levels "bell","conical",..: 3 3 1 3 3 3 1 1 3 1 ...
 $ cap_surface             : Factor w/ 4 levels "fibrous","grooves",..: 4 4 4 3 4 3 4 3 3 4 ...
 $ cap_color               : Factor w/ 10 levels "brown","buff",..: 1 10 9 9 4 10 9 9 9 10 ...
 $ bruises                 : Factor w/ 2 levels "no","yes": 2 2 2 2 1 2 2 2 2 2 ...
 $ odor                    : Factor w/ 9 levels "almond","anise",..: 8 1 2 8 7 1 1 2 8 1 ...
 $ gill_attachment         : Factor w/ 2 levels "attached","free": 2 2 2 2 2 2 2 2 2 2 ...
 $ gill_spacing            : Factor w/ 2 levels "close","crowded": 1 1 1 1 2 1 1 1 1 1 ...
 $ gill_size               : Factor w/ 2 levels "broad","narrow": 2 1 1 2 1 1 1 1 2 1 ...
 $ gill_color              : Factor w/ 12 levels "black","brown",..: 1 1 2 2 1 2 5 2 8 5 ...
 $ stalk_shape             : Factor w/ 2 levels "enlarging","tapering": 1 1 1 1 2 1 1 1 1 1 ...
 $ stalk_root              : Factor w/ 5 levels "bulbous","club",..: 3 2 2 3 3 2 2 2 3 2 ...
 $ stalk_surface_above_ring: Factor w/ 4 levels "fibrous","scaly",..: 4 4 4 4 4 4 4 4 4 4 ...
 $ stalk_surface_below_ring: Factor w/ 4 levels "fibrous","scaly",..: 4 4 4 4 4 4 4 4 4 4 ...
 $ stalk_color_above_ring  : Factor w/ 9 levels "brown","buff",..: 8 8 8 8 8 8 8 8 8 8 ...
 $ stalk_color_below_ring  : Factor w/ 9 levels "brown","buff",..: 8 8 8 8 8 8 8 8 8 8 ...
 $ veil_color              : Factor w/ 4 levels "brown","orange",..: 3 3 3 3 3 3 3 3 3 3 ...
 $ ring_number             : Factor w/ 3 levels "none","one","two": 2 2 2 2 2 2 2 2 2 2 ...
 $ ring_type               : Factor w/ 5 levels "evanescent","flaring",..: 5 5 5 5 1 5 5 5 5 5 ...
 $ spore_print_color       : Factor w/ 9 levels "black","brown",..: 1 2 2 1 2 1 1 2 1 1 ...
 $ population              : Factor w/ 6 levels "abundant","clustered",..: 4 3 3 4 1 3 3 4 5 4 ...
 $ habitat                 : Factor w/ 7 levels "grasses","leaves",..: 5 1 3 5 1 1 3 3 1 3 ...

drop the veil_type feature since all values are the same

mushrooms$veil_type <- NULL

examine the class distribution

table(mushrooms$type)

   edible poisonous 
     4208      3916 
set.seed(123)

randomly choose 7000 out of 8124 samples as train data set and check structure

set.seed(123)
train_sample <- sample(8124, 7000)
str(train_sample)
 int [1:7000] 2337 6404 3322 7171 7637 370 4288 7244 4476 3706 ...

split data frames to train and test dat sets

mushrooms_train <- mushrooms[train_sample, ]
mushrooms_test  <- mushrooms[-train_sample, ]

Step 3: Training a model on the data —-

library(RWeka)

train OneR() on the data

mushroom_1R <- OneR(type ~ ., data = mushrooms_train)

Step 4: Evaluating model performance —-

mushroom_1R
odor:
    almond  -> edible
    anise   -> edible
    creosote    -> poisonous
    fishy   -> poisonous
    foul    -> poisonous
    musty   -> poisonous
    none    -> edible
    pungent -> poisonous
    spicy   -> poisonous
(6895/7000 instances correct)
summary(mushroom_1R)

=== Summary ===

Correctly Classified Instances        6895               98.5    %
Incorrectly Classified Instances       105                1.5    %
Kappa statistic                          0.9699
Mean absolute error                      0.015 
Root mean squared error                  0.1225
Relative absolute error                  3.0039 %
Root relative squared error             24.5108 %
Total Number of Instances             7000     

=== Confusion Matrix ===

    a    b   <-- classified as
 3626    0 |    a = edible
  105 3269 |    b = poisonous
mushroom_pred <- predict(mushroom_1R, mushrooms_test)
mushroom_pred
   [1] edible    poisonous edible    edible   
   [5] edible    edible    edible    edible   
   [9] edible    edible    poisonous edible   
  [13] edible    edible    poisonous poisonous
  [17] edible    edible    edible    edible   
  [21] edible    poisonous edible    edible   
  [25] edible    edible    edible    edible   
  [29] edible    edible    edible    edible   
  [33] edible    poisonous edible    edible   
  [37] edible    edible    edible    edible   
  [41] edible    edible    edible    edible   
  [45] edible    edible    edible    poisonous
  [49] edible    edible    edible    edible   
  [53] edible    edible    edible    edible   
  [57] edible    edible    poisonous edible   
  [61] edible    edible    poisonous edible   
  [65] edible    edible    edible    edible   
  [69] edible    edible    edible    edible   
  [73] edible    edible    edible    edible   
  [77] edible    edible    edible    edible   
  [81] edible    edible    edible    edible   
  [85] poisonous edible    edible    edible   
  [89] edible    edible    edible    edible   
  [93] edible    edible    edible    edible   
  [97] edible    poisonous edible    edible   
 [101] edible    poisonous edible    edible   
 [105] edible    poisonous edible    edible   
 [109] edible    edible    edible    edible   
 [113] edible    edible    edible    edible   
 [117] edible    edible    edible    edible   
 [121] edible    edible    edible    poisonous
 [125] edible    edible    poisonous edible   
 [129] edible    edible    edible    edible   
 [133] edible    edible    edible    edible   
 [137] poisonous edible    edible    edible   
 [141] poisonous edible    edible    poisonous
 [145] poisonous edible    edible    edible   
 [149] edible    edible    poisonous edible   
 [153] edible    edible    edible    edible   
 [157] edible    edible    edible    edible   
 [161] edible    edible    poisonous edible   
 [165] edible    edible    edible    edible   
 [169] edible    poisonous edible    edible   
 [173] edible    edible    edible    edible   
 [177] edible    edible    edible    poisonous
 [181] edible    edible    edible    edible   
 [185] edible    edible    edible    edible   
 [189] edible    poisonous edible    edible   
 [193] edible    edible    edible    edible   
 [197] edible    edible    edible    edible   
 [201] edible    edible    edible    poisonous
 [205] edible    edible    edible    edible   
 [209] edible    edible    poisonous edible   
 [213] poisonous edible    edible    edible   
 [217] edible    edible    edible    edible   
 [221] edible    edible    edible    edible   
 [225] edible    edible    edible    edible   
 [229] edible    edible    edible    poisonous
 [233] edible    edible    poisonous edible   
 [237] edible    edible    edible    edible   
 [241] edible    edible    edible    edible   
 [245] edible    edible    poisonous edible   
 [249] edible    edible    edible    edible   
 [253] edible    edible    poisonous edible   
 [257] edible    edible    edible    edible   
 [261] edible    edible    edible    edible   
 [265] edible    edible    edible    edible   
 [269] edible    edible    edible    edible   
 [273] edible    edible    edible    poisonous
 [277] poisonous edible    edible    edible   
 [281] edible    edible    edible    edible   
 [285] edible    edible    edible    edible   
 [289] poisonous edible    edible    edible   
 [293] edible    edible    edible    edible   
 [297] edible    edible    edible    edible   
 [301] edible    edible    edible    edible   
 [305] edible    edible    edible    edible   
 [309] edible    edible    edible    edible   
 [313] poisonous edible    edible    edible   
 [317] edible    edible    edible    edible   
 [321] edible    edible    edible    edible   
 [325] edible    edible    edible    edible   
 [329] edible    edible    edible    edible   
 [333] edible    edible    edible    edible   
 [337] edible    edible    edible    edible   
 [341] edible    edible    edible    edible   
 [345] edible    edible    edible    edible   
 [349] edible    edible    edible    edible   
 [353] edible    edible    edible    edible   
 [357] edible    edible    edible    edible   
 [361] edible    edible    edible    edible   
 [365] edible    edible    edible    edible   
 [369] edible    edible    edible    edible   
 [373] edible    edible    edible    edible   
 [377] edible    edible    edible    edible   
 [381] edible    edible    edible    edible   
 [385] edible    edible    edible    edible   
 [389] edible    edible    edible    edible   
 [393] edible    edible    edible    edible   
 [397] edible    edible    edible    poisonous
 [401] poisonous poisonous poisonous edible   
 [405] edible    poisonous edible    poisonous
 [409] poisonous edible    poisonous edible   
 [413] edible    edible    edible    edible   
 [417] edible    edible    poisonous edible   
 [421] edible    edible    poisonous poisonous
 [425] poisonous edible    edible    edible   
 [429] edible    poisonous edible    edible   
 [433] edible    poisonous edible    edible   
 [437] edible    edible    edible    edible   
 [441] edible    edible    poisonous poisonous
 [445] edible    edible    edible    poisonous
 [449] edible    edible    edible    poisonous
 [453] edible    edible    edible    edible   
 [457] poisonous edible    edible    poisonous
 [461] edible    poisonous poisonous edible   
 [465] poisonous edible    edible    edible   
 [469] edible    edible    edible    poisonous
 [473] edible    poisonous edible    poisonous
 [477] edible    edible    edible    poisonous
 [481] poisonous edible    edible    edible   
 [485] edible    edible    edible    poisonous
 [489] edible    edible    poisonous edible   
 [493] edible    edible    poisonous edible   
 [497] edible    edible    edible    edible   
 [501] edible    edible    poisonous poisonous
 [505] poisonous poisonous edible    edible   
 [509] poisonous edible    edible    poisonous
 [513] edible    poisonous edible    edible   
 [517] poisonous edible    poisonous edible   
 [521] poisonous poisonous edible    edible   
 [525] edible    edible    edible    poisonous
 [529] edible    edible    edible    edible   
 [533] edible    poisonous poisonous edible   
 [537] poisonous edible    edible    poisonous
 [541] edible    poisonous poisonous edible   
 [545] poisonous poisonous poisonous poisonous
 [549] poisonous poisonous poisonous poisonous
 [553] poisonous poisonous edible    poisonous
 [557] poisonous edible    poisonous poisonous
 [561] poisonous poisonous poisonous poisonous
 [565] poisonous poisonous poisonous poisonous
 [569] poisonous poisonous poisonous poisonous
 [573] poisonous poisonous poisonous poisonous
 [577] poisonous poisonous poisonous poisonous
 [581] poisonous edible    poisonous poisonous
 [585] poisonous poisonous poisonous poisonous
 [589] poisonous poisonous poisonous poisonous
 [593] edible    poisonous poisonous poisonous
 [597] poisonous poisonous poisonous poisonous
 [601] poisonous poisonous poisonous poisonous
 [605] poisonous poisonous poisonous poisonous
 [609] poisonous edible    poisonous poisonous
 [613] poisonous poisonous poisonous poisonous
 [617] poisonous poisonous poisonous poisonous
 [621] poisonous poisonous poisonous edible   
 [625] poisonous edible    poisonous poisonous
 [629] poisonous poisonous poisonous poisonous
 [633] poisonous poisonous poisonous poisonous
 [637] poisonous poisonous edible    poisonous
 [641] poisonous poisonous poisonous poisonous
 [645] poisonous edible    poisonous poisonous
 [649] poisonous edible    poisonous poisonous
 [653] poisonous poisonous poisonous poisonous
 [657] poisonous poisonous poisonous poisonous
 [661] edible    edible    poisonous poisonous
 [665] poisonous poisonous poisonous poisonous
 [669] poisonous poisonous poisonous poisonous
 [673] poisonous edible    poisonous edible   
 [677] poisonous edible    edible    poisonous
 [681] edible    poisonous poisonous edible   
 [685] poisonous poisonous poisonous poisonous
 [689] edible    poisonous poisonous poisonous
 [693] edible    poisonous poisonous poisonous
 [697] poisonous poisonous poisonous poisonous
 [701] poisonous poisonous poisonous edible   
 [705] poisonous edible    edible    poisonous
 [709] poisonous edible    edible    poisonous
 [713] poisonous poisonous edible    poisonous
 [717] poisonous edible    poisonous poisonous
 [721] poisonous poisonous edible    edible   
 [725] edible    edible    edible    edible   
 [729] poisonous poisonous edible    edible   
 [733] edible    poisonous poisonous edible   
 [737] poisonous edible    poisonous poisonous
 [741] poisonous edible    poisonous edible   
 [745] poisonous edible    poisonous poisonous
 [749] edible    edible    poisonous poisonous
 [753] edible    edible    edible    edible   
 [757] poisonous edible    poisonous edible   
 [761] poisonous edible    poisonous poisonous
 [765] poisonous poisonous poisonous edible   
 [769] poisonous poisonous poisonous edible   
 [773] edible    poisonous poisonous poisonous
 [777] edible    edible    poisonous edible   
 [781] poisonous edible    poisonous poisonous
 [785] edible    poisonous edible    poisonous
 [789] poisonous poisonous poisonous poisonous
 [793] poisonous edible    poisonous poisonous
 [797] edible    edible    edible    poisonous
 [801] poisonous poisonous poisonous poisonous
 [805] poisonous poisonous poisonous poisonous
 [809] poisonous poisonous poisonous poisonous
 [813] poisonous poisonous poisonous poisonous
 [817] poisonous poisonous poisonous poisonous
 [821] edible    poisonous poisonous poisonous
 [825] poisonous poisonous poisonous poisonous
 [829] poisonous poisonous poisonous poisonous
 [833] poisonous poisonous poisonous poisonous
 [837] poisonous poisonous poisonous poisonous
 [841] poisonous poisonous poisonous poisonous
 [845] poisonous poisonous poisonous poisonous
 [849] poisonous poisonous poisonous poisonous
 [853] poisonous poisonous poisonous poisonous
 [857] poisonous poisonous poisonous poisonous
 [861] poisonous poisonous poisonous poisonous
 [865] poisonous poisonous poisonous poisonous
 [869] poisonous edible    poisonous poisonous
 [873] poisonous poisonous poisonous poisonous
 [877] poisonous poisonous poisonous poisonous
 [881] poisonous poisonous edible    poisonous
 [885] poisonous poisonous poisonous poisonous
 [889] poisonous poisonous poisonous poisonous
 [893] poisonous poisonous poisonous poisonous
 [897] poisonous edible    poisonous poisonous
 [901] poisonous poisonous poisonous poisonous
 [905] poisonous poisonous poisonous poisonous
 [909] poisonous poisonous poisonous poisonous
 [913] poisonous poisonous poisonous poisonous
 [917] poisonous poisonous poisonous poisonous
 [921] poisonous poisonous poisonous poisonous
 [925] poisonous poisonous poisonous poisonous
 [929] poisonous poisonous poisonous poisonous
 [933] poisonous poisonous poisonous poisonous
 [937] poisonous poisonous poisonous poisonous
 [941] poisonous poisonous poisonous poisonous
 [945] poisonous poisonous poisonous poisonous
 [949] poisonous edible    edible    poisonous
 [953] poisonous poisonous poisonous edible   
 [957] poisonous poisonous poisonous poisonous
 [961] poisonous poisonous poisonous edible   
 [965] poisonous poisonous poisonous poisonous
 [969] poisonous edible    edible    edible   
 [973] poisonous edible    edible    poisonous
 [977] poisonous poisonous poisonous poisonous
 [981] poisonous edible    poisonous edible   
 [985] poisonous edible    poisonous edible   
 [989] poisonous poisonous edible    poisonous
 [993] edible    poisonous poisonous edible   
 [997] poisonous poisonous edible    edible   
 [ reached getOption("max.print") -- omitted 124 entries ]
Levels: edible poisonous

Accuracy of 1R=(3626+3269)/7000=98.5%

cross tabulation of predicted versus actual classes

library(gmodels)
CrossTable(mushrooms_test$type, mushroom_pred,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))

 
   Cell Contents
|-------------------------|
|                       N |
|         N / Table Total |
|-------------------------|

 
Total Observations in Table:  1124 

 
               | predicted default 
actual default |    edible | poisonous | Row Total | 
---------------|-----------|-----------|-----------|
        edible |       582 |         0 |       582 | 
               |     0.518 |     0.000 |           | 
---------------|-----------|-----------|-----------|
     poisonous |        15 |       527 |       542 | 
               |     0.013 |     0.469 |           | 
---------------|-----------|-----------|-----------|
  Column Total |       597 |       527 |      1124 | 
---------------|-----------|-----------|-----------|

 

Accuracy=(582+527)/1124=98.67%

Step 5: Improving model performance using Ripper —-

mushroom_JRip <- JRip(type ~ ., data = mushrooms_train)
mushroom_JRip
JRIP rules:
===========

(odor = foul) => type=poisonous (1860.0/0.0)
(gill_size = narrow) and (gill_color = buff) => type=poisonous (986.0/0.0)
(gill_size = narrow) and (odor = pungent) => type=poisonous (222.0/0.0)
(odor = creosote) => type=poisonous (171.0/0.0)
(spore_print_color = green) => type=poisonous (65.0/0.0)
(stalk_surface_below_ring = scaly) and (stalk_surface_above_ring = silky) => type=poisonous (58.0/0.0)
(habitat = leaves) and (cap_surface = scaly) and (population = clustered) => type=poisonous (10.0/0.0)
(cap_surface = grooves) => type=poisonous (2.0/0.0)
 => type=edible (3626.0/0.0)

Number of Rules : 9
summary(mushroom_JRip)

=== Summary ===

Correctly Classified Instances        7000              100      %
Incorrectly Classified Instances         0                0      %
Kappa statistic                          1     
Mean absolute error                      0     
Root mean squared error                  0     
Relative absolute error                  0      %
Root relative squared error              0      %
Total Number of Instances             7000     

=== Confusion Matrix ===

    a    b   <-- classified as
 3626    0 |    a = edible
    0 3374 |    b = poisonous
mushroom_pred <- predict(mushroom_JRip, mushrooms_test)
mushroom_pred
   [1] edible    poisonous edible    edible   
   [5] edible    edible    edible    edible   
   [9] edible    edible    poisonous edible   
  [13] edible    edible    poisonous poisonous
  [17] edible    edible    edible    edible   
  [21] edible    poisonous edible    edible   
  [25] edible    edible    edible    edible   
  [29] edible    edible    edible    edible   
  [33] edible    poisonous edible    edible   
  [37] edible    edible    edible    edible   
  [41] edible    edible    edible    edible   
  [45] edible    edible    edible    poisonous
  [49] edible    edible    edible    edible   
  [53] edible    edible    edible    edible   
  [57] edible    edible    poisonous edible   
  [61] edible    edible    poisonous edible   
  [65] edible    edible    edible    edible   
  [69] edible    edible    edible    edible   
  [73] edible    edible    edible    edible   
  [77] edible    edible    edible    edible   
  [81] edible    edible    edible    edible   
  [85] poisonous edible    edible    edible   
  [89] edible    edible    edible    edible   
  [93] edible    edible    edible    edible   
  [97] edible    poisonous edible    edible   
 [101] edible    poisonous edible    edible   
 [105] edible    poisonous edible    edible   
 [109] edible    edible    edible    edible   
 [113] edible    edible    edible    edible   
 [117] edible    edible    edible    edible   
 [121] edible    edible    edible    poisonous
 [125] edible    edible    poisonous edible   
 [129] edible    edible    edible    edible   
 [133] edible    edible    edible    edible   
 [137] poisonous edible    edible    edible   
 [141] poisonous edible    edible    poisonous
 [145] poisonous edible    edible    edible   
 [149] edible    edible    poisonous edible   
 [153] edible    edible    edible    edible   
 [157] edible    edible    edible    edible   
 [161] edible    edible    poisonous edible   
 [165] edible    edible    edible    edible   
 [169] edible    poisonous edible    edible   
 [173] edible    edible    edible    edible   
 [177] edible    edible    edible    poisonous
 [181] edible    edible    edible    edible   
 [185] edible    edible    edible    edible   
 [189] edible    poisonous edible    edible   
 [193] edible    edible    edible    edible   
 [197] edible    edible    edible    edible   
 [201] edible    edible    edible    poisonous
 [205] edible    edible    edible    edible   
 [209] edible    edible    poisonous edible   
 [213] poisonous edible    edible    edible   
 [217] edible    edible    edible    edible   
 [221] edible    edible    edible    edible   
 [225] edible    edible    edible    edible   
 [229] edible    edible    edible    poisonous
 [233] edible    edible    poisonous edible   
 [237] edible    edible    edible    edible   
 [241] edible    edible    edible    edible   
 [245] edible    edible    poisonous edible   
 [249] edible    edible    edible    edible   
 [253] edible    edible    poisonous edible   
 [257] edible    edible    edible    edible   
 [261] edible    edible    edible    edible   
 [265] edible    edible    edible    edible   
 [269] edible    edible    edible    edible   
 [273] edible    edible    edible    poisonous
 [277] poisonous edible    edible    edible   
 [281] edible    edible    edible    edible   
 [285] edible    edible    edible    edible   
 [289] poisonous edible    edible    edible   
 [293] edible    edible    edible    edible   
 [297] edible    edible    edible    edible   
 [301] edible    edible    edible    edible   
 [305] edible    edible    edible    edible   
 [309] edible    edible    edible    edible   
 [313] poisonous edible    edible    edible   
 [317] edible    edible    edible    edible   
 [321] edible    edible    edible    edible   
 [325] edible    edible    edible    edible   
 [329] edible    edible    edible    edible   
 [333] edible    edible    edible    edible   
 [337] edible    edible    edible    edible   
 [341] edible    edible    edible    edible   
 [345] edible    edible    edible    edible   
 [349] edible    edible    edible    edible   
 [353] edible    edible    edible    edible   
 [357] edible    edible    edible    edible   
 [361] edible    edible    edible    edible   
 [365] edible    edible    edible    edible   
 [369] edible    edible    edible    edible   
 [373] edible    edible    edible    edible   
 [377] edible    edible    edible    edible   
 [381] edible    edible    edible    edible   
 [385] edible    edible    edible    edible   
 [389] edible    edible    edible    edible   
 [393] edible    edible    edible    edible   
 [397] edible    edible    edible    poisonous
 [401] poisonous poisonous poisonous edible   
 [405] edible    poisonous edible    poisonous
 [409] poisonous edible    poisonous edible   
 [413] edible    edible    edible    edible   
 [417] edible    edible    poisonous edible   
 [421] edible    edible    poisonous poisonous
 [425] poisonous edible    edible    edible   
 [429] edible    poisonous edible    edible   
 [433] edible    poisonous edible    edible   
 [437] edible    edible    edible    edible   
 [441] edible    edible    poisonous poisonous
 [445] edible    edible    edible    poisonous
 [449] edible    edible    edible    poisonous
 [453] edible    edible    edible    edible   
 [457] poisonous edible    edible    poisonous
 [461] edible    poisonous poisonous edible   
 [465] poisonous edible    edible    edible   
 [469] edible    edible    edible    poisonous
 [473] edible    poisonous edible    poisonous
 [477] edible    edible    edible    poisonous
 [481] poisonous edible    edible    edible   
 [485] edible    edible    edible    poisonous
 [489] edible    edible    poisonous edible   
 [493] edible    edible    poisonous edible   
 [497] edible    edible    edible    edible   
 [501] edible    edible    poisonous poisonous
 [505] poisonous poisonous edible    edible   
 [509] poisonous edible    edible    poisonous
 [513] edible    poisonous edible    edible   
 [517] poisonous edible    poisonous edible   
 [521] poisonous poisonous edible    edible   
 [525] edible    edible    edible    poisonous
 [529] edible    edible    edible    edible   
 [533] edible    poisonous poisonous edible   
 [537] poisonous edible    edible    poisonous
 [541] edible    poisonous poisonous edible   
 [545] poisonous poisonous poisonous poisonous
 [549] poisonous poisonous poisonous poisonous
 [553] poisonous poisonous edible    poisonous
 [557] poisonous edible    poisonous poisonous
 [561] poisonous poisonous poisonous poisonous
 [565] poisonous poisonous poisonous poisonous
 [569] poisonous poisonous poisonous poisonous
 [573] poisonous poisonous poisonous poisonous
 [577] poisonous poisonous poisonous poisonous
 [581] poisonous edible    poisonous poisonous
 [585] poisonous poisonous poisonous poisonous
 [589] poisonous poisonous poisonous poisonous
 [593] edible    poisonous poisonous poisonous
 [597] poisonous poisonous poisonous poisonous
 [601] poisonous poisonous poisonous poisonous
 [605] poisonous poisonous poisonous poisonous
 [609] poisonous edible    poisonous poisonous
 [613] poisonous poisonous poisonous poisonous
 [617] poisonous poisonous poisonous poisonous
 [621] poisonous poisonous poisonous edible   
 [625] poisonous edible    poisonous poisonous
 [629] poisonous poisonous poisonous poisonous
 [633] poisonous poisonous poisonous poisonous
 [637] poisonous poisonous edible    poisonous
 [641] poisonous poisonous poisonous poisonous
 [645] poisonous edible    poisonous poisonous
 [649] poisonous edible    poisonous poisonous
 [653] poisonous poisonous poisonous poisonous
 [657] poisonous poisonous poisonous poisonous
 [661] edible    edible    poisonous poisonous
 [665] poisonous poisonous poisonous poisonous
 [669] poisonous poisonous poisonous poisonous
 [673] poisonous edible    poisonous edible   
 [677] poisonous edible    poisonous poisonous
 [681] poisonous poisonous poisonous edible   
 [685] poisonous poisonous poisonous poisonous
 [689] poisonous poisonous poisonous poisonous
 [693] edible    poisonous poisonous poisonous
 [697] poisonous poisonous poisonous poisonous
 [701] poisonous poisonous poisonous edible   
 [705] poisonous edible    edible    poisonous
 [709] poisonous edible    edible    poisonous
 [713] poisonous poisonous edible    poisonous
 [717] poisonous poisonous poisonous poisonous
 [721] poisonous poisonous edible    edible   
 [725] edible    edible    edible    poisonous
 [729] poisonous poisonous edible    poisonous
 [733] edible    poisonous poisonous poisonous
 [737] poisonous edible    poisonous poisonous
 [741] poisonous edible    poisonous edible   
 [745] poisonous edible    poisonous poisonous
 [749] poisonous edible    poisonous poisonous
 [753] edible    edible    poisonous edible   
 [757] poisonous poisonous poisonous edible   
 [761] poisonous edible    poisonous poisonous
 [765] poisonous poisonous poisonous edible   
 [769] poisonous poisonous poisonous edible   
 [773] poisonous poisonous poisonous poisonous
 [777] edible    edible    poisonous edible   
 [781] poisonous edible    poisonous poisonous
 [785] poisonous poisonous poisonous poisonous
 [789] poisonous poisonous poisonous poisonous
 [793] poisonous edible    poisonous poisonous
 [797] edible    edible    edible    poisonous
 [801] poisonous poisonous poisonous poisonous
 [805] poisonous poisonous poisonous poisonous
 [809] poisonous poisonous poisonous poisonous
 [813] poisonous poisonous poisonous poisonous
 [817] poisonous poisonous poisonous poisonous
 [821] edible    poisonous poisonous poisonous
 [825] poisonous poisonous poisonous poisonous
 [829] poisonous poisonous poisonous poisonous
 [833] poisonous poisonous poisonous poisonous
 [837] poisonous poisonous poisonous poisonous
 [841] poisonous poisonous poisonous poisonous
 [845] poisonous poisonous poisonous poisonous
 [849] poisonous poisonous poisonous poisonous
 [853] poisonous poisonous poisonous poisonous
 [857] poisonous poisonous poisonous poisonous
 [861] poisonous poisonous poisonous poisonous
 [865] poisonous poisonous poisonous poisonous
 [869] poisonous edible    poisonous poisonous
 [873] poisonous poisonous poisonous poisonous
 [877] poisonous poisonous poisonous poisonous
 [881] poisonous poisonous edible    poisonous
 [885] poisonous poisonous poisonous poisonous
 [889] poisonous poisonous poisonous poisonous
 [893] poisonous poisonous poisonous poisonous
 [897] poisonous edible    poisonous poisonous
 [901] poisonous poisonous poisonous poisonous
 [905] poisonous poisonous poisonous poisonous
 [909] poisonous poisonous poisonous poisonous
 [913] poisonous poisonous poisonous poisonous
 [917] poisonous poisonous poisonous poisonous
 [921] poisonous poisonous poisonous poisonous
 [925] poisonous poisonous poisonous poisonous
 [929] poisonous poisonous poisonous poisonous
 [933] poisonous poisonous poisonous poisonous
 [937] poisonous poisonous poisonous poisonous
 [941] poisonous poisonous poisonous poisonous
 [945] poisonous poisonous poisonous poisonous
 [949] poisonous edible    edible    poisonous
 [953] poisonous poisonous poisonous edible   
 [957] poisonous poisonous poisonous poisonous
 [961] poisonous poisonous poisonous edible   
 [965] poisonous poisonous poisonous poisonous
 [969] poisonous edible    edible    edible   
 [973] poisonous edible    edible    poisonous
 [977] poisonous poisonous poisonous poisonous
 [981] poisonous edible    poisonous edible   
 [985] poisonous edible    poisonous edible   
 [989] poisonous poisonous edible    poisonous
 [993] edible    poisonous poisonous edible   
 [997] poisonous poisonous edible    edible   
 [ reached getOption("max.print") -- omitted 124 entries ]
Levels: edible poisonous

From the summary, the accuracy is 100%

cross tabulation of predicted versus actual classes

library(gmodels)
CrossTable(mushrooms_test$type, mushroom_pred,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))

 
   Cell Contents
|-------------------------|
|                       N |
|         N / Table Total |
|-------------------------|

 
Total Observations in Table:  1124 

 
               | predicted default 
actual default |    edible | poisonous | Row Total | 
---------------|-----------|-----------|-----------|
        edible |       582 |         0 |       582 | 
               |     0.518 |     0.000 |           | 
---------------|-----------|-----------|-----------|
     poisonous |         0 |       542 |       542 | 
               |     0.000 |     0.482 |           | 
---------------|-----------|-----------|-----------|
  Column Total |       582 |       542 |      1124 | 
---------------|-----------|-----------|-----------|

 

Accuracy of Ripper=(582+542)/1124=100%

Rule Learner Using C5.0 Decision Trees (not in text)

library(C50)
mushroom_c5rules <- C5.0(type ~ odor + gill_size, data = mushrooms_train, rules = TRUE)
mushroom_c5rules

Call:
C5.0.formula(formula = type ~ odor + gill_size,
 data = mushrooms_train, rules = TRUE)

Rule-Based Model
Number of samples: 7000 
Number of predictors: 2 

Number of Rules: 2 

Non-standard options: attempt to group attributes
summary(mushroom_c5rules)

Call:
C5.0.formula(formula = type ~ odor + gill_size,
 data = mushrooms_train, rules = TRUE)


C5.0 [Release 2.07 GPL Edition]     Sun Apr 30 04:36:11 2017
-------------------------------

Class specified by attribute `outcome'

Read 7000 cases (3 attributes) from undefined.data

Rules:

Rule 1: (3731/105, lift 1.9)
    odor in {almond, anise, none}
    ->  class edible  [0.972]

Rule 2: (3269, lift 2.1)
    odor in {creosote, fishy, foul, musty, pungent, spicy}
    ->  class poisonous  [1.000]

Default class: edible


Evaluation on training data (7000 cases):

            Rules     
      ----------------
        No      Errors

         2  105( 1.5%)   <<


       (a)   (b)    <-classified as
      ----  ----
      3626          (a): class edible
       105  3269    (b): class poisonous


    Attribute usage:

    100.00% odor


Time: 0.0 secs
mushroom_pred <- predict(mushroom_c5rules, mushrooms_test)
mushroom_pred
   [1] edible    poisonous edible    edible   
   [5] edible    edible    edible    edible   
   [9] edible    edible    poisonous edible   
  [13] edible    edible    poisonous poisonous
  [17] edible    edible    edible    edible   
  [21] edible    poisonous edible    edible   
  [25] edible    edible    edible    edible   
  [29] edible    edible    edible    edible   
  [33] edible    poisonous edible    edible   
  [37] edible    edible    edible    edible   
  [41] edible    edible    edible    edible   
  [45] edible    edible    edible    poisonous
  [49] edible    edible    edible    edible   
  [53] edible    edible    edible    edible   
  [57] edible    edible    poisonous edible   
  [61] edible    edible    poisonous edible   
  [65] edible    edible    edible    edible   
  [69] edible    edible    edible    edible   
  [73] edible    edible    edible    edible   
  [77] edible    edible    edible    edible   
  [81] edible    edible    edible    edible   
  [85] poisonous edible    edible    edible   
  [89] edible    edible    edible    edible   
  [93] edible    edible    edible    edible   
  [97] edible    poisonous edible    edible   
 [101] edible    poisonous edible    edible   
 [105] edible    poisonous edible    edible   
 [109] edible    edible    edible    edible   
 [113] edible    edible    edible    edible   
 [117] edible    edible    edible    edible   
 [121] edible    edible    edible    poisonous
 [125] edible    edible    poisonous edible   
 [129] edible    edible    edible    edible   
 [133] edible    edible    edible    edible   
 [137] poisonous edible    edible    edible   
 [141] poisonous edible    edible    poisonous
 [145] poisonous edible    edible    edible   
 [149] edible    edible    poisonous edible   
 [153] edible    edible    edible    edible   
 [157] edible    edible    edible    edible   
 [161] edible    edible    poisonous edible   
 [165] edible    edible    edible    edible   
 [169] edible    poisonous edible    edible   
 [173] edible    edible    edible    edible   
 [177] edible    edible    edible    poisonous
 [181] edible    edible    edible    edible   
 [185] edible    edible    edible    edible   
 [189] edible    poisonous edible    edible   
 [193] edible    edible    edible    edible   
 [197] edible    edible    edible    edible   
 [201] edible    edible    edible    poisonous
 [205] edible    edible    edible    edible   
 [209] edible    edible    poisonous edible   
 [213] poisonous edible    edible    edible   
 [217] edible    edible    edible    edible   
 [221] edible    edible    edible    edible   
 [225] edible    edible    edible    edible   
 [229] edible    edible    edible    poisonous
 [233] edible    edible    poisonous edible   
 [237] edible    edible    edible    edible   
 [241] edible    edible    edible    edible   
 [245] edible    edible    poisonous edible   
 [249] edible    edible    edible    edible   
 [253] edible    edible    poisonous edible   
 [257] edible    edible    edible    edible   
 [261] edible    edible    edible    edible   
 [265] edible    edible    edible    edible   
 [269] edible    edible    edible    edible   
 [273] edible    edible    edible    poisonous
 [277] poisonous edible    edible    edible   
 [281] edible    edible    edible    edible   
 [285] edible    edible    edible    edible   
 [289] poisonous edible    edible    edible   
 [293] edible    edible    edible    edible   
 [297] edible    edible    edible    edible   
 [301] edible    edible    edible    edible   
 [305] edible    edible    edible    edible   
 [309] edible    edible    edible    edible   
 [313] poisonous edible    edible    edible   
 [317] edible    edible    edible    edible   
 [321] edible    edible    edible    edible   
 [325] edible    edible    edible    edible   
 [329] edible    edible    edible    edible   
 [333] edible    edible    edible    edible   
 [337] edible    edible    edible    edible   
 [341] edible    edible    edible    edible   
 [345] edible    edible    edible    edible   
 [349] edible    edible    edible    edible   
 [353] edible    edible    edible    edible   
 [357] edible    edible    edible    edible   
 [361] edible    edible    edible    edible   
 [365] edible    edible    edible    edible   
 [369] edible    edible    edible    edible   
 [373] edible    edible    edible    edible   
 [377] edible    edible    edible    edible   
 [381] edible    edible    edible    edible   
 [385] edible    edible    edible    edible   
 [389] edible    edible    edible    edible   
 [393] edible    edible    edible    edible   
 [397] edible    edible    edible    poisonous
 [401] poisonous poisonous poisonous edible   
 [405] edible    poisonous edible    poisonous
 [409] poisonous edible    poisonous edible   
 [413] edible    edible    edible    edible   
 [417] edible    edible    poisonous edible   
 [421] edible    edible    poisonous poisonous
 [425] poisonous edible    edible    edible   
 [429] edible    poisonous edible    edible   
 [433] edible    poisonous edible    edible   
 [437] edible    edible    edible    edible   
 [441] edible    edible    poisonous poisonous
 [445] edible    edible    edible    poisonous
 [449] edible    edible    edible    poisonous
 [453] edible    edible    edible    edible   
 [457] poisonous edible    edible    poisonous
 [461] edible    poisonous poisonous edible   
 [465] poisonous edible    edible    edible   
 [469] edible    edible    edible    poisonous
 [473] edible    poisonous edible    poisonous
 [477] edible    edible    edible    poisonous
 [481] poisonous edible    edible    edible   
 [485] edible    edible    edible    poisonous
 [489] edible    edible    poisonous edible   
 [493] edible    edible    poisonous edible   
 [497] edible    edible    edible    edible   
 [501] edible    edible    poisonous poisonous
 [505] poisonous poisonous edible    edible   
 [509] poisonous edible    edible    poisonous
 [513] edible    poisonous edible    edible   
 [517] poisonous edible    poisonous edible   
 [521] poisonous poisonous edible    edible   
 [525] edible    edible    edible    poisonous
 [529] edible    edible    edible    edible   
 [533] edible    poisonous poisonous edible   
 [537] poisonous edible    edible    poisonous
 [541] edible    poisonous poisonous edible   
 [545] poisonous poisonous poisonous poisonous
 [549] poisonous poisonous poisonous poisonous
 [553] poisonous poisonous edible    poisonous
 [557] poisonous edible    poisonous poisonous
 [561] poisonous poisonous poisonous poisonous
 [565] poisonous poisonous poisonous poisonous
 [569] poisonous poisonous poisonous poisonous
 [573] poisonous poisonous poisonous poisonous
 [577] poisonous poisonous poisonous poisonous
 [581] poisonous edible    poisonous poisonous
 [585] poisonous poisonous poisonous poisonous
 [589] poisonous poisonous poisonous poisonous
 [593] edible    poisonous poisonous poisonous
 [597] poisonous poisonous poisonous poisonous
 [601] poisonous poisonous poisonous poisonous
 [605] poisonous poisonous poisonous poisonous
 [609] poisonous edible    poisonous poisonous
 [613] poisonous poisonous poisonous poisonous
 [617] poisonous poisonous poisonous poisonous
 [621] poisonous poisonous poisonous edible   
 [625] poisonous edible    poisonous poisonous
 [629] poisonous poisonous poisonous poisonous
 [633] poisonous poisonous poisonous poisonous
 [637] poisonous poisonous edible    poisonous
 [641] poisonous poisonous poisonous poisonous
 [645] poisonous edible    poisonous poisonous
 [649] poisonous edible    poisonous poisonous
 [653] poisonous poisonous poisonous poisonous
 [657] poisonous poisonous poisonous poisonous
 [661] edible    edible    poisonous poisonous
 [665] poisonous poisonous poisonous poisonous
 [669] poisonous poisonous poisonous poisonous
 [673] poisonous edible    poisonous edible   
 [677] poisonous edible    edible    poisonous
 [681] edible    poisonous poisonous edible   
 [685] poisonous poisonous poisonous poisonous
 [689] edible    poisonous poisonous poisonous
 [693] edible    poisonous poisonous poisonous
 [697] poisonous poisonous poisonous poisonous
 [701] poisonous poisonous poisonous edible   
 [705] poisonous edible    edible    poisonous
 [709] poisonous edible    edible    poisonous
 [713] poisonous poisonous edible    poisonous
 [717] poisonous edible    poisonous poisonous
 [721] poisonous poisonous edible    edible   
 [725] edible    edible    edible    edible   
 [729] poisonous poisonous edible    edible   
 [733] edible    poisonous poisonous edible   
 [737] poisonous edible    poisonous poisonous
 [741] poisonous edible    poisonous edible   
 [745] poisonous edible    poisonous poisonous
 [749] edible    edible    poisonous poisonous
 [753] edible    edible    edible    edible   
 [757] poisonous edible    poisonous edible   
 [761] poisonous edible    poisonous poisonous
 [765] poisonous poisonous poisonous edible   
 [769] poisonous poisonous poisonous edible   
 [773] edible    poisonous poisonous poisonous
 [777] edible    edible    poisonous edible   
 [781] poisonous edible    poisonous poisonous
 [785] edible    poisonous edible    poisonous
 [789] poisonous poisonous poisonous poisonous
 [793] poisonous edible    poisonous poisonous
 [797] edible    edible    edible    poisonous
 [801] poisonous poisonous poisonous poisonous
 [805] poisonous poisonous poisonous poisonous
 [809] poisonous poisonous poisonous poisonous
 [813] poisonous poisonous poisonous poisonous
 [817] poisonous poisonous poisonous poisonous
 [821] edible    poisonous poisonous poisonous
 [825] poisonous poisonous poisonous poisonous
 [829] poisonous poisonous poisonous poisonous
 [833] poisonous poisonous poisonous poisonous
 [837] poisonous poisonous poisonous poisonous
 [841] poisonous poisonous poisonous poisonous
 [845] poisonous poisonous poisonous poisonous
 [849] poisonous poisonous poisonous poisonous
 [853] poisonous poisonous poisonous poisonous
 [857] poisonous poisonous poisonous poisonous
 [861] poisonous poisonous poisonous poisonous
 [865] poisonous poisonous poisonous poisonous
 [869] poisonous edible    poisonous poisonous
 [873] poisonous poisonous poisonous poisonous
 [877] poisonous poisonous poisonous poisonous
 [881] poisonous poisonous edible    poisonous
 [885] poisonous poisonous poisonous poisonous
 [889] poisonous poisonous poisonous poisonous
 [893] poisonous poisonous poisonous poisonous
 [897] poisonous edible    poisonous poisonous
 [901] poisonous poisonous poisonous poisonous
 [905] poisonous poisonous poisonous poisonous
 [909] poisonous poisonous poisonous poisonous
 [913] poisonous poisonous poisonous poisonous
 [917] poisonous poisonous poisonous poisonous
 [921] poisonous poisonous poisonous poisonous
 [925] poisonous poisonous poisonous poisonous
 [929] poisonous poisonous poisonous poisonous
 [933] poisonous poisonous poisonous poisonous
 [937] poisonous poisonous poisonous poisonous
 [941] poisonous poisonous poisonous poisonous
 [945] poisonous poisonous poisonous poisonous
 [949] poisonous edible    edible    poisonous
 [953] poisonous poisonous poisonous edible   
 [957] poisonous poisonous poisonous poisonous
 [961] poisonous poisonous poisonous edible   
 [965] poisonous poisonous poisonous poisonous
 [969] poisonous edible    edible    edible   
 [973] poisonous edible    edible    poisonous
 [977] poisonous poisonous poisonous poisonous
 [981] poisonous edible    poisonous edible   
 [985] poisonous edible    poisonous edible   
 [989] poisonous poisonous edible    poisonous
 [993] edible    poisonous poisonous edible   
 [997] poisonous poisonous edible    edible   
 [ reached getOption("max.print") -- omitted 124 entries ]
Levels: edible poisonous

Accuracy of C50=(3626+3269)/7000=98.5% This is same as OneR.

cross tabulation of predicted versus actual classes

library(gmodels)
CrossTable(mushrooms_test$type, mushroom_pred,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))

 
   Cell Contents
|-------------------------|
|                       N |
|         N / Table Total |
|-------------------------|

 
Total Observations in Table:  1124 

 
               | predicted default 
actual default |    edible | poisonous | Row Total | 
---------------|-----------|-----------|-----------|
        edible |       582 |         0 |       582 | 
               |     0.518 |     0.000 |           | 
---------------|-----------|-----------|-----------|
     poisonous |        15 |       527 |       542 | 
               |     0.013 |     0.469 |           | 
---------------|-----------|-----------|-----------|
  Column Total |       597 |       527 |      1124 | 
---------------|-----------|-----------|-----------|

 

Accuracy of C50=(582+527)/1124=98.67 This is also same with OneR

LS0tDQp0aXRsZTogIklkZW50aWZ5IHBvaXNvbm91cyBtdXNocm9vbXMgd2l0aCBydWxlIGxlYXJuZXJzIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQNCi0tLQ0KDQojI1N0ZXAgMTpjb2xsZWN0aW5nIGRhdGEtLS0tDQpUbyBpZGVudGlmeSBydWxlcyBmb3IgZGlzdGluZ3Vpc2hpbmcgcG9pc29ub3VzIG11c2hyb29tcywgd2Ugd2lsbCB1dGlsaXplIHRoZSBNdXNocm9vbSBkYXRhc2V0IGJ5IEplZmYgU2NobGltbWVyIG9mIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5LiBUaGUgcmF3IGRhdGFzZXQgaXMgYXZhaWxhYmxlIGZyZWVseSBhdCB0aGUgVUNJIE1hY2hpbmUgTGVhcm5pbmcgUmVwb3NpdG9yeSAoaHR0cDovL2FyY2hpdmUuaWNzLnVjaS5lZHUvbWwpLlRoZSBkYXRhc2V0IGluY2x1ZGVzIGluZm9ybWF0aW9uIG9uIDgsMTI0IG11c2hyb29tIHNhbXBsZXMgZnJvbSAyMyBzcGVjaWVzIG9mDQpnaWxsZWQgbXVzaHJvb21zIGxpc3RlZCBpbiBBdWR1Ym9uIFNvY2lldHkgRmllbGQgR3VpZGUgdG8gTm9ydGggQW1lcmljYW4gTXVzaHJvb21zKDE5ODEpLiBJbiB0aGUgRmllbGQgR3VpZGUsIGVhY2ggb2YgdGhlIG11c2hyb29tIHNwZWNpZXMgaXMgaWRlbnRpZmllZCAiZGVmaW5pdGVseSBlZGlibGUsIiAiZGVmaW5pdGVseSBwb2lzb25vdXMsIiBvciAibGlrZWx5IHBvaXNvbm91cywgYW5kIG5vdCByZWNvbW1lbmRlZCB0byBiZWVhdGVuLiIgRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRhdGFzZXQsIHRoZSBsYXR0ZXIgZ3JvdXAgd2FzIGNvbWJpbmVkIHdpdGggdGhlImRlZmluaXRlbHkgcG9pc29ub3VzIiBncm91cCB0byBtYWtlIHR3byBjbGFzc2VzOiBwb2lzb25vdXMgYW5kIG5vbnBvaXNvbm91cy5UaGUgZGF0YSBkaWN0aW9uYXJ5IGF2YWlsYWJsZSBvbiB0aGUgVUNJIHdlYnNpdGUgZGVzY3JpYmVzIHRoZSAyMiBmZWF0dXJlcyBvZiB0aGUgbXVzaHJvb20gc2FtcGxlcywgaW5jbHVkaW5nDQpjaGFyYWN0ZXJpc3RpY3Mgc3VjaCBhcyBjYXAgc2hhcGUsIGNhcCBjb2xvciwgb2RvciwgZ2lsbA0Kc2l6ZSBhbmQgY29sb3IsIHN0YWxrIHNoYXBlLCBhbmQgaGFiaXRhdC4NCg0KIyMgU3RlcDI6RXhwbG9yaW5nIGFuZCBwcmVwYXJpbmcgdGhlIGRhdGEgLS0tLQ0KYGBge3J9DQptdXNocm9vbXMgPC0gcmVhZC5jc3YoZmlsZT0ibXVzaHJvb21zLmNzdiIsc3RyaW5nc0FzRmFjdG9ycyA9IFRSVUUpDQpgYGANCiMgZXhhbWluZSB0aGUgc3RydWN0dXJlIG9mIHRoZSBkYXRhIGZyYW1lDQpgYGB7cn0NCnN0cihtdXNocm9vbXMpDQpgYGANCiMgZHJvcCB0aGUgdmVpbF90eXBlIGZlYXR1cmUgc2luY2UgYWxsIHZhbHVlcyBhcmUgdGhlIHNhbWUNCmBgYHtyfQ0KbXVzaHJvb21zJHZlaWxfdHlwZSA8LSBOVUxMDQpgYGANCiMgZXhhbWluZSB0aGUgY2xhc3MgZGlzdHJpYnV0aW9uDQpgYGB7cn0NCnRhYmxlKG11c2hyb29tcyR0eXBlKQ0KYGBgDQpgYGB7cn0NCnNldC5zZWVkKDEyMykNCg0KYGBgDQoNCg0KIyByYW5kb21seSBjaG9vc2UgNzAwMCBvdXQgb2YgODEyNCBzYW1wbGVzIGFzIHRyYWluIGRhdGEgc2V0IGFuZCBjaGVjayBzdHJ1Y3R1cmUgDQpgYGB7cn0NCnNldC5zZWVkKDEyMykNCnRyYWluX3NhbXBsZSA8LSBzYW1wbGUoODEyNCwgNzAwMCkNCg0Kc3RyKHRyYWluX3NhbXBsZSkNCmBgYA0KDQojIHNwbGl0IGRhdGEgZnJhbWVzIHRvIHRyYWluIGFuZCB0ZXN0IGRhdCBzZXRzDQpgYGB7cn0NCm11c2hyb29tc190cmFpbiA8LSBtdXNocm9vbXNbdHJhaW5fc2FtcGxlLCBdDQptdXNocm9vbXNfdGVzdCAgPC0gbXVzaHJvb21zWy10cmFpbl9zYW1wbGUsIF0NCmBgYA0KDQoNCiMjIFN0ZXAgMzogVHJhaW5pbmcgYSBtb2RlbCBvbiB0aGUgZGF0YSAtLS0tDQpgYGB7cn0NCmxpYnJhcnkoUldla2EpDQpgYGANCiMgdHJhaW4gT25lUigpIG9uIHRoZSBkYXRhDQpgYGB7cn0NCm11c2hyb29tXzFSIDwtIE9uZVIodHlwZSB+IC4sIGRhdGEgPSBtdXNocm9vbXNfdHJhaW4pDQpgYGANCiMjIFN0ZXAgNDogRXZhbHVhdGluZyBtb2RlbCBwZXJmb3JtYW5jZSAtLS0tDQpgYGB7cn0NCm11c2hyb29tXzFSDQpzdW1tYXJ5KG11c2hyb29tXzFSKQ0KDQptdXNocm9vbV9wcmVkIDwtIHByZWRpY3QobXVzaHJvb21fMVIsIG11c2hyb29tc190ZXN0KQ0KbXVzaHJvb21fcHJlZA0KYGBgDQojIEFjY3VyYWN5IG9mIDFSPSgzNjI2KzMyNjkpLzcwMDA9OTguNSUNCg0KIyBjcm9zcyB0YWJ1bGF0aW9uIG9mIHByZWRpY3RlZCB2ZXJzdXMgYWN0dWFsIGNsYXNzZXMNCmBgYHtyfQ0KbGlicmFyeShnbW9kZWxzKQ0KQ3Jvc3NUYWJsZShtdXNocm9vbXNfdGVzdCR0eXBlLCBtdXNocm9vbV9wcmVkLA0KICAgICAgICAgICBwcm9wLmNoaXNxID0gRkFMU0UsIHByb3AuYyA9IEZBTFNFLCBwcm9wLnIgPSBGQUxTRSwNCiAgICAgICAgICAgZG5uID0gYygnYWN0dWFsIGRlZmF1bHQnLCAncHJlZGljdGVkIGRlZmF1bHQnKSkNCg0KYGBgDQojIEFjY3VyYWN5PSg1ODIrNTI3KS8xMTI0PTk4LjY3JQ0KDQojIyBTdGVwIDU6IEltcHJvdmluZyBtb2RlbCBwZXJmb3JtYW5jZSB1c2luZyBSaXBwZXIgLS0tLQ0KYGBge3J9DQptdXNocm9vbV9KUmlwIDwtIEpSaXAodHlwZSB+IC4sIGRhdGEgPSBtdXNocm9vbXNfdHJhaW4pDQptdXNocm9vbV9KUmlwDQpzdW1tYXJ5KG11c2hyb29tX0pSaXApDQoNCm11c2hyb29tX3ByZWQgPC0gcHJlZGljdChtdXNocm9vbV9KUmlwLCBtdXNocm9vbXNfdGVzdCkNCm11c2hyb29tX3ByZWQNCmBgYA0KIyBGcm9tIHRoZSBzdW1tYXJ5LCB0aGUgYWNjdXJhY3kgaXMgMTAwJQ0KDQojIGNyb3NzIHRhYnVsYXRpb24gb2YgcHJlZGljdGVkIHZlcnN1cyBhY3R1YWwgY2xhc3Nlcw0KYGBge3J9DQpsaWJyYXJ5KGdtb2RlbHMpDQpDcm9zc1RhYmxlKG11c2hyb29tc190ZXN0JHR5cGUsIG11c2hyb29tX3ByZWQsDQogICAgICAgICAgIHByb3AuY2hpc3EgPSBGQUxTRSwgcHJvcC5jID0gRkFMU0UsIHByb3AuciA9IEZBTFNFLA0KICAgICAgICAgICBkbm4gPSBjKCdhY3R1YWwgZGVmYXVsdCcsICdwcmVkaWN0ZWQgZGVmYXVsdCcpKQ0KDQoNCmBgYA0KQWNjdXJhY3kgb2YgUmlwcGVyPSg1ODIrNTQyKS8xMTI0PTEwMCUNCg0KIyBSdWxlIExlYXJuZXIgVXNpbmcgQzUuMCBEZWNpc2lvbiBUcmVlcyAobm90IGluIHRleHQpDQpgYGB7cn0NCmxpYnJhcnkoQzUwKQ0KbXVzaHJvb21fYzVydWxlcyA8LSBDNS4wKHR5cGUgfiBvZG9yICsgZ2lsbF9zaXplLCBkYXRhID0gbXVzaHJvb21zX3RyYWluLCBydWxlcyA9IFRSVUUpDQptdXNocm9vbV9jNXJ1bGVzDQpzdW1tYXJ5KG11c2hyb29tX2M1cnVsZXMpDQoNCm11c2hyb29tX3ByZWQgPC0gcHJlZGljdChtdXNocm9vbV9jNXJ1bGVzLCBtdXNocm9vbXNfdGVzdCkNCm11c2hyb29tX3ByZWQNCmBgYA0KQWNjdXJhY3kgIG9mIEM1MD0oMzYyNiszMjY5KS83MDAwPTk4LjUlDQpUaGlzIGlzIHNhbWUgYXMgT25lUi4NCg0KIyBjcm9zcyB0YWJ1bGF0aW9uIG9mIHByZWRpY3RlZCB2ZXJzdXMgYWN0dWFsIGNsYXNzZXMNCmBgYHtyfQ0KbGlicmFyeShnbW9kZWxzKQ0KQ3Jvc3NUYWJsZShtdXNocm9vbXNfdGVzdCR0eXBlLCBtdXNocm9vbV9wcmVkLA0KICAgICAgICAgICBwcm9wLmNoaXNxID0gRkFMU0UsIHByb3AuYyA9IEZBTFNFLCBwcm9wLnIgPSBGQUxTRSwNCiAgICAgICAgICAgZG5uID0gYygnYWN0dWFsIGRlZmF1bHQnLCAncHJlZGljdGVkIGRlZmF1bHQnKSkNCg0KYGBgDQpBY2N1cmFjeSBvZiBDNTA9KDU4Mis1MjcpLzExMjQ9OTguNjcNClRoaXMgaXMgYWxzbyBzYW1lIHdpdGggT25lUg0K