Difference between revisions of "Template:SEU/toolJS"

Line 1: Line 1:
var DNAspace=6;//| | | |
+
var DNAspace=6;//| | | |
 
var DNAwid=12;
 
var DNAwid=12;
 
var DNAstep=2;
 
var DNAstep=2;
Line 5: Line 5:
 
var arrowHeadLen=8;
 
var arrowHeadLen=8;
 
var DNAseperate=24;
 
var DNAseperate=24;
var Font="0px Arial";
+
var Font="7px Arial";
 
var FontDescription="14px Arial";
 
var FontDescription="14px Arial";
 
var fontSpace=2;
 
var fontSpace=2;
Line 17: Line 17:
 
var line45Angle=Math.asin(arrowSin);
 
var line45Angle=Math.asin(arrowSin);
 
var arrowAngle=line45Angle*0.7;
 
var arrowAngle=line45Angle*0.7;
 +
var longDNAlen=20;
 +
var shortDNAlen=10;
 +
//color and name
 +
//name
 +
var d="d";
 +
var xp="x+",xn="x-";
 +
var y="y",yn="y-";
 +
var waste="_w_";
 +
var wi0p=[],wi0n=[];
 +
var wip=[],win=[];
 +
var inputp=[],inputn=[];
 +
var inputpBkp=[],inputnBkp=[];
 +
//color
 +
var dColor=[];
 +
var xpColor=[];
 +
var xnColor=[];
 +
var yColor=[];
 +
var ynColor=[];
 +
var wasteColor=[0,0,0];
 +
var inputpColor=[],inputnColor=[];
 +
var inputpBkpColor=[],inputnBkpColor=[];
 +
var wi0pColor=[],wi0nColor=[];
 +
var wipColor=[],winColor=[];
 +
var state=0;//part of reaction to print
 +
var seqDict=[[]];
 +
var lis=[];
 +
function setState(num){
 +
state=num;
 +
}
 
function draw() {
 
function draw() {
var ctx = document.getElementById('canvas').getContext('2d');
+
var weightedNum=document.getElementById("number").value;
+
var weightNum=document.getElementById("number").value;
 
// ctx.font = "18px Arial";
 
// ctx.font = "18px Arial";
 
// ctx.fillText("Da",20,65);
 
// ctx.fillText("Da",20,65);
var longDNAlen=20;
+
drawNeuron(weightNum);
var shortDNAlen=10;
+
seqDict=[[]];
ctx.lineWidth=1;
+
//showSeq(seqDict,[10,10]);
var seqDict=drawNeuron(ctx,weightedNum,50,50);
+
showSeq(seqDict,[10,10]);
+
 
}
 
}
function showSeq(seqDict,[X0,Y0]){
+
function showSeq(){
var X=X0,Y=Y0;
+
 
     var seqs = document.getElementById("sequence");
 
     var seqs = document.getElementById("sequence");
    for(var i=0;i<seqDict[0].length;i++){
+
//    for(var i=0;i<seqDict[0].length;i++){
    seqs.innerHTML=seqs.innerHTML+"***************"+seqDict[0][i]+"***************"+":<br>"
+
//    seqs.innerHTML=seqs.innerHTML+"***************"+seqDict[0][i]+"***************"+":<br>"
for(var j in seqDict[i+1]){
+
// for(var j in seqDict[i+1]){
seqs.innerHTML = seqs.innerHTML + change(seqDict[i+1][j]) +"<br>";
+
// seqs.innerHTML = seqs.innerHTML + change(seqDict[i+1][j]) +"<br>";
}
+
// }
}       
+
// }       
 +
seqs.innerHTML="";
 +
for(var i=0;i<lis.length;i++){
 +
seqs.innerHTML=seqs.innerHTML+lis[i]+"<br>";
 +
 
}
 
}
 
function clearCanvas(){
 
function clearCanvas(){
Line 47: Line 77:
 
var t=document.getElementById('sequence');
 
var t=document.getElementById('sequence');
 
t.innerHTML="";
 
t.innerHTML="";
 +
lis=[];
 
}
 
}
 
function arrowReac(ctx,len,arrowReacLen,[x,y]){
 
function arrowReac(ctx,len,arrowReacLen,[x,y]){
Line 1,234: Line 1,265:
 
return Y+20;
 
return Y+20;
 
}
 
}
function drawNeuron(ctx,weightNum,X0,Y0){
+
function drawNeuron(weightNum){
 
//name
 
//name
var d="d";
+
 
var xp="x+",xn="x-";
+
var y="y",yn="y-";
+
var waste="_w_";
+
var wi0p=[],wi0n=[];
+
var wip=[],win=[];
+
var inputp=[],inputn=[];
+
var inputpBkp=[],inputnBkp=[];
+
 
//color
 
//color
var dColor=[Math.random()*255,Math.random()*255,Math.random()*255];
+
dColor=[Math.random()*255,Math.random()*255,Math.random()*255];
var xpColor=[Math.random()*255,Math.random()*255,Math.random()*255];
+
xpColor=[Math.random()*255,Math.random()*255,Math.random()*255];
var xnColor=[255-xpColor[0],255-xpColor[1],255-xpColor[2]];
+
xnColor=[255-xpColor[0],255-xpColor[1],255-xpColor[2]];
var yColor=[Math.random()*255,Math.random()*255,Math.random()*255];
+
yColor=[Math.random()*255,Math.random()*255,Math.random()*255];
var ynColor=[255-yColor[0],255-yColor[1],255-yColor[2]];
+
ynColor=[255-yColor[0],255-yColor[1],255-yColor[2]];
var wasteColor=[0,0,0];
+
wasteColor=[0,0,0];
var inputpColor=[],inputnColor=[];
+
inputpColor=[],inputnColor=[];
var inputpBkpColor=[],inputnBkpColor=[];
+
inputpBkpColor=[],inputnBkpColor=[];
var wi0pColor=[],wi0nColor=[];
+
wi0pColor=[],wi0nColor=[];
var wipColor=[],winColor=[];
+
wipColor=[],winColor=[];
var seqDict=[[]];
+
 
for(var i=1;i<=weightNum;i=i+1){
 
for(var i=1;i<=weightNum;i=i+1){
 
wi0p.push("w"+i+"0+");
 
wi0p.push("w"+i+"0+");
Line 1,261: Line 1,284:
 
wip.push("w"+i+"+");
 
wip.push("w"+i+"+");
 
win.push("w"+i+"-");
 
win.push("w"+i+"-");
 +
 
wi0pColor.push([Math.random()*255,Math.random()*255,Math.random()*255]);
 
wi0pColor.push([Math.random()*255,Math.random()*255,Math.random()*255]);
 
wi0nColor.push([255-wi0pColor[i-1][0],255-wi0pColor[i-1][1],255-wi0pColor[i-1][2]]);
 
wi0nColor.push([255-wi0pColor[i-1][0],255-wi0pColor[i-1][1],255-wi0pColor[i-1][2]]);
Line 1,276: Line 1,300:
 
inputnBkpColor.push([255-inputpBkpColor[i-1][0],255-inputpBkpColor[i-1][1],255-inputpBkpColor[i-1][2]]);
 
inputnBkpColor.push([255-inputpBkpColor[i-1][0],255-inputpBkpColor[i-1][1],255-inputpBkpColor[i-1][2]]);
 
}
 
}
 +
}
 +
function drawWeightedSum([X0,Y0]){
 +
var ctx = document.getElementById('canvas').getContext('2d');
 
X=X0;
 
X=X0;
 
Y=Y0;
 
Y=Y0;
 
//Y=displayStr(ctx,"Weighted sum:",[X,Y],Black);
 
//Y=displayStr(ctx,"Weighted sum:",[X,Y],Black);
X=X0;
 
 
//weighted sum
 
//weighted sum
 +
var weightNum=document.getElementById("number").value;
 
for(var i=1;i<=weightNum;i=i+1){
 
for(var i=1;i<=weightNum;i=i+1){
 
Y=drawMulReLU(ctx,inputpBkp[i-1],wip[i-1],xp,y,inputpBkpColor[i-1],wipColor[i-1],xpColor,yColor,[X,Y],longDNAlen,shortDNAlen)+4*DNAseperate;
 
Y=drawMulReLU(ctx,inputpBkp[i-1],wip[i-1],xp,y,inputpBkpColor[i-1],wipColor[i-1],xpColor,yColor,[X,Y],longDNAlen,shortDNAlen)+4*DNAseperate;
Line 1,292: Line 1,319:
 
}
 
}
 
for(var i=1;i<=weightNum;i=i+1){
 
for(var i=1;i<=weightNum;i=i+1){
seqDict=multiplicationReLU(seqDict,inputpBkp[i-1],wip[i-1],xp,y);
+
seqDict=multiplicationReLU(seqDict,inputpBkp[i-1],wip[i-1],xp,y,inputpBkpColor[i-1],wipColor[i-1],xpColor,yColor);
seqDict=multiplicationReLU(seqDict,inputnBkp[i-1],wip[i-1],xn,yn);
+
seqDict=multiplicationReLU(seqDict,inputnBkp[i-1],wip[i-1],xn,yn,inputnBkpColor[i-1],wipColor[i-1],xnColor,ynColor);
seqDict=multiplicationReLU(seqDict,inputpBkp[i-1],win[i-1],xn,yn);
+
seqDict=multiplicationReLU(seqDict,inputpBkp[i-1],win[i-1],xn,yn,inputpBkpColor[i-1],winColor[i-1],xnColor,ynColor);
seqDict=multiplicationReLU(seqDict,inputnBkp[i-1],win[i-1],xp,y);
+
seqDict=multiplicationReLU(seqDict,inputnBkp[i-1],win[i-1],xp,y,inputnBkpColor[i-1],winColor[i-1],xpColor,yColor);
 
}
 
}
 +
}
 +
function drawSubNeuron([X0,Y0]){
 
//x^+ + x^- -> \phi
 
//x^+ + x^- -> \phi
 
//Y=displayStr(ctx,"x+ + x- -> waste",[X,Y],Black);
 
//Y=displayStr(ctx,"x+ + x- -> waste",[X,Y],Black);
 +
var ctx = document.getElementById('canvas').getContext('2d');
 
X=X0;
 
X=X0;
 +
Y=Y0;
 
Y=drawSub(ctx,xp,xn,waste,xpColor,xnColor,wasteColor,[X,Y],longDNAlen,shortDNAlen)+4*DNAseperate;
 
Y=drawSub(ctx,xp,xn,waste,xpColor,xnColor,wasteColor,[X,Y],longDNAlen,shortDNAlen)+4*DNAseperate;
seqDict=subtraction(seqDict,xp,xn,waste);
+
seqDict=subtraction(seqDict,xp,xn,waste,xpColor,xnColor,wasteColor);
 
X=X0;
 
X=X0;
 
//y + y^- -> \phi
 
//y + y^- -> \phi
Line 1,307: Line 1,338:
 
X=X0;
 
X=X0;
 
Y=drawSub(ctx,y,yn,waste,yColor,ynColor,wasteColor,[X,Y],longDNAlen,shortDNAlen)+4*DNAseperate;
 
Y=drawSub(ctx,y,yn,waste,yColor,ynColor,wasteColor,[X,Y],longDNAlen,shortDNAlen)+4*DNAseperate;
seqDict=subtraction(seqDict,y,yn,waste);
+
seqDict=subtraction(seqDict,y,yn,waste,yColor,ynColor,wasteColor);
 
X=X0;
 
X=X0;
 
+
}
 +
 +
function drawBackprop([X0,Y0]){
 
//backpropagation
 
//backpropagation
 +
var ctx = document.getElementById('canvas').getContext('2d');
 +
var weightNum=document.getElementById("number").value;
 +
X=X0;
 +
Y=Y0;
 
for(var i=1;i<=weightNum;i=i+1){
 
for(var i=1;i<=weightNum;i=i+1){
 
Y=drawMul(ctx,xp,inputp[i-1],wi0n[i-1],xpColor,inputpColor[i-1],wi0nColor[i-1],[X,Y],longDNAlen,shortDNAlen)+4*DNAseperate;
 
Y=drawMul(ctx,xp,inputp[i-1],wi0n[i-1],xpColor,inputpColor[i-1],wi0nColor[i-1],[X,Y],longDNAlen,shortDNAlen)+4*DNAseperate;
Line 1,318: Line 1,355:
 
}
 
}
 
for(var i=1;i<=weightNum;i=i+1){
 
for(var i=1;i<=weightNum;i=i+1){
seqDict=multiplication(seqDict,xp,inputp[i-1],wi0n[i-1]);
+
seqDict=multiplication(seqDict,xp,inputp[i-1],wi0n[i-1],xpColor,inputpColor[i-1],wi0nColor[i-1]);
seqDict=multiplication(seqDict,xp,inputn[i-1],wi0n[i-1]);
+
seqDict=multiplication(seqDict,xp,inputn[i-1],wi0n[i-1],xpColor,inputnColor[i-1],wi0nColor[i-1]);
 
}
 
}
 
 
Line 1,332: Line 1,369:
 
}
 
}
 
for(var i=1;i<=weightNum;i=i+1){
 
for(var i=1;i<=weightNum;i=i+1){
seqDict=add(seqDict,wi0p[i-1],wip[i-1],waste);
+
seqDict=add(seqDict,wi0p[i-1],wip[i-1],waste,wi0pColor[i-1],wipColor[i-1],wasteColor);
seqDict=add(seqDict,wi0n[i-1],win[i-1],waste);
+
seqDict=add(seqDict,wi0n[i-1],win[i-1],waste,wi0nColor[i-1],winColor[i-1],wasteColor);
seqDict=add(seqDict,wip[i-1],win[i-1],waste);
+
seqDict=add(seqDict,wip[i-1],win[i-1],waste,wipColor[i-1],winColor[i-1],wasteColor);
 
}
 
}
return seqDict;
 
 
}
 
}
 +
 +
// return seqDict;
 +
 
///////////////////////////////sequence design//////////////////////////////////////////////////////
 
///////////////////////////////sequence design//////////////////////////////////////////////////////
 
function zeros(num){
 
function zeros(num){
Line 1,466: Line 1,505:
 
}
 
}
  
function add(dict,aName,bName,cName){//dict:[[<species name>s],[Da,al,a,ar,Da*,al*,a*,ar*],[...],...]
+
 
 +
 
 +
 
 +
 
 +
 
 +
//////////////////////////////////////
 +
function rgb2hex(color){
 +
    //var arr=rgb;
 +
    var hexStr="#"+num2hex(color[0])+num2hex(color[1])+num2hex(color[2]);
 +
    return hexStr.toUpperCase();
 +
}
 +
function num2hex(x){
 +
        return ("0" + parseInt(x).toString(16)).slice(-2);
 +
}
 +
function add(dict,aName,bName,cName,aColor,bColor,cColor){//dict:[[<species name>s],[Da,al,a,ar,Da*,al*,a*,ar*],[...],...]
 
var Da,Da_,Db,Db_,Dc,Dc_,a,a_,b,b_,c,c_;//long chain
 
var Da,Da_,Db,Db_,Dc,Dc_,a,a_,b,b_,c,c_;//long chain
 
var al,al_,ar,ar_,bl,bl_,br,br_,cl,cl_,cr,cr_;//short chain
 
var al,al_,ar,ar_,bl,bl_,br,br_,cl,cl_,cr,cr_;//short chain
Line 1,478: Line 1,531:
 
[bl,bl_,br,br_]=creatshortchain();
 
[bl,bl_,br,br_]=creatshortchain();
 
[cl,cl_,cr,cr_]=creatshortchain();
 
[cl,cl_,cr,cr_]=creatshortchain();
if(!(aName in dict[0])){
+
if(!findNameinDict(aName,dict[0])){
 
dict[0].push(aName);
 
dict[0].push(aName);
 
dict.push([Da,al,a,ar,Da_,al_,a_,ar_]);
 
dict.push([Da,al,a,ar,Da_,al_,a_,ar_]);
 
}
 
}
if(!(bName in dict[0])){
+
else{
 +
Da=dict[getIndex(aName,dict[0])+1][0];
 +
al=dict[getIndex(aName,dict[0])+1][1];
 +
a=dict[getIndex(aName,dict[0])+1][2];
 +
ar=dict[getIndex(aName,dict[0])+1][3];
 +
Da_=dict[getIndex(aName,dict[0])+1][4];
 +
al_=dict[getIndex(aName,dict[0])+1][5];
 +
a_=dict[getIndex(aName,dict[0])+1][6];
 +
ar_=dict[getIndex(aName,dict[0])+1][7];
 +
}
 +
if(!findNameinDict(bName,dict[0])){
 
dict[0].push(bName);
 
dict[0].push(bName);
 
dict.push([Db,bl,b,br,Db_,bl_,b_,br_]);
 
dict.push([Db,bl,b,br,Db_,bl_,b_,br_]);
 
}
 
}
if(!(cName in dict[0])){
+
else{
 +
Db=dict[getIndex(bName,dict[0])+1][0];
 +
bl=dict[getIndex(bName,dict[0])+1][1];
 +
b=dict[getIndex(bName,dict[0])+1][2];
 +
br=dict[getIndex(bName,dict[0])+1][3];
 +
Db_=dict[getIndex(bName,dict[0])+1][4];
 +
bl_=dict[getIndex(bName,dict[0])+1][5];
 +
b_=dict[getIndex(bName,dict[0])+1][6];
 +
br_=dict[getIndex(bName,dict[0])+1][7];
 +
}
 +
if(!findNameinDict(cName,dict[0])){
 
dict[0].push(cName);
 
dict[0].push(cName);
 
dict.push([Dc,cl,c,cr,Dc_,cl_,c_,cr_]);
 
dict.push([Dc,cl,c,cr,Dc_,cl_,c_,cr_]);
 
}
 
}
 
+
else{
 +
Dc=dict[getIndex(cName,dict[0])+1][0];
 +
cl=dict[getIndex(cName,dict[0])+1][1];
 +
c=dict[getIndex(cName,dict[0])+1][2];
 +
cr=dict[getIndex(cName,dict[0])+1][3];
 +
Dc_=dict[getIndex(cName,dict[0])+1][4];
 +
cl_=dict[getIndex(cName,dict[0])+1][5];
 +
c_=dict[getIndex(cName,dict[0])+1][6];
 +
cr_=dict[getIndex(cName,dict[0])+1][7];
 +
}
 
///////////////////////////////////////////////////////
 
///////////////////////////////////////////////////////
var ai=[Da,0,al,0,a,0,ar];
+
///
var Gi_up=zeros(al.length).concat([0,a,0,ar,0,Db,0,bl,0,Dc,0,cl]);
+
 
    var Gi_down=[al_,0,a_,0,ar_,0].concat(zeros(Db.length+bl.length+Dc.length+cl.length),[0,0,0]);
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Da) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar) +"</div>");
var Oi=[a,0,ar,0,Db,0,bl,0,Dc,0,cl];
+
lis.push("<div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar) + "</div><div style=\"color:#000000;float:left\">" + change(Db) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl) + "</div><div style=\"color:#000000;float:left\">" + change(Dc) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl) +"</div>");
var waste1_up=[Da,0,al,0,a,0,ar];
+
lis.push("<div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al_) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a_) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar_) +"</div>");
    var waste1_down=zeros(Da.length).concat[0,al_,0,a_,0,ar_];
+
lis.push("<div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar) + "</div><div style=\"color:#000000;float:left\">" + change(Db) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl) + "</div><div style=\"color:#000000;float:left\">" + change(Dc) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl) +"</div>");
var waste2_up=[a,0,ar,0,Db,0,bl,0,Dc,0,cl];
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Da) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar) +"</div>");
    var waste2_down=zeros(a.length).concat[0,al_,0,Db_,0,bl_,0,Dc_,0,cl_];
