library(rpart);

train <- read.table("loans.dat",header=F,col.names=c("x1","x2","y"));
n <- length(y)

size <- 100;

grid <- mat.or.vec((size+1)*(size+1),2);
for (i in 0:size) {
for (j in 0:size) {
  ij <- (size+1)*j+i+1
  grid[ij,1] <- i;
  grid[ij,2] <- j;
}
}
grid <- grid/(size+1);

gx1 <- grid[,1];
gx2 <- grid[,2];

dflt <- (gx1 < 0.3440913);

errors <- 0
for (i in 1:n) {
  errors <- errors + abs(train$y[i] - (train$x1[i] < 0.3440913))
}
print(paste("Errors = ", errors))

edge <- mat.or.vec((size+1)*(size+1),1);
edge <- as.logical(edge);
for (i in 1:size) {
for (j in 1:size) {
  left <- (size+1)*j+i+1;
  rite <- (size+1)*(j-1)+i+1;
  top  <- left;
  bot  <- left - 1;
  edge[left] <- 
    ( dflt[left] && !dflt[rite] ) ||
    ( !dflt[left] && dflt[rite] ) ||
    ( dflt[top]  && !dflt[bot]  ) || 
    ( !dflt[top]  && dflt[bot]  ) ;
}
}

X <- cbind(train$x1,train$x2);
y <- (train$y==1);

if (!exists("ps.default")) ps.default <- ps.options()
ps.options(horizontal=FALSE,onefile=FALSE);
ps.options(paper="special",pagecentre=FALSE);
ps.options(width=8.0,height=4.0);

postscript(file="treelec01.eps");
par(mfrow=c(1,2),mar=c(4,4,1.5,2)+0.1) # mar=c(bottom,left,top,right)

plot(X,type='n',xlab="FICO Score",ylab="P-Index");
points(X[y,],pch='o',col="red");
points(X[!y,],pch='o',col="green");
points(grid[dflt,],pch='.',col="red");
points(grid[!dflt,],pch='.',col="green");
points(grid[edge,],pch='+',col="black",cex=0.4);

grid <- mat.or.vec((size+1)*(size+1),2);
for (i in 0:size) {
for (j in 0:size) {
  ij <- (size+1)*j+i+1
  grid[ij,1] <- i;
  grid[ij,2] <- j;
}
}
grid <- grid/(size+1);

gx1 <- grid[,1];
gx2 <- grid[,2];

dflt <- (gx2 < 0.3520624);

errors <- 0
for (i in 1:n) {
  errors <- errors + abs(train$y[i] - (train$x2[i] < 0.3520624))
}
print(paste("Errors = ", errors))

edge <- mat.or.vec((size+1)*(size+1),1);
edge <- as.logical(edge);
for (i in 1:size) {
for (j in 1:size) {
  left <- (size+1)*j+i+1;
  rite <- (size+1)*(j-1)+i+1;
  top  <- left;
  bot  <- left - 1;
  edge[left] <- 
    ( dflt[left] && !dflt[rite] ) ||
    ( !dflt[left] && dflt[rite] ) ||
    ( dflt[top]  && !dflt[bot]  ) || 
    ( !dflt[top]  && dflt[bot]  ) ;
}
}

X <- cbind(train$x1,train$x2);
y <- (train$y==1);

plot(X,type='n',xlab="FICO Score",ylab="P-Index");
points(X[y,],pch='o',col="red");
points(X[!y,],pch='o',col="green");
points(grid[dflt,],pch='.',col="red");
points(grid[!dflt,],pch='.',col="green");
points(grid[edge,],pch='+',col="black",cex=0.4);

dev.off();

grid <- mat.or.vec((size+1)*(size+1),2);
for (i in 0:size) {
for (j in 0:size) {
  ij <- (size+1)*j+i+1
  grid[ij,1] <- i;
  grid[ij,2] <- j;
}
}
grid <- grid/(size+1);

gx1 <- grid[,1];
gx2 <- grid[,2];

