Skip to content

Commit 0a27d6f

Browse files
committed
Fixed issues with >2 nodes.
Issues are now with Algebrite - it is struggling to simplify the results for a simple 3-resistor divider.
1 parent 5d32e5d commit 0a27d6f

7 files changed

Lines changed: 25776 additions & 54 deletions

File tree

filterAnalyzer/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
integrity="sha384-iYQeCzEYFbKjA/T2uDLTpkwGzCiq6soy8tYaI1GyVh/UjpbCx/TYkiZhlZB6+fzT" crossorigin="anonymous">
1515
<script src="https://cdn.plot.ly/plotly-2.14.0.min.js"></script>
1616
<script src="js/algebrite.bundle-for-browser-min.js"></script>
17+
<!-- <script src="js/algebrite_v1p2.bundle-for-browser-min.js"></script> -->
1718
<script src="js/startupSchematic.js"></script>
1819

1920
<!-- <link type="text/css" rel="stylesheet" href="application.css" /> -->

filterAnalyzer/js/algebrite_v1p2.bundle-for-browser-min.js

Lines changed: 25675 additions & 0 deletions
Large diffs are not rendered by default.

filterAnalyzer/modules/View.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export class View extends draw2d.Canvas {
99
wrapperWidth -=
1010
parseFloat(wrapperComputedStyle.paddingLeft) +
1111
parseFloat(wrapperComputedStyle.paddingRight)
12-
console.log("height, width", canvasHolder.offsetHeight, wrapperWidth)
12+
// console.log("height, width", canvasHolder.offsetHeight, wrapperWidth)
1313
super(id, wrapperWidth-2, canvasHolder.offsetHeight-2);
1414
this.rCounter = 0;
1515
this.cCounter = 0;

filterAnalyzer/modules/main.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -235,13 +235,11 @@ class Game extends React.Component {
235235
}
236236

237237
handleCanvasChange (canvasState) {
238-
console.log("Inside handleCanvasChange");
239-
console.log(canvasState);
238+
// console.log("Inside handleCanvasChange");
240239
var latexResult;
241240
var newElementMap;
242241
var elements = this.state.elements;
243242
[this.schematicReadiness, latexResult, newElementMap] = calculateMNA(canvasState, this.schematicReadiness);
244-
console.log("latex",latexResult);
245243

246244
//add new elements
247245
for (const key in newElementMap) {

filterAnalyzer/modules/mna.js

Lines changed: 89 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,85 @@
11
function processCanvasState(canvasState) {
22
var newElementMap = {};
3-
var elementsOnNodes = [];
3+
// var elementsOnNodes = [];
44
var nodeMap = [];
55
var createNode;
6-
var end1, end2, i;
6+
var end1, end2, i, j, k;
7+
var optimized;
8+
79

8-
console.log('processCanvasState', canvasState)
10+
//Create a new node for each component
911
canvasState.forEach(item => {
1012
if (item.type == "draw2d.Connection") {
1113
//get both ends of the connection
1214
end1 = `${item.source.node}.${item.source.port}`
1315
end2 = `${item.target.node}.${item.target.port}`
14-
15-
//check if either end exists in the nodemap, create a new entry or add to existing entry
16-
createNode = true;
17-
for (i = 0; i < nodeMap.length; i++) {
18-
if (nodeMap[i].includes(end1) && !nodeMap[i].includes(end2)) {
19-
nodeMap[i].push(end2);
20-
elementsOnNodes[i].push(item.target.node)
21-
createNode = false;
22-
break;
23-
}
24-
else if (!nodeMap[i].includes(end1) && nodeMap[i].includes(end2)) {
25-
nodeMap[i].push(end1);
26-
elementsOnNodes[i].push(item.source.node)
27-
createNode = false;
28-
break;
29-
}
30-
}
31-
if (createNode) {
32-
nodeMap.push([end1, end2])
33-
elementsOnNodes.push([item.source.node, item.target.node])
34-
}
35-
//Fixme - there needs to be some code here to merge nodes
36-
16+
nodeMap.push([end1, end2])
17+
// console.log(end1, end2);
3718
} else {
3819
//if its not a connection its an element
3920
newElementMap[item.id] = {};
4021
}
41-
4222
});
4323

44-
console.log('newElementMap', newElementMap)
24+
//loop through nodeMap and merge nodes which are the same until nodes are no longer optimized out
25+
do {
26+
optimized = false;
27+
loop1:
28+
for (i = 0; i < nodeMap.length; i++) {
29+
for (j = 0; j < nodeMap[i].length; j++) {
30+
for (k = i+1; k < nodeMap.length; k++) {
31+
if (nodeMap[k].includes(nodeMap[i][j])) {
32+
optimized = true;
33+
//Before concat with K, must remove the element that is about to be duplicated
34+
const index = nodeMap[k].indexOf(nodeMap[i][j]);
35+
if (index > -1) { // only splice array when item is found
36+
nodeMap[k].splice(index, 1); // 2nd parameter means remove one item only
37+
}
38+
nodeMap[i] = nodeMap[i].concat(nodeMap[k]);
39+
nodeMap.splice(k, 1);
40+
break loop1;
41+
}
42+
}
43+
}
44+
}
45+
} while (optimized==true);
46+
47+
// //check if either end exists in the nodemap, create a new entry or add to existing entry
48+
// createNode = true;
49+
// for (i = 0; i < nodeMap.length; i++) {
50+
// if (nodeMap[i].includes(end1) && !nodeMap[i].includes(end2)) {
51+
// nodeMap[i].push(end2);
52+
// createNode = false;
53+
// break;
54+
// }
55+
// else if (!nodeMap[i].includes(end1) && nodeMap[i].includes(end2)) {
56+
// nodeMap[i].push(end1);
57+
// createNode = false;
58+
// break;
59+
// }
60+
// }
61+
// if (createNode) {
62+
// nodeMap.push([end1, end2])
63+
// }
64+
// //Fixme - there needs to be some code here to merge nodes
65+
66+
// } else {
67+
// //if its not a connection its an element
68+
// newElementMap[item.id] = {};
69+
// }
70+
71+
// });
72+
73+
var elementsOnNodes =[];
74+
var t;
75+
for (i = 0; i < nodeMap.length; i++) {
76+
elementsOnNodes[i] = [];
77+
for (j = 0; j < nodeMap[i].length; j++) {
78+
t = nodeMap[i][j].split('.')
79+
elementsOnNodes[i].push(t[0])
80+
}
81+
}
82+
// console.log('newElementMap', newElementMap)
4583

4684
return [elementsOnNodes, nodeMap, newElementMap]
4785

@@ -56,10 +94,14 @@ export function calculateMNA(canvasState, schematicReadiness) {
5694
var elementMap = {};
5795
var newElementMap = {};
5896
var element;
97+
var latexResult = null;
5998

6099
[elementsOnNodes, nodeMap, newElementMap] = processCanvasState(canvasState);
100+
console.log("bp1", elementsOnNodes, nodeMap, newElementMap)
61101

62102
//verify how ready the schematic is
103+
// All this code is just for that! Can't it be done later, for free? //FIXME
104+
63105
schematicReadiness = {
64106
vout: false,
65107
vin: false,
@@ -106,9 +148,9 @@ export function calculateMNA(canvasState, schematicReadiness) {
106148

107149

108150
// console.log(json);
109-
console.log('nodemap', nodeMap);
110-
console.log('elements on node', elementsOnNodes);
111-
console.log('all elements on this node', elementsOnThisNode);
151+
// console.log('nodemap', nodeMap);
152+
// console.log('elements on node', elementsOnNodes);
153+
// console.log('all elements on this node', elementsOnThisNode);
112154

113155

114156

@@ -123,7 +165,6 @@ export function calculateMNA(canvasState, schematicReadiness) {
123165
}
124166
var nodeMapNoGnd = nodeMap;
125167
var rem = nodeMapNoGnd.splice(gndNode, 1);
126-
console.log('removed', rem);
127168

128169
// Step 1 - create map of every element and which node it connects too. Doing this here, after node map is complete and ground node is removed
129170
for (i = 0; i < nodeMapNoGnd.length; i++) {
@@ -133,7 +174,6 @@ export function calculateMNA(canvasState, schematicReadiness) {
133174
else elementMap[element[0]] = [i]
134175
}
135176
}
136-
console.log('elementMap', elementMap);
137177
voutNode = elementMap['vout'][0];
138178
vinNode = elementMap['vin'][0];
139179

@@ -144,7 +184,6 @@ export function calculateMNA(canvasState, schematicReadiness) {
144184
firstLetter = Array.from(key2)[0];
145185
if (firstLetter == 'R') laplaceElement = key2;
146186
else laplaceElement = "1/(S*" + key2 + ")";
147-
console.log('CCC', firstLetter, laplaceElement);
148187

149188
//2.1 in the diagonal is the sum of all impedances connected to that node
150189
for (j = 0; j < elementMap[key2].length; j++) {
@@ -163,6 +202,7 @@ export function calculateMNA(canvasState, schematicReadiness) {
163202
//2.4 Add a 1 in the node connected to Vin to indicate that Iin flows into that node
164203
mnaMatrix[vinNode][mnaMatrix.length - 1] = '1';
165204

205+
console.log('elementMap', elementMap);
166206
console.log('vin, vout and gnd node', vinNode, voutNode, gndNode);
167207
console.log('mna ', mnaMatrix);
168208

@@ -173,22 +213,26 @@ export function calculateMNA(canvasState, schematicReadiness) {
173213
}
174214
nerdStr = nerdStrArr.join(',');
175215

176-
console.log('nerdStr ', nerdStr);
177-
178216

179217
//Using algebrite not nerdamer
180-
// var t = "mna = ["+nerdStr+"]";
181-
// console.log("t",t);
218+
Algebrite.eval("clearall");
182219
Algebrite.eval("mna = [" + nerdStr + "]");
183220
Algebrite.eval("inv_mna = inv(mna)")
184221
Algebrite.eval("inv_mna")
185-
Algebrite.eval("mna_vo_vi = simplify(inv_mna[" + (voutNode + 1) + "][3])")
186-
var latexResult = Algebrite.run("printlatex(mna_vo_vi)");
187-
console.log('Algebrite');
188-
console.log(Algebrite.eval("mna").toString());
189-
console.log(Algebrite.eval("inv_mna").toString());
190-
console.log(Algebrite.eval("mna_vo_vi").toString());
191-
console.log(latexResult);
222+
Algebrite.eval("mna_vo_vi = (inv_mna[" + (voutNode + 1) + "][" + (mnaMatrix.length) + "])")
223+
Algebrite.eval("mna_vo_vi_num = simplify(numerator(mna_vo_vi))")
224+
Algebrite.eval("mna_vo_vi_den = simplify(denominator(mna_vo_vi))")
225+
Algebrite.eval("mna_vo_vi_long = simplify(mna_vo_vi_num/mna_vo_vi_den)")
226+
console.log('vin node')
227+
latexResult = Algebrite.run("printlatex(mna_vo_vi)");
228+
// console.log('Algebrite');
229+
// console.log(Algebrite.eval("mna").toString());
230+
console.log(Algebrite.eval("mna_vo_vi_num").toString());
231+
console.log(Algebrite.eval("mna_vo_vi_den").toString());
232+
console.log(Algebrite.eval("mna_vo_vi_long").toString());
233+
// console.log(Algebrite.eval("inv_mna").toString());
234+
// console.log(Algebrite.eval("mna_vo_vi").toString());
235+
// console.log(latexResult);
192236
// console.log(MNA_vo_vi.text());
193237

194238
// renderPage();

filterAnalyzer/modules/wdk_draw2d.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export class init_draw2d {
3636
vw.getCommandStack().addEventListener(function (e) {
3737
if (e.isPostChangeEvent()) {
3838
wr.marshal(vw, function (json) {
39-
console.log('some change', json)
39+
// console.log('some change', json)
4040
cb(json);
4141
});
4242
}

filterAnalyzer/toDo.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,15 @@
3030
- ~~Use Preact properly~~
3131
- ~~Displaying latex nicely~~
3232
- ~~Add capacitors~~
33-
- Clean up console logging
34-
- Element selector shows whats on schematic
33+
- ~~Clean up console logging~~
34+
- ~~Element selector shows whats on schematic~~
3535
- ~~Load a preset schematic~~
36-
- Launch the beta version on github
37-
10) Remove elements who aren't connected at both ends
36+
- ~~Launch the beta version on github~~
37+
10) Fix R-C-R-C laplace result
38+
11) Add option to rotate components
39+
12) Fix component port location, and make drawings nicer...
40+
13) Make draggable things into images, not text boxes
41+
14) Laplace use subscript in number
3842
11) displaying frequency response
3943

4044

0 commit comments

Comments
 (0)