+
lis.push("<div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al_) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a_) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar_) +"</div>");
var bi=[Db,0,bl,0,b,0,br];
+
lis.push("<div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar) + "</div><div style=\"color:#000000;float:left\">" + change(Db) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl) + "</div><div style=\"color:#000000;float:left\">" + change(Dc) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl) +"</div>");
var ci=[Dc,0,cl,0,c,0,cr];
+
lis.push("<div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al_) + "</div><div style=\"color:#000000;float:left\">" + change(Db_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl_) + "</div><div style=\"color:#000000;float:left\">" + change(Dc_) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl_) +"</div>");
var Ti1=[Db,0,bl,0,b,0,br];
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Db) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br) +"</div>");
var Ti2=[Dc,0,cl,0,c,0,cr];
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Dc) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(c) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cr) +"</div>");
var Ti3=[al_,0,Db_,0,bl_,0,Dc_,0,cl_];
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Db) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br) +"</div>");
 +
lis.push("<div style=\"color:#000000;float:left\">" + change(Dc) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(c) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cr) +"</div>");
 +
lis.push("<div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al_) + "</div><div style=\"color:#000000;float:left\">" + change(Db_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl_) + "</div><div style=\"color:#000000;float:left\">" + change(Dc) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl_)  +"</div>");
 +
 
 
return dict;
 
return dict;
 
}
 
}
  
function multiplication(dict,aName,bName,cName){
+
 
 +
function multiplication(dict,aName,bName,cName,aColor,bColor,cColor){
 
var Da,Da_,Db,Db_,Dc,Dc_,a,a_,b,b_,c,c_;//long chain
 
var Da,Da_,Db,Db_,Dc,Dc_,a,a_,b,b_,c,c_;//long chain
 
var al,al_,ar,ar_,bl,bl_,br,br_,cl,cl_,cr,cr_;//short chain
 
var al,al_,ar,ar_,bl,bl_,br,br_,cl,cl_,cr,cr_;//short chain
Line 1,520: Line 1,606:
 
[bl,bl_,br,br_]=creatshortchain();
 
[bl,bl_,br,br_]=creatshortchain();
 
[cl,cl_,cr,cr_]=creatshortchain();
 
[cl,cl_,cr,cr_]=creatshortchain();
if(!(aName in dict[0])){
+
if(!findNameinDict(aName,dict[0])){
 
dict[0].push(aName);
 
dict[0].push(aName);
 
dict.push([Da,al,a,ar,Da_,al_,a_,ar_]);
 
dict.push([Da,al,a,ar,Da_,al_,a_,ar_]);
 
}
 
}
if(!(bName in dict[0])){
+
else{
 +
Da=dict[getIndex(aName,dict[0])+1][0];
 +
al=dict[getIndex(aName,dict[0])+1][1];
 +
a=dict[getIndex(aName,dict[0])+1][2];
 +
ar=dict[getIndex(aName,dict[0])+1][3];
 +
Da_=dict[getIndex(aName,dict[0])+1][4];
 +
al_=dict[getIndex(aName,dict[0])+1][5];
 +
a_=dict[getIndex(aName,dict[0])+1][6];
 +
ar_=dict[getIndex(aName,dict[0])+1][7];
 +
}
 +
if(!findNameinDict(bName,dict[0])){
 
dict[0].push(bName);
 
dict[0].push(bName);
 
dict.push([Db,bl,b,br,Db_,bl_,b_,br_]);
 
dict.push([Db,bl,b,br,Db_,bl_,b_,br_]);
 
}
 
}
if(!(cName in dict[0])){
+
else{
 +
Db=dict[getIndex(bName,dict[0])+1][0];
 +
bl=dict[getIndex(bName,dict[0])+1][1];
 +
b=dict[getIndex(bName,dict[0])+1][2];
 +
br=dict[getIndex(bName,dict[0])+1][3];
 +
Db_=dict[getIndex(bName,dict[0])+1][4];
 +
bl_=dict[getIndex(bName,dict[0])+1][5];
 +
b_=dict[getIndex(bName,dict[0])+1][6];
 +
br_=dict[getIndex(bName,dict[0])+1][7];
 +
}
 +
if(!findNameinDict(cName,dict[0])){
 
dict[0].push(cName);
 
dict[0].push(cName);
 
dict.push([Dc,cl,c,cr,Dc_,cl_,c_,cr_]);
 
dict.push([Dc,cl,c,cr,Dc_,cl_,c_,cr_]);
 +
}
 +
else{
 +
Dc=dict[getIndex(cName,dict[0])+1][0];
 +
cl=dict[getIndex(cName,dict[0])+1][1];
 +
c=dict[getIndex(cName,dict[0])+1][2];
 +
cr=dict[getIndex(cName,dict[0])+1][3];
 +
Dc_=dict[getIndex(cName,dict[0])+1][4];
 +
cl_=dict[getIndex(cName,dict[0])+1][5];
 +
c_=dict[getIndex(cName,dict[0])+1][6];
 +
cr_=dict[getIndex(cName,dict[0])+1][7];
 
}
 
}
 
/////////////////////////////////////////////////////////
 
/////////////////////////////////////////////////////////
var ai=[Da,0,al,0,a,0,ar];
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Da) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar) +"</div>");
var Li_up=zeros(al.length).concat([0,a,0,ar,0,bl,0,b,0,br,0,Da,0,al,0,Db,0,bl,0,Dc,0,cl]);
+
lis.push("<div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br) +"</div><div style=\"color:#000000;float:left\">" + change(Da) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al) +"</div><div style=\"color:#000000;float:left\">" + change(Db) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl) +"</div><div style=\"color:#000000;float:left\">" + change(Dc) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl) +"</div>");
    var Li_down=[al_,0,a_,0,ar_,0,bl_,0,b_,0,br_].concat(zeros(Da.length+al.length+Db.length+bl.length+Dc.length+cl.length),[0,0,0,0,0,0]);
+
lis.push("<div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al_) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a_) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar_) +"</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br_) +"</div>");
var Hi_up=[Da,0,al,0,a,0,ar,0].concat([zeros(bl_.length)],[0,b,0,br,0,Da,0,al,0,Db,0,bl,0,Dc,0,cl]);
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Da) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br) + "</div><div style=\"color:#000000;float:left\">" + change(Dc) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl) +"</div>");
var Hi_down=zeros(Da.length).concat([0,al_,0,a_,0,ar_,0,bl_,0,b_,0,br_],zeros(Da.length+al.length+Db.length+bl.length+Dc.length+cl.length),[0,0,0,0,0,0]);
+
lis.push("<div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al_) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a_) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br_) +"</div>");
 
+
lis.push("<div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl) +"</div>");
var Bi=[a,0,ar,0,bl];
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Db) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b) +"</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" +change(br) +"</div>");
var bi=[Db,0,bl,0,b,0,br];
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Da) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar) +"</div>");
var waste11=[Da,0,al,0,a,0,ar];
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Db) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br) +"</div>");
var waste12=[Db,0,bl,0,b,0,br];
+
  lis.push("<div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al_) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a_) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br_) +"</div>");
var waste13=[al_,0,a_,0,ar_,0,bl_,0,b_,0,br_];
+
lis.push("<div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br) + "</div><div style=\"color:#000000;float:left\">" + change(Da) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al) +"</div><div style=\"color:#000000;float:left\">" + change(Db) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl) +"</div><div style=\"color:#000000;float:left\">" + change(Dc) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl) +"</div>");
var Oi=[b,0,br,0,Da,0,al,0,Db,0,bl,0,Dc,0,cl];
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Da) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar) +"</div>");
var Ti1=[Da,0,al,0,a,0,ar];
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Db) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br) +"</div>");
var Ti2=[Db,0,bl,0,b,0,br];
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Dc) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(c) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cr) +"</div>");
var Ti3=[Dc,0,cl,0,b,0,br];
+
lis.push("<div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br_) + "</div><div style=\"color:#000000;float:left\">" + change(Da_) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al_)+ "</div><div style=\"color:#000000;float:left\">" + change(Db_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl_)+ "</div><div style=\"color:#000000;float:left\">" + change(Dc_) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl_)+"</div>");
var Ti4=[br_,0,Da_,0,al_,0,Db_,0,bl_,0,Dc_,0,cl_];
+
lis.push("<div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br) + "</div><div style=\"color:#000000;float:left\">" + change(Da) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al) +"</div><div style=\"color:#000000;float:left\">" + change(Db) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl) +"</div><div style=\"color:#000000;float:left\">" + change(Dc) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl) +"</div>");
var waste2_up=[b,0,br,0,Da,0,al,0,Db,0,bl,0,Dc,0,cl];
+
lis.push("<div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br_) + "</div><div style=\"color:#000000;float:left\">" + change(Da_) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al_) +"</div><div style=\"color:#000000;float:left\">" + change(Db_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl_) +"</div><div style=\"color:#000000;float:left\">" + change(Dc_) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl_) +"</div>");
var waste2_down=zeros(b.length).concat([0,br_,0,Da_,0,al_,0,Db_,0,bl_,0,Dc_,0,cl_]);
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Dc) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(c) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cr) +"</div>");
var ci=[Dc,0,cl,0,c,0,cr];
+
 
return dict;
 
return dict;
 
}
 
}
  
function subtraction(dict,aName,bName,cName){
+
function subtraction(dict,aName,bName,cName,aColor,bColor,cColor){
 
var Da,Da_,Db,Db_,Dc,Dc_,a,a_,b,b_,c,c_;//long chain
 
var Da,Da_,Db,Db_,Dc,Dc_,a,a_,b,b_,c,c_;//long chain
 
var al,al_,ar,ar_,bl,bl_,br,br_,cl,cl_,cr,cr_;//short chain
 
var al,al_,ar,ar_,bl,bl_,br,br_,cl,cl_,cr,cr_;//short chain
Line 1,567: Line 1,682:
 
[bl,bl_,br,br_]=creatshortchain();
 
[bl,bl_,br,br_]=creatshortchain();
 
[cl,cl_,cr,cr_]=creatshortchain();
 
[cl,cl_,cr,cr_]=creatshortchain();
if(!(aName in dict[0])){
+
if(!findNameinDict(aName,dict[0])){
 
dict[0].push(aName);
 
dict[0].push(aName);
 
dict.push([Da,al,a,ar,Da_,al_,a_,ar_]);
 
dict.push([Da,al,a,ar,Da_,al_,a_,ar_]);
 
}
 
}
if(!(bName in dict[0])){
+
else{
 +
Da=dict[getIndex(aName,dict[0])+1][0];
 +
al=dict[getIndex(aName,dict[0])+1][1];
 +
a=dict[getIndex(aName,dict[0])+1][2];
 +
ar=dict[getIndex(aName,dict[0])+1][3];
 +
Da_=dict[getIndex(aName,dict[0])+1][4];
 +
al_=dict[getIndex(aName,dict[0])+1][5];
 +
a_=dict[getIndex(aName,dict[0])+1][6];
 +
ar_=dict[getIndex(aName,dict[0])+1][7];
 +
}
 +
if(!findNameinDict(bName,dict[0])){
 
dict[0].push(bName);
 
dict[0].push(bName);
 
dict.push([Db,bl,b,br,Db_,bl_,b_,br_]);
 
dict.push([Db,bl,b,br,Db_,bl_,b_,br_]);
 
}
 
}
if(!(cName in dict[0])){
+
else{
 +
Db=dict[getIndex(bName,dict[0])+1][0];
 +
bl=dict[getIndex(bName,dict[0])+1][1];
 +
b=dict[getIndex(bName,dict[0])+1][2];
 +
br=dict[getIndex(bName,dict[0])+1][3];
 +
Db_=dict[getIndex(bName,dict[0])+1][4];
 +
bl_=dict[getIndex(bName,dict[0])+1][5];
 +
b_=dict[getIndex(bName,dict[0])+1][6];
 +
br_=dict[getIndex(bName,dict[0])+1][7];
 +
}
 +
if(!findNameinDict(cName,dict[0])){
 
dict[0].push(cName);
 
dict[0].push(cName);
 
dict.push([Dc,cl,c,cr,Dc_,cl_,c_,cr_]);
 
dict.push([Dc,cl,c,cr,Dc_,cl_,c_,cr_]);
 +
}
 +
else{
 +
Dc=dict[getIndex(cName,dict[0])+1][0];
 +
cl=dict[getIndex(cName,dict[0])+1][1];
 +
c=dict[getIndex(cName,dict[0])+1][2];
 +
cr=dict[getIndex(cName,dict[0])+1][3];
 +
Dc_=dict[getIndex(cName,dict[0])+1][4];
 +
cl_=dict[getIndex(cName,dict[0])+1][5];
 +
c_=dict[getIndex(cName,dict[0])+1][6];
 +
cr_=dict[getIndex(cName,dict[0])+1][7];
 
}
 
}
 
/////////////////////////////////////////////////////////
 
/////////////////////////////////////////////////////////
var ai=[Da,0,al,0,a,0,ar];
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Da) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar) +"</div>");
var Li_up=zeros(al_.length).concat([0,a,0,ar,0,bl,0,b,0,br,0,Da,0,al,0,Db,0,bl,0,Dc,0,cl]);
+
lis.push("<div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br) +"</div><div style=\"color:#000000;float:left\">" + change(Da) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al) +"</div><div style=\"color:#000000;float:left\">" + change(Db) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl) +"</div><div style=\"color:#000000;float:left\">" + change(Dc) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl) +"</div>");
    var Li_down=[al_,0,a_,0,ar_,0,bl_,0,b_,0,br_].concat(zeros(Dc.length+cl.length),[0,0]);
+
lis.push("<div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al_) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a_) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar_) +"</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br_) +"</div>");
var Hi_up=[Da,0,al,0,a,0,ar,0].concat([zeros(bl_.length)],[0,b,0,br,0,Dc,0,cl]);
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Da) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br) + "</div><div style=\"color:#000000;float:left\">" + change(Dc) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl) +"</div>");
var Hi_down=zeros(Da.length).concat([0,al_,0,a_,0,ar_,0,bl_,0,b_,0,br_,0],zeros(Dc.length+cl.length),[0]);
+
lis.push("<div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al_) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a_) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br_) +"</div>");
var Bi=[a,0,ar,0,bl];
+
lis.push("<div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl) +"</div>");
var bi=[Db,0,bl,0,b,0,br];
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Db) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b) +"</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" +change(br) +"</div>");
var waste11=[Da,0,al,0,a,0,ar];
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Da) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar) +"</div>");
var waste12=[Db,0,bl,0,b,0,br];
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Db) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br) +"</div>");
var waste13=[al_,0,a_,0,ar_,0,bl_,0,b_,0,br_];
+
    lis.push("<div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al_) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a_) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br_) +"</div>");
var Oi=[b,0,br,0,Dc,0,cl];
+
lis.push("<div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br)  +"</div><div style=\"color:#000000;float:left\">" + change(Dc) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl) +"</div>");
var Ti_up=zeros(br_.length).concat([0,Dc,0,cl,0,c,0,cr]);
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Dc) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl)  +"</div><div style=\"color:#000000;float:left\">" + change(c) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cr) +"</div>");
var Ti_down=[br_,0,Dc_,0,cl_,0].concat(zeros(c.length+cr.length),[0]);
+
lis.push("<div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br_) + "</div><div style=\"color:#000000;float:left\">" + change(Dc_) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl_)+"</div>");
var waste2_up=[b,0,br,0,Dc,0,cl];
+
lis.push("<div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br) + "</div><div style=\"color:#000000;float:left\">" + change(Dc) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl) +"</div>");
var waste2_down=zeros(b.length).concat([0,br_,0,Dc_,0,cl_]);
+
lis.push("<div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br_) + "</div><div style=\"color:#000000;float:left\">" + change(Dc_) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl_) +"</div>");
var ci=[Dc,0,cl,0,c,0,cr];
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Dc) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(c) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cr) +"</div>");
 