dflt <- (gx1 < 0.3440913) | ( (gx1 >= 0.3440913) & (gx2 < 0.2215745) );
dflt0 <- (gx1 < 0.3440913)

errors <- 0
for (i in 1:n) {
  x1 <- train$x1[i]
  x2 <- train$x2[i]
  y  <- train$y[i]
  yhat <- (x1 < 0.3440913) | ( (x1 >= 0.3440913) & (x2 < 0.2215745) );
  errors <- errors + abs(y - yhat)
}
print(paste("Errors = ", errors))

edge <- mat.or.vec((size+1)*(size+1),1);
edge <- as.logical(edge);
for (i in 1:size) {
for (j in 1:size) {
  left <- (size+1)*j+i+1;
  rite <- (size+1)*(j-1)+i+1;
  top  <- left;
  bot  <- left - 1;
  edge[left] <- 
    ( dflt[left] && !dflt[rite] ) ||
    ( !dflt[left] && dflt[rite] ) ||
    ( dflt[top]  && !dflt[bot]  ) || 
    ( !dflt[top]  && dflt[bot]  ) ||
    ( dflt0[left] && !dflt0[rite] ) ||
    ( !dflt0[left] && dflt0[rite] ) ||
    ( dflt0[top]  && !dflt0[bot]  ) || 
    ( !dflt0[top]  && dflt0[bot]  )
}
}

X <- cbind(train$x1,train$x2);
y <- (train$y==1);

postscript(file="treelec02.eps");
par(mfrow=c(1,2),mar=c(4,4,1.5,2)+0.1) # mar=c(bottom,left,top,right)

plot(X,type='n',xlab="FICO Score",ylab="P-Index");
points(X[y,],pch='o',col="red");
points(X[!y,],pch='o',col="green");
points(grid[dflt,],pch='.',col="red");
points(grid[!dflt,],pch='.',col="green");
points(grid[edge,],pch='+',col="black",cex=0.4);

grid <- mat.or.vec((size+1)*(size+1),2);
for (i in 0:size) {
for (j in 0:size) {
  ij <- (size+1)*j+i+1
  grid[ij,1] <- i;
  grid[ij,2] <- j;
}
}
grid <- grid/(size+1);

gx1 <- grid[,1];
gx2 <- grid[,2];

dflt <- (gx1 < 0.3440913) & (gx2 < 0.75) 
dflt0 <- (gx1 < 0.3440913)

errors <- 0
for (i in 1:n) {
  x1 <- train$x1[i]
  x2 <- train$x2[i]
  y  <- train$y[i]
  yhat <- (x1 < 0.3440913) & (x2 < 0.75)
  errors <- errors + abs(y - yhat)
}
print(paste("Errors = ", errors))

edge <- mat.or.vec((size+1)*(size+1),1);
edge <- as.logical(edge);
for (i in 1:size) {
for (j in 1:size) {
  left <- (size+1)*j+i+1;
  rite <- (size+1)*(j-1)+i+1;
  top  <- left;
  bot  <- left - 1;
  edge[left] <- 
    ( dflt[left] && !dflt[rite] ) ||
    ( !dflt[left] && dflt[rite] ) ||
    ( dflt[top]  && !dflt[bot]  ) || 
    ( !dflt[top]  && dflt[bot]  ) ||
    ( dflt0[left] && !dflt0[rite] ) ||
    ( !dflt0[left] && dflt0[rite] ) ||
    ( dflt0[top]  && !dflt0[bot]  ) || 
    ( !dflt0[top]  && dflt0[bot]  )
}
}

X <- cbind(train$x1,train$x2);
y <- (train$y==1);

plot(X,type='n',xlab="FICO Score",ylab="P-Index");
points(X[y,],pch='o',col="red");
points(X[!y,],pch='o',col="green");
points(grid[dflt,],pch='.',col="red");
points(grid[!dflt,],pch='.',col="green");
points(grid[edge,],pch='+',col="black",cex=0.4);

dev.off()
