How to Draw 2 Variable Decision Tree

What is a decision tree?

A decision tree is a tool that builds regression models in the shape of a tree structure. Decision trees take the shape of a graph that illustrates possible outcomes of different decisions based on a variety of parameters. Decision trees break the data down into smaller and smaller subsets, they are typically used for machine learning and data mining, and are based on machine learning algorithms. Decision trees are also referred to as recursive partitioning.

The Algorithm: How decision trees work

  • Decision trees are based on an algorithm called ID3 created by JR Quinlan
  • ID3 employs entropy and information gain to create a decsion tree
  • entropy: is a top-down process that partitons data into subsets that consist of homogeneous data points. If a sample is completely homogenous the entropy is zero, if the sample is completely divided entropy is one.
  • information gain: the decrease in entropy after the dataset is split on an attribute/parameter. Decision trees make splits based on which attributes generate the highest information gain, which results in the most homogenous subsets. Entropy values are calculated for every parameter that is entered into the tree model, for each decision, the parameter with the highest information gain is selected. Then the process is repeated.

Decision Tree Components

Decision trees are made up to two parts: nodes and leaves.

  • Nodes: represent a decision test, examine a single variable and move to another node based on the outcome
  • Leaves: represent the outcome of the decision.

What can I do with a decision tree?

Decision trees are useful to make various predictions. For example, to predict if an email is SPAM or not, to predict health outcomes, to predict what group an individual belongs to based on a variety of factors that are specified in the decision tree model.

ADVANTAGES

  • simple to understand and interpret
  • help determine the expected outcomes of various scenarios
  • help determine best and worst values for different scenarios
  • can be combined with other decision techniques
  • require a relatively low degree of data preparation
  • can accommodate missing data
  • low sensitivity to outliers
  • low impact of nonlinear relationships between parameters
  • can handle both categorical and numeric variables
  • can translate the decision tree results into "decision rules"

DISADVANTAGES

  • for categorical variables, more levels of the variable creates more bias of the decision tree toward that variable
  • if the tree is over-fitted to the data, the results can be poor predictors

R Package: 'party'

The package we will use to create decision trees is called 'party'. Safe to say, you're going to have a good time creating decision trees.

To install the package, use the syntax below. We will also be using the packages plyr and readr for some data set structuring.

Install 'party'

install.packages("party")

              library(party) library(plyr) library(readr)            

The function: ctree()

To create decision trees, we will be using the function ctree() from the package 'party'. To get more information about the ctree() function you can use the syntax below.

              ?ctree()            

A BRIEF OVERVIEW OF ctree()

The function ctree() is used to create conditional inference trees. The main components of this function are formula and data. Other components include subset, weights, controls, xtrafo, ytrafo, and scores.

  • arguments
    • formula: refers to the the decision model we are using to make predicitions. Similarly to ANOVA and regression models in R, the formula will take the shape of outcome~factor1+factor2+...factor(n): where the outcome is the variable we are trying to predict, and each of the factors are the bases for the decision nodes.

    • data: tells the function which dataset to pull the variables listed in the model from.

    • subset: is an optional add on which specifies a subset of observations to be used in the fitting process. Should be used if you don't want to fit the model to the entire dataset.

    • weights: is an optional vector that provides weighted values that can be used in the model fitting process. Can only consist of non-negative integers.

  • basic syntax
    • ctree(formula, data)

An Example using ctree()

The Dataset: IRIS

For the example, we will be using the dataset from UCI machine learning database called iris.

ABOUT IRIS The iris dataset contains information about three different types of iris flowers: setosa iris, versicolor iris, and virginica iris. There are five variables included in the dataset: sepal.length, sepal.width, petal.length, petal.width, and class. Each entry in the data set represent a different iris flower: the length and width of the sepal and petals are listed for each flower along with the type, or class, of the iris. The sepal and petal refer to two different components of the iris flower each of which contribute to the the overall aesthetic of the flower. Using the syntax below, we will load the dataset iris from the UCI website and rename each of the columns to reflect each of the five variables.

Here are some helpful links to learn more about iris flowers!

  • pictures of different classes of iris flowers

  • pictures of iris flower features

READ-IN THE DATASET

              #first read in the dataset from the URL link - more info found in references section  iris <- read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data", col_names = FALSE)  #next, rename columns to represent the correct flower attribute  iris<-rename(iris, c("X1"="sepal.length", "X2"="sepal.width", "X3"="petal.length", "X4"="petal.width", "X5"="class"))  #change iris class into a factor  iris$class<-as.factor(iris$class)   #overall descriptives of the dataset  summary(iris)            
              ##   sepal.length    sepal.width     petal.length    petal.width    ##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100   ##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300   ##  Median :5.800   Median :3.000   Median :4.350   Median :1.300   ##  Mean   :5.843   Mean   :3.054   Mean   :3.759   Mean   :1.199   ##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800   ##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500   ##              class    ##  Iris-setosa    :50   ##  Iris-versicolor:50   ##  Iris-virginica :50   ##                       ##                       ##                          

As you can see from the summary of the dataset, we have 150 total observations: each class of iris has 50 observations each. Some basic descriptive statistics of each of the four flower dimensions is also listed.

Decision Trees using 1 variable

First we will create 4 different decision trees consisting of one variable to predict which class of iris a given iris belongs to.

TREE 1

Predicting iris class by sepal length

To see how well sepal length predicts which class of iris a flower is, we create the following decision tree.

                tree1<-ctree(class~sepal.length, data=iris) #set the model for the tree, predicting class by sepal length , data set being used is iris  plot(tree1) #view the decision tree              

Interpreting the decision tree

To understand what the decision tree is saying, we want to start with the root of the tree (the first decision node). Looking at the first decision node, we know that the variable that the decision is determined by is sepal.length. There are two leaves from this node: first if the sepal length is less than or equal to 5.4 then it drops down into the group of iris flowers.

This first group, indicated by the first graph on the left side, tells us that there are 52 flowers that have a sepal length less than or equal to 5.4. Of these 52 flowers, approximately 80% of them fall into the first class of iris which is setosa. about 15% fall into the second class which is versicolor, and the remaining fall into the virginica class. The y-axis represents the proportion of the total flowers in this group that correspond to each of the iris flower classes (setosa, versicolor, virginica).

Next, we move to the second node. Again, the variable that the decision is determined by is sepal.length. The two leaves here are less than or equal to 6.1 or greater than 6.1. If the flower has a sepal length that is less than or equal to 6.1, it falls into the second group. Looking at the second graph we can see that the majority of the 43 flowers in this group are of iris class versicolor.