return dict;
 
return dict;
 
}
 
}
  
function multiplicationReLU(dict,aName,bName,cName,dName){
+
function multiplicationReLU(dict,aName,bName,cName,dName,aColor,bColor,cColor,dcolor){
 
var Da,Da_,Db,Db_,Dc,Dc_,Dd,Dd_,a,a_,b,b_,c,c_,d,d_;//long chain
 
var Da,Da_,Db,Db_,Dc,Dc_,Dd,Dd_,a,a_,b,b_,c,c_,d,d_;//long chain
 
var al,al_,ar,ar_,bl,bl_,br,br_,cl,cl_,cr,cr_,dl,dl_,dr,dr_;//short chain
 
var al,al_,ar,ar_,bl,bl_,br,br_,cl,cl_,cr,cr_,dl,dl_,dr,dr_;//short chain
Line 1,614: Line 1,759:
 
[cl,cl_,cr,cr_]=creatshortchain();
 
[cl,cl_,cr,cr_]=creatshortchain();
 
[dl,dl_,dr,dr_]=creatshortchain();
 
[dl,dl_,dr,dr_]=creatshortchain();
if(!(aName in dict[0])){
+
if(!findNameinDict(aName,dict[0])){
 
dict[0].push(aName);
 
dict[0].push(aName);
 
dict.push([Da,al,a,ar,Da_,al_,a_,ar_]);
 
dict.push([Da,al,a,ar,Da_,al_,a_,ar_]);
 
}
 
}
if(!(bName in dict[0])){
+
else{
 +
Da=dict[getIndex(aName,dict[0])+1][0];
 +
al=dict[getIndex(aName,dict[0])+1][1];
 +
a=dict[getIndex(aName,dict[0])+1][2];
 +
ar=dict[getIndex(aName,dict[0])+1][3];
 +
Da_=dict[getIndex(aName,dict[0])+1][4];
 +
al_=dict[getIndex(aName,dict[0])+1][5];
 +
a_=dict[getIndex(aName,dict[0])+1][6];
 +
ar_=dict[getIndex(aName,dict[0])+1][7];
 +
}
 +
if(!findNameinDict(bName,dict[0])){
 
dict[0].push(bName);
 
dict[0].push(bName);
 
dict.push([Db,bl,b,br,Db_,bl_,b_,br_]);
 
dict.push([Db,bl,b,br,Db_,bl_,b_,br_]);
 
}
 
}
if(!(cName in dict[0])){
+
else{
 +
Db=dict[getIndex(bName,dict[0])+1][0];
 +
bl=dict[getIndex(bName,dict[0])+1][1];
 +
b=dict[getIndex(bName,dict[0])+1][2];
 +
br=dict[getIndex(bName,dict[0])+1][3];
 +
Db_=dict[getIndex(bName,dict[0])+1][4];
 +
bl_=dict[getIndex(bName,dict[0])+1][5];
 +
b_=dict[getIndex(bName,dict[0])+1][6];
 +
br_=dict[getIndex(bName,dict[0])+1][7];
 +
}
 +
if(!findNameinDict(cName,dict[0])){
 
dict[0].push(cName);
 
dict[0].push(cName);
 
dict.push([Dc,cl,c,cr,Dc_,cl_,c_,cr_]);
 
dict.push([Dc,cl,c,cr,Dc_,cl_,c_,cr_]);
 
}
 
}
if(!(dName in dict[0])){
+
else{
 +
Dc=dict[getIndex(cName,dict[0])+1][0];
 +
cl=dict[getIndex(cName,dict[0])+1][1];
 +
c=dict[getIndex(cName,dict[0])+1][2];
 +
cr=dict[getIndex(cName,dict[0])+1][3];
 +
Dc_=dict[getIndex(cName,dict[0])+1][4];
 +
cl_=dict[getIndex(cName,dict[0])+1][5];
 +
c_=dict[getIndex(cName,dict[0])+1][6];
 +
cr_=dict[getIndex(cName,dict[0])+1][7];
 +
}
 +
if(!findNameinDict(dName,dict[0])){
 
dict[0].push(dName);
 
dict[0].push(dName);
 
dict.push([Dd,dl,d,dr,Dd_,dl_,d_,dr_]);
 
dict.push([Dd,dl,d,dr,Dd_,dl_,d_,dr_]);
 +
}
 +
else{
 +
Dd=dict[getIndex(dName,dict[0])+1][0];
 +
dl=dict[getIndex(dName,dict[0])+1][1];
 +
d=dict[getIndex(dName,dict[0])+1][2];
 +
dr=dict[getIndex(dName,dict[0])+1][3];
 +
Dd_=dict[getIndex(dName,dict[0])+1][4];
 +
dl_=dict[getIndex(dName,dict[0])+1][5];
 +
d_=dict[getIndex(dName,dict[0])+1][6];
 +
dr_=dict[getIndex(dName,dict[0])+1][7];
 
}
 
}
 
/////////////////////////////////////////////////////////
 
/////////////////////////////////////////////////////////
var ai=[Da,0,al,0,a,0,ar];
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Da) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar) +"</div>");
var Li_up=zeros(al.length).concat([0,a,0,ar,0,bl,0,b,0,br,0,Da,0,al,0,Db,0,bl,0,Dc,0,cl,0,Dd,0,dl]);
+
lis.push("<div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br) +"</div><div style=\"color:#000000;float:left\">" + change(Da) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al) +"</div><div style=\"color:#000000;float:left\">" + change(Db) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl) +"</div><div style=\"color:#000000;float:left\">" + change(Dc) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl) +"</div><div style=\"color:#000000;float:left\">" + change(Dd) + "</div><div style=\"color:"+rgb2hex(dColor)+";float:left\">" + change(dl) +"</div>");
    var Li_down=[al_,0,a_,0,ar_,0,bl_,0,b_,0,br_].concat(zeros(Da.length+al.length+Db.length+bl.length+Dc.length+cl.length+Dd.length+dl.length),[0,0,0,0,0,0,0,0]);
+
lis.push("<div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al_) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a_) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar_) +"</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br_) +"</div>");
var Hi_up=[Da,0,al,0,a,0,ar,0].concat([zeros(bl_.length)],[0,b,0,br,0,Da,0,al,0,Db,0,bl,0,Dc,0,cl,0,Dd,0,dl]);
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Da) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br) + "</div><div style=\"color:#000000;float:left\">" + change(Da) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al) +"</div><div style=\"color:#000000;float:left\">" + change(Db) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl) +"</div><div style=\"color:#000000;float:left\">" + change(Dc) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl) +"</div><div style=\"color:#000000;float:left\">" + change(Dd) + "</div><div style=\"color:"+rgb2hex(dColor)+";float:left\">" + change(dl) +"</div>");
var Hi_down=zeros(Da.length).concat([0,al_,0,a_,0,ar_,0,bl_,0,b_,0,br_],zeros(Da.length+al.length+Da.length+al.length+Dc.length+cl.length+Dd.length+dl.length),[0,0,0,0,0,0,0,0]);
+
lis.push("<div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al_) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a_) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br_) +"</div>");
var Bi=[a,0,ar,0,bl];
+
lis.push("<div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl) +"</div>");
var bi=[Db,0,bl,0,b,0,br];
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Db) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b) +"</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" +change(br) +"</div>");
var waste11=[Da,0,al,0,a,0,ar];
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Da) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar) +"</div>");
var waste12=[Db,0,bl,0,b,0,br];
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Db) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br) +"</div>");
var waste13=[al_,0,a_,0,ar_,0,bl_,0,b_,0,br_];
+
    lis.push("<div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al_) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a_) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br_) +"</div>");
var Oi=[b,0,br,0,Da,0,al,0,Db,0,bl,0,Dc,0,cl,0,Dd,0,dl];
+
lis.push("<div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br) + "</div><div style=\"color:#000000;float:left\">" + change(Da) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al) +"</div><div style=\"color:#000000;float:left\">" + change(Db) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl) +"</div><div style=\"color:#000000;float:left\">" + change(Dc) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl) +"</div><div style=\"color:#000000;float:left\">" + change(Dd) + "</div><div style=\"color:"+rgb2hex(dColor)+";float:left\">" + change(dl) +"</div>");
var Ti1=[Da,0,al,0,a,0,ar];
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Da) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(a) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(ar) +"</div>");
var Ti2=[Db,0,bl,0,b,0,br];
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Db) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br) +"</div>");
var Ti3=[Dc,0,cl,0,c,0,cr];
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Dc) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(c) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cr) +"</div>");
var Ti4=[Dd,0,dl,0,d,0,dr];
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Dd) + "</div><div style=\"color:"+rgb2hex(dColor)+";float:left\">" + change(dl) + "</div><div style=\"color:"+rgb2hex(dColor)+";float:left\">" + change(d) + "</div><div style=\"color:"+rgb2hex(dColor)+";float:left\">" + change(dr) +"</div>");
var Ti5=[br_,0,Da_,0,al_,0,Db_,0,bl_,0,Dc_,0,cl_,0,Dd_,0,dl_];
+
lis.push("<div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br_) + "</div><div style=\"color:#000000;float:left\">" + change(Da_) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al_)+ "</div><div style=\"color:#000000;float:left\">" + change(Db_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl_)+ "</div><div style=\"color:#000000;float:left\">" + change(Dc_) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl_)+"</div><div style=\"color:#000000;float:left\">" + change(Dd_) + "</div><div style=\"color:"+rgb2hex(dColor)+";float:left\">" + change(dl_)+"</div>");
var waste2_up=[b,0,br,0,Da,0,al,0,Db,0,bl,0,Dc,0,cl,0,Dd,0,dl];
+
lis.push("<div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(b) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br) + "</div><div style=\"color:#000000;float:left\">" + change(Da) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al) +"</div><div style=\"color:#000000;float:left\">" + change(Db) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl) +"</div><div style=\"color:#000000;float:left\">" + change(Dc) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl) +"</div><div style=\"color:#000000;float:left\">" + change(Dd) + "</div><div style=\"color:"+rgb2hex(dColor)+";float:left\">" + change(dl) +"</div>");
var waste2_down=zeros(b.length).concat([0,br_,0,Da_,0,al_,0,Db_,0,bl_,0,Dc_,0,cl_,0,Dd_,0,dl_]);
+
lis.push("<div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(br_) + "</div><div style=\"color:#000000;float:left\">" + change(Da_) + "</div><div style=\"color:"+rgb2hex(aColor)+";float:left\">" + change(al_) +"</div><div style=\"color:#000000;float:left\">" + change(Db_) + "</div><div style=\"color:"+rgb2hex(bColor)+";float:left\">" + change(bl_) +"</div><div style=\"color:#000000;float:left\">" + change(Dc_) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl_) +"</div><div style=\"color:#000000;float:left\">" + change(Dd_) + "</div><div style=\"color:"+rgb2hex(dColor)+";float:left\">" + change(dl_) +"</div>");
var ci=[Dc,0,cl,0,c,0,cr];
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Dc) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cl) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(c) + "</div><div style=\"color:"+rgb2hex(cColor)+";float:left\">" + change(cr) +"</div>");
var di=[Dd,0,dl,0,d,0,dr];
+
lis.push("<div style=\"color:#000000;float:left\">" + change(Dd) + "</div><div style=\"color:"+rgb2hex(dColor)+";float:left\">" + change(dl) + "</div><div style=\"color:"+rgb2hex(dColor)+";float:left\">" + change(d) + "</div><div style=\"color:"+rgb2hex(dColor)+";float:left\">" + change(dr) +"</div>");
 
return dict;
 
return dict;
 +
}
 +
////////////////////tools/////////////////////////////////////////////////
 +
function findNameinDict(name,dict0){
 +
for(var i=0;i<dict0.length;i=i+1){
 +
      //console.log(dict0[i]);
 +
if(dict0[i]==name)
 +
return true;
 +
}
 +
return false;
 +
}
 +
function getIndex(element,lis){
 +
for(var i=0;i<lis.length;i=i+1){
 +
if(element==lis[i])
 +
return i;
 +
}
 +
return -1;
 
}
 
}

Revision as of 11:15, 22 September 2019

var DNAspace=6;//| | | | var DNAwid=12; var DNAstep=2; var arrowLen=4; var arrowHeadLen=8; var DNAseperate=24; var Font="7px Arial"; var FontDescription="14px Arial"; var fontSpace=2; var Black=[0,0,0]; var reacArrowLen=40; var reacArrowHeadLen=6; var longDNAlen=20; var shortDNAlen=16; var arrowSin=0.4; var arrowCos=Math.sqrt(1-arrowSin*arrowSin); var line45Angle=Math.asin(arrowSin); var arrowAngle=line45Angle*0.7; var longDNAlen=20; var shortDNAlen=10; //color and name //name var d="d"; var xp="x+",xn="x-"; var y="y",yn="y-"; var waste="_w_"; var wi0p=[],wi0n=[]; var wip=[],win=[]; var inputp=[],inputn=[]; var inputpBkp=[],inputnBkp=[]; //color var dColor=[]; var xpColor=[]; var xnColor=[]; var yColor=[]; var ynColor=[]; var wasteColor=[0,0,0]; var inputpColor=[],inputnColor=[]; var inputpBkpColor=[],inputnBkpColor=[]; var wi0pColor=[],wi0nColor=[]; var wipColor=[],winColor=[]; var state=0;//part of reaction to print var seqDict=[[]]; var lis=[]; function setState(num){ state=num; } function draw() {

var weightNum=document.getElementById("number").value; // ctx.font = "18px Arial"; // ctx.fillText("Da",20,65); drawNeuron(weightNum); seqDict=[[]]; //showSeq(seqDict,[10,10]); } function showSeq(){

   var seqs = document.getElementById("sequence");
//    for(var i=0;i<seqDict[0].length;i++){
//    	seqs.innerHTML=seqs.innerHTML+"***************"+seqDict[0][i]+"***************"+":
"

// for(var j in seqDict[i+1]){ // seqs.innerHTML = seqs.innerHTML + change(seqDict[i+1][j]) +"
"; // } // } seqs.innerHTML=""; for(var i=0;i<lis.length;i++){ seqs.innerHTML=seqs.innerHTML+lis[i]+"
"; } } function clearCanvas(){ var c=document.getElementById('canvas'); var ctx=c.getContext('2d'); ctx. c=document.getElementById('seqCanvas'); ctx=c.getContext('2d'); ctx.clearRect(0,0,c.width,c.height); var t=document.getElementById('sequence'); t.innerHTML=""; lis=[]; } function arrowReac(ctx,len,arrowReacLen,[x,y]){ ctx.strokeStyle='rgb('+Black[0]+','+Black[0]+','+Black[0]+')'; ctx.beginPath(); ctx.moveTo(x,y); ctx.lineTo(x+len,y); ctx.moveTo(x+len-arrowReacLen,y+arrowReacLen); ctx.lineTo(x+len,y); ctx.moveTo(x+len-arrowReacLen,y-arrowReacLen); ctx.lineTo(x+len,y); ctx.stroke(); } function revArrowReac(ctx,len,arrowReacLen,[x,y]){ ctx.strokeStyle='rgb('+Black[0]+','+Black[0]+','+Black[0]+')'; ctx.beginPath(); ctx.moveTo(x,y); ctx.lineTo(x+len,y); ctx.moveTo(x+len-arrowReacLen,y+arrowReacLen); ctx.lineTo(x+len,y); ctx.moveTo(x+len-arrowReacLen,y-arrowReacLen); ctx.lineTo(x+len,y); ctx.moveTo(x+arrowReacLen,y+arrowReacLen); ctx.lineTo(x,y); ctx.moveTo(x+arrowReacLen,y-arrowReacLen); ctx.lineTo(x,y); ctx.stroke(); } function horizontalLine(ctx,name,len,[x,y],[R,G,B]){ ctx.strokeStyle='rgb('+R+','+G+','+B+')'; ctx.beginPath(); ctx.moveTo(x,y); ctx.lineTo(x+len,y); ctx.stroke(); ctx.fillStyle='rgb('+R+','+G+','+B+')'; ctx.fillText(name,x,y-fontSpace); }

function verticalLine(ctx,len,[x,y],[R,G,B]){ ctx.strokeStyle='rgb('+R+','+G+','+B+')'; ctx.beginPath(); ctx.moveTo(x,y); ctx.lineTo(x,y+len); ctx.stroke(); }

function horizontalDashedLine(ctx,name,len,[x,y],[R,G,B],step){ ctx.strokeStyle='rgb('+R+','+G+','+B+')'; ctx.beginPath(); for(var i=0;i<=len-1;i+=2*step){ ctx.moveTo(x+i,y); ctx.lineTo(x+i+step,y); ctx.stroke(); } ctx.fillStyle='rgb('+R+','+G+','+B+')'; ctx.fillText(name,x,y-fontSpace); }

function up45RightLine(ctx,name,len,[x,y],[R,G,B]){ ctx.strokeStyle='rgb('+R+','+G+','+B+')'; ctx.beginPath(); ctx.moveTo(x,y); ctx.lineTo(x+arrowCos*len,y-arrowSin*len); ctx.stroke(); ctx.fillStyle='rgb('+R+','+G+','+B+')'; ctx.fillText(name,x+len/2,y-fontSpace); }

function up45DashedRightLine(ctx,name,len,[x,y],[R,G,B],step){ ctx.strokeStyle='rgb('+R+','+G+','+B+')'; ctx.beginPath(); for(var i=0;i<=len-1;i+=2*step){ ctx.moveTo(x+arrowCos*i,y-arrowSin*i); ctx.lineTo(x+arrowCos*(i+step),y-arrowSin*(i+step)); ctx.stroke(); } ctx.fillStyle='rgb('+R+','+G+','+B+')'; ctx.fillText(name,x+len/2,y-fontSpace); }

