From 40e8e64e7b58b8cf454aba63304cd79f37c7f397 Mon Sep 17 00:00:00 2001 From: Amira Abdel-Rahman <aabdelrahman@gsd.harvard.edu> Date: Sun, 1 Dec 2019 22:12:24 -0500 Subject: [PATCH] run asynchrounous max state --- 01_Code/physical_computing_interface/app.js | 5 - .../physical_computing_interface/globals.js | 2 +- .../graph/graph.js | 134 ++++++++++++++---- .../physical_computing_interface/index.html | 5 +- 4 files changed, 112 insertions(+), 34 deletions(-) diff --git a/01_Code/physical_computing_interface/app.js b/01_Code/physical_computing_interface/app.js index 2ec7b8f..a415436 100644 --- a/01_Code/physical_computing_interface/app.js +++ b/01_Code/physical_computing_interface/app.js @@ -16,8 +16,3 @@ initEditor();// todo enclose into class var assembler= new Assembler(three,GLOBALS,1,50,[new THREE.Vector3(0,0,0)],[new THREE.Vector3(GLOBALS.gridSize/2.0*GLOBALS.voxelSpacing,0,0)]); assembler.run(); - - - - - diff --git a/01_Code/physical_computing_interface/globals.js b/01_Code/physical_computing_interface/globals.js index e6e7254..68b28ba 100644 --- a/01_Code/physical_computing_interface/globals.js +++ b/01_Code/physical_computing_interface/globals.js @@ -360,7 +360,7 @@ globals.prototype.selectNode=function (x,y,z){ ////////////////////////////////////////////// //////////////////////utils////////////////// -//rulw:utilities shouldn't be dependednt on globals +//rule: utilities shouldn't be dependent on globals function utilities(){ } diff --git a/01_Code/physical_computing_interface/graph/graph.js b/01_Code/physical_computing_interface/graph/graph.js index e77185d..0136d6c 100644 --- a/01_Code/physical_computing_interface/graph/graph.js +++ b/01_Code/physical_computing_interface/graph/graph.js @@ -1,5 +1,4 @@ -//todo enclose this -// document.addEventListener('DOMContentLoaded', function(){ +// todo: enclose this function initGraph(){ //todo change these and put to global var color1= "#ffffff"; //white @@ -254,17 +253,7 @@ function initGraph(){ cy.nodes().unselect();//unselect the rest tgt.select(); GLOBALS.selectedjson=tgt._private.data.data; - var neigh=tgt.neighborhood(function( ele ){ - return ele.isNode(); - }); - neigh=tgt.connectedEdges(); - // console.log(tgt.edgesTo()); - for(var i=0;i<neigh.length;i++){ - // console.log(neigh[i].id()); - } - - // console.log(tgt.descendants()); }, false); //select edge @@ -315,11 +304,15 @@ function initGraph(){ id: e.detail.id, name: '[' +e.detail.x +"," +e.detail.y+']', parent: ''+e.detail.z, - code: "2*2*5", - state:0, + code: "Math.max(...inValues)", + state:Math.floor(Math.random() * 100), + locked:false, + runOnce:true, neighbors:[], - inputs:[], - outputs:[], + inValues:[], + outValues:[], + numRuns:0, + maxRuns:10 } }, position: { @@ -329,7 +322,14 @@ function initGraph(){ }); api.expandAll(); + + + addEdges(e.detail.x,e.detail.y,e.detail.z); + + var tgt=cy.$id('[' +e.detail.x +"," +e.detail.y+","+e.detail.z+']'); + updateName(tgt); + // addEvents(e.detail.x,e.detail.y,e.detail.z); // api.expandAll(); @@ -347,16 +347,18 @@ function initGraph(){ [i1,j1,k1]=list[i]; if (GLOBALS.occupancy[i1][j1][k1]) { var tgt=cy.$id('[' +x +"," +y+","+z+']'); + var valIn=tgt._private.data.data.state; tgt._private.data.data.neighbors.push('[' +i1 +"," +j1+","+k1+']'); tgt=cy.$id('[' +i1 +"," +j1+","+k1+']'); - + var valOut=tgt._private.data.data.state; tgt._private.data.data.neighbors.push('[' +x +"," +y+","+z+']'); + cy.add([ - { group: "edges",data: { name:0, source: '[' +x +"," +y+","+z+']', target: '[' +i1 +"," +j1+","+k1+']', + { group: "edges",data: { name:valIn, source: '[' +x +"," +y+","+z+']', target: '[' +i1 +"," +j1+","+k1+']', id:'[' +x +"," +y+","+z+']'+'to[' +i1 +"," +j1+","+k1+']'}} ]); cy.add([ - { group: "edges",data: { name:0, target: '[' +x +"," +y+","+z+']', source: '[' +i1 +"," +j1+","+k1+']', + { group: "edges",data: { name:valOut, target: '[' +x +"," +y+","+z+']', source: '[' +i1 +"," +j1+","+k1+']', id:'[' +i1 +"," +j1+","+k1+']'+'to[' +x +"," +y+","+z+']'}} ]); } @@ -429,19 +431,99 @@ function initGraph(){ }, false); function runNode(node){ - // node.data('state',eval(node._private.data.data.code)) - node._private.data.data.state=eval(node._private.data.data.code); - updateName(node); + // console.log("run node "+node.id()); + if(!node._private.data.data.locked){ + // var neigh=tgt.neighborhood(function( ele ){ + // return ele.isNode(); + // }); + // var outEdges=node.outgoers(function( ele ){ + // return ele.isEdge(); + // }); + var outNodes=node.outgoers(function( ele ){ + return ele.isNode(); + }); + var inEdges=node.incomers(function( ele ){ + return ele.isEdge(); + }); + var inNodes=node.incomers(function( ele ){ + return ele.isNode(); + }); + + //reduce input values list to one list + //TODO find a smarter way to do this + var initialValue = node._private.data.data.state; + var fn = function( prevVal, ele, i, eles ){ + if( prevVal ){ + return prevVal + ',' + ele.data('name'); + } else { + return ele.id(); + } + }; + var inValues = inEdges.reduce( fn, initialValue ); + // if(inValues!=initialValue){ + inValues = inValues.split(","); + inValues = inValues.map(function (x) { + return parseInt(x); }); + // console.log(inValues); + node._private.data.data.inValues=inValues; //update inValues //TODO:move elsewhere?? + // } + + + node._private.data.data.state=eval(node._private.data.data.code); + + + + + updateName(node); + node._private.data.data.numRuns++; + if(node._private.data.data.numRuns==node._private.data.data.maxRuns){ + node._private.data.data.locked=true; + } + + // todo: later run available neighbor + for(var i=0;i<outNodes.length;i++){ + // if(!outNodes[i]._private.data.data.triggered){ + runNode(outNodes[i]); + // } + // outEdges[i].data('name', node._private.data.data.state); + } - //select - GLOBALS.selectedjson=node.data('data'); - var pos=utils.getXYZfromName(node.data('id')); - GLOBALS.selectNode(pos.x,pos.y,pos.z); + //select + GLOBALS.selectedjson=node.data('data'); + var pos=utils.getXYZfromName(node.data('id')); + GLOBALS.selectNode(pos.x,pos.y,pos.z); + + } + } function updateName(node){ node.data('name', node._private.data.data.name+'\n'+node._private.data.data.state); + var outEdges=node.outgoers(function( ele ){ + return ele.isEdge(); + }); + for(var i=0;i<outEdges.length;i++){ + outEdges[i].data('name', node._private.data.data.state); + } + + //reduce output values list to one list + var initialValue = node._private.data.data.state; + var fn = function( prevVal, ele, i, eles ){ + if( prevVal ){ + return prevVal + ',' + ele.data('name'); + } else { + return ele.id(); + } + }; + var outValues = outEdges.reduce( fn, initialValue ); + if(outValues!=initialValue){ + outValues = outValues.split(","); + outValues = outValues.map(function (x) { + return parseInt(x); }); + node._private.data.data.outValues=outValues; + } + // node._private.data.name= node._private.data.data.name+'\n'+node._private.data.data.state; } diff --git a/01_Code/physical_computing_interface/index.html b/01_Code/physical_computing_interface/index.html index dd8ba46..63e534d 100644 --- a/01_Code/physical_computing_interface/index.html +++ b/01_Code/physical_computing_interface/index.html @@ -78,11 +78,12 @@ </div> <div class="footer1"> - <strong>click</strong>: add voxel, <strong>right-click</strong>: remove voxel + <strong>left-click</strong>: place voxel/orbit, <strong>right-click</strong>: radial options </div> <div class="footer2"> - <i>footer</i> + <!-- update change to more instructions/feedback --> + <i>istructions</i> </div> </body> -- GitLab