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