-
-
Save jcbozonier/5608523 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<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); | |
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 '+': | |
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; | |
case 'q': | |
tokens.push({'type': 'operator', 'value':'q'}); | |
break; | |
case 's': | |
tokens.push({'type': 'operator', 'value':'s'}); | |
break; | |
case 'c': | |
tokens.push({'type': 'operator', 'value':'c'}); | |
break; | |
case 't': | |
tokens.push({'type': 'operator', 'value':'t'}); | |
break; | |
case '^': | |
tokens.push({'type': 'operator', 'value':'^'}); | |
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 PowerOperator = function(left_node, right_node){ | |
return { | |
'evaluate':function(input_constant){ | |
return Math.pow(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 SquareRootOperator = function(node){ | |
return { | |
'evaluate': function(input_constant){ | |
return Math.sqrt(node.evaluate(input_constant)); | |
} | |
} | |
}; | |
var SineOperator = function(node){ | |
return { | |
'evaluate': function(input_constant){ | |
return Math.sin(node.evaluate(input_constant)); | |
} | |
} | |
}; | |
var CosineOperator = function(node){ | |
return { | |
'evaluate': function(input_constant){ | |
return Math.cos(node.evaluate(input_constant)); | |
} | |
} | |
}; | |
var TangentOperator = function(node){ | |
return { | |
'evaluate': function(input_constant){ | |
return Math.tan(node.evaluate(input_constant)); | |
} | |
} | |
}; | |
var parse_these = function(tokens){ | |
tokens = tokens.slice(0); | |
console.log(tokens); | |
var nodes_to_assemble = []; | |
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; | |
case '^': | |
var right_term = nodes_to_assemble.shift(); | |
var left_term = nodes_to_assemble.shift(); | |
var operator_node = new PowerOperator(left_term, right_term); | |
nodes_to_assemble.push(operator_node); | |
break; | |
case 'q': | |
var term = nodes_to_assemble.shift(); | |
var operator_node = new SquareRootOperator(term); | |
nodes_to_assemble.push(operator_node); | |
break; | |
case 's': | |
var term = nodes_to_assemble.shift(); | |
var operator_node = new SineOperator(term); | |
nodes_to_assemble.push(operator_node); | |
break; | |
case 'c': | |
var term = nodes_to_assemble.shift(); | |
var operator_node = new CosineOperator(term); | |
nodes_to_assemble.push(operator_node); | |
break; | |
case 't': | |
var term = nodes_to_assemble.shift(); | |
var operator_node = new TangentOperator(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 result = evaluate_chromosome(chromosome, x); | |
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> | |
</ul> | |
Result: <span id="chromosome_result"></span> | |
<script> | |
var button = document.getElementById('get_results'); | |
button.onclick = main; | |
</script> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment