@@ -2,180 +2,180 @@
< html >
< head >
< title > Monte Carlo Calculus</ title >
< script src = "script/monte_carlo.js" > </ script >
< script >
var lex_this = function(chromosome){
var tokens = [ ] ;
chromosome = chromosome . split ( '' ) . slice ( 0 ) ;
< script src = "script/monte_carlo.js" > </ script >
< script >
var lex_this = function(chromosome){
var tokens = [ ] ;
chromosome = chromosome . split ( '' ) . slice ( 0 ) ;
var buffer = '' ;
for ( var index = chromosome . length - 1 ; index >= 0 ; index -- ) {
var character = chromosome [ index ] ;
console . log ( character ) ;
switch ( character ) {
case '*' :
tokens . push ( { 'type' :'operator' , 'value' :'*' } ) ;
break ;
case '+ ':
tokens . push ( { 'type' :'operator' , 'value' :'+' } ) ;
break ;
case 'n ':
tokens . push ( { 'type' : 'constant' , 'value' :parseFloat ( buffer ) } ) ;
buffer = '';
break ;
case 'x ':
tokens . push ( { 'type' : 'input_constant' } ) ;
break ;
default :
var constant_pattern = / [ 0 - 9 \. ] /
if ( constant_pattern . test ( character ) ) {
buffer = character + buffer ;
console . log ( 'Buffer is now: ' + buffer ) ;
} else {
throw 'Unexpected value of ' + character;
}
break ;
}
}
return tokens ;
} ;
var DivisionOperator = function ( left_node , right_node ) {
return {
'evaluate' :function ( input_constant ) {
return left_node . evaluate ( input_constant ) / right_node . evaluate ( input_constant ) ;
}
} ;
} ;
var MultiplicationOperator = function ( left_node , right_node ) {
return {
'evaluate' :function ( input_constant ) {
return left_node . evaluate ( input_constant ) * right_node . evaluate ( input_constant ) ;
}
} ;
} ;
var AdditionOperator = function(left_node, right_node){
return {
'evaluate' :function ( input_constant ) {
return left_node . evaluate ( input_constant ) + right_node . evaluate ( input_constant ) ;
}
} ;
} ;
var SubtractionOperator = function(left_node, right_node){
return {
'evaluate' :function ( input_constant ) {
return left_node . evaluate ( input_constant ) - right_node . evaluate ( input_constant ) ;
}
} ;
} ;
var ConstantTerm = function(constant_value){
return {
'evaluate' : function ( input_constant ) {
return constant_value ;
}
} ;
} ;
var InputConstantTerm = function(){
return {
'evaluate' : function ( input_constant ) {
return input_constant ;
}
}
} ;
var parse_these = function(tokens){
tokens = tokens . slice ( 0 ) ;
var buffer = '' ;
for ( var index = chromosome . length - 1 ; index >= 0 ; index -- ) {
var character = chromosome [ index ] ;
console . log ( character ) ;
switch ( character ) {
case '*' :
tokens . push ( { 'type' :'operator' , 'value' :'*' } ) ;
break ;
case '+ ':
tokens . push ( { 'type' :'operator' , 'value' :'+' } ) ;
break ;
case 'n ':
tokens . push ( { 'type' : 'constant' , 'value' :parseFloat ( buffer ) } ) ;
buffer = '';
break ;
case 'x ':
tokens . push ( { 'type' : 'input_constant' } ) ;
break ;
default :
var constant_pattern = / [ 0 - 9 \. ] /
if ( constant_pattern . test ( character ) ) {
buffer = character + buffer ;
console . log ( 'Buffer is now: ' + buffer ) ;
} else {
throw 'Unexpected value of ' + character;
}
break ;
}
}
return tokens ;
} ;
var DivisionOperator = function ( left_node , right_node ) {
return {
'evaluate' :function ( input_constant ) {
return left_node . evaluate ( input_constant ) / right_node . evaluate ( input_constant ) ;
}
} ;
} ;
var MultiplicationOperator = function ( left_node , right_node ) {
return {
'evaluate' :function ( input_constant ) {
return left_node . evaluate ( input_constant ) * right_node . evaluate ( input_constant ) ;
}
} ;
} ;
var AdditionOperator = function(left_node, right_node){
return {
'evaluate' :function ( input_constant ) {
return left_node . evaluate ( input_constant ) + right_node . evaluate ( input_constant ) ;
}
} ;
} ;
var SubtractionOperator = function(left_node, right_node){
return {
'evaluate' :function ( input_constant ) {
return left_node . evaluate ( input_constant ) - right_node . evaluate ( input_constant ) ;
}
} ;
} ;
var ConstantTerm = function(constant_value){
return {
'evaluate' : function ( input_constant ) {
return constant_value ;
}
} ;
} ;
var InputConstantTerm = function(){
return {
'evaluate' : function ( input_constant ) {
return input_constant ;
}
}
} ;
var parse_these = function(tokens){
tokens = tokens . slice ( 0 ) ;
console . log ( tokens ) ;
var nodes_to_assemble = [ ] ;
console . log ( tokens ) ;
var nodes_to_assemble = [ ] ;
for ( var index in tokens ) {
var token = tokens [ index ] ;
for ( var index in tokens ) {
var token = tokens [ index ] ;
switch ( token . type ) {
case 'operator' :
switch ( token . value ) {
case '+' :
var right_term = nodes_to_assemble . shift ( ) ;
var left_term = nodes_to_assemble . shift ( ) ;
var operator_node = new AdditionOperator ( left_term , right_term ) ;
nodes_to_assemble . push ( operator_node ) ;
break ;
case '-' :
var right_term = nodes_to_assemble . shift ( ) ;
var left_term = nodes_to_assemble . shift ( ) ;
var operator_node = new SubtractionOperator ( left_term , right_term ) ;
nodes_to_assemble . push ( operator_node ) ;
break ;
case '*' :
var right_term = nodes_to_assemble . shift ( ) ;
var left_term = nodes_to_assemble . shift ( ) ;
var operator_node = new MultiplicationOperator ( left_term , right_term ) ;
nodes_to_assemble . push ( operator_node ) ;
break ;
case '/' :
var right_term = nodes_to_assemble . shift ( ) ;
var left_term = nodes_to_assemble . shift ( ) ;
var operator_node = new DivisionOperator ( left_term , right_term ) ;
nodes_to_assemble . push ( operator_node ) ;
break ;
}
break ;
case 'constant ':
var constant = new ConstantTerm ( token . value ) ;
nodes_to_assemble . push ( constant ) ;
break ;
case 'input_constant ':
var input_constant = new InputConstantTerm ( ) ;
nodes_to_assemble . push ( input_constant ) ;
break ;
default :
throw 'Unexpected token type ' + token . type ;
break ;
}
}
if ( nodes_to_assemble . length > 1 ) {
throw 'Invalid AST . Ambiguous root node ';
}
return nodes_to_assemble [ 0 ] ;
} ;
var evaluate_chromosome = function ( chromosome , x ) {
console . log ( "In evaluate_chromosome" ) ;
var tokens = lex_this ( chromosome ) ;
console . log ( "Token count: " + tokens . length ) ;
console . log ( "Tokens: " + JSON . stringify ( tokens ) ) ;
var ast = parse_these ( tokens ) ;
return ast . evaluate ( parseFloat ( x ) ) ;
} ;
switch ( token . type ) {
case 'operator' :
switch ( token . value ) {
case '+' :
var right_term = nodes_to_assemble . shift ( ) ;
var left_term = nodes_to_assemble . shift ( ) ;
var operator_node = new AdditionOperator ( left_term , right_term ) ;
nodes_to_assemble . push ( operator_node ) ;
break ;
case '-' :
var right_term = nodes_to_assemble . shift ( ) ;
var left_term = nodes_to_assemble . shift ( ) ;
var operator_node = new SubtractionOperator ( left_term , right_term ) ;
nodes_to_assemble . push ( operator_node ) ;
break ;
case '*' :
var right_term = nodes_to_assemble . shift ( ) ;
var left_term = nodes_to_assemble . shift ( ) ;
var operator_node = new MultiplicationOperator ( left_term , right_term ) ;
nodes_to_assemble . push ( operator_node ) ;
break ;
case '/' :
var right_term = nodes_to_assemble . shift ( ) ;
var left_term = nodes_to_assemble . shift ( ) ;
var operator_node = new DivisionOperator ( left_term , right_term ) ;
nodes_to_assemble . push ( operator_node ) ;
break ;
}
break ;
case 'constant ':
var constant = new ConstantTerm ( token . value ) ;
nodes_to_assemble . push ( constant ) ;
break ;
case 'input_constant ':
var input_constant = new InputConstantTerm ( ) ;
nodes_to_assemble . push ( input_constant ) ;
break ;
default :
throw 'Unexpected token type ' + token . type ;
break ;
}
}
if ( nodes_to_assemble . length > 1 ) {
throw 'Invalid AST . Ambiguous root node ';
}
return nodes_to_assemble [ 0 ] ;
} ;
var evaluate_chromosome = function ( chromosome , x ) {
console . log ( "In evaluate_chromosome" ) ;
var tokens = lex_this ( chromosome ) ;
console . log ( "Token count: " + tokens . length ) ;
console . log ( "Tokens: " + JSON . stringify ( tokens ) ) ;
var ast = parse_these ( tokens ) ;
return ast . evaluate ( parseFloat ( x ) ) ;
} ;
var main = function ( ) {
var chromosome = document . getElementById ( 'chromosome' ) . value ;
var x = Number ( document . getElementById ( 'x' ) . value ) ;
var main = function ( ) {
var chromosome = document . getElementById ( 'chromosome' ) . value ;
var x = Number ( document . getElementById ( 'x' ) . value ) ;
var result = evaluate_chromosome ( chromosome , x ) ;
var result = evaluate_chromosome ( chromosome , x ) ;
var result_field = document . getElementById ( 'chromosome_result' ) ;
result_field . innerHTML = result ;
} ;
</ script >
var result_field = document . getElementById ( 'chromosome_result' ) ;
result_field . innerHTML = result ;
} ;
</ script >
</ head >
< body >
Evaluating chromosome< br />
< ul >
< li >
Chromosome: < input type = "text" id = "chromosome" value = "+x*+xn2n31" />
</ li >
< li >
X: < input type = "text" id = "x" value = "0" />
</ li >
< li >
< input id = "get_results" type = "button" value = "Calculate" />
</ li >
< li >
Chromosome: < input type = "text" id = "chromosome" value = "+x*+xn2n31" />
</ li >
< li >
X: < input type = "text" id = "x" value = "0" />
</ li >
< li >
< input id = "get_results" type = "button" value = "Calculate" />
</ li >
</ ul >
Result: < span id = "chromosome_result" > </ span >
< script >
var button = document.getElementById('get_results');
button.onclick = main;
var button = document.getElementById('get_results');
button.onclick = main;
</ script >
</ body >
</ html >