Next, we move to the third node. Here if the sepal length is less than or equal to 7 the flower falls into the thrid group and if it's greater than 7 the flower falls into the fourth group. Looking at the third graph, there are 43 flowers in the third group and majority of these flowers are of class virginica, however, you can see that there are still a good amount of versicolor iris flowers in this group as well.

In the fourth and last group, there are the remaining 12 flowers. All of these flowers belong to the thrid class of iris: virginica.

Overall, the decision tree tells us that sertosa iris flowers tend to have shorter sepal length, versicolor iris flowers have mid-length sepals, and virginica iris flowers tend to have the longest sepal length.

TREE 2

Predicting iris class by sepal width

Now, let's see how well sepal width does at predicting iris class.

                tree2<-ctree(class~sepal.width, data=iris) plot(tree2)              

Looking at the decision tree, you can see that using sepal width creates three groups of flowers compared to sepal length that created four groups of flowers.

Here the results are much more mixed. Main conclusions would be that setosa iris tend to have wider sepals, versicolor tend to have more narrow sepals, and virginica have more variety in sepal width.

TREE 3

Predicting iris class by petal length

                tree3<-ctree(class~petal.length, data=iris) plot(tree3)              

TREE 4

Predicting iris class by petal width

                tree4<-ctree(class~petal.width, data=iris) plot(tree4)              

Decision Trees with 2 variables

TREE 5

Predicting iris class by sepal dimensions

                tree5<-ctree(class~sepal.length+sepal.width, data=iris) plot(tree5)              

TREE 6

Predicting iris class by petal dimensions

                tree6<-ctree(class~petal.length+petal.width, data=iris) plot(tree6)              

Decision Trees with all variables

TREE 7

Predicting iris class by sepal and petal dimensions

                tree7<-ctree(class~sepal.length + sepal.width + petal.length + petal.width, data=iris) plot(tree7)              

Here we have the decision tree that includes all four variables (sepal length, sepal width, petal length, and petal width) into the prediction model.

Notice that there are only two factors that are used in the decision nodes: Petal length and petal width. This tells us that these two factors are most important when distinguishing which type of iris class each flower belongs to. The factors sepal length and sepal width are not necessary to predict which class the flowers belong to.

This decision tree is identical to decision tree #6.

How to Avoid Overfitting the Decision Tree

There are two approaches to avoid overfitting a decision tree to your data.

  1. pre-pruning: prevents the tree from growing earlier, before the training data is perfectly classified

  2. post-trimming: or post-pruning, tree is perfectly classified then after the tree is created prune or trim the tree

Post-trimming is the most common approach because it's often difficult to estimate when to stop growing the tree. The important thing is to define the criteria which determines the correct final tree size.

  1. validation set: use a different data set, other than the training set, to evaluate the post-trimming nodes from the decision tree. Often the dataset is broken in to two datasets, the training set and the validation set. The decision tree is constructed on the training set, then any post-trimming is done on the validation set.

  2. statistical testing: create the decision tree using the training set, then apply statistical tests (error estimation or chi square) to determine if pruning a node or expanding a node produces an improvement beyond the training set. For more information on these statistical tests, see the "Overfitting Data" in the references and resources section.

