173 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			173 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| {
 | |
|     "cells": [
 | |
|         {
 | |
|             "cell_type": "markdown",
 | |
|             "source": [
 | |
|                 "## DEVOUR Virtual Data Structure\r\n",
 | |
|                 "Dynamic: The structure of the output DEVOUR graph is dynamically generated from raw input data\r\n",
 | |
|                 "\r\n",
 | |
|                 "Explicit: Every node in a DEVOUR graph is explicitly typed and namespaced for reliability and interoperability between programs\r\n",
 | |
|                 "\r\n",
 | |
|                 "Virtual: DEVOUR graphs contain their own serialized virtual memory space\r\n",
 | |
|                 "\r\n",
 | |
|                 "Ordered: A DEVOUR graph's virtual memory is structured as an ordered list for performance\r\n",
 | |
|                 "\r\n",
 | |
|                 "Unique: A DEVOUR graph contains only one instance of a given \"real\" value, mapped into its virtual memory\r\n",
 | |
|                 "\r\n",
 | |
|                 "Relational: A DEVOUR graph's virtual memory is referenced via indexed pointers within its data structure"
 | |
|             ],
 | |
|             "metadata": {}
 | |
|         },
 | |
|         {
 | |
|             "cell_type": "code",
 | |
|             "execution_count": 98,
 | |
|             "source": [
 | |
|                 "class Graph:\r\n",
 | |
|                 "    def __init__(self):\r\n",
 | |
|                 "        self.graph = []\r\n",
 | |
|                 "        self.cache = {\r\n",
 | |
|                 "            \"shape\": [],\r\n",
 | |
|                 "            \"memory\": []\r\n",
 | |
|                 "        }\r\n",
 | |
|                 "\r\n",
 | |
|                 "    # adds a new object to the graph\r\n",
 | |
|                 "    def add(self, node):\r\n",
 | |
|                 "        # add to graph\r\n",
 | |
|                 "        self.graph.append(node)\r\n",
 | |
|                 "\r\n",
 | |
|                 "    def redirect_node(self, node):\r\n",
 | |
|                 "        shape = self.cache[\"shape\"]\r\n",
 | |
|                 "        memory = self.cache[\"memory\"]\r\n",
 | |
|                 "\r\n",
 | |
|                 "        # for dictionaries, add each member node\r\n",
 | |
|                 "        if type(node) == dict:\r\n",
 | |
|                 "            # cache keys and values\r\n",
 | |
|                 "            new_dict = {}\r\n",
 | |
|                 "            for key, value in node.items():\r\n",
 | |
|                 "                if type(value) == dict:\r\n",
 | |
|                 "                    value = self.redirect_node(value)\r\n",
 | |
|                 "\r\n",
 | |
|                 "                # add dict key to memory\r\n",
 | |
|                 "                if key not in memory:\r\n",
 | |
|                 "                    memory.append(key)\r\n",
 | |
|                 "                    key_index = \"#\" + hex(len(memory) - 1)\r\n",
 | |
|                 "                else:\r\n",
 | |
|                 "                    key_index = \"#\" + hex(memory.index(key))\r\n",
 | |
|                 "\r\n",
 | |
|                 "                # add dict value to memory\r\n",
 | |
|                 "                if value not in memory:\r\n",
 | |
|                 "                    memory.append(value)\r\n",
 | |
|                 "                    value_index = \"#\" + hex(len(memory) - 1)\r\n",
 | |
|                 "                else:\r\n",
 | |
|                 "                    value_index = \"#\" + hex(memory.index(value))\r\n",
 | |
|                 "\r\n",
 | |
|                 "                new_dict[key_index] = value_index\r\n",
 | |
|                 "\r\n",
 | |
|                 "            # check if the dict is in memory already\r\n",
 | |
|                 "            if new_dict in memory:\r\n",
 | |
|                 "                node = \"#\" + hex(memory.index(new_dict))\r\n",
 | |
|                 "            else:\r\n",
 | |
|                 "                node = new_dict\r\n",
 | |
|                 "\r\n",
 | |
|                 "        # redirect object to virtual memory\r\n",
 | |
|                 "        if type(node) == str:\r\n",
 | |
|                 "            is_pointer = node[0] == \"#\"\r\n",
 | |
|                 "        else:\r\n",
 | |
|                 "            is_pointer = False\r\n",
 | |
|                 "        \r\n",
 | |
|                 "        if not is_pointer:\r\n",
 | |
|                 "            if node not in memory:\r\n",
 | |
|                 "                memory.append(node)\r\n",
 | |
|                 "                value_pointer = \"#\" + hex(len(memory) - 1)\r\n",
 | |
|                 "            else:\r\n",
 | |
|                 "                value_pointer = \"#\" + hex(memory.index(node))\r\n",
 | |
|                 "\r\n",
 | |
|                 "        # add a redirector to shape\r\n",
 | |
|                 "        shape.append(value_pointer)\r\n",
 | |
|                 "\r\n",
 | |
|                 "        # return a pointer to the node\r\n",
 | |
|                 "        return \"#\" + hex(len(memory) - 1)\r\n",
 | |
|                 "\r\n",
 | |
|                 "    # exports the graph as a single dictionary object\r\n",
 | |
|                 "    def serialize(self):\r\n",
 | |
|                 "        # serialize DevourObject instances\r\n",
 | |
|                 "        for node in self.graph:\r\n",
 | |
|                 "            self.redirect_node(node)\r\n",
 | |
|                 "\r\n",
 | |
|                 "        return self.cache"
 | |
|             ],
 | |
|             "outputs": [],
 | |
|             "metadata": {}
 | |
|         },
 | |
|         {
 | |
|             "cell_type": "code",
 | |
|             "execution_count": 99,
 | |
|             "source": [
 | |
|                 "# test\r\n",
 | |
|                 "graph = Graph()\r\n",
 | |
|                 "graph.add(1.0)\r\n",
 | |
|                 "graph.add(1.0)\r\n",
 | |
|                 "graph.add(3.0)\r\n",
 | |
|                 "graph.add(3.0)\r\n",
 | |
|                 "graph.add(1.0)\r\n",
 | |
|                 "graph.add({\r\n",
 | |
|                 "        \"name\": \"TestObject\",\r\n",
 | |
|                 "        \"visible\": True\r\n",
 | |
|                 "    })\r\n",
 | |
|                 "graph.add({\r\n",
 | |
|                 "        \"name\": \"TestObject\",\r\n",
 | |
|                 "        \"visible\": True\r\n",
 | |
|                 "    })\r\n",
 | |
|                 "graph.add({\r\n",
 | |
|                 "        \"name\": \"TestObject\",\r\n",
 | |
|                 "        \"visible\": True,\r\n",
 | |
|                 "        \"transform\": {\r\n",
 | |
|                 "            \"position\": [0.0, 0.0, 0.0],\r\n",
 | |
|                 "            \"rotation\": [0.0, 0.0, 0.0],\r\n",
 | |
|                 "            \"scale\": [1.0, 1.0, 1.0]\r\n",
 | |
|                 "        }\r\n",
 | |
|                 "    })\r\n",
 | |
|                 "graph.add({\r\n",
 | |
|                 "        \"name\": \"TestObject\",\r\n",
 | |
|                 "        \"visible\": True,\r\n",
 | |
|                 "        \"transform\": {\r\n",
 | |
|                 "            \"position\": [0.0, 0.0, 0.0],\r\n",
 | |
|                 "            \"rotation\": [0.0, 0.0, 0.0],\r\n",
 | |
|                 "            \"scale\": [1.0, 1.0, 1.0]\r\n",
 | |
|                 "        }\r\n",
 | |
|                 "    })\r\n",
 | |
|                 "\r\n",
 | |
|                 "# write to disk\r\n",
 | |
|                 "import json\r\n",
 | |
|                 "with open(\"DEVOURTest.json\", \"w\") as outfile:\r\n",
 | |
|                 "    json.dump(graph.serialize(), outfile, indent = 4)"
 | |
|             ],
 | |
|             "outputs": [],
 | |
|             "metadata": {}
 | |
|         }
 | |
|     ],
 | |
|     "metadata": {
 | |
|         "orig_nbformat": 4,
 | |
|         "language_info": {
 | |
|             "name": "python",
 | |
|             "version": "3.7.8",
 | |
|             "mimetype": "text/x-python",
 | |
|             "codemirror_mode": {
 | |
|                 "name": "ipython",
 | |
|                 "version": 3
 | |
|             },
 | |
|             "pygments_lexer": "ipython3",
 | |
|             "nbconvert_exporter": "python",
 | |
|             "file_extension": ".py"
 | |
|         },
 | |
|         "kernelspec": {
 | |
|             "name": "python3",
 | |
|             "display_name": "Python 3.7.8 64-bit"
 | |
|         },
 | |
|         "interpreter": {
 | |
|             "hash": "57baa5815c940fdaff4d14510622de9616cae602444507ba5d0b6727c008cbd6"
 | |
|         }
 | |
|     },
 | |
|     "nbformat": 4,
 | |
|     "nbformat_minor": 2
 | |
| } |