function up45LeftLine(ctx,name,len,[x,y],[R,G,B]){ ctx.strokeStyle='rgb('+R+','+G+','+B+')'; ctx.beginPath(); ctx.moveTo(x,y); ctx.lineTo(x-arrowCos*len,y-arrowSin*len); ctx.stroke(); ctx.fillStyle='rgb('+R+','+G+','+B+')'; ctx.fillText(name,x-len/2,y-len/2-fontSpace); }

function up45DashedLeftLine(ctx,len,[x,y],[R,G,B],step){ ctx.strokeStyle='rgb('+R+','+G+','+B+')'; ctx.beginPath(); for(var i=0;i<=len-1;i+=2*step){ ctx.moveTo(x-arrowCos*i,y-arrowSin*i); ctx.lineTo(x-arrowCos*(i+step),y-arrowSin*(i+step)); ctx.stroke(); } }

function down45LeftLine(ctx,len,[x,y],[R,G,B]){ ctx.strokeStyle='rgb('+R+','+G+','+B+')'; ctx.beginPath(); ctx.moveTo(x,y); ctx.lineTo(x-arrowCos*len,y+arrowSin*len); ctx.stroke(); }

function down45DashedLeftLine(ctx,len,[x,y],[R,G,B],step){ ctx.strokeStyle='rgb('+R+','+G+','+B+')'; ctx.beginPath(); for(var i=0;i<=len-1;i+=2*step){ ctx.moveTo(x-arrowCos*i,y+arrowSin*i); ctx.lineTo(x-arrowCos*(i+step),y+arrowSin*(i+step)); ctx.stroke(); } }

