"""
*******************************************************
Owner: Ashutosh Jha
For: APPCAIR BITS Pilani Goa Campus, Reflexis Systems
Function Name: addRule
Takes head of Tree() class, last_true node, no Of nodes
current row, target column, column name list, maximal
set and row no as input. Adds value to head, like name,
predicted class, name.
*******************************************************
"""
from chooseRule import chooseRule
from addChosenRule import addChosenRule
from addCombination import addCombination
from addCombinationRules import addCombinationRules
from common_data import common_data
def addRule(head,last_true,noOfNodes,cur_row,target_col,col_list,maximal_set,z):
#checks whether a last_true node exists
if(last_true == None):
head.name = "c" + str(noOfNodes-1)
head.row_no = z
if(target_col != None):
head.pred_label = cur_row[target_col]
rule_list,feature_used,isstr = addCombination(col_list,cur_row,target_col)
if(rule_list != None):
addCombinationRules(head,rule_list,cur_row,isstr)
if(target_col == None):
head.pred_label = input("Since this dataset has no target column, which can be used to indicate conclusion" +
" from a rule, kindly assign a class value as conclusion if this rule is satisfied:")
head.f_used = feature_used
else:
j=1
for i in range(0,len(col_list)):
if(col_list[i] != target_col):
if(type(cur_row[col_list[i]])== str):
maximal_set[j] = [str(col_list[i]) , str(cur_row[col_list[i]]), "str"]
j = j+1
else:
maximal_set[j] = [str(col_list[i]) , str(cur_row[col_list[i]]), "nstr"]
j = j+1
rule_no = chooseRule(j,maximal_set)
#print(maximal_set[rule_no])
#print(noOfNodes)
addChosenRule(head,maximal_set[rule_no])
if(target_col == None):
head.pred_label = input("Since this dataset has no target column, which can be used to indicate conclusion" +
" from a rule, kindly assign a class value as conclusion if this rule is satisfied:")
head.f_used.append(maximal_set[rule_no][0])
maximal_set.clear()
else:
head.name = "c" + str(noOfNodes-1)
head.row_no = z
if(target_col != None):
head.pred_label = cur_row[target_col]
rule_list,feature_used,isstr = addCombination(col_list,cur_row,target_col)
if(rule_list != None):
#Check whether features used are present in last_true node
#and if the input condition of last node is satisfied by current instance
if((common_data(feature_used,last_true.f_used) == True) and (eval(last_true.inp_cond)==True)):
print("Can't add this rule as it violates RDR implementation." +
" The instance uses feature common to last true node." +
" And also satisfies the last true node.")
return
else:
addCombinationRules(head,rule_list,cur_row,isstr)
if(target_col == None):
head.pred_label = input("Since this dataset has no target column, which can be used to indicate conclusion" +
" from a rule, kindly assign a class value as conclusion if this rule is satisfied:")
head.f_used = feature_used
else:
j=1
for i in range(0,len(col_list)):
if(col_list[i] != target_col):
if((col_list[i] in last_true.f_used) and
(eval(last_true.inp_cond) == True)):
continue
else:
if(type(cur_row[col_list[i]])== str):
maximal_set[j] = [str(col_list[i]) , str(cur_row[col_list[i]]), "str"]
j = j+1
else:
maximal_set[j] = [str(col_list[i]) , str(cur_row[col_list[i]]), "nstr"]
j = j+1
rule_no = chooseRule(j,maximal_set)
#print(maximal_set[rule_no])
#print(noOfNodes)
addChosenRule(head,maximal_set[rule_no])
if(target_col == None):
head.pred_label = input("Since this dataset has no target column, which can be used to indicate conclusion" +
" from a rule, kindly assign a class value as conclusion if this rule is satisfied:")
head.f_used.append(maximal_set[rule_no][0])
maximal_set.clear()
print("\nThe condition added by you:")
print(head.name,":",head.inp_cond)