-
Notifications
You must be signed in to change notification settings - Fork 0
/
quantumComputerConstructor.js
117 lines (98 loc) · 3.48 KB
/
quantumComputerConstructor.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
var quantumComputerConstructor = function(operationsStorage, initial) {
if (!operationsStorage || !operationsStorage.addTempOperations) {
console.assert(false, "No operations storage connected to the quantum computer.");
return;
}
const InitialChips = [];
const InitialEnabled = false;
const ChipCostIncrement = 5e3;
const ComputeFactor = 360;
const CounterFactor = 1/1e3;
const FadeTimeout = 100;
const InitialChipCost = 10e3;
const MaxChips = 10;
const UpdateInterval = 10;
var _chips = (initial && initial.chips) || InitialChips;
var _enabled = (initial && initial.enabled) || InitialEnabled;
var _enabledUpdatedCallbacks = [];
var _chipRowDiv;
var _groupdiv;
var create = function() {
if (!_groupDiv) return;
var subGroupDiv = _groupDiv.appendElement("div", undefined, {className: "sub-group outlined"});
subGroupDiv.appendElement("h3", undefined, {innerText: "Quantum Computing"});
_chipRowDiv = subGroupDiv.appendElement("div", undefined, {id: "qChipsDiv"});
for (var i=0; i<_chips.length; i++) {
var chip = _chipRowDiv.appendElement("div", undefined, {className: "chip"});
chip.style.opacity = Math.max(0, _chips[i]);
}
var buttonRow = subGroupDiv.appendElement("div");
buttonRow.appendElement("input", undefined, {
type: "button",
id: "computeQuantumButton",
value: "Compute",
onclick: function() {
if (buttonRow.lastChild.classList && buttonRow.lastChild.classList.contains("fadable")) buttonRow.removeChild(buttonRow.lastChild);
var span = buttonRow.appendElement("span", undefined, {className: "fadable"});
setTimeout(function() { span.classList.add("fade-out"); }, FadeTimeout);
if (_chips.length === InitialChips.length) {
span.innerText = "Need Photonic Chips";
return;
}
var value = Math.ceil(_chips.reduce(function(a, b) { return a + b;}) * ComputeFactor);
span.innerText = "Operations: " + value.toLocaleString();
operationsStorage.addTempOperations(value);
}
});
buttonRow.appendText(" ");
};
setInterval(function() {
var counter = Math.round(new Date().getTime() / UpdateInterval);
for (var i=0; i<_chips.length; i++) {
_chips[i] = Math.sin(counter * (i + 1) * CounterFactor);
_chipRowDiv.children[i].style.opacity = Math.max(0, _chips[i]);
}
}, UpdateInterval);
return {
addChip: function() {
if (_chips.length >= MaxChips) {
console.assert(false, "Cannot add chips beyond the max: " + MaxChips);
return false;
}
_chips[_chips.length] = 0;
if (!_chipRowDiv) return;
_chipRowDiv.appendElement("div", undefined, {className: "chip"});
},
addEnabledUpdatedCallback: function(callback) {
if (typeof(callback) === "function") _enabledUpdatedCallbacks.push(callback);
},
bind: function(groupDiv) {
if (!groupDiv) return;
_groupDiv = groupDiv;
if (_enabled) create();
},
enable: function() {
_enabled = true;
_enabledUpdatedCallbacks.forEachCallback(true);
create();
},
getChips: function() {
return _chips.length;
},
getChipCost: function() {
return InitialChipCost + _chips.length * ChipCostIncrement;
},
getMaxChips: function() {
return MaxChips;
},
isEnabled: function() {
return _enabled;
},
serialize: function() {
return {
chips: _chips,
enabled: _enabled
};
}
};
};