function arrowHorizontalRight(ctx,name,len,[x,y],[R,G,B],arrowLen,arrowAngle){ ctx.strokeStyle='rgb('+R+','+G+','+B+')'; ctx.beginPath(); ctx.moveTo(x,y); ctx.lineTo(x+len,y); //right ctx.moveTo(x+len-Math.floor(arrowLen*Math.cos(arrowAngle)), y-Math.floor(arrowLen*Math.sin(arrowAngle))); ctx.lineTo(x+len,y); //left ctx.moveTo(x+len-Math.floor(arrowLen*Math.cos(arrowAngle)), y+Math.floor(arrowLen*Math.sin(arrowAngle))); ctx.lineTo(x+len,y); ctx.stroke(); ctx.fillStyle='rgb('+R+','+G+','+B+')'; ctx.fillText(name,x+len/2,y-fontSpace); }

function arrowHorizontalLeft(ctx,name,len,[x,y],[R,G,B],arrowLen,arrowAngle){ ctx.strokeStyle='rgb('+R+','+G+','+B+')'; ctx.beginPath(); //right ctx.moveTo(x+Math.floor(arrowLen*Math.cos(arrowAngle)), y-Math.floor(arrowLen*Math.sin(arrowAngle))); ctx.lineTo(x+len,y); //left ctx.moveTo(x+Math.floor(arrowLen*Math.cos(arrowAngle)), y+Math.floor(arrowLen*Math.sin(arrowAngle)));

ctx.lineTo(x+len,y); ctx.moveTo(x,y); ctx.lineTo(x+len,y);

ctx.stroke(); ctx.fillStyle='rgb('+R+','+G+','+B+')'; ctx.fillText(name,x+len/2,y-fontSpace); }

function arrowDashedHorizontalRight(ctx,name,len,[x,y],[R,G,B],arrowLen,arrowAngle,step){ ctx.strokeStyle='rgb('+R+','+G+','+B+')'; ctx.beginPath(); ctx.moveTo(x,y); for(var i=0;i<=len-1;i+=2*step){ ctx.moveTo(x+i,y); ctx.lineTo(x+i+step,y); ctx.stroke(); } //right ctx.moveTo(x+len-Math.floor(arrowLen*Math.cos(arrowAngle)), y-Math.floor(arrowLen*Math.sin(arrowAngle))); ctx.lineTo(x+len,y); //left ctx.moveTo(x+len-Math.floor(arrowLen*Math.cos(arrowAngle)), y+Math.floor(arrowLen*Math.sin(arrowAngle))); ctx.lineTo(x+len,y); ctx.stroke(); ctx.fillStyle='rgb('+R+','+G+','+B+')'; ctx.fillText(name,x+len/2,y-fontSpace); }

function arrowDashedHorizontalLeft(ctx,name,len,[x,y],[R,G,B],arrowLen,arrowAngle,step){ ctx.strokeStyle='rgb('+R+','+G+','+B+')'; ctx.beginPath(); //right ctx.moveTo(x+Math.floor(arrowLen*Math.cos(arrowAngle)), y-Math.floor(arrowLen*Math.sin(arrowAngle))); ctx.lineTo(x,y); //left ctx.moveTo(x+Math.floor(arrowLen*Math.cos(arrowAngle)), y+Math.floor(arrowLen*Math.sin(arrowAngle))); ctx.lineTo(x,y); ctx.moveTo(x,y); for(var i=0;i<=len-1;i+=2*step){ ctx.moveTo(x+i,y); ctx.lineTo(x+i+step,y); ctx.stroke(); } ctx.fillStyle='rgb('+R+','+G+','+B+')'; ctx.fillText(name,x+len/2,y-fontSpace); }

function arrowUpRight45(ctx,lenInAxis,[x,y],[R,G,B],arrowLen,arrowAngle){//arrowAngle:theta,best:Math.PI/8 ctx.strokeStyle='rgb('+R+','+G+','+B+')'; ctx.beginPath(); ctx.moveTo(x,y); ctx.lineTo(x+arrowCos*lenInAxis,y-arrowSin*lenInAxis); //right ctx.moveTo(x+arrowCos*lenInAxis-Math.floor(arrowLen*Math.cos(Math.PI/2-arrowAngle)), y-arrowSin*lenInAxis+Math.floor(arrowLen*Math.sin(Math.PI/2-arrowAngle))); ctx.lineTo(x+arrowCos*lenInAxis,y-arrowSin*lenInAxis); //left ctx.moveTo(x+arrowCos*lenInAxis-Math.floor(arrowLen*Math.sin(Math.PI/2-arrowAngle)), y-arrowSin*lenInAxis+Math.floor(arrowLen*Math.cos(Math.PI/2-arrowAngle))); ctx.lineTo(x+arrowCos*lenInAxis,y-arrowSin*lenInAxis); ctx.stroke(); }

function arrowDashedUpRight45(ctx,name,lenInAxis,[x,y],[R,G,B],arrowLen,arrowAngle,stepInAxis){//arrowAngle:theta ctx.strokeStyle='rgb('+R+','+G+','+B+')'; ctx.beginPath(); for(var i=0;i<=lenInAxis-1;i+=2*stepInAxis){ ctx.moveTo(x+arrowCos*i,y-arrowSin*i); ctx.lineTo(x+arrowCos*(i+stepInAxis),y-arrowSin*(i+stepInAxis)); ctx.stroke(); } //right half arrow head ctx.moveTo(x+arrowCos*lenInAxis-Math.floor(arrowLen*Math.cos(arrowAngle-line45Angle)), y-arrowSin*lenInAxis+Math.floor(arrowLen*Math.sin(arrowAngle-line45Angle))); ctx.lineTo(x+arrowCos*lenInAxis,y-arrowSin*lenInAxis); //left half arrow head ctx.moveTo(x+arrowCos*lenInAxis-Math.floor(arrowLen*Math.sin(arrowAngle-line45Angle)), y-arrowSin*lenInAxis+Math.floor(arrowLen*Math.cos(arrowAngle-line45Angle))); ctx.lineTo(x+arrowCos*lenInAxis,y-arrowSin*lenInAxis); ctx.stroke(); ctx.fillStyle='rgb('+R+','+G+','+B+')'; ctx.fillText(name,x+lenInAxis/2,y-fontSpace); }

function arrowDownLeft45(ctx,lenInAxis,[x,y],[R,G,B],arrowLen,arrowAngle){//arrowAngle:theta,best:Math.PI/8 ctx.strokeStyle='rgb('+R+','+G+','+B+')'; ctx.beginPath(); ctx.moveTo(x,y); ctx.lineTo(x-arrowCos*lenInAxis,y+arrowSin*lenInAxis); //right ctx.moveTo(x-arrowCos*lenInAxis+Math.floor(arrowLen*Math.cos(Math.PI/2-arrowAngle)), y+arrowSin*lenInAxis-Math.floor(arrowLen*Math.sin(Math.PI/2-arrowAngle))); ctx.lineTo(x-arrowCos*lenInAxis,y+arrowSin*lenInAxis); //left ctx.moveTo(x-arrowCos*lenInAxis+Math.floor(arrowLen*Math.sin(Math.PI/2-arrowAngle)), y+arrowSin*lenInAxis-Math.floor(arrowLen*Math.cos(Math.PI/2-arrowAngle))); ctx.lineTo(x-arrowCos*lenInAxis,y+arrowSin*lenInAxis); ctx.stroke(); }

function arrowDashedDownLeft45(ctx,name,lenInAxis,[x,y],[R,G,B],arrowLen,arrowAngle,stepInAxis){//arrowAngle:theta ctx.strokeStyle='rgb('+R+','+G+','+B+')'; ctx.fillStyle='rgb('+R+','+G+','+B+')'; ctx.beginPath(); for(var i=0;i<=lenInAxis-1;i+=2*stepInAxis){ ctx.moveTo(x-arrowCos*i,y+arrowSin*i); ctx.lineTo(x-arrowCos*(i+stepInAxis),y+arrowSin*(i+stepInAxis)); ctx.stroke(); } //right ctx.moveTo(x-lenInAxis+Math.floor(arrowLen*Math.cos(Math.PI/2-arrowAngle)), y+arrowSin*lenInAxis-Math.floor(arrowLen*Math.sin(Math.PI/2-arrowAngle))); ctx.lineTo(x-arrowCos*lenInAxis,y+arrowSin*lenInAxis); //left ctx.moveTo(x-arrowCos*lenInAxis+Math.floor(arrowLen*Math.sin(Math.PI/2-arrowAngle)), y+arrowSin*lenInAxis-Math.floor(arrowLen*Math.cos(Math.PI/2-arrowAngle))); ctx.lineTo(x-arrowCos*lenInAxis,y+arrowSin*lenInAxis); ctx.stroke(); ctx.fillText(name,x-lenInAxis/2,y+lenInAxis/2+fontSpace); }




function drawDoubleDNAnoArrow(ctx,DNAname,DNAlen,[R,G,B],[posX,posY]){ horizontalLine(ctx,DNAname,DNAlen,[posX,posY],[R,G,B]); for(var i=DNAspace/2;i<=DNAlen;i+=DNAspace){ verticalLine(ctx,DNAwid,[posX+i,posY],[R,G,B]); } horizontalLine(ctx,' ',DNAlen,[posX,posY+DNAwid],[R,G,B]); }

function drawDoubleDNAwithArrowHorizontalRight(ctx,DNAname,DNAlen,[R,G,B],[posX,posY]){ arrowHorizontalRight(ctx,DNAname,DNAlen,[posX,posY],[R,G,B],arrowHeadLen,arrowAngle); for(var i=DNAspace/2;i<=DNAlen;i+=DNAspace){ verticalLine(ctx,DNAwid,[posX+i,posY],[R,G,B]); } horizontalLine(ctx,' ',DNAlen,[posX,posY+DNAwid],[R,G,B]); }

function drawDoubleDNAwithArrowHorizontalLeft(ctx,DNAname,DNAlen,[R,G,B],[posX,posY]){ horizontalLine(ctx,DNAname,DNAlen,[posX,posY+DNAwid],[R,G,B]); for(var i=DNAspace/2;i<=DNAlen;i+=DNAspace){ verticalLine(ctx,DNAwid,[posX+i,posY],[R,G,B]); } arrowHorizontalLeft(ctx,' ',DNAlen,[posX,posY-DNAwid],[R,G,B],arrowHeadLen,arrowAngle); }

function drawDoubleDNAwithArrow45(ctx,DNAname,DNAlen,[R,G,B],[posX,posY]){ horizontalLine(ctx,DNAlen,[posX,posY],[R,G,B]); for(var i=DNAspace/2;i<=DNAlen;i+=DNAspace){ verticalLine(ctx,DNAwid,[posX+i,posY],[R,G,B]); } horizontalLine(ctx,DNAlen,[posX,posY+DNAwid],[R,G,B]); arrow45(ctx,arrowLen,[posX+DNAlen,posY],[R,G,B],arrowHeadLen,arrowAngle); }

function drawDoubleDNADashednoArrow(ctx,DNAname,DNAlen,[R,G,B],[posX,posY]){ horizontalDashedLine(ctx,DNAname,DNAlen,[posX,posY],[R,G,B],DNAstep); for(var i=DNAspace/2;i<=DNAlen;i+=DNAspace){ verticalLine(ctx,DNAwid,[posX+i,posY],[R,G,B]); } horizontalDashedLine(ctx,' ',DNAlen,[posX,posY+DNAwid],[R,G,B],DNAstep); }

function drawDoubleDNADashedwithArrowHorizontalRight(ctx,DNAname,DNAlen,[R,G,B],[posX,posY]){ arrowDashedHorizontalRight(ctx,DNAname,DNAlen,[posX,posY],[R,G,B],arrowHeadLen,arrowAngle,DNAstep); for(var i=DNAspace/2;i<=DNAlen;i+=DNAspace){ verticalLine(ctx,DNAwid,[posX+i,posY],[R,G,B]); } horizontalDashedLine(ctx,' ',DNAlen,[posX,posY+DNAwid],[R,G,B],DNAstep); }

function drawDoubleDNADashedwithArrowHorizontalLeft(ctx,DNAname,DNAlen,[R,G,B],[posX,posY]){ horizontalDashedLine(ctx,DNAname,DNAlen,[posX,posY],[R,G,B],DNAstep); for(var i=DNAspace/2;i<=DNAlen;i+=DNAspace){ verticalLine(ctx,DNAwid,[posX+i,posY],[R,G,B]); } arrowDashedHorizontalLeft(ctx,' ',DNAlen,[posX,posY+DNAwid],[R,G,B],arrowHeadLen,arrowAngle,DNAstep); }

function drawDoubleDNADashedwithArrow45(ctx,DNAname,DNAlen,[R,G,B],[posX,posY]){ horizontalDashedLine(ctx,DNAlen,[posX,posY],[R,G,B],DNAstep); for(var i=DNAspace/2;i<=DNAlen;i+=DNAspace){ verticalLine(ctx,DNAwid,[posX+i,posY],[R,G,B]); } horizontalDashedLine(ctx,DNAlen,[posX,posY+DNAwid],[R,G,B],DNAstep); arrow45(ctx,arrowLen,[posX+DNAlen,posY],[R,G,B],arrowHeadLen,arrowAngle); }



//According to Fig. 11 function drawMul(ctx,aName,bName,cName,aColor,bColor,cColor,[X0,Y0],longDNAlen,shortDNAlen){//c=a*b //exponential factor var Black=[0,0,0]; var X=X0; var Y=Y0; var Da="D"+aName; var al=aName+"l"; var a=aName; var ar=aName+"r"; var Db="D"+bName; var bl=bName+"l"; var b=bName; var br=bName+"r"; var Dc="D"+cName; var cl=cName+"l"; var c=cName; var cr=cName+"r"; X=drawSig(ctx,aName,aColor,[X,Y],longDNAlen,shortDNAlen); //Wi arrowDashedDownLeft45(ctx,al+"*",shortDNAlen,[X,Y+DNAwid],aColor,arrowHeadLen,arrowAngle,DNAstep); drawDoubleDNAnoArrow(ctx,a,longDNAlen,aColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashedwithArrowHorizontalRight(ctx,ar,shortDNAlen,aColor,[X,Y]);

X=X+shortDNAlen+DNAseperate*2; arrowReac(ctx,reacArrowLen,reacArrowHeadLen,[X,Y]);

//waste X=X+reacArrowLen+DNAseperate*2; up45LeftLine(ctx,Da,longDNAlen,[X,Y],Black); drawDoubleDNADashedwithArrowHorizontalLeft(ctx,al,shortDNAlen,aColor,[X,Y],arrowHeadLen,arrowAngle,DNAstep); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,a,longDNAlen,aColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashedwithArrowHorizontalRight(ctx,ar,shortDNAlen,aColor,[X,Y]); //waste X=X+shortDNAlen+DNAseperate; horizontalLine(ctx,a,longDNAlen,[X,Y],aColor); X=X+longDNAlen; arrowDashedHorizontalRight(ctx,ar,shortDNAlen,[X,Y],aColor,arrowLen,arrowAngle,DNAstep); //Multiplication //Line 1 X=X0; Y=Y0+4*DNAseperate;

X=drawSig(ctx,aName,aColor,[X,Y],longDNAlen,shortDNAlen); //Li arrowDashedDownLeft45(ctx,al+"*",shortDNAlen,[X,Y+DNAwid],aColor,arrowHeadLen,arrowAngle,DNAstep); drawDoubleDNAnoArrow(ctx,a,longDNAlen,aColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,ar,shortDNAlen,aColor,[X,Y]); X=X+shortDNAlen; drawDoubleDNADashedwithArrowHorizontalRight(ctx,bl,shortDNAlen,bColor,[X,Y]); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,b,longDNAlen,bColor,[X,Y]); X=X+arrowCos*longDNAlen; drawDoubleDNADashednoArrow(ctx,br,shortDNAlen,bColor,[X,Y]); X=X+shortDNAlen; up45RightLine(ctx,Da,longDNAlen,[X,Y],Black); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; up45DashedRightLine(ctx,al,shortDNAlen,[X,Y],aColor,DNAstep); X=X+arrowCos*shortDNAlen; Y=Y-arrowSin*shortDNAlen; up45RightLine(ctx,Db,longDNAlen,[X,Y],Black); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; up45DashedRightLine(ctx,bl,shortDNAlen,[X,Y],bColor,DNAstep); X=X+arrowCos*shortDNAlen; Y=Y-arrowSin*shortDNAlen; up45RightLine(ctx,Dc,longDNAlen,[X,Y],Black); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; arrowDashedUpRight45(ctx,cl,shortDNAlen,[X,Y],cColor,arrowHeadLen,arrowAngle,DNAstep);

X=X+arrowCos*shortDNAlen+DNAseperate*2; Y=Y0+4*DNAseperate; revArrowReac(ctx,reacArrowLen,reacArrowHeadLen,[X,Y]);

X=X+reacArrowLen+2*DNAseperate; //Hi up45LeftLine(ctx,Da,longDNAlen,[X,Y],Black); drawDoubleDNADashedwithArrowHorizontalLeft(ctx,al,shortDNAlen,aColor,[X,Y],arrowHeadLen,arrowAngle,DNAstep); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,a,longDNAlen,aColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,ar,shortDNAlen,aColor,[X,Y]); X=X+shortDNAlen; horizontalDashedLine(ctx,bl+"*",shortDNAlen,[X,Y+DNAwid],bColor,DNAstep); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,b,longDNAlen,bColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,br,shortDNAlen,bColor,[X,Y]); X=X+shortDNAlen; up45RightLine(ctx,Da,longDNAlen,[X,Y],Black); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; up45DashedRightLine(ctx,al,shortDNAlen,[X,Y],aColor,DNAstep); X=X+arrowCos*shortDNAlen; Y=Y-arrowSin*shortDNAlen; up45RightLine(ctx,Db,longDNAlen,[X,Y],Black); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; up45DashedRightLine(ctx,bl,shortDNAlen,[X,Y],bColor,DNAstep); X=X+arrowCos*shortDNAlen; Y=Y-arrowSin*shortDNAlen; up45RightLine(ctx,Dc,longDNAlen,[X,Y],Black);

X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; arrowDashedUpRight45(ctx,cl,shortDNAlen,[X,Y],cColor,arrowHeadLen,arrowAngle,DNAstep); //Bi X=X+DNAseperate; Y=Y0+4*DNAseperate; horizontalLine(ctx,a,longDNAlen,[X,Y],aColor); X=X+longDNAlen; horizontalDashedLine(ctx,ar,shortDNAlen,[X,Y],aColor,DNAstep); X=X+shortDNAlen; arrowDashedHorizontalRight(ctx,bl,shortDNAlen,[X,Y],bColor,arrowHeadLen,arrowAngle,DNAstep);

//Line 2 X=X0; Y=Y0+8*DNAseperate; X=drawSig(ctx,bName,bColor,[X,Y],longDNAlen,shortDNAlen); //Hi up45LeftLine(ctx,Da,longDNAlen,[X,Y],Black); drawDoubleDNADashedwithArrowHorizontalLeft(ctx,al,shortDNAlen,aColor,[X,Y],arrowHeadLen,arrowAngle,DNAstep); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,a,longDNAlen,aColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,ar,shortDNAlen,aColor,[X,Y]); X=X+shortDNAlen; horizontalDashedLine(ctx,bl+"*",shortDNAlen,[X,Y+DNAwid],bColor,DNAstep); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,b,longDNAlen,bColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,br,shortDNAlen,bColor,[X,Y]); X=X+shortDNAlen; up45RightLine(ctx,Da,longDNAlen,[X,Y],Black); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; up45DashedRightLine(ctx,al,shortDNAlen,[X,Y],aColor,DNAstep); X=X+arrowCos*shortDNAlen; Y=Y-arrowSin*shortDNAlen; up45RightLine(ctx,Db,longDNAlen,[X,Y],Black); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; up45DashedRightLine(ctx,bl,shortDNAlen,[X,Y],bColor,DNAstep); X=X+arrowCos*shortDNAlen; Y=Y-arrowSin*shortDNAlen; up45RightLine(ctx,Dc,longDNAlen,[X,Y],Black); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; arrowDashedUpRight45(ctx,cl,shortDNAlen,[X,Y],cColor,arrowHeadLen,arrowAngle,DNAstep);

X=X+arrowCos*shortDNAlen+DNAseperate*2; Y=Y0+8*DNAseperate; arrowReac(ctx,reacArrowLen,reacArrowHeadLen,[X,Y]);

X=X+reacArrowLen+2*DNAseperate;

//waste up45LeftLine(ctx,Da,longDNAlen,[X,Y],Black); drawDoubleDNADashedwithArrowHorizontalLeft(ctx,al,shortDNAlen,aColor,[X,Y],arrowHeadLen,arrowAngle,DNAstep); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,a,longDNAlen,aColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashedwithArrowHorizontalRight(ctx,ar,shortDNAlen,aColor,[X,Y]); X=X+shortDNAlen; up45LeftLine(ctx,Db,longDNAlen,[X,Y],Black); drawDoubleDNADashedwithArrowHorizontalLeft(ctx,bl,shortDNAlen,bColor,[X,Y],arrowHeadLen,arrowAngle,DNAstep); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,b,longDNAlen,bColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashedwithArrowHorizontalRight(ctx,br,shortDNAlen,bColor,[X,Y]);

X=X+shortDNAlen+DNAseperate;

//Oi horizontalLine(ctx,b,longDNAlen,[X,Y],bColor); X=X+longDNAlen; horizontalDashedLine(ctx,br,shortDNAlen,[X,Y],bColor,DNAstep); X=X+shortDNAlen; horizontalLine(ctx,Da,longDNAlen,[X,Y],Black); X=X+longDNAlen; horizontalDashedLine(ctx,al,shortDNAlen,[X,Y],aColor,DNAstep); X=X+shortDNAlen; horizontalLine(ctx,Db,longDNAlen,[X,Y],Black); X=X+longDNAlen; horizontalDashedLine(ctx,bl,shortDNAlen,[X,Y],bColor,DNAstep); X=X+shortDNAlen; horizontalLine(ctx,Dc,longDNAlen,[X,Y],Black); X=X+longDNAlen; arrowDashedHorizontalRight(ctx,cl,shortDNAlen,[X,Y],cColor,arrowHeadLen,arrowAngle,DNAstep);

//Line 3 X=X0; Y=Y0+12*DNAseperate; //Oi horizontalLine(ctx,b,longDNAlen,[X,Y],bColor); X=X+longDNAlen; horizontalDashedLine(ctx,br,shortDNAlen,[X,Y],bColor,DNAstep); X=X+shortDNAlen; horizontalLine(ctx,Da,longDNAlen,[X,Y],Black); X=X+longDNAlen; horizontalDashedLine(ctx,al,shortDNAlen,[X,Y],aColor,DNAstep); X=X+shortDNAlen; horizontalLine(ctx,Db,longDNAlen,[X,Y],Black); X=X+longDNAlen; horizontalDashedLine(ctx,bl,shortDNAlen,[X,Y],bColor,DNAstep); X=X+shortDNAlen; horizontalLine(ctx,Dc,longDNAlen,[X,Y],Black); X=X+longDNAlen; arrowDashedHorizontalRight(ctx,cl,shortDNAlen,[X,Y],cColor,arrowHeadLen,arrowAngle,DNAstep);

X=X+DNAseperate; //Ti arrowDashedDownLeft45(ctx,br+"*",shortDNAlen,[X,Y+DNAwid],bColor,arrowHeadLen,arrowAngle,DNAstep); drawDoubleDNAnoArrow(ctx,Da,longDNAlen,Black,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,al,shortDNAlen,aColor,[X,Y]); X=X+shortDNAlen; up45RightLine(ctx,a,longDNAlen,[X,Y],aColor); arrowDashedUpRight45(ctx,ar,shortDNAlen,[X+arrowCos*longDNAlen,Y-arrowSin*longDNAlen],aColor,arrowHeadLen,arrowAngle,DNAstep); drawDoubleDNAnoArrow(ctx,Db,longDNAlen,Black,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,bl,shortDNAlen,bColor,[X,Y]); X=X+shortDNAlen; up45RightLine(ctx,b,longDNAlen,[X,Y],bColor); arrowDashedUpRight45(ctx,br,shortDNAlen,[X+arrowCos*longDNAlen,Y-arrowSin*longDNAlen],bColor,arrowHeadLen,arrowAngle,DNAstep); drawDoubleDNAnoArrow(ctx,Dc,longDNAlen,Black,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,cl,shortDNAlen,cColor,[X,Y]); X=X+shortDNAlen; up45RightLine(ctx,c,longDNAlen,[X,Y],cColor); arrowDashedUpRight45(ctx,cr,shortDNAlen,[X+arrowCos*longDNAlen,Y-arrowSin*longDNAlen],cColor,arrowHeadLen,arrowAngle,DNAstep);

X=X+arrowCos*shortDNAlen+DNAseperate*2; arrowReac(ctx,reacArrowLen,reacArrowHeadLen,[X,Y]); //waste X=X+reacArrowLen+2*DNAseperate; up45LeftLine(ctx,b,longDNAlen,[X,Y],bColor); drawDoubleDNADashedwithArrowHorizontalLeft(ctx,br,shortDNAlen,bColor,[X,Y],arrowHeadLen,arrowAngle,DNAstep); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,Da,longDNAlen,Black,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,al,shortDNAlen,aColor,[X,Y]); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,Db,longDNAlen,Black,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,bl,shortDNAlen,bColor,[X,Y]); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,Dc,longDNAlen,Black,[X,Y]); X=X+longDNAlen; drawDoubleDNADashedwithArrowHorizontalRight(ctx,cl,shortDNAlen,cColor,[X,Y]);

X=X+shortDNAlen+DNAseperate; X=drawSig(ctx,aName,aColor,[X,Y],longDNAlen,shortDNAlen); X=drawSig(ctx,bName,bColor,[X,Y],longDNAlen,shortDNAlen); X=drawSig(ctx,cName,cColor,[X,Y],longDNAlen,shortDNAlen);

return Y; }

//ReLU weighted summation function drawMulReLU(ctx,aName,bName,cName,dName,aColor,bColor,cColor,dColor,[X0,Y0],longDNAlen,shortDNAlen){//c=a*b //exponential factor var Black=[0,0,0]; var X=X0; var Y=Y0; var Da="D"+aName; var al=aName+"l"; var a=aName; var ar=aName+"r"; var Db="D"+bName; var bl=bName+"l"; var b=bName; var br=bName+"r"; var Dc="D"+cName; var cl=cName+"l"; var c=cName; var cr=dName+"r"; var Dd="D"+dName; var dl=dName+"l"; var d=dName; var dr=dName+"r"; X=drawSig(ctx,aName,aColor,[X,Y],longDNAlen,shortDNAlen); //Wi arrowDashedDownLeft45(ctx,al+"*",shortDNAlen,[X,Y+DNAwid],aColor,arrowHeadLen,arrowAngle,DNAstep); drawDoubleDNAnoArrow(ctx,a,longDNAlen,aColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashedwithArrowHorizontalRight(ctx,ar,shortDNAlen,aColor,[X,Y]);

X=X+shortDNAlen+DNAseperate*2; arrowReac(ctx,reacArrowLen,reacArrowHeadLen,[X,Y]); //waste X=X+shortDNAlen+DNAseperate*2; up45LeftLine(ctx,Da,longDNAlen,[X,Y],Black); drawDoubleDNADashedwithArrowHorizontalLeft(ctx,al,shortDNAlen,aColor,[X,Y],arrowHeadLen,arrowAngle,DNAstep); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,a,longDNAlen,aColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashedwithArrowHorizontalRight(ctx,ar,shortDNAlen,aColor,[X,Y]); //waste X=X+shortDNAlen+DNAseperate; horizontalLine(ctx,a,longDNAlen,[X,Y],aColor); X=X+longDNAlen; arrowDashedHorizontalRight(ctx,ar,shortDNAlen,[X,Y],aColor,arrowLen,arrowAngle,DNAstep); //Multiplication //Line 1 X=X0; Y=Y0+4*DNAseperate;

X=drawSig(ctx,aName,aColor,[X,Y],longDNAlen,shortDNAlen); //Li arrowDashedDownLeft45(ctx,al+"*",shortDNAlen,[X,Y+DNAwid],aColor,arrowHeadLen,arrowAngle,DNAstep); drawDoubleDNAnoArrow(ctx,a,longDNAlen,aColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,ar,shortDNAlen,aColor,[X,Y]); X=X+shortDNAlen; drawDoubleDNADashedwithArrowHorizontalRight(ctx,bl,shortDNAlen,bColor,[X,Y]); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,b,longDNAlen,bColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,br,shortDNAlen,bColor,[X,Y]); X=X+shortDNAlen; up45RightLine(ctx,Da,longDNAlen,[X,Y],Black); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; up45DashedRightLine(ctx,al,shortDNAlen,[X,Y],aColor,DNAstep); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; up45RightLine(ctx,Db,longDNAlen,[X,Y],Black); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; up45DashedRightLine(ctx,bl,shortDNAlen,[X,Y],bColor,DNAstep); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; up45RightLine(ctx,Dc,longDNAlen,[X,Y],Black); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; up45DashedRightLine(ctx,cl,shortDNAlen,[X,Y],cColor,DNAstep); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; up45RightLine(ctx,Dd,longDNAlen,[X,Y],Black); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; arrowDashedUpRight45(ctx,dl,shortDNAlen,[X,Y],dColor,arrowHeadLen,arrowAngle,DNAstep);

X=X+arrowCos*shortDNAlen+DNAseperate*2; Y=Y0+4*DNAseperate; revArrowReac(ctx,reacArrowLen,reacArrowHeadLen,[X,Y]);

X=X+reacArrowLen+2*DNAseperate; //Hi up45LeftLine(ctx,Da,longDNAlen,[X,Y],Black); drawDoubleDNADashedwithArrowHorizontalLeft(ctx,al,shortDNAlen,aColor,[X,Y],arrowHeadLen,arrowAngle,DNAstep); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,a,longDNAlen,aColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,ar,shortDNAlen,aColor,[X,Y]); X=X+shortDNAlen; horizontalDashedLine(ctx,bl+"*",shortDNAlen,[X,Y+DNAwid],bColor,DNAstep); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,b,longDNAlen,bColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,br,shortDNAlen,bColor,[X,Y]); X=X+shortDNAlen; up45RightLine(ctx,Da,longDNAlen,[X,Y],Black); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; up45DashedRightLine(ctx,al,shortDNAlen,[X,Y],aColor,DNAstep); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; up45RightLine(ctx,Db,longDNAlen,[X,Y],Black); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; up45DashedRightLine(ctx,bl,shortDNAlen,[X,Y],bColor,DNAstep); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; up45RightLine(ctx,Dc,longDNAlen,[X,Y],Black); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; up45DashedRightLine(ctx,cl,shortDNAlen,[X,Y],cColor,DNAstep); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; up45RightLine(ctx,Dd,longDNAlen,[X,Y],Black); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; arrowDashedUpRight45(ctx,dl,shortDNAlen,[X,Y],dColor,arrowHeadLen,arrowAngle,DNAstep); //Bi X=X+arrowCos*shortDNAlen+DNAseperate; Y=Y0+4*DNAseperate; horizontalLine(ctx,a,longDNAlen,[X,Y],aColor); X=X+longDNAlen; horizontalDashedLine(ctx,ar,shortDNAlen,[X,Y],aColor,DNAstep); X=X+shortDNAlen; arrowDashedHorizontalRight(ctx,bl,shortDNAlen,[X,Y],bColor,arrowHeadLen,arrowAngle,DNAstep);

//Line 2 X=X0; Y=Y0+8*DNAseperate; X=drawSig(ctx,bName,bColor,[X,Y],longDNAlen,shortDNAlen); //Hi up45LeftLine(ctx,Da,longDNAlen,[X,Y],Black); drawDoubleDNADashedwithArrowHorizontalLeft(ctx,al,shortDNAlen,aColor,[X,Y],arrowHeadLen,arrowAngle,DNAstep); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,a,longDNAlen,aColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,ar,shortDNAlen,aColor,[X,Y]); X=X+shortDNAlen; horizontalDashedLine(ctx,bl+"*",shortDNAlen,[X,Y+DNAwid],bColor,DNAstep); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,b,longDNAlen,bColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,br,shortDNAlen,bColor,[X,Y]); X=X+shortDNAlen; up45RightLine(ctx,Da,longDNAlen,[X,Y],Black); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; up45DashedRightLine(ctx,al,shortDNAlen,[X,Y],aColor,DNAstep); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; up45RightLine(ctx,Db,longDNAlen,[X,Y],Black); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; up45DashedRightLine(ctx,bl,shortDNAlen,[X,Y],bColor,DNAstep); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; up45RightLine(ctx,Dc,longDNAlen,[X,Y],Black); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; up45DashedRightLine(ctx,cl,shortDNAlen,[X,Y],cColor,DNAstep); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; up45RightLine(ctx,Dd,longDNAlen,[X,Y],Black); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; arrowDashedUpRight45(ctx,dl,shortDNAlen,[X,Y],dColor,arrowHeadLen,arrowAngle,DNAstep);

X=X+arrowCos*shortDNAlen+DNAseperate*2; Y=Y0+8*DNAseperate; arrowReac(ctx,reacArrowLen,reacArrowHeadLen,[X,Y]);

X=X+reacArrowLen+2*DNAseperate; //waste up45LeftLine(ctx,Da,longDNAlen,[X,Y],Black); drawDoubleDNADashedwithArrowHorizontalLeft(ctx,al,shortDNAlen,aColor,[X,Y],arrowHeadLen,arrowAngle,DNAstep); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,a,longDNAlen,aColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashedwithArrowHorizontalRight(ctx,ar,shortDNAlen,aColor,[X,Y]); X=X+shortDNAlen; up45LeftLine(ctx,Db,longDNAlen,[X,Y],Black); drawDoubleDNADashedwithArrowHorizontalLeft(ctx,bl,shortDNAlen,bColor,[X,Y],arrowHeadLen,arrowAngle,DNAstep); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,b,longDNAlen,bColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashedwithArrowHorizontalRight(ctx,br,shortDNAlen,bColor,[X,Y]);

X=X+shortDNAlen+DNAseperate;

//Oi horizontalLine(ctx,b,longDNAlen,[X,Y],bColor); X=X+longDNAlen; horizontalDashedLine(ctx,br,shortDNAlen,[X,Y],bColor,DNAstep); X=X+shortDNAlen; horizontalLine(ctx,Da,longDNAlen,[X,Y],Black); X=X+longDNAlen; horizontalDashedLine(ctx,al,shortDNAlen,[X,Y],aColor,DNAstep); X=X+shortDNAlen; horizontalLine(ctx,Db,longDNAlen,[X,Y],Black); X=X+longDNAlen; horizontalDashedLine(ctx,bl,shortDNAlen,[X,Y],bColor,DNAstep); X=X+shortDNAlen; horizontalLine(ctx,Dc,longDNAlen,[X,Y],Black); X=X+longDNAlen; horizontalDashedLine(ctx,cl,shortDNAlen,[X,Y],cColor,DNAstep); X=X+shortDNAlen; horizontalLine(ctx,Dd,longDNAlen,[X,Y],Black); X=X+longDNAlen; arrowDashedHorizontalRight(ctx,dl,shortDNAlen,[X,Y],dColor,arrowHeadLen,arrowAngle,DNAstep);

//Line 3 X=X0; Y=Y0+12*DNAseperate; //Oi horizontalLine(ctx,b,longDNAlen,[X,Y],bColor); X=X+longDNAlen; horizontalDashedLine(ctx,br,shortDNAlen,[X,Y],bColor,DNAstep); X=X+shortDNAlen; horizontalLine(ctx,Da,longDNAlen,[X,Y],Black); X=X+longDNAlen; horizontalDashedLine(ctx,al,shortDNAlen,[X,Y],aColor,DNAstep); X=X+shortDNAlen; horizontalLine(ctx,Db,longDNAlen,[X,Y],Black); X=X+longDNAlen; horizontalDashedLine(ctx,bl,shortDNAlen,[X,Y],bColor,DNAstep); X=X+shortDNAlen; horizontalLine(ctx,Dc,longDNAlen,[X,Y],Black); X=X+longDNAlen; horizontalDashedLine(ctx,cl,shortDNAlen,[X,Y],cColor,DNAstep); X=X+shortDNAlen; horizontalLine(ctx,Dd,longDNAlen,[X,Y],Black); X=X+longDNAlen; arrowDashedHorizontalRight(ctx,dl,shortDNAlen,[X,Y],dColor,arrowHeadLen,arrowAngle,DNAstep);


X=X+DNAseperate; //Ti arrowDashedDownLeft45(ctx,br+"*",shortDNAlen,[X,Y+DNAwid],bColor,arrowHeadLen,arrowAngle,DNAstep); drawDoubleDNAnoArrow(ctx,Da,longDNAlen,Black,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,al,shortDNAlen,aColor,[X,Y]); X=X+shortDNAlen; up45RightLine(ctx,a,longDNAlen,[X,Y],aColor); arrowDashedUpRight45(ctx,ar,shortDNAlen,[X+arrowCos*longDNAlen,Y-arrowSin*longDNAlen],aColor,arrowHeadLen,arrowAngle,DNAstep); drawDoubleDNAnoArrow(ctx,Db,longDNAlen,Black,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,bl,shortDNAlen,bColor,[X,Y]); X=X+shortDNAlen; up45RightLine(ctx,b,longDNAlen,[X,Y],bColor); arrowDashedUpRight45(ctx,br,shortDNAlen,[X+arrowCos*longDNAlen,Y-arrowSin*longDNAlen],bColor,arrowHeadLen,arrowAngle,DNAstep); drawDoubleDNAnoArrow(ctx,Dc,longDNAlen,Black,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,cl,shortDNAlen,cColor,[X,Y]); X=X+shortDNAlen; up45RightLine(ctx,c,longDNAlen,[X,Y],cColor); arrowDashedUpRight45(ctx,cr,shortDNAlen,[X+arrowCos*longDNAlen,Y-arrowSin*longDNAlen],cColor,arrowHeadLen,arrowAngle,DNAstep); drawDoubleDNAnoArrow(ctx,Dd,longDNAlen,Black,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,dl,shortDNAlen,dColor,[X,Y]); X=X+shortDNAlen; up45RightLine(ctx,d,longDNAlen,[X,Y],dColor); arrowDashedUpRight45(ctx,dr,shortDNAlen,[X+arrowCos*longDNAlen,Y-arrowSin*longDNAlen],dColor,arrowHeadLen,arrowAngle,DNAstep);

X=X+arrowCos*shortDNAlen+DNAseperate*2; Y=Y0+12*DNAseperate; arrowReac(ctx,reacArrowLen,reacArrowHeadLen,[X,Y]);

X=X+reacArrowLen+2*DNAseperate;

//waste up45LeftLine(ctx,b,longDNAlen,[X,Y],bColor); drawDoubleDNADashedwithArrowHorizontalLeft(ctx,br,shortDNAlen,bColor,[X,Y],arrowHeadLen,arrowAngle,DNAstep); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,Da,longDNAlen,Black,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,al,shortDNAlen,aColor,[X,Y]); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,Db,longDNAlen,Black,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,bl,shortDNAlen,bColor,[X,Y]); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,Dc,longDNAlen,Black,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,cl,shortDNAlen,cColor,[X,Y]); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,Dd,longDNAlen,Black,[X,Y]); X=X+longDNAlen; drawDoubleDNADashedwithArrowHorizontalRight(ctx,dl,shortDNAlen,dColor,[X,Y]);

X=X+shortDNAlen+DNAseperate; X=drawSig(ctx,aName,aColor,[X,Y],longDNAlen,shortDNAlen); X=drawSig(ctx,bName,bColor,[X,Y],longDNAlen,shortDNAlen); X=drawSig(ctx,cName,cColor,[X,Y],longDNAlen,shortDNAlen); X=drawSig(ctx,dName,dColor,[X,Y],longDNAlen,shortDNAlen);

return Y; } //according to Fig. 9 function drawAdd(ctx,aName,bName,aColor,bColor,[X0,Y0],longDNAlen,shortDNAlen){//a->b var Black=[0,0,0]; X=X0; Y=Y0; var Da="D"+aName; var al=aName+"l"; var a=aName; var ar=aName+"r"; var Db="D"+bName; var bl=bName+"l"; var b=bName; var br=bName+"r"; //Line 1 X=drawSig(ctx,aName,aColor,[X,Y],longDNAlen,shortDNAlen); //Gi arrowDashedDownLeft45(ctx,al+"*",shortDNAlen,[X,Y+DNAwid],aColor,arrowHeadLen,arrowAngle,DNAstep); drawDoubleDNAnoArrow(ctx,a,longDNAlen,aColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,ar,shortDNAlen,aColor,[X,Y]); X=X+shortDNAlen; up45RightLine(ctx,Db,longDNAlen,[X,Y],Black); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; arrowDashedUpRight45(ctx,bl,shortDNAlen,[X,Y],bColor,arrowHeadLen,arrowAngle,DNAstep);

X=X+shortDNAlen+DNAseperate*2; Y=Y0; arrowReac(ctx,reacArrowLen,reacArrowHeadLen,[X,Y]);

X=X+reacArrowLen+2*DNAseperate;


//Oi Y=Y0; horizontalLine(ctx,a,longDNAlen,[X,Y],aColor); X=X+longDNAlen; horizontalDashedLine(ctx,ar,shortDNAlen,[X,Y],aColor,DNAstep); X=X+shortDNAlen; horizontalLine(ctx,Db,longDNAlen,[X,Y],Black); X=X+longDNAlen; arrowDashedHorizontalRight(ctx,bl,shortDNAlen,[X,Y],bColor,arrowHeadLen,arrowAngle,DNAstep); //waste X=X+shortDNAlen+DNAseperate*2; up45LeftLine(ctx,Da,longDNAlen,[X,Y],Black); drawDoubleDNADashedwithArrowHorizontalLeft(ctx,al,shortDNAlen,aColor,[X,Y],arrowHeadLen,arrowAngle,DNAstep); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,a,longDNAlen,aColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashedwithArrowHorizontalRight(ctx,ar,shortDNAlen,aColor,[X,Y]);

//Line 2 X=X0; Y=Y0+4*DNAseperate; //Oi horizontalLine(ctx,a,longDNAlen,[X,Y],aColor); X=X+longDNAlen; horizontalDashedLine(ctx,ar,shortDNAlen,[X,Y],aColor,DNAstep); X=X+shortDNAlen; horizontalLine(ctx,Db,longDNAlen,[X,Y],Black); X=X+longDNAlen; arrowDashedHorizontalRight(ctx,bl,shortDNAlen,[X,Y],bColor,arrowHeadLen,arrowAngle,DNAstep);

X=X+DNAseperate; //Ti arrowDashedDownLeft45(ctx,al+"*",shortDNAlen,[X,Y+DNAwid],aColor,arrowHeadLen,arrowAngle,DNAstep); drawDoubleDNAnoArrow(ctx,Db,longDNAlen,Black,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,bl,shortDNAlen,bColor,[X,Y]); X=X+shortDNAlen; up45RightLine(ctx,b,longDNAlen,[X,Y],bColor); arrowDashedUpRight45(ctx,br,shortDNAlen,[X+arrowCos*longDNAlen,Y-arrowSin*longDNAlen],bColor,arrowHeadLen,arrowAngle,DNAstep);

X=X+arrowCos*shortDNAlen+DNAseperate*2; Y=Y0+4*DNAseperate; arrowReac(ctx,reacArrowLen,reacArrowHeadLen,[X,Y]);

X=X+reacArrowLen+2*DNAseperate;

//waste up45LeftLine(ctx,a,longDNAlen,[X,Y],aColor); drawDoubleDNADashedwithArrowHorizontalLeft(ctx,ar,shortDNAlen,aColor,[X,Y],arrowHeadLen,arrowAngle,DNAstep); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,Db,longDNAlen,Black,[X,Y]); X=X+longDNAlen; drawDoubleDNADashedwithArrowHorizontalRight(ctx,bl,shortDNAlen,bColor,[X,Y]);

X=X+shortDNAlen+DNAseperate; X=drawSig(ctx,bName,bColor,[X,Y],longDNAlen,shortDNAlen); return Y;

}

function drawSub(ctx,aName,bName,cName,aColor,bColor,cColor,[X0,Y0],longDNAlen,shortDNAlen){//a+b->c var Black=[0,0,0]; X=X0; Y=Y0; var Da="D"+aName; var al=aName+"l"; var a=aName; var ar=aName+"r"; var Db="D"+bName; var bl=bName+"l"; var b=bName; var br=bName+"r"; var Dc="D"+cName; var cl=cName+"l"; var c=cName; var cr=cName+"r"; //Line 1 X=drawSig(ctx,aName,aColor,[X,Y],longDNAlen,shortDNAlen); //Li arrowDashedDownLeft45(ctx,al+"*",shortDNAlen,[X,Y+DNAwid],aColor,arrowHeadLen,arrowAngle,DNAstep); drawDoubleDNAnoArrow(ctx,a,longDNAlen,aColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,ar,shortDNAlen,aColor,[X,Y]); X=X+shortDNAlen; drawDoubleDNADashedwithArrowHorizontalRight(ctx,bl,shortDNAlen,bColor,[X,Y]); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,b,longDNAlen,bColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,br,shortDNAlen,bColor,[X,Y]); X=X+shortDNAlen; up45RightLine(ctx,Dc,longDNAlen,[X,Y],Black); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; arrowDashedUpRight45(ctx,cl,shortDNAlen,[X,Y],cColor,arrowHeadLen,arrowAngle,DNAstep);

X=X+arrowCos*shortDNAlen+DNAseperate*2; Y=Y0; revArrowReac(ctx,reacArrowLen,reacArrowHeadLen,[X,Y]);

X=X+reacArrowLen+2*DNAseperate; //Hi up45LeftLine(ctx,Da,longDNAlen,[X,Y],Black); drawDoubleDNADashedwithArrowHorizontalLeft(ctx,al,shortDNAlen,aColor,[X,Y],arrowHeadLen,arrowAngle,DNAstep); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,a,longDNAlen,aColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,ar,shortDNAlen,aColor,[X,Y]); X=X+shortDNAlen; horizontalDashedLine(ctx,bl+"*",shortDNAlen,[X,Y+DNAwid],bColor,DNAstep); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,b,longDNAlen,bColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,br,shortDNAlen,bColor,[X,Y]); X=X+shortDNAlen; up45RightLine(ctx,Dc,longDNAlen,[X,Y],Black); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; arrowDashedUpRight45(ctx,cl,shortDNAlen,[X,Y],cColor,arrowHeadLen,arrowAngle,DNAstep); X=X+arrowCos*shortDNAlen+DNAseperate; Y=Y0; //Bi horizontalLine(ctx,a,longDNAlen,[X,Y],aColor); X=X+longDNAlen; horizontalDashedLine(ctx,ar,longDNAlen,[X,Y],aColor,DNAstep); X=X+shortDNAlen; arrowDashedHorizontalRight(ctx,bl,shortDNAlen,[X,Y],bColor,arrowHeadLen,arrowAngle,DNAstep);

X=X0; Y=Y0+4*DNAseperate; //Line 2 X=drawSig(ctx,bName,bColor,[X,Y],longDNAlen,shortDNAlen); //Hi up45LeftLine(ctx,Da,longDNAlen,[X,Y],Black); drawDoubleDNADashedwithArrowHorizontalLeft(ctx,al,shortDNAlen,aColor,[X,Y],arrowHeadLen,arrowAngle,DNAstep); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,a,longDNAlen,aColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,ar,shortDNAlen,aColor,[X,Y]); X=X+shortDNAlen; horizontalDashedLine(ctx,bl+"*",shortDNAlen,[X,Y+DNAwid],bColor,DNAstep); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,b,longDNAlen,bColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,br,shortDNAlen,bColor,[X,Y]); X=X+shortDNAlen; up45RightLine(ctx,Dc,longDNAlen,[X,Y],Black); X=X+arrowCos*longDNAlen; Y=Y-arrowSin*longDNAlen; arrowDashedUpRight45(ctx,cl,shortDNAlen,[X,Y],cColor,arrowHeadLen,arrowAngle,DNAstep); X=X+arrowCos*shortDNAlen+DNAseperate*2; Y=Y0+4*DNAseperate; arrowReac(ctx,reacArrowLen,reacArrowHeadLen,[X,Y]);

X=X+reacArrowLen+2*DNAseperate; //waste up45LeftLine(ctx,Da,longDNAlen,[X,Y],Black); drawDoubleDNADashedwithArrowHorizontalLeft(ctx,al,shortDNAlen,aColor,[X,Y],arrowHeadLen,arrowAngle,DNAstep); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,a,longDNAlen,aColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashedwithArrowHorizontalRight(ctx,ar,shortDNAlen,aColor,[X,Y]); X=X+shortDNAlen; up45LeftLine(ctx,Db,longDNAlen,[X,Y],Black); drawDoubleDNADashedwithArrowHorizontalLeft(ctx,bl,shortDNAlen,bColor,[X,Y],arrowHeadLen,arrowAngle,DNAstep); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,b,longDNAlen,bColor,[X,Y]); X=X+longDNAlen; drawDoubleDNADashedwithArrowHorizontalRight(ctx,br,shortDNAlen,bColor,[X,Y]);

X=X+shortDNAlen+DNAseperate; //Oi horizontalLine(ctx,b,longDNAlen,[X,Y],bColor); X=X+longDNAlen; horizontalDashedLine(ctx,br,shortDNAlen,[X,Y],bColor,DNAstep); X=X+shortDNAlen; horizontalLine(ctx,Dc,longDNAlen,[X,Y],Black); X=X+longDNAlen; arrowDashedHorizontalRight(ctx,cl,shortDNAlen,[X,Y],cColor,arrowHeadLen,arrowAngle,DNAstep);

X=X0; Y=Y0+8*DNAseperate; //Line 3 //Oi horizontalLine(ctx,b,longDNAlen,[X,Y],bColor); X=X+longDNAlen; horizontalDashedLine(ctx,br,shortDNAlen,[X,Y],bColor,DNAstep); X=X+shortDNAlen; horizontalLine(ctx,Dc,longDNAlen,[X,Y],Black); X=X+longDNAlen; arrowDashedHorizontalRight(ctx,cl,shortDNAlen,[X,Y],cColor,arrowHeadLen,arrowAngle,DNAstep); X=X+shortDNAlen+DNAseperate; //Ti arrowDashedDownLeft45(ctx,br+"*",shortDNAlen,[X,Y+DNAwid],bColor,arrowHeadLen,arrowAngle,DNAstep); drawDoubleDNAnoArrow(ctx,Dc,longDNAlen,Black,[X,Y]); X=X+longDNAlen; drawDoubleDNADashednoArrow(ctx,cl,shortDNAlen,cColor,[X,Y]); X=X+shortDNAlen; up45RightLine(ctx,c,longDNAlen,[X,Y],cColor); arrowDashedUpRight45(ctx,cr,shortDNAlen,[X+arrowCos*longDNAlen,Y-arrowSin*longDNAlen],cColor,arrowHeadLen,arrowAngle,DNAstep); X=X+arrowCos*shortDNAlen+DNAseperate*2; Y=Y0+8*DNAseperate; arrowReac(ctx,reacArrowLen,reacArrowHeadLen,[X,Y]);

X=X+reacArrowLen+2*DNAseperate; //waste up45LeftLine(ctx,b,longDNAlen,[X,Y],bColor); drawDoubleDNADashedwithArrowHorizontalLeft(ctx,br,shortDNAlen,bColor,[X,Y],arrowHeadLen,arrowAngle,DNAstep); X=X+shortDNAlen; drawDoubleDNAnoArrow(ctx,Dc,longDNAlen,Black,[X,Y]); X=X+longDNAlen; drawDoubleDNADashedwithArrowHorizontalRight(ctx,cl,shortDNAlen,cColor,[X,Y]); X=X+shortDNAlen+DNAseperate; X=drawSig(ctx,cName,cColor,[X,Y],longDNAlen,shortDNAlen); return Y; }

function drawSig(ctx,name,color,[X,Y],longDNAlen,shortDNAlen){ var Black=[0,0,0]; ctx.font = Font; horizontalLine(ctx,"D"+name,longDNAlen,[X,Y],Black); X=X+longDNAlen; horizontalDashedLine(ctx,name+"l",shortDNAlen,[X,Y],color,DNAstep); X=X+shortDNAlen; horizontalLine(ctx,name,longDNAlen,[X,Y],color); X=X+longDNAlen; arrowDashedHorizontalRight(ctx,name+"r",shortDNAlen,[X,Y],color,arrowHeadLen,arrowAngle,DNAstep); X=X+shortDNAlen+DNAseperate; return X; }

function displayStr(ctx,str,[X,Y],[R,G,B]) { ctx.font = FontDescription; ctx.strokeStyle='rgb('+R+','+G+','+B+')'; ctx.fillText(str,X,Y); return Y+20; } function drawNeuron(weightNum){ //name

//color dColor=[Math.random()*255,Math.random()*255,Math.random()*255]; xpColor=[Math.random()*255,Math.random()*255,Math.random()*255]; xnColor=[255-xpColor[0],255-xpColor[1],255-xpColor[2]]; yColor=[Math.random()*255,Math.random()*255,Math.random()*255]; ynColor=[255-yColor[0],255-yColor[1],255-yColor[2]]; wasteColor=[0,0,0]; inputpColor=[],inputnColor=[]; inputpBkpColor=[],inputnBkpColor=[]; wi0pColor=[],wi0nColor=[]; wipColor=[],winColor=[]; for(var i=1;i<=weightNum;i=i+1){ wi0p.push("w"+i+"0+"); wi0n.push("w"+i+"0-"); wip.push("w"+i+"+"); win.push("w"+i+"-");

wi0pColor.push([Math.random()*255,Math.random()*255,Math.random()*255]); wi0nColor.push([255-wi0pColor[i-1][0],255-wi0pColor[i-1][1],255-wi0pColor[i-1][2]]); wipColor.push([Math.random()*255,Math.random()*255,Math.random()*255]); winColor.push([255-wipColor[i-1][0],255-wipColor[i-1][1],255-wipColor[i-1][2]]);

inputp.push("i"+i+"+"); inputn.push("i"+i+"-"); inputpColor.push([Math.random()*255,Math.random()*255,Math.random()*255]); inputnColor.push([255-inputpColor[i-1][0],255-inputpColor[i-1][1],255-inputpColor[i-1][2]]);

inputpBkp.push("ib"+i+"+"); inputnBkp.push("ib"+i+"-"); inputpBkpColor.push([Math.random()*255,Math.random()*255,Math.random()*255]); inputnBkpColor.push([255-inputpBkpColor[i-1][0],255-inputpBkpColor[i-1][1],255-inputpBkpColor[i-1][2]]); } } function drawWeightedSum([X0,Y0]){ var ctx = document.getElementById('canvas').getContext('2d'); X=X0; Y=Y0; //Y=displayStr(ctx,"Weighted sum:",[X,Y],Black); //weighted sum var weightNum=document.getElementById("number").value; for(var i=1;i<=weightNum;i=i+1){ Y=drawMulReLU(ctx,inputpBkp[i-1],wip[i-1],xp,y,inputpBkpColor[i-1],wipColor[i-1],xpColor,yColor,[X,Y],longDNAlen,shortDNAlen)+4*DNAseperate; X=X0; Y=drawMulReLU(ctx,inputnBkp[i-1],wip[i-1],xn,yn,inputnBkpColor[i-1],wipColor[i-1],xnColor,ynColor,[X,Y],longDNAlen,shortDNAlen)+4*DNAseperate; X=X0; Y=drawMulReLU(ctx,inputpBkp[i-1],win[i-1],xn,yn,inputpBkpColor[i-1],winColor[i-1],xnColor,ynColor,[X,Y],longDNAlen,shortDNAlen)+4*DNAseperate; X=X0; Y=drawMulReLU(ctx,inputnBkp[i-1],win[i-1],xp,y,inputnBkpColor[i-1],winColor[i-1],xpColor,yColor,[X,Y],longDNAlen,shortDNAlen)+4*DNAseperate; X=X0; } for(var i=1;i<=weightNum;i=i+1){ seqDict=multiplicationReLU(seqDict,inputpBkp[i-1],wip[i-1],xp,y,inputpBkpColor[i-1],wipColor[i-1],xpColor,yColor); seqDict=multiplicationReLU(seqDict,inputnBkp[i-1],wip[i-1],xn,yn,inputnBkpColor[i-1],wipColor[i-1],xnColor,ynColor); seqDict=multiplicationReLU(seqDict,inputpBkp[i-1],win[i-1],xn,yn,inputpBkpColor[i-1],winColor[i-1],xnColor,ynColor); seqDict=multiplicationReLU(seqDict,inputnBkp[i-1],win[i-1],xp,y,inputnBkpColor[i-1],winColor[i-1],xpColor,yColor); } } function drawSubNeuron([X0,Y0]){ //x^+ + x^- -> \phi //Y=displayStr(ctx,"x+ + x- -> waste",[X,Y],Black); var ctx = document.getElementById('canvas').getContext('2d'); X=X0; Y=Y0; Y=drawSub(ctx,xp,xn,waste,xpColor,xnColor,wasteColor,[X,Y],longDNAlen,shortDNAlen)+4*DNAseperate; seqDict=subtraction(seqDict,xp,xn,waste,xpColor,xnColor,wasteColor); X=X0; //y + y^- -> \phi //Y=displayStr(ctx,"y + y- -> waste",[X,Y],Black); X=X0; Y=drawSub(ctx,y,yn,waste,yColor,ynColor,wasteColor,[X,Y],longDNAlen,shortDNAlen)+4*DNAseperate; seqDict=subtraction(seqDict,y,yn,waste,yColor,ynColor,wasteColor); X=X0; }

function drawBackprop([X0,Y0]){ //backpropagation var ctx = document.getElementById('canvas').getContext('2d'); var weightNum=document.getElementById("number").value; X=X0; Y=Y0; for(var i=1;i<=weightNum;i=i+1){ Y=drawMul(ctx,xp,inputp[i-1],wi0n[i-1],xpColor,inputpColor[i-1],wi0nColor[i-1],[X,Y],longDNAlen,shortDNAlen)+4*DNAseperate; X=X0; Y=drawMul(ctx,xp,inputn[i-1],wi0n[i-1],xpColor,inputnColor[i-1],wi0pColor[i-1],[X,Y],longDNAlen,shortDNAlen)+4*DNAseperate; X=X0; } for(var i=1;i<=weightNum;i=i+1){ seqDict=multiplication(seqDict,xp,inputp[i-1],wi0n[i-1],xpColor,inputpColor[i-1],wi0nColor[i-1]); seqDict=multiplication(seqDict,xp,inputn[i-1],wi0n[i-1],xpColor,inputnColor[i-1],wi0nColor[i-1]); }

//wi0p->wip, wi0n->win, wip + win -> \phi for(var i=1;i<=weightNum;i=i+1){ Y=drawAdd(ctx,wi0p[i-1],wip[i-1],wi0pColor[i-1],wipColor[i-1],[X,Y],longDNAlen,shortDNAlen)+4*DNAseperate; X=X0; Y=drawAdd(ctx,wi0n[i-1],win[i-1],wi0nColor[i-1],winColor[i-1],[X,Y],longDNAlen,shortDNAlen)+4*DNAseperate; X=X0; Y=drawSub(ctx,wip[i-1],win[i-1],waste,wipColor[i-1],winColor[i-1],wasteColor,[X,Y],longDNAlen,shortDNAlen)+4*DNAseperate; X=X0; } for(var i=1;i<=weightNum;i=i+1){ seqDict=add(seqDict,wi0p[i-1],wip[i-1],waste,wi0pColor[i-1],wipColor[i-1],wasteColor); seqDict=add(seqDict,wi0n[i-1],win[i-1],waste,wi0nColor[i-1],winColor[i-1],wasteColor); seqDict=add(seqDict,wip[i-1],win[i-1],waste,wipColor[i-1],winColor[i-1],wasteColor); } }

// return seqDict;

///////////////////////////////sequence design////////////////////////////////////////////////////// function zeros(num){ var z=[]; for (var i = 0; i < num; i++) { z.push(0); } return z; }

function change(a){ var chain=; for(var i=0;i<a.length;i++){ if(a[i]==0) chain+=; if(a[i]==1) chain+='A'; if(a[i]==2) chain+='T'; if(a[i]==3) chain+='C'; if(a[i]==4) chain+='G'; } return chain; }

function check(a,b){ var i; var Original1=[]; n=a.length; if(b==1){ for(i=3;i<n-3;i++){ if(a[i]==1 && a[i-1]==1 && a[i-2]==1 && a[i-3]==1) a[i]=randsrc([2,3],[0.5,0.5]); if(a[i]==2 && a[i-1]==2 && a[i-2]==2 && a[i-3]==2) a[i]=randsrc([1,3],[0.5,0.5]); if(a[i]==3 && a[i-1]==3 && a[i-2]==3) a[i]=randsrc([1,2],[0.5,0.5]); } if(a[n-5]==1 && a[n-4]==1 && a[n-3]==1) a[n-4]=randsrc([2,3],[0.5,0.5]); } if(b==2){ for(i=2;i<n-1;i++){ if(i==2){ if(a[i]==3 && a[i-1]==3 && a[i-2]==3) a[i]=randsrc([1,2],[0.5,0.5]); } if (i>2){ if(a[i]==1 && a[i-1]==1 && a[i-2]==1 && a[i-3]==1) a[i]=randsrc([2,3],[0.5,0.5]); if(a[i]==2 && a[i-1]==2 && a[i-2]==2 && a[i-3]==2) a[i]=randsrc([1,3],[0.5,0.5]); if(a[i]==3 && a[i-1]==3 && a[i-2]==3) a[i]=randsrc([1,2],[0.5,0.5]); } } } for(i=0;i<n;i++) Original1.push(a[i]); return Original1; }


function creatComplementary(Original0){ var Complementary0=[]; for(var i=0;i<Original0.length;i++){ if(Original0[i]==1)

       	Complementary0.push(2);

if(Original0[i]==2) Complementary0.push(1); if(Original0[i]==3) Complementary0.push(4); } return Complementary0; }


function randsrc(entry,prob){ var r=Math.random(); var totalP=prob[0]; var i; for(i=1;i<entry.length;i++){ if(r<totalP) return entry[i-1]; totalP+=prob[i]; } return entry[i]; }

function creatlongchain(a){ var longchain0=[],longchain0_=[]; var i; for(i=0;i<a;i++) longchain0.push(randsrc([1,2,3],[0.15,0.15,0.7])); longchain0[0]=1; longchain0[1]=3; longchain0[a-2]=1; longchain0[a-1]=3; longchain0=check(longchain0,1); longchain0_=creatComplementary(longchain0); return [longchain0,longchain0_]; }

function creatshortchain(){ var core=[],t=randsrc([0,1,2],[1/3,1/3,1/3]),clamp=[1,3]; var shortchain_l=[0,0,0,0,0],shortchain_l_=[0,0,0,0,0],shortchain_r=[0,0,0,0,0],shortchain_r_=[0,0,0,0,0]; var i; for(i=0;i<3;i++) core.push(randsrc([1,2],[0.5,0.5])); core[t]=3; shortchain_l[0]=clamp[0]; shortchain_l[1]=clamp[1]; shortchain_l[2]=core[0]; shortchain_l[3]=core[1]; shortchain_l[4]=core[2];

shortchain_r[0]=core[0]; shortchain_r[1]=core[1]; shortchain_r[2]=core[2]; shortchain_r[3]=clamp[0]; shortchain_r[4]=clamp[1];

shortchain_l_=creatComplementary(shortchain_l); shortchain_r_=creatComplementary(shortchain_r); return [shortchain_l,shortchain_l_,shortchain_r,shortchain_r_]; }




////////////////////////////////////// function rgb2hex(color){

   //var arr=rgb;
   var hexStr="#"+num2hex(color[0])+num2hex(color[1])+num2hex(color[2]);
   return hexStr.toUpperCase();

} function num2hex(x){

       return ("0" + parseInt(x).toString(16)).slice(-2);

} function add(dict,aName,bName,cName,aColor,bColor,cColor){//dict:[[<species name>s],[Da,al,a,ar,Da*,al*,a*,ar*],[...],...] var Da,Da_,Db,Db_,Dc,Dc_,a,a_,b,b_,c,c_;//long chain var al,al_,ar,ar_,bl,bl_,br,br_,cl,cl_,cr,cr_;//short chain [Da,Da_]=creatlongchain(15); [Db,Db_]=creatlongchain(15); [Dc,Dc_]=creatlongchain(15); [a,a_]=creatlongchain(15); [b,b_]=creatlongchain(15); [c,c_]=creatlongchain(15); [al,al_,ar,ar_]=creatshortchain(); [bl,bl_,br,br_]=creatshortchain(); [cl,cl_,cr,cr_]=creatshortchain(); if(!findNameinDict(aName,dict[0])){ dict[0].push(aName); dict.push([Da,al,a,ar,Da_,al_,a_,ar_]); } else{ Da=dict[getIndex(aName,dict[0])+1][0]; al=dict[getIndex(aName,dict[0])+1][1]; a=dict[getIndex(aName,dict[0])+1][2]; ar=dict[getIndex(aName,dict[0])+1][3]; Da_=dict[getIndex(aName,dict[0])+1][4]; al_=dict[getIndex(aName,dict[0])+1][5]; a_=dict[getIndex(aName,dict[0])+1][6]; ar_=dict[getIndex(aName,dict[0])+1][7]; } if(!findNameinDict(bName,dict[0])){ dict[0].push(bName); dict.push([Db,bl,b,br,Db_,bl_,b_,br_]); } else{ Db=dict[getIndex(bName,dict[0])+1][0]; bl=dict[getIndex(bName,dict[0])+1][1]; b=dict[getIndex(bName,dict[0])+1][2]; br=dict[getIndex(bName,dict[0])+1][3]; Db_=dict[getIndex(bName,dict[0])+1][4]; bl_=dict[getIndex(bName,dict[0])+1][5]; b_=dict[getIndex(bName,dict[0])+1][6]; br_=dict[getIndex(bName,dict[0])+1][7]; } if(!findNameinDict(cName,dict[0])){ dict[0].push(cName); dict.push([Dc,cl,c,cr,Dc_,cl_,c_,cr_]); } else{ Dc=dict[getIndex(cName,dict[0])+1][0]; cl=dict[getIndex(cName,dict[0])+1][1]; c=dict[getIndex(cName,dict[0])+1][2]; cr=dict[getIndex(cName,dict[0])+1][3]; Dc_=dict[getIndex(cName,dict[0])+1][4]; cl_=dict[getIndex(cName,dict[0])+1][5]; c_=dict[getIndex(cName,dict[0])+1][6]; cr_=dict[getIndex(cName,dict[0])+1][7]; } /////////////////////////////////////////////////////// ///

lis.push("
" + change(Da) + "
" + change(al) + "
" + change(a) + "
" + change(ar) +"
"); lis.push("
" + change(a) + "
" + change(ar) + "
" + change(Db) + "
" + change(bl) + "
" + change(Dc) + "
" + change(cl) +"
"); lis.push("
" + change(al_) + "
" + change(a_) + "
" + change(ar_) +"
"); lis.push("
" + change(a) + "
" + change(ar) + "
" + change(Db) + "
" + change(bl) + "
" + change(Dc) + "
" + change(cl) +"
"); lis.push("
" + change(Da) + "
" + change(al) + "
" + change(a) + "
" + change(ar) +"
"); lis.push("
" + change(al_) + "
" + change(a_) + "
" + change(ar_) +"
"); lis.push("
" + change(a) + "
" + change(ar) + "
" + change(Db) + "
" + change(bl) + "
" + change(Dc) + "
" + change(cl) +"
"); lis.push("
" + change(al_) + "
" + change(Db_) + "
" + change(bl_) + "
" + change(Dc_) + "
" + change(cl_) +"
"); lis.push("
" + change(Db) + "
" + change(bl) + "
" + change(b) + "
" + change(br) +"
"); lis.push("
" + change(Dc) + "
" + change(cl) + "
" + change(c) + "
" + change(cr) +"
"); lis.push("
" + change(Db) + "
" + change(bl) + "
" + change(b) + "
" + change(br) +"
"); lis.push("
" + change(Dc) + "
" + change(cl) + "
" + change(c) + "
" + change(cr) +"
"); lis.push("
" + change(al_) + "
" + change(Db_) + "
" + change(bl_) + "
" + change(Dc) + "
" + change(cl_) +"
");

return dict; }


function multiplication(dict,aName,bName,cName,aColor,bColor,cColor){ var Da,Da_,Db,Db_,Dc,Dc_,a,a_,b,b_,c,c_;//long chain var al,al_,ar,ar_,bl,bl_,br,br_,cl,cl_,cr,cr_;//short chain [Da,Da_]=creatlongchain(15); [Db,Db_]=creatlongchain(15); [Dc,Dc_]=creatlongchain(15); [a,a_]=creatlongchain(15); [b,b_]=creatlongchain(15); [c,c_]=creatlongchain(15); [al,al_,ar,ar_]=creatshortchain(); [bl,bl_,br,br_]=creatshortchain(); [cl,cl_,cr,cr_]=creatshortchain(); if(!findNameinDict(aName,dict[0])){ dict[0].push(aName); dict.push([Da,al,a,ar,Da_,al_,a_,ar_]); } else{ Da=dict[getIndex(aName,dict[0])+1][0]; al=dict[getIndex(aName,dict[0])+1][1]; a=dict[getIndex(aName,dict[0])+1][2]; ar=dict[getIndex(aName,dict[0])+1][3]; Da_=dict[getIndex(aName,dict[0])+1][4]; al_=dict[getIndex(aName,dict[0])+1][5]; a_=dict[getIndex(aName,dict[0])+1][6]; ar_=dict[getIndex(aName,dict[0])+1][7]; } if(!findNameinDict(bName,dict[0])){ dict[0].push(bName); dict.push([Db,bl,b,br,Db_,bl_,b_,br_]); } else{ Db=dict[getIndex(bName,dict[0])+1][0]; bl=dict[getIndex(bName,dict[0])+1][1]; b=dict[getIndex(bName,dict[0])+1][2]; br=dict[getIndex(bName,dict[0])+1][3]; Db_=dict[getIndex(bName,dict[0])+1][4]; bl_=dict[getIndex(bName,dict[0])+1][5]; b_=dict[getIndex(bName,dict[0])+1][6]; br_=dict[getIndex(bName,dict[0])+1][7]; } if(!findNameinDict(cName,dict[0])){ dict[0].push(cName); dict.push([Dc,cl,c,cr,Dc_,cl_,c_,cr_]); } else{ Dc=dict[getIndex(cName,dict[0])+1][0]; cl=dict[getIndex(cName,dict[0])+1][1]; c=dict[getIndex(cName,dict[0])+1][2]; cr=dict[getIndex(cName,dict[0])+1][3]; Dc_=dict[getIndex(cName,dict[0])+1][4]; cl_=dict[getIndex(cName,dict[0])+1][5]; c_=dict[getIndex(cName,dict[0])+1][6]; cr_=dict[getIndex(cName,dict[0])+1][7]; } /////////////////////////////////////////////////////////

lis.push("
" + change(Da) + "
" + change(al) + "
" + change(a) + "
" + change(ar) +"
"); lis.push("
" + change(a) + "
" + change(ar) + "
" + change(bl) + "
" + change(b) + "
" + change(br) +"
" + change(Da) + "
" + change(al) +"
" + change(Db) + "
" + change(bl) +"
" + change(Dc) + "
" + change(cl) +"
"); lis.push("
" + change(al_) + "
" + change(a_) + "
" + change(ar_) +"
" + change(bl_) + "
" + change(b_) + "
" + change(br_) +"
"); lis.push("
" + change(Da) + "
" + change(al) + "
" + change(a) + "
" + change(ar) + "
" + change(b) + "
" + change(br) + "
" + change(Dc) + "
" + change(cl) +"
"); lis.push("
" + change(al_) + "
" + change(a_) + "
" + change(ar_) + "
" + change(bl_) + "
" + change(b_) + "
" + change(br_) +"
"); lis.push("
" + change(a) + "
" + change(ar) + "
" + change(bl) +"
"); lis.push("
" + change(Db) + "
" + change(bl) + "
" + change(b) +"
" +change(br) +"
"); lis.push("
" + change(Da) + "
" + change(al) + "
" + change(a) + "
" + change(ar) +"
"); lis.push("
" + change(Db) + "
" + change(bl) + "
" + change(b) + "
" + change(br) +"
"); lis.push("
" + change(al_) + "
" + change(a_) + "
" + change(ar_) + "
" + change(bl_) + "
" + change(b_) + "
" + change(br_) +"
"); lis.push("
" + change(b) + "
" + change(br) + "
" + change(Da) + "
" + change(al) +"
" + change(Db) + "
" + change(bl) +"
" + change(Dc) + "
" + change(cl) +"
"); lis.push("
" + change(Da) + "
" + change(al) + "
" + change(a) + "
" + change(ar) +"
"); lis.push("
" + change(Db) + "
" + change(bl) + "
" + change(b) + "
" + change(br) +"
"); lis.push("
" + change(Dc) + "
" + change(cl) + "
" + change(c) + "
" + change(cr) +"
"); lis.push("
" + change(br_) + "
" + change(Da_) + "
" + change(al_)+ "
" + change(Db_) + "
" + change(bl_)+ "
" + change(Dc_) + "
" + change(cl_)+"
"); lis.push("
" + change(b) + "
" + change(br) + "
" + change(Da) + "
" + change(al) +"
" + change(Db) + "
" + change(bl) +"
" + change(Dc) + "
" + change(cl) +"
"); lis.push("
" + change(br_) + "
" + change(Da_) + "
" + change(al_) +"
" + change(Db_) + "
" + change(bl_) +"
" + change(Dc_) + "
" + change(cl_) +"
"); lis.push("
" + change(Dc) + "
" + change(cl) + "
" + change(c) + "
" + change(cr) +"
");

return dict; }

function subtraction(dict,aName,bName,cName,aColor,bColor,cColor){ var Da,Da_,Db,Db_,Dc,Dc_,a,a_,b,b_,c,c_;//long chain var al,al_,ar,ar_,bl,bl_,br,br_,cl,cl_,cr,cr_;//short chain [Da,Da_]=creatlongchain(15); [Db,Db_]=creatlongchain(15); [Dc,Dc_]=creatlongchain(15); [a,a_]=creatlongchain(15); [b,b_]=creatlongchain(15); [c,c_]=creatlongchain(15); [al,al_,ar,ar_]=creatshortchain(); [bl,bl_,br,br_]=creatshortchain(); [cl,cl_,cr,cr_]=creatshortchain(); if(!findNameinDict(aName,dict[0])){ dict[0].push(aName); dict.push([Da,al,a,ar,Da_,al_,a_,ar_]); } else{ Da=dict[getIndex(aName,dict[0])+1][0]; al=dict[getIndex(aName,dict[0])+1][1]; a=dict[getIndex(aName,dict[0])+1][2]; ar=dict[getIndex(aName,dict[0])+1][3]; Da_=dict[getIndex(aName,dict[0])+1][4]; al_=dict[getIndex(aName,dict[0])+1][5]; a_=dict[getIndex(aName,dict[0])+1][6]; ar_=dict[getIndex(aName,dict[0])+1][7]; } if(!findNameinDict(bName,dict[0])){ dict[0].push(bName); dict.push([Db,bl,b,br,Db_,bl_,b_,br_]); } else{ Db=dict[getIndex(bName,dict[0])+1][0]; bl=dict[getIndex(bName,dict[0])+1][1]; b=dict[getIndex(bName,dict[0])+1][2]; br=dict[getIndex(bName,dict[0])+1][3]; Db_=dict[getIndex(bName,dict[0])+1][4]; bl_=dict[getIndex(bName,dict[0])+1][5]; b_=dict[getIndex(bName,dict[0])+1][6]; br_=dict[getIndex(bName,dict[0])+1][7]; } if(!findNameinDict(cName,dict[0])){ dict[0].push(cName); dict.push([Dc,cl,c,cr,Dc_,cl_,c_,cr_]); } else{ Dc=dict[getIndex(cName,dict[0])+1][0]; cl=dict[getIndex(cName,dict[0])+1][1]; c=dict[getIndex(cName,dict[0])+1][2]; cr=dict[getIndex(cName,dict[0])+1][3]; Dc_=dict[getIndex(cName,dict[0])+1][4]; cl_=dict[getIndex(cName,dict[0])+1][5]; c_=dict[getIndex(cName,dict[0])+1][6]; cr_=dict[getIndex(cName,dict[0])+1][7]; } /////////////////////////////////////////////////////////

lis.push("
" + change(Da) + "
" + change(al) + "
" + change(a) + "
" + change(ar) +"
"); lis.push("
" + change(a) + "
" + change(ar) + "
" + change(bl) + "
" + change(b) + "
" + change(br) +"
" + change(Da) + "
" + change(al) +"
" + change(Db) + "
" + change(bl) +"
" + change(Dc) + "
" + change(cl) +"
"); lis.push("
" + change(al_) + "
" + change(a_) + "
" + change(ar_) +"
" + change(bl_) + "
" + change(b_) + "
" + change(br_) +"
"); lis.push("
" + change(Da) + "
" + change(al) + "
" + change(a) + "
" + change(ar) + "
" + change(b) + "
" + change(br) + "
" + change(Dc) + "
" + change(cl) +"
"); lis.push("
" + change(al_) + "
" + change(a_) + "
" + change(ar_) + "
" + change(bl_) + "
" + change(b_) + "
" + change(br_) +"
"); lis.push("
" + change(a) + "
" + change(ar) + "
" + change(bl) +"
"); lis.push("
" + change(Db) + "
" + change(bl) + "
" + change(b) +"
" +change(br) +"
"); lis.push("
" + change(Da) + "
" + change(al) + "
" + change(a) + "
" + change(ar) +"
"); lis.push("
" + change(Db) + "
" + change(bl) + "
" + change(b) + "
" + change(br) +"
"); lis.push("
" + change(al_) + "
" + change(a_) + "
" + change(ar_) + "
" + change(bl_) + "
" + change(b_) + "
" + change(br_) +"
"); lis.push("
" + change(b) + "
" + change(br) +"
" + change(Dc) + "
" + change(cl) +"
"); lis.push("
" + change(Dc) + "
" + change(cl) +"
" + change(c) + "
" + change(cr) +"
"); lis.push("
" + change(br_) + "
" + change(Dc_) + "
" + change(cl_)+"
"); lis.push("
" + change(b) + "
" + change(br) + "
" + change(Dc) + "
" + change(cl) +"
"); lis.push("
" + change(br_) + "
" + change(Dc_) + "
" + change(cl_) +"
"); lis.push("
" + change(Dc) + "
" + change(cl) + "
" + change(c) + "
" + change(cr) +"
");

return dict; }

function multiplicationReLU(dict,aName,bName,cName,dName,aColor,bColor,cColor,dcolor){ var Da,Da_,Db,Db_,Dc,Dc_,Dd,Dd_,a,a_,b,b_,c,c_,d,d_;//long chain var al,al_,ar,ar_,bl,bl_,br,br_,cl,cl_,cr,cr_,dl,dl_,dr,dr_;//short chain [Da,Da_]=creatlongchain(15); [Db,Db_]=creatlongchain(15); [Dc,Dc_]=creatlongchain(15); [Dd,Dd_]=creatlongchain(15); [a,a_]=creatlongchain(15); [b,b_]=creatlongchain(15); [c,c_]=creatlongchain(15); [d,d_]=creatlongchain(15); [al,al_,ar,ar_]=creatshortchain(); [bl,bl_,br,br_]=creatshortchain(); [cl,cl_,cr,cr_]=creatshortchain(); [dl,dl_,dr,dr_]=creatshortchain(); if(!findNameinDict(aName,dict[0])){ dict[0].push(aName); dict.push([Da,al,a,ar,Da_,al_,a_,ar_]); } else{ Da=dict[getIndex(aName,dict[0])+1][0]; al=dict[getIndex(aName,dict[0])+1][1]; a=dict[getIndex(aName,dict[0])+1][2]; ar=dict[getIndex(aName,dict[0])+1][3]; Da_=dict[getIndex(aName,dict[0])+1][4]; al_=dict[getIndex(aName,dict[0])+1][5]; a_=dict[getIndex(aName,dict[0])+1][6]; ar_=dict[getIndex(aName,dict[0])+1][7]; } if(!findNameinDict(bName,dict[0])){ dict[0].push(bName); dict.push([Db,bl,b,br,Db_,bl_,b_,br_]); } else{ Db=dict[getIndex(bName,dict[0])+1][0]; bl=dict[getIndex(bName,dict[0])+1][1]; b=dict[getIndex(bName,dict[0])+1][2]; br=dict[getIndex(bName,dict[0])+1][3]; Db_=dict[getIndex(bName,dict[0])+1][4]; bl_=dict[getIndex(bName,dict[0])+1][5]; b_=dict[getIndex(bName,dict[0])+1][6]; br_=dict[getIndex(bName,dict[0])+1][7]; } if(!findNameinDict(cName,dict[0])){ dict[0].push(cName); dict.push([Dc,cl,c,cr,Dc_,cl_,c_,cr_]); } else{ Dc=dict[getIndex(cName,dict[0])+1][0]; cl=dict[getIndex(cName,dict[0])+1][1]; c=dict[getIndex(cName,dict[0])+1][2]; cr=dict[getIndex(cName,dict[0])+1][3]; Dc_=dict[getIndex(cName,dict[0])+1][4]; cl_=dict[getIndex(cName,dict[0])+1][5]; c_=dict[getIndex(cName,dict[0])+1][6]; cr_=dict[getIndex(cName,dict[0])+1][7]; } if(!findNameinDict(dName,dict[0])){ dict[0].push(dName); dict.push([Dd,dl,d,dr,Dd_,dl_,d_,dr_]); } else{ Dd=dict[getIndex(dName,dict[0])+1][0]; dl=dict[getIndex(dName,dict[0])+1][1]; d=dict[getIndex(dName,dict[0])+1][2]; dr=dict[getIndex(dName,dict[0])+1][3]; Dd_=dict[getIndex(dName,dict[0])+1][4]; dl_=dict[getIndex(dName,dict[0])+1][5]; d_=dict[getIndex(dName,dict[0])+1][6]; dr_=dict[getIndex(dName,dict[0])+1][7]; } /////////////////////////////////////////////////////////

lis.push("
" + change(Da) + "
" + change(al) + "
" + change(a) + "
" + change(ar) +"
"); lis.push("
" + change(a) + "
" + change(ar) + "
" + change(bl) + "
" + change(b) + "
" + change(br) +"
" + change(Da) + "
" + change(al) +"
" + change(Db) + "
" + change(bl) +"
" + change(Dc) + "
" + change(cl) +"
" + change(Dd) + "
" + change(dl) +"
"); lis.push("
" + change(al_) + "
" + change(a_) + "
" + change(ar_) +"
" + change(bl_) + "
" + change(b_) + "
" + change(br_) +"
"); lis.push("
" + change(Da) + "
" + change(al) + "
" + change(a) + "
" + change(ar) + "
" + change(b) + "
" + change(br) + "
" + change(Da) + "
" + change(al) +"
" + change(Db) + "
" + change(bl) +"
" + change(Dc) + "
" + change(cl) +"
" + change(Dd) + "
" + change(dl) +"
"); lis.push("
" + change(al_) + "
" + change(a_) + "
" + change(ar_) + "
" + change(bl_) + "
" + change(b_) + "
" + change(br_) +"
"); lis.push("
" + change(a) + "
" + change(ar) + "
" + change(bl) +"
"); lis.push("
" + change(Db) + "
" + change(bl) + "
" + change(b) +"
" +change(br) +"
"); lis.push("
" + change(Da) + "
" + change(al) + "
" + change(a) + "
" + change(ar) +"
"); lis.push("
" + change(Db) + "
" + change(bl) + "
" + change(b) + "
" + change(br) +"
"); lis.push("
" + change(al_) + "
" + change(a_) + "
" + change(ar_) + "
" + change(bl_) + "
" + change(b_) + "
" + change(br_) +"
"); lis.push("
" + change(b) + "
" + change(br) + "
" + change(Da) + "
" + change(al) +"
" + change(Db) + "
" + change(bl) +"
" + change(Dc) + "
" + change(cl) +"
" + change(Dd) + "
" + change(dl) +"
"); lis.push("
" + change(Da) + "
" + change(al) + "
" + change(a) + "
" + change(ar) +"
"); lis.push("
" + change(Db) + "
" + change(bl) + "
" + change(b) + "
" + change(br) +"
"); lis.push("
" + change(Dc) + "
" + change(cl) + "
" + change(c) + "
" + change(cr) +"
"); lis.push("
" + change(Dd) + "
" + change(dl) + "
" + change(d) + "
" + change(dr) +"
"); lis.push("
" + change(br_) + "
" + change(Da_) + "
" + change(al_)+ "
" + change(Db_) + "
" + change(bl_)+ "
" + change(Dc_) + "
" + change(cl_)+"
" + change(Dd_) + "
" + change(dl_)+"
"); lis.push("
" + change(b) + "
" + change(br) + "
" + change(Da) + "
" + change(al) +"
" + change(Db) + "
" + change(bl) +"
" + change(Dc) + "
" + change(cl) +"
" + change(Dd) + "
" + change(dl) +"
"); lis.push("
" + change(br_) + "
" + change(Da_) + "
" + change(al_) +"
" + change(Db_) + "
" + change(bl_) +"
" + change(Dc_) + "
" + change(cl_) +"
" + change(Dd_) + "
" + change(dl_) +"
"); lis.push("
" + change(Dc) + "
" + change(cl) + "
" + change(c) + "
" + change(cr) +"
"); lis.push("
" + change(Dd) + "
" + change(dl) + "
" + change(d) + "
" + change(dr) +"
");

return dict; } ////////////////////tools///////////////////////////////////////////////// function findNameinDict(name,dict0){ for(var i=0;i<dict0.length;i=i+1){

     	//console.log(dict0[i]);

if(dict0[i]==name) return true; } return false; } function getIndex(element,lis){ for(var i=0;i<lis.length;i=i+1){ if(element==lis[i]) return i; } return -1; }