LS0tDQp0aXRsZTogIkNoYXB0ZXIgMjQ6IERlY2lzaW9uIFRyZWVzIg0KYXV0aG9yOiAiS2VuZGFsIFdvbmciDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdGhlbWU6IGNlcnVsZWFuDQogICAgaGlnaGxpZ2h0OiB0ZXh0bWF0ZQ0KICAgIGZvbnRzaXplOiA4cHQNCiAgICB0b2M6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiBmYWxzZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCiMgV2hhdCBpcyBhIGRlY2lzaW9uIHRyZWU/DQoNCkEgZGVjaXNpb24gdHJlZSBpcyBhIHRvb2wgdGhhdCBidWlsZHMgcmVncmVzc2lvbiBtb2RlbHMgaW4gdGhlIHNoYXBlIG9mIGEgdHJlZSBzdHJ1Y3R1cmUuIERlY2lzaW9uIHRyZWVzIHRha2UgdGhlIHNoYXBlIG9mIGEgZ3JhcGggdGhhdCBpbGx1c3RyYXRlcyBwb3NzaWJsZSBvdXRjb21lcyBvZiBkaWZmZXJlbnQgZGVjaXNpb25zIGJhc2VkIG9uIGEgdmFyaWV0eSBvZiBwYXJhbWV0ZXJzLiBEZWNpc2lvbiB0cmVlcyBicmVhayB0aGUgZGF0YSBkb3duIGludG8gc21hbGxlciBhbmQgc21hbGxlciBzdWJzZXRzLCB0aGV5IGFyZSB0eXBpY2FsbHkgdXNlZCBmb3IgbWFjaGluZSBsZWFybmluZyBhbmQgZGF0YSBtaW5pbmcsIGFuZCBhcmUgYmFzZWQgb24gbWFjaGluZSBsZWFybmluZyBhbGdvcml0aG1zLiBEZWNpc2lvbiB0cmVlcyBhcmUgYWxzbyByZWZlcnJlZCB0byBhcyByZWN1cnNpdmUgcGFydGl0aW9uaW5nLiANCg0KKipUaGUgQWxnb3JpdGhtOiBIb3cgZGVjaXNpb24gdHJlZXMgd29yayoqDQoNCi0gRGVjaXNpb24gdHJlZXMgYXJlIGJhc2VkIG9uIGFuIGFsZ29yaXRobSBjYWxsZWQgSUQzIGNyZWF0ZWQgYnkgSlIgUXVpbmxhbg0KLSBJRDMgZW1wbG95cyBlbnRyb3B5IGFuZCBpbmZvcm1hdGlvbiBnYWluIHRvIGNyZWF0ZSBhIGRlY3Npb24gdHJlZSANCi0gKiplbnRyb3B5Kio6IGlzIGEgdG9wLWRvd24gcHJvY2VzcyB0aGF0IHBhcnRpdG9ucyBkYXRhIGludG8gc3Vic2V0cyB0aGF0IGNvbnNpc3Qgb2YgaG9tb2dlbmVvdXMgZGF0YSBwb2ludHMuIElmIGEgc2FtcGxlIGlzIGNvbXBsZXRlbHkgaG9tb2dlbm91cyB0aGUgZW50cm9weSBpcyB6ZXJvLCBpZiB0aGUgc2FtcGxlIGlzIGNvbXBsZXRlbHkgZGl2aWRlZCBlbnRyb3B5IGlzIG9uZS4gDQotICoqaW5mb3JtYXRpb24gZ2FpbioqOiB0aGUgZGVjcmVhc2UgaW4gZW50cm9weSBhZnRlciB0aGUgZGF0YXNldCBpcyBzcGxpdCBvbiBhbiBhdHRyaWJ1dGUvcGFyYW1ldGVyLiBEZWNpc2lvbiB0cmVlcyBtYWtlIHNwbGl0cyBiYXNlZCBvbiB3aGljaCBhdHRyaWJ1dGVzIGdlbmVyYXRlIHRoZSBoaWdoZXN0IGluZm9ybWF0aW9uIGdhaW4sIHdoaWNoIHJlc3VsdHMgaW4gdGhlIG1vc3QgaG9tb2dlbm91cyBzdWJzZXRzLiBFbnRyb3B5IHZhbHVlcyBhcmUgY2FsY3VsYXRlZCBmb3IgZXZlcnkgcGFyYW1ldGVyIHRoYXQgaXMgZW50ZXJlZCBpbnRvIHRoZSB0cmVlIG1vZGVsLCBmb3IgZWFjaCBkZWNpc2lvbiwgdGhlIHBhcmFtZXRlciB3aXRoIHRoZSBoaWdoZXN0IGluZm9ybWF0aW9uIGdhaW4gaXMgc2VsZWN0ZWQuIFRoZW4gdGhlIHByb2Nlc3MgaXMgcmVwZWF0ZWQuIA0KICANCioqRGVjaXNpb24gVHJlZSBDb21wb25lbnRzKioNCg0KRGVjaXNpb24gdHJlZXMgYXJlIG1hZGUgdXAgdG8gdHdvIHBhcnRzOiBub2RlcyBhbmQgbGVhdmVzLiANCg0KLSAqKk5vZGVzKio6IHJlcHJlc2VudCBhIGRlY2lzaW9uIHRlc3QsIGV4YW1pbmUgYSBzaW5nbGUgdmFyaWFibGUgYW5kIG1vdmUgdG8gYW5vdGhlciBub2RlIGJhc2VkIG9uIHRoZSBvdXRjb21lICANCi0gKipMZWF2ZXMqKjogcmVwcmVzZW50IHRoZSBvdXRjb21lIG9mIHRoZSBkZWNpc2lvbi4gDQoNCg0KKipXaGF0IGNhbiBJIGRvIHdpdGggYSBkZWNpc2lvbiB0cmVlPyoqDQoNCkRlY2lzaW9uIHRyZWVzIGFyZSB1c2VmdWwgdG8gbWFrZSB2YXJpb3VzIHByZWRpY3Rpb25zLiBGb3IgZXhhbXBsZSwgdG8gcHJlZGljdCBpZiBhbiBlbWFpbCBpcyBTUEFNIG9yIG5vdCwgdG8gcHJlZGljdCBoZWFsdGggb3V0Y29tZXMsIHRvIHByZWRpY3Qgd2hhdCBncm91cCBhbiBpbmRpdmlkdWFsIGJlbG9uZ3MgdG8gYmFzZWQgb24gYSB2YXJpZXR5IG9mIGZhY3RvcnMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRoZSBkZWNpc2lvbiB0cmVlIG1vZGVsLiANCg0KKipBRFZBTlRBR0VTKioNCg0KLSBzaW1wbGUgdG8gdW5kZXJzdGFuZCBhbmQgaW50ZXJwcmV0DQotIGhlbHAgZGV0ZXJtaW5lIHRoZSBleHBlY3RlZCBvdXRjb21lcyBvZiB2YXJpb3VzIHNjZW5hcmlvcyANCi0gaGVscCBkZXRlcm1pbmUgYmVzdCBhbmQgd29yc3QgdmFsdWVzIGZvciBkaWZmZXJlbnQgc2NlbmFyaW9zIA0KLSBjYW4gYmUgY29tYmluZWQgd2l0aCBvdGhlciBkZWNpc2lvbiB0ZWNobmlxdWVzIA0KLSByZXF1aXJlIGEgcmVsYXRpdmVseSBsb3cgZGVncmVlIG9mIGRhdGEgcHJlcGFyYXRpb24gDQotIGNhbiBhY2NvbW1vZGF0ZSBtaXNzaW5nIGRhdGENCi0gbG93IHNlbnNpdGl2aXR5IHRvIG91dGxpZXJzDQotIGxvdyBpbXBhY3Qgb2Ygbm9ubGluZWFyIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBwYXJhbWV0ZXJzIA0KLSBjYW4gaGFuZGxlIGJvdGggY2F0ZWdvcmljYWwgYW5kIG51bWVyaWMgdmFyaWFibGVzIA0KLSBjYW4gdHJhbnNsYXRlIHRoZSBkZWNpc2lvbiB0cmVlIHJlc3VsdHMgaW50byAiZGVjaXNpb24gcnVsZXMiDQoNCioqRElTQURWQU5UQUdFUyoqDQoNCi0gZm9yIGNhdGVnb3JpY2FsIHZhcmlhYmxlcywgbW9yZSBsZXZlbHMgb2YgdGhlIHZhcmlhYmxlIGNyZWF0ZXMgbW9yZSBiaWFzIG9mIHRoZSBkZWNpc2lvbiB0cmVlIHRvd2FyZCB0aGF0IHZhcmlhYmxlIA0KLSBpZiB0aGUgdHJlZSBpcyAqb3Zlci1maXR0ZWQqIHRvIHRoZSBkYXRhLCB0aGUgcmVzdWx0cyBjYW4gYmUgcG9vciBwcmVkaWN0b3JzIA0KDQojIFIgUGFja2FnZTogYCdwYXJ0eSdgDQpUaGUgcGFja2FnZSB3ZSB3aWxsIHVzZSB0byBjcmVhdGUgZGVjaXNpb24gdHJlZXMgaXMgY2FsbGVkIGAncGFydHknYC4gU2FmZSB0byBzYXksIHlvdSdyZSBnb2luZyB0byBoYXZlIGEgZ29vZCB0aW1lIGNyZWF0aW5nIGRlY2lzaW9uIHRyZWVzLiANCg0KVG8gaW5zdGFsbCB0aGUgcGFja2FnZSwgdXNlIHRoZSBzeW50YXggYmVsb3cuIFdlIHdpbGwgYWxzbyBiZSB1c2luZyB0aGUgcGFja2FnZXMgcGx5ciBhbmQgcmVhZHIgZm9yIHNvbWUgZGF0YSBzZXQgc3RydWN0dXJpbmcuIA0KDQojIyBJbnN0YWxsICdwYXJ0eScNCmBpbnN0YWxsLnBhY2thZ2VzKCJwYXJ0eSIpYA0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZWNobz1UUlVFfQ0KbGlicmFyeShwYXJ0eSkNCmxpYnJhcnkocGx5cikNCmxpYnJhcnkocmVhZHIpDQpgYGANCg0KIyMgVGhlIGZ1bmN0aW9uOiBgY3RyZWUoKWANClRvIGNyZWF0ZSBkZWNpc2lvbiB0cmVlcywgd2Ugd2lsbCBiZSB1c2luZyB0aGUgZnVuY3Rpb24gYGN0cmVlKClgIGZyb20gdGhlIHBhY2thZ2UgYCdwYXJ0eSdgLiBUbyBnZXQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYGN0cmVlKClgIGZ1bmN0aW9uIHlvdSBjYW4gdXNlIHRoZSBzeW50YXggYmVsb3cuIA0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZWNobz1UUlVFfQ0KP2N0cmVlKCkNCmBgYA0KDQoqKkEgQlJJRUYgT1ZFUlZJRVcgT0YgYGN0cmVlKClgICoqDQoNClRoZSBmdW5jdGlvbiBgY3RyZWUoKWAgaXMgdXNlZCB0byBjcmVhdGUgY29uZGl0aW9uYWwgaW5mZXJlbmNlIHRyZWVzLiBUaGUgbWFpbiBjb21wb25lbnRzIG9mIHRoaXMgZnVuY3Rpb24gYXJlIGZvcm11bGEgYW5kIGRhdGEuIE90aGVyIGNvbXBvbmVudHMgaW5jbHVkZSBzdWJzZXQsIHdlaWdodHMsIGNvbnRyb2xzLCB4dHJhZm8sIHl0cmFmbywgYW5kIHNjb3Jlcy4gDQoNCiogYXJndW1lbnRzIA0KICAgICsgKmZvcm11bGEqOiByZWZlcnMgdG8gdGhlIHRoZSBkZWNpc2lvbiBtb2RlbCB3ZSBhcmUgdXNpbmcgdG8gbWFrZSBwcmVkaWNpdGlvbnMuIFNpbWlsYXJseSB0byBBTk9WQSBhbmQgcmVncmVzc2lvbiBtb2RlbHMgaW4gUiwgdGhlIGZvcm11bGEgd2lsbCB0YWtlIHRoZSBzaGFwZSBvZiBgb3V0Y29tZX5mYWN0b3IxK2ZhY3RvcjIrLi4uZmFjdG9yKG4pYDogd2hlcmUgdGhlIG91dGNvbWUgaXMgdGhlIHZhcmlhYmxlIHdlIGFyZSB0cnlpbmcgdG8gcHJlZGljdCwgYW5kIGVhY2ggb2YgdGhlIGZhY3RvcnMgYXJlIHRoZSBiYXNlcyBmb3IgdGhlIGRlY2lzaW9uIG5vZGVzLiANCg0KICAgICsgKmRhdGEqOiB0ZWxscyB0aGUgZnVuY3Rpb24gd2hpY2ggZGF0YXNldCB0byBwdWxsIHRoZSB2YXJpYWJsZXMgbGlzdGVkIGluIHRoZSBtb2RlbCBmcm9tLiANCg0KICAgICsgKnN1YnNldCo6IGlzIGFuIG9wdGlvbmFsIGFkZCBvbiB3aGljaCBzcGVjaWZpZXMgYSBzdWJzZXQgb2Ygb2JzZXJ2YXRpb25zIHRvIGJlIHVzZWQgaW4gdGhlIGZpdHRpbmcgcHJvY2Vzcy4gU2hvdWxkIGJlIHVzZWQgaWYgeW91IGRvbid0IHdhbnQgdG8gZml0IHRoZSBtb2RlbCB0byB0aGUgZW50aXJlIGRhdGFzZXQuIA0KDQogICAgKyAqd2VpZ2h0cyo6IGlzIGFuIG9wdGlvbmFsIHZlY3RvciB0aGF0IHByb3ZpZGVzIHdlaWdodGVkIHZhbHVlcyB0aGF0IGNhbiBiZSB1c2VkIGluIHRoZSBtb2RlbCBmaXR0aW5nIHByb2Nlc3MuIENhbiBvbmx5IGNvbnNpc3Qgb2Ygbm9uLW5lZ2F0aXZlIGludGVnZXJzLiANCg0KKiBiYXNpYyBzeW50YXgNCiAgICArIGBjdHJlZShmb3JtdWxhLCBkYXRhKWANCg0KIyBBbiBFeGFtcGxlIHVzaW5nIGBjdHJlZSgpYA0KIyMgVGhlIERhdGFzZXQ6IElSSVMgDQoNCkZvciB0aGUgZXhhbXBsZSwgd2Ugd2lsbCBiZSB1c2luZyB0aGUgZGF0YXNldCBmcm9tIFVDSSBtYWNoaW5lIGxlYXJuaW5nIGRhdGFiYXNlIGNhbGxlZCBpcmlzLiANCg0KKipBQk9VVCBJUklTKioNClRoZSBpcmlzIGRhdGFzZXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhyZWUgZGlmZmVyZW50IHR5cGVzIG9mIGlyaXMgZmxvd2Vyczogc2V0b3NhIGlyaXMsIHZlcnNpY29sb3IgaXJpcywgYW5kIHZpcmdpbmljYSBpcmlzLiBUaGVyZSBhcmUgZml2ZSB2YXJpYWJsZXMgaW5jbHVkZWQgaW4gdGhlIGRhdGFzZXQ6IHNlcGFsLmxlbmd0aCwgc2VwYWwud2lkdGgsIHBldGFsLmxlbmd0aCwgcGV0YWwud2lkdGgsIGFuZCBjbGFzcy4gRWFjaCBlbnRyeSBpbiB0aGUgZGF0YSBzZXQgcmVwcmVzZW50IGEgZGlmZmVyZW50IGlyaXMgZmxvd2VyOiB0aGUgbGVuZ3RoIGFuZCB3aWR0aCBvZiB0aGUgc2VwYWwgYW5kIHBldGFscyBhcmUgbGlzdGVkIGZvciBlYWNoIGZsb3dlciBhbG9uZyB3aXRoIHRoZSB0eXBlLCBvciBjbGFzcywgb2YgdGhlIGlyaXMuIFRoZSBzZXBhbCBhbmQgcGV0YWwgcmVmZXIgdG8gdHdvIGRpZmZlcmVudCBjb21wb25lbnRzIG9mIHRoZSBpcmlzIGZsb3dlciBlYWNoIG9mIHdoaWNoIGNvbnRyaWJ1dGUgdG8gdGhlIHRoZSBvdmVyYWxsIGFlc3RoZXRpYyBvZiB0aGUgZmxvd2VyLiBVc2luZyB0aGUgc3ludGF4IGJlbG93LCB3ZSB3aWxsIGxvYWQgdGhlIGRhdGFzZXQgaXJpcyBmcm9tIHRoZSBVQ0kgd2Vic2l0ZSBhbmQgcmVuYW1lIGVhY2ggb2YgdGhlIGNvbHVtbnMgdG8gcmVmbGVjdCBlYWNoIG9mIHRoZSBmaXZlIHZhcmlhYmxlcy4gDQoNCkhlcmUgYXJlIHNvbWUgaGVscGZ1bCBsaW5rcyB0byBsZWFybiBtb3JlIGFib3V0IGlyaXMgZmxvd2VycyENCg0KKiBbcGljdHVyZXMgb2YgZGlmZmVyZW50IGNsYXNzZXMgb2YgaXJpcyBmbG93ZXJzXShodHRwczovL3d3dy5nb29nbGUuY29tL3NlYXJjaD9xPXNlcGFsK2lyaXMmZXNwdj0yJnRibT1pc2NoJnRibz11JnNvdXJjZT11bml2JnNhPVgmdmVkPTBhaFVLRXdqVjZPTHJoNHZUQWhWSDhJTUtIV3l1RDEwUXNBUUlKUSZiaXc9MTE3OCZiaWg9NTk0I3RibT1pc2NoJnE9c2V0b3NhK2lyaXMmKiZpbWdyYz1tTVJKeGVTd3JIQ1l3TTopDQoNCiogW3BpY3R1cmVzIG9mIGlyaXMgZmxvd2VyIGZlYXR1cmVzXShodHRwczovL3d3dy5nb29nbGUuY29tL3NlYXJjaD9xPXNlcGFsK2lyaXMmZXNwdj0yJnRibT1pc2NoJnRibz11JnNvdXJjZT11bml2JnNhPVgmdmVkPTBhaFVLRXdqVjZPTHJoNHZUQWhWSDhJTUtIV3l1RDEwUXNBUUlKUSZiaXc9MTE3OCZiaWg9NTk0I2ltZ3JjPUFJRUlNWDZkR1FOdUxNOikNCg0KKipSRUFELUlOIFRIRSBEQVRBU0VUKioNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVjaG89VFJVRX0NCiNmaXJzdCByZWFkIGluIHRoZSBkYXRhc2V0IGZyb20gdGhlIFVSTCBsaW5rIC0gbW9yZSBpbmZvIGZvdW5kIGluIHJlZmVyZW5jZXMgc2VjdGlvbiANCmlyaXMgPC0gcmVhZF9jc3YoImh0dHBzOi8vYXJjaGl2ZS5pY3MudWNpLmVkdS9tbC9tYWNoaW5lLWxlYXJuaW5nLWRhdGFiYXNlcy9pcmlzL2lyaXMuZGF0YSIsIGNvbF9uYW1lcyA9IEZBTFNFKQ0KDQojbmV4dCwgcmVuYW1lIGNvbHVtbnMgdG8gcmVwcmVzZW50IHRoZSBjb3JyZWN0IGZsb3dlciBhdHRyaWJ1dGUgDQppcmlzPC1yZW5hbWUoaXJpcywgYygiWDEiPSJzZXBhbC5sZW5ndGgiLCAiWDIiPSJzZXBhbC53aWR0aCIsICJYMyI9InBldGFsLmxlbmd0aCIsICJYNCI9InBldGFsLndpZHRoIiwgIlg1Ij0iY2xhc3MiKSkNCg0KI2NoYW5nZSBpcmlzIGNsYXNzIGludG8gYSBmYWN0b3IgDQppcmlzJGNsYXNzPC1hcy5mYWN0b3IoaXJpcyRjbGFzcykgDQoNCiNvdmVyYWxsIGRlc2NyaXB0aXZlcyBvZiB0aGUgZGF0YXNldCANCnN1bW1hcnkoaXJpcykNCmBgYA0KQXMgeW91IGNhbiBzZWUgZnJvbSB0aGUgc3VtbWFyeSBvZiB0aGUgZGF0YXNldCwgd2UgaGF2ZSAxNTAgdG90YWwgb2JzZXJ2YXRpb25zOiBlYWNoIGNsYXNzIG9mIGlyaXMgaGFzIDUwIG9ic2VydmF0aW9ucyBlYWNoLiBTb21lIGJhc2ljIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3Mgb2YgZWFjaCBvZiB0aGUgZm91ciBmbG93ZXIgZGltZW5zaW9ucyBpcyBhbHNvIGxpc3RlZC4gDQoNCiMjRGVjaXNpb24gVHJlZXMgdXNpbmcgMSB2YXJpYWJsZSANCg0KRmlyc3Qgd2Ugd2lsbCBjcmVhdGUgNCBkaWZmZXJlbnQgZGVjaXNpb24gdHJlZXMgY29uc2lzdGluZyBvZiBvbmUgdmFyaWFibGUgdG8gcHJlZGljdCB3aGljaCBjbGFzcyBvZiBpcmlzIGEgZ2l2ZW4gaXJpcyBiZWxvbmdzIHRvLiANCg0KIyMjIFRSRUUgMSANCioqUHJlZGljdGluZyBpcmlzIGNsYXNzIGJ5IHNlcGFsIGxlbmd0aCoqIA0KDQpUbyBzZWUgaG93IHdlbGwgc2VwYWwgbGVuZ3RoIHByZWRpY3RzIHdoaWNoIGNsYXNzIG9mIGlyaXMgYSBmbG93ZXIgaXMsIHdlIGNyZWF0ZSB0aGUgZm9sbG93aW5nIGRlY2lzaW9uIHRyZWUuIA0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZWNobz1UUlVFfQ0KDQp0cmVlMTwtY3RyZWUoY2xhc3N+c2VwYWwubGVuZ3RoLCBkYXRhPWlyaXMpICNzZXQgdGhlIG1vZGVsIGZvciB0aGUgdHJlZSwgcHJlZGljdGluZyBjbGFzcyBieSBzZXBhbCBsZW5ndGggLCBkYXRhIHNldCBiZWluZyB1c2VkIGlzIGlyaXMgDQpwbG90KHRyZWUxKSAjdmlldyB0aGUgZGVjaXNpb24gdHJlZQ0KYGBgDQoNCioqSW50ZXJwcmV0aW5nIHRoZSBkZWNpc2lvbiB0cmVlKioNCg0KVG8gdW5kZXJzdGFuZCB3aGF0IHRoZSBkZWNpc2lvbiB0cmVlIGlzIHNheWluZywgd2Ugd2FudCB0byBzdGFydCB3aXRoIHRoZSByb290IG9mIHRoZSB0cmVlICh0aGUgZmlyc3QgZGVjaXNpb24gbm9kZSkuIExvb2tpbmcgYXQgdGhlIGZpcnN0IGRlY2lzaW9uIG5vZGUsIHdlIGtub3cgdGhhdCB0aGUgdmFyaWFibGUgdGhhdCB0aGUgZGVjaXNpb24gaXMgZGV0ZXJtaW5lZCBieSBpcyBzZXBhbC5sZW5ndGguIFRoZXJlIGFyZSB0d28gbGVhdmVzIGZyb20gdGhpcyBub2RlOiBmaXJzdCBpZiB0aGUgc2VwYWwgbGVuZ3RoIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byA1LjQgdGhlbiBpdCBkcm9wcyBkb3duIGludG8gdGhlIGdyb3VwIG9mIGlyaXMgZmxvd2Vycy4gDQoNClRoaXMgZmlyc3QgZ3JvdXAsIGluZGljYXRlZCBieSB0aGUgZmlyc3QgZ3JhcGggb24gdGhlIGxlZnQgc2lkZSwgdGVsbHMgdXMgdGhhdCB0aGVyZSBhcmUgNTIgZmxvd2VycyB0aGF0IGhhdmUgYSBzZXBhbCBsZW5ndGggbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDUuNC4gT2YgdGhlc2UgNTIgZmxvd2VycywgYXBwcm94aW1hdGVseSA4MCUgb2YgdGhlbSBmYWxsIGludG8gdGhlIGZpcnN0IGNsYXNzIG9mIGlyaXMgd2hpY2ggaXMgc2V0b3NhLiBhYm91dCAxNSUgZmFsbCBpbnRvIHRoZSBzZWNvbmQgY2xhc3Mgd2hpY2ggaXMgdmVyc2ljb2xvciwgYW5kIHRoZSByZW1haW5pbmcgZmFsbCBpbnRvIHRoZSB2aXJnaW5pY2EgY2xhc3MuIFRoZSB5LWF4aXMgcmVwcmVzZW50cyB0aGUgcHJvcG9ydGlvbiBvZiB0aGUgdG90YWwgZmxvd2VycyBpbiB0aGlzIGdyb3VwIHRoYXQgY29ycmVzcG9uZCB0byBlYWNoIG9mIHRoZSBpcmlzIGZsb3dlciBjbGFzc2VzIChzZXRvc2EsIHZlcnNpY29sb3IsIHZpcmdpbmljYSkuIA0KDQpOZXh0LCB3ZSBtb3ZlIHRvIHRoZSBzZWNvbmQgbm9kZS4gQWdhaW4sIHRoZSB2YXJpYWJsZSB0aGF0IHRoZSBkZWNpc2lvbiBpcyBkZXRlcm1pbmVkIGJ5IGlzIHNlcGFsLmxlbmd0aC4gVGhlIHR3byBsZWF2ZXMgaGVyZSBhcmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDYuMSBvciBncmVhdGVyIHRoYW4gNi4xLiBJZiB0aGUgZmxvd2VyIGhhcyBhIHNlcGFsIGxlbmd0aCB0aGF0IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byA2LjEsIGl0IGZhbGxzIGludG8gdGhlIHNlY29uZCBncm91cC4gTG9va2luZyBhdCB0aGUgc2Vjb25kIGdyYXBoIHdlIGNhbiBzZWUgdGhhdCB0aGUgbWFqb3JpdHkgb2YgdGhlIDQzIGZsb3dlcnMgaW4gdGhpcyBncm91cCBhcmUgb2YgaXJpcyBjbGFzcyB2ZXJzaWNvbG9yLiANCg0KTmV4dCwgd2UgbW92ZSB0byB0aGUgdGhpcmQgbm9kZS4gSGVyZSBpZiB0aGUgc2VwYWwgbGVuZ3RoIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byA3IHRoZSBmbG93ZXIgZmFsbHMgaW50byB0aGUgdGhyaWQgZ3JvdXAgYW5kIGlmIGl0J3MgZ3JlYXRlciB0aGFuIDcgdGhlIGZsb3dlciBmYWxscyBpbnRvIHRoZSBmb3VydGggZ3JvdXAuIExvb2tpbmcgYXQgdGhlIHRoaXJkIGdyYXBoLCB0aGVyZSBhcmUgNDMgZmxvd2VycyBpbiB0aGUgdGhpcmQgZ3JvdXAgYW5kIG1ham9yaXR5IG9mIHRoZXNlIGZsb3dlcnMgYXJlIG9mIGNsYXNzIHZpcmdpbmljYSwgaG93ZXZlciwgeW91IGNhbiBzZWUgdGhhdCB0aGVyZSBhcmUgc3RpbGwgYSBnb29kIGFtb3VudCBvZiB2ZXJzaWNvbG9yIGlyaXMgZmxvd2VycyBpbiB0aGlzIGdyb3VwIGFzIHdlbGwuIA0KDQpJbiB0aGUgZm91cnRoIGFuZCBsYXN0IGdyb3VwLCB0aGVyZSBhcmUgdGhlIHJlbWFpbmluZyAxMiBmbG93ZXJzLiBBbGwgb2YgdGhlc2UgZmxvd2VycyBiZWxvbmcgdG8gdGhlIHRocmlkIGNsYXNzIG9mIGlyaXM6IHZpcmdpbmljYS4gDQoNCk92ZXJhbGwsIHRoZSBkZWNpc2lvbiB0cmVlIHRlbGxzIHVzIHRoYXQgc2VydG9zYSBpcmlzIGZsb3dlcnMgdGVuZCB0byBoYXZlIHNob3J0ZXIgc2VwYWwgbGVuZ3RoLCB2ZXJzaWNvbG9yIGlyaXMgZmxvd2VycyBoYXZlIG1pZC1sZW5ndGggc2VwYWxzLCBhbmQgdmlyZ2luaWNhIGlyaXMgZmxvd2VycyB0ZW5kIHRvIGhhdmUgdGhlIGxvbmdlc3Qgc2VwYWwgbGVuZ3RoLiANCg0KIyMjIFRSRUUgMg0KKipQcmVkaWN0aW5nIGlyaXMgY2xhc3MgYnkgc2VwYWwgd2lkdGgqKiANCg0KTm93LCBsZXQncyBzZWUgaG93IHdlbGwgc2VwYWwgd2lkdGggZG9lcyBhdCBwcmVkaWN0aW5nIGlyaXMgY2xhc3MuIA0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZWNobz1UUlVFfQ0KdHJlZTI8LWN0cmVlKGNsYXNzfnNlcGFsLndpZHRoLCBkYXRhPWlyaXMpDQpwbG90KHRyZWUyKQ0KYGBgDQoNCkxvb2tpbmcgYXQgdGhlIGRlY2lzaW9uIHRyZWUsIHlvdSBjYW4gc2VlIHRoYXQgdXNpbmcgc2VwYWwgd2lkdGggY3JlYXRlcyB0aHJlZSBncm91cHMgb2YgZmxvd2VycyBjb21wYXJlZCB0byBzZXBhbCBsZW5ndGggdGhhdCBjcmVhdGVkIGZvdXIgZ3JvdXBzIG9mIGZsb3dlcnMuIA0KDQpIZXJlIHRoZSByZXN1bHRzIGFyZSBtdWNoIG1vcmUgbWl4ZWQuIE1haW4gY29uY2x1c2lvbnMgd291bGQgYmUgdGhhdCBzZXRvc2EgaXJpcyB0ZW5kIHRvIGhhdmUgd2lkZXIgc2VwYWxzLCB2ZXJzaWNvbG9yIHRlbmQgdG8gaGF2ZSBtb3JlIG5hcnJvdyBzZXBhbHMsIGFuZCB2aXJnaW5pY2EgaGF2ZSBtb3JlIHZhcmlldHkgaW4gc2VwYWwgd2lkdGguIA0KDQojIyMgVFJFRSAzDQoqKlByZWRpY3RpbmcgaXJpcyBjbGFzcyBieSBwZXRhbCBsZW5ndGgqKiANCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVjaG89VFJVRX0NCnRyZWUzPC1jdHJlZShjbGFzc35wZXRhbC5sZW5ndGgsIGRhdGE9aXJpcykNCnBsb3QodHJlZTMpDQpgYGANCg0KIyMjIFRSRUUgNA0KKipQcmVkaWN0aW5nIGlyaXMgY2xhc3MgYnkgcGV0YWwgd2lkdGgqKg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZWNobz1UUlVFfQ0KdHJlZTQ8LWN0cmVlKGNsYXNzfnBldGFsLndpZHRoLCBkYXRhPWlyaXMpDQpwbG90KHRyZWU0KQ0KYGBgDQoNCiMjIERlY2lzaW9uIFRyZWVzIHdpdGggMiB2YXJpYWJsZXMgDQojIyMgVFJFRSA1DQoqKlByZWRpY3RpbmcgaXJpcyBjbGFzcyBieSBzZXBhbCBkaW1lbnNpb25zKioNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVjaG89VFJVRX0NCnRyZWU1PC1jdHJlZShjbGFzc35zZXBhbC5sZW5ndGgrc2VwYWwud2lkdGgsIGRhdGE9aXJpcykNCnBsb3QodHJlZTUpDQpgYGANCg0KIyMjVFJFRSA2DQoqKlByZWRpY3RpbmcgaXJpcyBjbGFzcyBieSBwZXRhbCBkaW1lbnNpb25zKioNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVjaG89VFJVRX0NCnRyZWU2PC1jdHJlZShjbGFzc35wZXRhbC5sZW5ndGgrcGV0YWwud2lkdGgsIGRhdGE9aXJpcykNCnBsb3QodHJlZTYpDQpgYGANCg0KIyMgRGVjaXNpb24gVHJlZXMgd2l0aCBhbGwgdmFyaWFibGVzIA0KIyMjIFRSRUUgNw0KKipQcmVkaWN0aW5nIGlyaXMgY2xhc3MgYnkgc2VwYWwgYW5kIHBldGFsIGRpbWVuc2lvbnMqKiANCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVjaG89VFJVRX0NCnRyZWU3PC1jdHJlZShjbGFzc35zZXBhbC5sZW5ndGggKyBzZXBhbC53aWR0aCArIHBldGFsLmxlbmd0aCArIHBldGFsLndpZHRoLCBkYXRhPWlyaXMpDQpwbG90KHRyZWU3KQ0KYGBgDQoNCkhlcmUgd2UgaGF2ZSB0aGUgZGVjaXNpb24gdHJlZSB0aGF0IGluY2x1ZGVzIGFsbCBmb3VyIHZhcmlhYmxlcyAoc2VwYWwgbGVuZ3RoLCBzZXBhbCB3aWR0aCwgcGV0YWwgbGVuZ3RoLCBhbmQgcGV0YWwgd2lkdGgpIGludG8gdGhlIHByZWRpY3Rpb24gbW9kZWwuIA0KDQpOb3RpY2UgdGhhdCB0aGVyZSBhcmUgb25seSB0d28gZmFjdG9ycyB0aGF0IGFyZSB1c2VkIGluIHRoZSBkZWNpc2lvbiBub2RlczogUGV0YWwgbGVuZ3RoIGFuZCBwZXRhbCB3aWR0aC4gVGhpcyB0ZWxscyB1cyB0aGF0IHRoZXNlIHR3byBmYWN0b3JzIGFyZSBtb3N0IGltcG9ydGFudCB3aGVuIGRpc3Rpbmd1aXNoaW5nIHdoaWNoIHR5cGUgb2YgaXJpcyBjbGFzcyBlYWNoIGZsb3dlciBiZWxvbmdzIHRvLiBUaGUgZmFjdG9ycyBzZXBhbCBsZW5ndGggYW5kIHNlcGFsIHdpZHRoIGFyZSBub3QgbmVjZXNzYXJ5IHRvIHByZWRpY3Qgd2hpY2ggY2xhc3MgdGhlIGZsb3dlcnMgYmVsb25nIHRvLiANCg0KVGhpcyBkZWNpc2lvbiB0cmVlIGlzIGlkZW50aWNhbCB0byBkZWNpc2lvbiB0cmVlICM2LiANCg0KI0hvdyB0byBBdm9pZCBPdmVyZml0dGluZyB0aGUgRGVjaXNpb24gVHJlZQ0KVGhlcmUgYXJlIHR3byBhcHByb2FjaGVzIHRvIGF2b2lkIG92ZXJmaXR0aW5nIGEgZGVjaXNpb24gdHJlZSB0byB5b3VyIGRhdGEuDQoNCjEuICoqcHJlLXBydW5pbmcqKjogcHJldmVudHMgdGhlIHRyZWUgZnJvbSBncm93aW5nIGVhcmxpZXIsIGJlZm9yZSB0aGUgdHJhaW5pbmcgZGF0YSBpcyBwZXJmZWN0bHkgY2xhc3NpZmllZA0KDQoyLiAqKnBvc3QtdHJpbW1pbmcqKjogb3IgcG9zdC1wcnVuaW5nLCB0cmVlIGlzIHBlcmZlY3RseSBjbGFzc2lmaWVkIHRoZW4gYWZ0ZXIgdGhlIHRyZWUgaXMgY3JlYXRlZCBwcnVuZSBvciB0cmltIHRoZSB0cmVlDQoNClBvc3QtdHJpbW1pbmcgaXMgdGhlIG1vc3QgY29tbW9uIGFwcHJvYWNoIGJlY2F1c2UgaXQncyBvZnRlbiBkaWZmaWN1bHQgdG8gZXN0aW1hdGUgd2hlbiB0byBzdG9wIGdyb3dpbmcgdGhlIHRyZWUuIFRoZSBpbXBvcnRhbnQgdGhpbmcgaXMgdG8gZGVmaW5lIHRoZSBjcml0ZXJpYSB3aGljaCBkZXRlcm1pbmVzIHRoZSBjb3JyZWN0IGZpbmFsIHRyZWUgc2l6ZS4gDQoNCjEuICoqdmFsaWRhdGlvbiBzZXQqKjogdXNlIGEgZGlmZmVyZW50IGRhdGEgc2V0LCBvdGhlciB0aGFuIHRoZSB0cmFpbmluZyBzZXQsIHRvIGV2YWx1YXRlIHRoZSBwb3N0LXRyaW1taW5nIG5vZGVzIGZyb20gdGhlIGRlY2lzaW9uIHRyZWUuIE9mdGVuIHRoZSBkYXRhc2V0IGlzIGJyb2tlbiBpbiB0byB0d28gZGF0YXNldHMsIHRoZSB0cmFpbmluZyBzZXQgYW5kIHRoZSB2YWxpZGF0aW9uIHNldC4gVGhlIGRlY2lzaW9uIHRyZWUgaXMgY29uc3RydWN0ZWQgb24gdGhlIHRyYWluaW5nIHNldCwgdGhlbiBhbnkgcG9zdC10cmltbWluZyBpcyBkb25lIG9uIHRoZSB2YWxpZGF0aW9uIHNldC4gDQoNCjIuICoqc3RhdGlzdGljYWwgdGVzdGluZyoqOiBjcmVhdGUgdGhlIGRlY2lzaW9uIHRyZWUgdXNpbmcgdGhlIHRyYWluaW5nIHNldCwgdGhlbiBhcHBseSBzdGF0aXN0aWNhbCB0ZXN0cyAoZXJyb3IgZXN0aW1hdGlvbiBvciBjaGkgc3F1YXJlKSB0byBkZXRlcm1pbmUgaWYgcHJ1bmluZyBhIG5vZGUgb3IgZXhwYW5kaW5nIGEgbm9kZSBwcm9kdWNlcyBhbiBpbXByb3ZlbWVudCBiZXlvbmQgdGhlIHRyYWluaW5nIHNldC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2Ugc3RhdGlzdGljYWwgdGVzdHMsIHNlZSB0aGUgIk92ZXJmaXR0aW5nIERhdGEiIGluIHRoZSByZWZlcmVuY2VzIGFuZCByZXNvdXJjZXMgc2VjdGlvbi4gDQogIA0KIyBSZWZlcmVuY2VzIGFuZCBSZXNvdXJjZXMgDQoNCiogW3BhY2thZ2UgJ3BhcnR5J10oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL3BhcnR5L3BhcnR5LnBkZikNCg0KKiBbbGluayB0byBVQ0kgaXJpcyBkYXRhc2V0XShodHRwczovL2FyY2hpdmUuaWNzLnVjaS5lZHUvbWwvZGF0YXNldHMvSXJpcykNCg0KKiBbRGVjaXNpb24gVHJlZSBUaGVvcnkgT3ZlcnZpZXddKGh0dHA6Ly9jaGVtLWVuZy51dG9yb250by5jYS9+ZGF0YW1pbmluZy9kbWMvZGVjaXNpb25fdHJlZS5odG0pDQoNCiogW092ZXJmaXR0aW5nIERhdGFdKGh0dHA6Ly9jaGVtLWVuZy51dG9yb250by5jYS9+ZGF0YW1pbmluZy9kbWMvZGVjaXNpb25fdHJlZV9vdmVyZml0dGluZy5odG0pDQoNCiogW0FkZGl0aW9uYWwgRXhhbXBsZV0oaHR0cDovL3d3dy5qb3lvZmRhdGEuZGUvYmxvZy90aXRhbmljLWNoYWxsZW5nZS1rYWdnbGUtc3Ztcy1rZXJubGFiLWRlY2lzaW9uLXRyZWVzLXBhcnR5LykNCg0KDQo8c2NyaXB0Pg0KICAoZnVuY3Rpb24oaSxzLG8sZyxyLGEsbSl7aVsnR29vZ2xlQW5hbHl0aWNzT2JqZWN0J109cjtpW3JdPWlbcl18fGZ1bmN0aW9uKCl7DQogIChpW3JdLnE9aVtyXS5xfHxbXSkucHVzaChhcmd1bWVudHMpfSxpW3JdLmw9MSpuZXcgRGF0ZSgpO2E9cy5jcmVhdGVFbGVtZW50KG8pLA0KICBtPXMuZ2V0RWxlbWVudHNCeVRhZ05hbWUobylbMF07YS5hc3luYz0xO2Euc3JjPWc7bS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLG0pDQogIH0pKHdpbmRvdyxkb2N1bWVudCwnc2NyaXB0JywnaHR0cHM6Ly93d3cuZ29vZ2xlLWFuYWx5dGljcy5jb20vYW5hbHl0aWNzLmpzJywnZ2EnKTsNCg0KICBnYSgnY3JlYXRlJywgJ1VBLTk4ODc4NzkzLTEnLCAnYXV0bycpOw0KICBnYSgnc2VuZCcsICdwYWdldmlldycpOw0KDQo8L3NjcmlwdD4NCg==

arriagagagin2000.blogspot.com

Source: https://ademos.people.uic.edu/Chapter24.html

0 Response to "How to Draw 2 Variable Decision Tree"

Post a Comment

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel