ЛР№3 Обчислювальний граф (15 балів)
Реалізувати на JavaScript обчислювальний напрямлений граф для обчислення значень виразів.
Приклад коду:
// контейнер повідомлення
var message=function(value, token){
this.value=value;
this.token=token;
}
var input=function(){
this.subscribers=[];
this.send:function(message){
for(var i=0; i<this.subscribers.length; i++){
this.subscribers[i](message);
}
}
}
var output=function(a){
a.subscribers.push(function(message){
console.log(message);
});
}
var plus=function(a,b){
// перелік підписок
this.subscribers=[];
// підписка на події від джерел a та b
var self=this;
a.subscribers.push(function(message){
self.queueA.push(message);
self.calc();
});
b.subscribers.push(function(message){
self.queueB.push(message);
self.calc();
});
this.queueA=[];
this.queueB=[];
this.calc=function(){
// знайти в масивах this.queueA та this.queueB
// повідомлення з однаковими значеннями атрибута token
// якщо знайдено, то
// додати значення атрибутів value
// результат додавання зберегти в змінну summa
this.send(new message(summa, token));
}
this.send:function(message){
for(var i=0; i<queue.length; i++){
this.queue.send(message);
}
}
}
var a=new input();
var b=new input();
var o=new output(new plus(a,b));
var token=1;
a.send(new message(1,token))
b.send(new message(3,token))
На вхід графа подаються параметри із часовою міткою, проходячи через граф, дані перетворюються, відповідно до арифметичного виразу, в задане число.
Вузлами графа є об'єкти, відповідальні за елементарні операції ( додавання, віднімання, множення, ділення ), які виконуються за умови наявності на вхідних ребрах даних із однаковою часовою міткою. Якщо на вхідних ребрах відсутні дані із однаковою часовою міткою, то вони зберігаються у сховищі даних відповідного ребра до тих пір, поки не з'явиться можливість їх обробити.
Арифметичний вираз обирається відповідно до варіанту
- a * b + c / ( d - e )
- a + ( b - c / d ) * e
- ( a - b ) * c + d / e
- a + ( b + c / d ) * e
- a - ( b + c - d ) / e
- a + b / ( c + d * e )
- a + b - c / ( d * e - f)
- a / b - c / ( d + e / f )
- a / ( b + c / (d + e / f ) )
- a * ( b + c * (d - e ) )
- a / ( b / c - d * e )
- a - b * ( c + d * e )
- a * ( b + c / d - e / ( f - g ) )
- a / b + c * ( d - e )
- a * ( b + c / ( d + e ) )
- a + b / c + d / e
- a - b * c / ( d * e )
Приклад коду:
// контейнер повідомлення
var message=function(value, token){
this.value=value;
this.token=token;
}
var input=function(){
this.subscribers=[];
this.send:function(message){
for(var i=0; i<this.subscribers.length; i++){
this.subscribers[i](message);
}
}
}
var output=function(a){
a.subscribers.push(function(message){
console.log(message);
});
}
var plus=function(a,b){
// перелік підписок
this.subscribers=[];
// підписка на події від джерел a та b
var self=this;
a.subscribers.push(function(message){
self.queueA.push(message);
self.calc();
});
b.subscribers.push(function(message){
self.queueB.push(message);
self.calc();
});
this.queueA=[];
this.queueB=[];
this.calc=function(){
// знайти в масивах this.queueA та this.queueB
// повідомлення з однаковими значеннями атрибута token
// якщо знайдено, то
// додати значення атрибутів value
// результат додавання зберегти в змінну summa
this.send(new message(summa, token));
}
this.send:function(message){
for(var i=0; i<queue.length; i++){
this.queue.send(message);
}
}
}
var a=new input();
var b=new input();
var o=new output(new plus(a,b));
var token=1;
a.send(new message(1,token))
b.send(new message(3,token))