From b9eb1143a27d03f13c02d3c76d92237100740c68 Mon Sep 17 00:00:00 2001
From: Mohamed feroz khan D <cb.en.p2cys21017@cb.students.amrita.edu>
Date: Fri, 9 Jun 2023 13:03:20 +0530
Subject: [PATCH] Syncing with Github project repo

---
 .../my_temporal_network_sample_sicp.html      | 378 ++++++++++++++++++
 1 file changed, 378 insertions(+)
 create mode 100644 Assets/Temporal_Graph/Bitcoin/Bitcoin_Code_Visualisation/my_temporal_network_sample_sicp.html

diff --git a/Assets/Temporal_Graph/Bitcoin/Bitcoin_Code_Visualisation/my_temporal_network_sample_sicp.html b/Assets/Temporal_Graph/Bitcoin/Bitcoin_Code_Visualisation/my_temporal_network_sample_sicp.html
new file mode 100644
index 0000000..7ec8e2c
--- /dev/null
+++ b/Assets/Temporal_Graph/Bitcoin/Bitcoin_Code_Visualisation/my_temporal_network_sample_sicp.html
@@ -0,0 +1,378 @@
+<!DOCTYPE html>
+<html><body>
+<style>
+    text.active_xFlGNRtq {
+        text-anchor: middle;
+        font-size: 24px;
+        font-family: Arial, Helvetica, sans-serif;
+        fill: #706f6f;
+        opacity: 1.0;
+    }
+    text.hidden_xFlGNRtq {
+        opacity: 0;
+    }
+    line.tlinks_xFlGNRtq {
+        stroke: #cccccc;
+        stroke-opacity: 0.4;
+        stroke-width: 2;
+    }
+    line.active_xFlGNRtq {
+        stroke: #ff0000;
+        stroke-opacity: 1.0;
+        stroke-width: 4;
+    }
+    line.hidden_xFlGNRtq {
+        stroke: rgb(255, 255, 255);
+        stroke-opacity: 0;
+        stroke-width: 0px;
+    }
+    circle.active_xFlGNRtq {
+        stroke: #222;
+        fill: #ff0000;
+        fill-opacity: 1;
+        stroke-width: 2px;
+    }
+    circle.tnodes_xFlGNRtq {
+        fill: #cccccc;
+        stroke: #222;
+        fill-opacity: 1;
+        stroke-width: 1.5px;
+    }
+</style>
+
+<svg width="400" height="400" id="xFlGNRtq">
+    <text x="10" y="20" font-family="sans-serif" font-size="14px" fill="red"
+        id='xFlGNRtq_time_txt'>t</text>
+    <text x="120" y="20" font-family="sans-serif" font-size="14px" fill="#9999bb" style="cursor: pointer"
+        id='xFlGNRtq_start_txt'>stop</text>
+    <text x="170" y="20" font-family="sans-serif" font-size="14px" fill="#9999bb" style="cursor: pointer"
+        id='xFlGNRtq_restart_txt'>restart</text>
+</svg>
+
+<script charset="utf-8" src="https://d3js.org/d3.v4.min.js"></script>
+<script charset="utf-8">
+
+// Load via requireJS if available (jupyter notebook environment)
+try {
+    // Problem: require.config will raise an exception when called for the second time
+    require.config({
+        paths: {
+            //d3: "https://d3js.org/d3.v4.min"
+            d3: "https://d3js.org/d3.v4.min.js".replace(".js", "")
+        }
+    });
+    console.log("Detected requireJS");
+}
+catch(err){
+    // a reference error indicates that requireJS does not exist.
+    // other errors may occur due to multiple calls to config
+    if (err instanceof ReferenceError){
+        console.log("Detected no requireJS");
+
+        // Helper function that waits for d3js to be loaded
+        require = function require(symbols, callback) {
+            var ms = 5;
+            window.setTimeout(function(t) {
+                if (window[symbols[0]])
+                    callback(window[symbols[0]]);
+                else
+                    window.setTimeout(arguments.callee, ms);
+            }, ms);
+        }
+    }
+}
+
+require(["d3"], function(d3) {
+    d3.selection.prototype.moveToFront = function() {
+        return this.each(function(){
+            this.parentNode.appendChild(this);
+        });
+    };
+
+    d3.selection.prototype.moveToBack = function() {
+        return this.each(function() {
+            var firstChild = this.parentNode.firstChild;
+            if (firstChild) {
+                this.parentNode.insertBefore(this, firstChild);
+            }
+        });
+    };
+
+    var svg = d3.select("#xFlGNRtq"),
+        width = +svg.attr("width"),
+        height = +svg.attr("height"),
+        radius = 15,
+        color = d3.scaleOrdinal(d3.schemeCategory20b);
+
+    var temporal_net = {"nodes": [{"id": "bc1qqlqhu85am9ldqsavlw79kd2faq0xw2kr7h5g2g", "group": 1}, {"id": "bc1qer54w4up6ymeeh7z48a34yahnd9v9lj20r8lgq", "group": 1}, {"id": "bc1qymkm9ltk6xgk2lauspf0952q79a06ayswelj9v", "group": 1}, {"id": "n_3PL7jn4su3bHFd5fHjw9pR5m43yhve3hn8", "group": 1}, {"id": "n_3Bcg83dPQpEYKmiyTyUbj4LjvuKkHMfkN7", "group": 1}, {"id": "n_3AFM3nuHJwVqPw4SuAKKwttiSs6byM1DKm", "group": 1}, {"id": "n_3GL5VCscmw3Xqj4AkGHB1TK6pKBuZ5qAzg", "group": 1}, {"id": "bc1qha6tazesy5yp7quqzahy8pe7cn7cjj0hmtm2dt", "group": 1}, {"id": "n_3K24pXcBVR2PEyGt55GHjugHxjVyMDhUiq", "group": 1}, {"id": "n_34MJDmtAGesavCJoqSVg141mv9dQArtx2t", "group": 1}, {"id": "n_1DYyg2cE5krYDjvWSKJtXb19fP3vQE43dR", "group": 1}, {"id": "n_1DBzP5sLa2ARufoBxYAJsdXNe3hQzuXcix", "group": 1}, {"id": "n_3HKXmBq7Ftij1fxAEuz1nYuexaCiTWubdF", "group": 1}, {"id": "n_3Mi5jQczRxWGAXUdovtDY9tnAeirwA72yr", "group": 1}, {"id": "n_3KQ6EvT7D6VN5F1JcDpm5sNWeU6rLKdGjZ", "group": 1}], "links": [{"source": "bc1qqlqhu85am9ldqsavlw79kd2faq0xw2kr7h5g2g", "target": "bc1qer54w4up6ymeeh7z48a34yahnd9v9lj20r8lgq", "width": 1, "time": 1}, {"source": "bc1qymkm9ltk6xgk2lauspf0952q79a06ayswelj9v", "target": "bc1qer54w4up6ymeeh7z48a34yahnd9v9lj20r8lgq", "width": 1, "time": 1}, {"source": "bc1qqlqhu85am9ldqsavlw79kd2faq0xw2kr7h5g2g", "target": "bc1qer54w4up6ymeeh7z48a34yahnd9v9lj20r8lgq", "width": 1, "time": 2}, {"source": "bc1qqlqhu85am9ldqsavlw79kd2faq0xw2kr7h5g2g", "target": "bc1qymkm9ltk6xgk2lauspf0952q79a06ayswelj9v", "width": 1, "time": 2}, {"source": "n_3PL7jn4su3bHFd5fHjw9pR5m43yhve3hn8", "target": "bc1qqlqhu85am9ldqsavlw79kd2faq0xw2kr7h5g2g", "width": 1, "time": 3}, {"source": "n_3PL7jn4su3bHFd5fHjw9pR5m43yhve3hn8", "target": "n_3Bcg83dPQpEYKmiyTyUbj4LjvuKkHMfkN7", "width": 1, "time": 3}, {"source": "n_3AFM3nuHJwVqPw4SuAKKwttiSs6byM1DKm", "target": "bc1qqlqhu85am9ldqsavlw79kd2faq0xw2kr7h5g2g", "width": 1, "time": 3}, {"source": "n_3AFM3nuHJwVqPw4SuAKKwttiSs6byM1DKm", "target": "n_3Bcg83dPQpEYKmiyTyUbj4LjvuKkHMfkN7", "width": 1, "time": 3}, {"source": "n_3GL5VCscmw3Xqj4AkGHB1TK6pKBuZ5qAzg", "target": "bc1qqlqhu85am9ldqsavlw79kd2faq0xw2kr7h5g2g", "width": 1, "time": 4}, {"source": "n_3GL5VCscmw3Xqj4AkGHB1TK6pKBuZ5qAzg", "target": "n_3PL7jn4su3bHFd5fHjw9pR5m43yhve3hn8", "width": 1, "time": 4}, {"source": "bc1qha6tazesy5yp7quqzahy8pe7cn7cjj0hmtm2dt", "target": "bc1qer54w4up6ymeeh7z48a34yahnd9v9lj20r8lgq", "width": 1, "time": 7}, {"source": "bc1qha6tazesy5yp7quqzahy8pe7cn7cjj0hmtm2dt", "target": "bc1qer54w4up6ymeeh7z48a34yahnd9v9lj20r8lgq", "width": 1, "time": 7}, {"source": "bc1qha6tazesy5yp7quqzahy8pe7cn7cjj0hmtm2dt", "target": "bc1qer54w4up6ymeeh7z48a34yahnd9v9lj20r8lgq", "width": 1, "time": 7}, {"source": "n_3K24pXcBVR2PEyGt55GHjugHxjVyMDhUiq", "target": "bc1qha6tazesy5yp7quqzahy8pe7cn7cjj0hmtm2dt", "width": 1, "time": 8}, {"source": "n_3K24pXcBVR2PEyGt55GHjugHxjVyMDhUiq", "target": "n_3GL5VCscmw3Xqj4AkGHB1TK6pKBuZ5qAzg", "width": 1, "time": 8}, {"source": "n_34MJDmtAGesavCJoqSVg141mv9dQArtx2t", "target": "bc1qha6tazesy5yp7quqzahy8pe7cn7cjj0hmtm2dt", "width": 1, "time": 9}, {"source": "n_34MJDmtAGesavCJoqSVg141mv9dQArtx2t", "target": "n_3AFM3nuHJwVqPw4SuAKKwttiSs6byM1DKm", "width": 1, "time": 9}, {"source": "n_34MJDmtAGesavCJoqSVg141mv9dQArtx2t", "target": "bc1qha6tazesy5yp7quqzahy8pe7cn7cjj0hmtm2dt", "width": 1, "time": 10}, {"source": "n_34MJDmtAGesavCJoqSVg141mv9dQArtx2t", "target": "n_3K24pXcBVR2PEyGt55GHjugHxjVyMDhUiq", "width": 1, "time": 10}, {"source": "n_34MJDmtAGesavCJoqSVg141mv9dQArtx2t", "target": "bc1qha6tazesy5yp7quqzahy8pe7cn7cjj0hmtm2dt", "width": 1, "time": 10}, {"source": "n_34MJDmtAGesavCJoqSVg141mv9dQArtx2t", "target": "n_3K24pXcBVR2PEyGt55GHjugHxjVyMDhUiq", "width": 1, "time": 10}, {"source": "bc1qha6tazesy5yp7quqzahy8pe7cn7cjj0hmtm2dt", "target": "bc1qer54w4up6ymeeh7z48a34yahnd9v9lj20r8lgq", "width": 1, "time": 14}, {"source": "bc1qha6tazesy5yp7quqzahy8pe7cn7cjj0hmtm2dt", "target": "bc1qer54w4up6ymeeh7z48a34yahnd9v9lj20r8lgq", "width": 1, "time": 14}, {"source": "bc1qha6tazesy5yp7quqzahy8pe7cn7cjj0hmtm2dt", "target": "bc1qer54w4up6ymeeh7z48a34yahnd9v9lj20r8lgq", "width": 1, "time": 14}, {"source": "bc1qqlqhu85am9ldqsavlw79kd2faq0xw2kr7h5g2g", "target": "bc1qer54w4up6ymeeh7z48a34yahnd9v9lj20r8lgq", "width": 1, "time": 15}, {"source": "bc1qymkm9ltk6xgk2lauspf0952q79a06ayswelj9v", "target": "bc1qer54w4up6ymeeh7z48a34yahnd9v9lj20r8lgq", "width": 1, "time": 15}, {"source": "bc1qqlqhu85am9ldqsavlw79kd2faq0xw2kr7h5g2g", "target": "bc1qer54w4up6ymeeh7z48a34yahnd9v9lj20r8lgq", "width": 1, "time": 16}, {"source": "bc1qqlqhu85am9ldqsavlw79kd2faq0xw2kr7h5g2g", "target": "bc1qymkm9ltk6xgk2lauspf0952q79a06ayswelj9v", "width": 1, "time": 16}, {"source": "n_1DYyg2cE5krYDjvWSKJtXb19fP3vQE43dR", "target": "n_1DBzP5sLa2ARufoBxYAJsdXNe3hQzuXcix", "width": 1, "time": 18}, {"source": "n_3HKXmBq7Ftij1fxAEuz1nYuexaCiTWubdF", "target": "n_1DYyg2cE5krYDjvWSKJtXb19fP3vQE43dR", "width": 1, "time": 19}, {"source": "n_3HKXmBq7Ftij1fxAEuz1nYuexaCiTWubdF", "target": "n_3Mi5jQczRxWGAXUdovtDY9tnAeirwA72yr", "width": 1, "time": 19}, {"source": "n_3KQ6EvT7D6VN5F1JcDpm5sNWeU6rLKdGjZ", "target": "n_1DYyg2cE5krYDjvWSKJtXb19fP3vQE43dR", "width": 1, "time": 19}, {"source": "n_3KQ6EvT7D6VN5F1JcDpm5sNWeU6rLKdGjZ", "target": "n_3Mi5jQczRxWGAXUdovtDY9tnAeirwA72yr", "width": 1, "time": 19}, {"source": "n_3PL7jn4su3bHFd5fHjw9pR5m43yhve3hn8", "target": "bc1qqlqhu85am9ldqsavlw79kd2faq0xw2kr7h5g2g", "width": 1, "time": 21}, {"source": "n_3PL7jn4su3bHFd5fHjw9pR5m43yhve3hn8", "target": "n_3Bcg83dPQpEYKmiyTyUbj4LjvuKkHMfkN7", "width": 1, "time": 21}, {"source": "n_3AFM3nuHJwVqPw4SuAKKwttiSs6byM1DKm", "target": "bc1qqlqhu85am9ldqsavlw79kd2faq0xw2kr7h5g2g", "width": 1, "time": 21}, {"source": "n_3AFM3nuHJwVqPw4SuAKKwttiSs6byM1DKm", "target": "n_3Bcg83dPQpEYKmiyTyUbj4LjvuKkHMfkN7", "width": 1, "time": 21}]};
+    var tsperframe = 1;
+    var msperframe = 2000;
+    var look_ahead = 2;
+    var look_behind = 2;
+
+    var hidden_link_strength = 0;
+    var active_link_strength = 0.2;
+
+    // create a dictionary with edges indexed by timestamps
+    var edgesbytime = {};
+    var time_stamps = temporal_net.links.map(link => link['time']);
+    time_stamps.forEach(function(t){
+                edgesbytime[t] = [];
+            });
+
+    // extract static links
+    var links = [];
+    var links_by_id = {};
+    temporal_net.links.forEach(function(link){
+        id = String(link.source + '-' + link.target);
+        edgesbytime[link.time].push(id);
+        l = {
+            'source': link.source,
+            'target': link.target,
+            'id': id,
+            'strength': 0
+        };
+        if (!contains(links, l)){
+            links.push(l);
+            links_by_id[l.id] = l;
+        }
+    });
+
+    var mintime = d3.min(time_stamps);
+    var maxtime = d3.max(time_stamps);
+    var run_status = true;
+
+    var simulation = d3.forceSimulation()
+        .force("link", d3.forceLink().id(function(d) { return d.id; }))
+        .force("charge", d3.forceManyBody().strength(-30).distanceMax(200))
+        .force("repelForce", d3.forceManyBody().strength(-100).distanceMax(200))
+        .force("center", d3.forceCenter(width / 2, height / 2))
+        .alphaTarget(0.1)
+        .on("tick", ticked);
+
+    var g = svg.append("g")
+        .attr("class", "everything");
+
+    var link = g.append("g")
+        .attr("class", "tlinks_xFlGNRtq")
+        .selectAll("line")
+        .data(links, function(d){return d.id;})
+        .enter().append("line")
+        .attr("id", function(d) { return d.id; });
+
+    var node_g = g.append("g").attr("class", "tnodes_xFlGNRtq")
+        .selectAll("circle")
+        .data(temporal_net.nodes, function(d){return d.id;})
+        .enter()
+        .append("g");
+
+    var node = node_g.append("circle")
+            .attr('id', function(d) { return d.id; })
+            .attr("r", radius)
+            // .attr("fill", function(d) { return color(d.group); })
+            .attr("class", "tnodes_xFlGNRtq")
+            .call(d3.drag()
+                .on("start", dragstarted)
+                .on("drag", dragged)
+                .on("end", dragended));
+
+    var text = node_g.append("text")
+    .attr("x", [0, 5][0])
+    .attr("y", [0, 5][1])
+    .attr("id", function(d) {return d.id; })
+    .attr("class", "active_xFlGNRtq")
+    .text(function(d) { return d.id; });
+
+    node.append("title").text(function(d) { return d.id; });
+
+    var zoom_handler = d3.zoom()
+        .on("zoom", zoom_actions);
+    zoom_handler(svg);
+
+    // build mapping to DOM objects once
+    // for performance reasons
+    var time_txt = d3.select('#xFlGNRtq_time_txt');
+    var edges_to_dom = {};
+    var nodes_to_dom = {};
+
+    links.forEach(function(link){
+        edges_to_dom[link.id] = d3.select('#xFlGNRtq #'+link.id);
+    });
+
+    temporal_net.nodes.forEach(function(n){
+        nodes_to_dom[n.id] = d3.select('#xFlGNRtq #'+n.id);
+    });
+
+    // attach event handlers
+    d3.select('#xFlGNRtq_start_txt').on("click", pauseAnimation);
+    d3.select('#xFlGNRtq_restart_txt').on("click", restartAnimation);
+
+    simulation.nodes(temporal_net.nodes).on("tick", ticked);
+    // simulation.force("link").links(links);
+
+    // start animation
+    var time = mintime;
+    var intervl = setInterval(time_step, msperframe);
+    console.log('Started animation.')
+
+    // animates one time step
+    function time_step() {
+
+        time_txt.html('t = ' + time);
+
+        // stop animation
+        if(time > maxtime){
+            run_status = false;
+            clearInterval(intervl);
+            console.log('Stopped animation.')
+        }
+
+       // reset all links to hidden
+       for (id in edges_to_dom){
+            try {
+                // edges_to_dom[l.id].attr('class', 'links');
+                links_by_id[id].strength = hidden_link_strength;
+                edges_to_dom[id].attr('class', 'hidden_xFlGNRtq');
+            }
+            catch(err){
+                console.log('Error: Could not find DOM object with id ' + id);
+            }
+        }
+        // reset all nodes to inactive
+        for (id in nodes_to_dom) {
+            try{
+                nodes_to_dom[id].attr("class", "tnodes_xFlGNRtq");
+            }
+            catch(err){
+                console.log('Error: Could not find DOM object with id ' + id);
+            }
+        }
+
+        // change nodes and links in current time slice
+        for (ti=Math.max(mintime, time-look_behind); ti<=time+look_ahead; ti++) {
+
+            if (ti in edgesbytime) {
+                edgesbytime[ti].forEach(function(id){
+                    links_by_id[id].strength = active_link_strength;
+                    // links that are currently active
+                    if (ti >= time-tsperframe+1 && ti <= time) {
+                        node_ids = id.split('-');
+                        try {
+                            edges_to_dom[id].attr('class', 'active_xFlGNRtq').moveToFront();
+                        }
+                        catch(err){
+                            console.log('Error: Could not find DOM link with id ' + id);
+                        }
+                        try {
+                            nodes_to_dom[node_ids[0]].attr('class', 'active_xFlGNRtq').moveToFront();
+                        }
+                        catch(err){
+                            console.log('Error: Could not find DOM node with id ' + node_ids[0]);
+                        }
+                        try {
+                            nodes_to_dom[node_ids[1]].attr('class', 'active_xFlGNRtq').moveToFront();
+                        }
+                        catch(err){
+                            console.log('Error: Could not find DOM node with id ' + node_ids[1]);
+                        }
+                    }
+                    // links in current time slice that are not active
+                    else{
+                        edges_to_dom[id].attr('class', 'tlinks_xFlGNRtq');
+                    }
+                });
+            }
+        }
+        simulation.force('link', d3.forceLink()
+            .id(link => link.id)
+            .strength(link => link.strength));
+        simulation.force("link").links(links);
+        text.moveToFront();
+
+        time += tsperframe;
+    }
+
+    function pauseAnimation() {
+        if (run_status) {
+            run_status = false;
+            clearInterval(intervl);
+            d3.select('#xFlGNRtq_start_txt').html('start');
+            console.log('Paused animation.')
+        }
+        else {
+            intervl = setInterval(time_step, msperframe);
+            run_status = true;
+            d3.select('#xFlGNRtq_start_txt').html('stop');
+            console.log('Resumed animation.')
+        }
+
+    }
+
+    function zoom_actions(){
+        g.attr("transform", d3.event.transform)
+    }
+
+    function restartAnimation() {
+        if (run_status)
+            clearInterval(intervl);
+        time = mintime;
+        time_txt.html('t = ' + time);
+        d3.select('#xFlGNRtq_start_txt').html('stop');
+        run_status = true;
+        intervl = setInterval(time_step, msperframe);
+        console.log('Restarted animation.')
+    }
+
+    function ticked() {
+        link.attr("x1", function(d) { return d.source.x; })
+            .attr("y1", function(d) { return d.source.y; })
+            .attr("x2", function(d) { return d.target.x; })
+            .attr("y2", function(d) { return d.target.y; });
+
+         text.attr("transform", transform);
+
+
+        text.attr("cx", function(d) { return d.x; })
+            .attr("cy", function(d) { return d.y; });
+
+        node.attr("cx", function(d) { return d.x; })
+            .attr("cy", function(d) { return d.y; });
+    }
+
+
+    function transform(d) {
+        return "translate(" + d.x + "," + d.y + ")";
+    }
+
+    function dragstarted(d) {
+        if (!d3.event.active)
+            simulation.alphaTarget(0.2).restart();
+        d.fx = d.x;
+        d.fy = d.y;
+    }
+
+    function dragged(d) {
+        d.fx = d3.event.x;
+        d.fy = d3.event.y;
+    }
+
+    function dragended(d) {
+        if (!d3.event.active)
+            simulation.alphaTarget(0.2);
+        d.fx = null;
+        d.fy = null;
+    }
+
+    function contains(array, obj) {
+        var i = array.length;
+        while (i--) {
+        if (array[i] === obj) {
+            return true;
+        }
+        }
+        return false;
+    }
+});
+</script>
+</body>
+</html>
\ No newline at end of file
-- 
GitLab