Articulo de referencia

Arquitectura de grafo de nodos

Nodos de sombreado en Blender La arquitectura de grafos de nodos es un diseño de software estructurado en torno al concepto de grafo de nodos . Tanto el código fuente como la in...

Nodos de sombreado en Blender

La arquitectura de grafos de nodos es un diseño de software estructurado en torno al concepto de grafo de nodos . Tanto el código fuente como la interfaz de usuario están diseñados para la edición y composición (o vinculación) de unidades funcionales atómicas. Los grafos de nodos son un tipo de lenguaje de programación visual .

El código fuente de la aplicación de software se organiza en unidades funcionales atómicas llamadas nodos. Esto se suele hacer mediante clases derivadas de una clase base común a todos los nodos. Cada nodo puede tener entradas y salidas, que también se implementan normalmente mediante clases derivadas de clases base para todas las entradas y todas las salidas. Las entradas y salidas pueden hacer referencia entre sí, generalmente mediante punteros a instancias de otras entradas o salidas. Cuando un nodo ejecuta su funcionalidad, recupera sus entradas siguiendo los punteros almacenados en ellas para obtener los datos generados por otros nodos. A continuación, el nodo ejecuta su operación sobre estas entradas para producir sus propias salidas. La capacidad de vincular nodos de esta manera permite descomponer tareas o problemas complejos en unidades nodales atómicas más fáciles de comprender.

La interfaz de usuario de la aplicación suele mostrar visualmente el gráfico de nodos. Los nodos se suelen representar como rectángulos, y las conexiones entre ellos se dibujan con líneas o curvas.

El uso de la arquitectura de grafos de nodos comenzó en la década de 1960. Hoy en día, su uso se ha disparado. Los campos de los gráficos, los videojuegos y el aprendizaje automático son los principales usuarios de este diseño de software, y la mayoría de las herramientas utilizan la arquitectura de grafos de nodos.

Aún hoy, existe cierto debate sobre las ventajas de la programación visual y la arquitectura de grafos de nodos. Quienes la defienden destacan cómo la abstracción que proporcionan los grafos de nodos facilita su uso. Los críticos, por su parte, señalan que la programación visual es demasiado restrictiva y que deben recurrir a la modificación del código fuente o de scripts para realizar sus tareas.

Historia

There is an ongoing effort by Eric Hosick on X to collect snapshots of all node graph user interfaces in most software applications. The effort attempts to document the evolution and explosion of node graph user interfaces starting from their initial roots. This visual history is hosted on a blog page called Visual Programming Languages - Snapshots. Work leading to node graph architectures and visual programming seems to have started in the 1960s, in the area known as "man-machine communications".

In William Robert Sutherland's MIT thesis (1966) "Online Graphical Specification of Procedures", he describes and analyses topics around a 2D pictorial language. This is one of the first investigations in dataflow-based workflows or programs. Since then his thesis has been used as "prior art" in order to quash lawsuits about dataflow ideas today. His work is often thought to have led the way to what is known as computer-aided design (CAD) today.

  1. A pictorial program is a natural way of expressing parallel processes. The two-dimensional nature of the language helps in visualizing many things happening at once.[1]
  2. The ease of debugging programs, particularly parallel ones, will be enhanced by a pictorial language form. Being able to attach data probes and to see a program run gives one a grasp of detail that is hard to obtain in any other way.[1]
  3. A program's execution need not be controlled by the usual explicit sequential flow conventions. The movement of data through a program may determine its operation. A data controlled convention corresponds closely to our intuitive ideas of how a graphical program should operate and also allows parallel programming without explicit flow designations.[1]

In 1969, T. O. Ellis, J. F. Heafner, and W. L. Sibley published a paper concerning a Graphical Input Language (GRAIL). Their work was related to the RAND Tablet which began with research on Sketchpad, a system where users could write computer commands directly on a tablet, conducted by Ivan Sutherland. The GRAIL system used a flowchart-based graphical programming language and could recognize handwritten letters and gestures.[2]Alan Kay has given a number of demos of the GRAIL system, however, he was not involved with the creation of the system.

  1. Los conceptos organizativos importantes en el sistema GRAIL son el flujo de control secuencial, la jerarquía de subrutinas y el lenguaje (diagramas de flujo) para relacionar gráficamente la organización dentro de los conceptos de los dos primeros. [ 2 ]
  2. La naturaleza secuencial del control permite al hombre visualizar procesos aislados que se adaptan a funciones específicas, lo que, a su vez, permite al organizador pensar en el programa total en términos de subpartes manejables. [ 2 ]
  3. La jerarquía de subrutinas enfatiza aún más la noción de procesos aislados. [ 2 ]
  4. Los diagramas de flujo ayudan al hombre a visualizar sus opciones de control y la relación entre los procesos al expresar estas interrelaciones en dos dimensiones. [ 2 ]
Gráfico de nodos de Blender, 2006

Algunos de los usos más recientes de las arquitecturas de grafos de nodos comenzaron alrededor de 2005. En este período, los grafos de nodos empezaron a desarrollar paradigmas para abordar la complejidad. Esta complejidad surgió a medida que aumentaba el número de nodos y enlaces en el grafo. Una de las ideas principales para abordar la complejidad fue el concepto de nodo de grupo o paquete, que ocultaba los nodos en su interior, exponiendo únicamente las entradas y salidas del grupo.

Abstracción y complejidad

En el artículo «Mundos pequeños jerárquicos en la arquitectura de software» [ 3 ], el autor Sergi Valverde argumenta que la mayoría de los grandes sistemas de software se construyen de forma modular y jerárquica, y que los grafos de nodos pueden utilizarse para analizarlos. Muchos otros artículos de análisis de software también utilizan grafos de nodos para analizar grandes sistemas, lo que sugiere que estos son buenos modelos de la estructura interna y el funcionamiento del software. [ 4 ]

Debate sobre programación visual

Los grafos de nodos son un subconjunto de la clase más amplia de lenguajes de programación visual . Permiten diseñar programas de forma visual y estructurada, en lugar de escribir código fuente . En las industrias del cine y los videojuegos, los grafos de nodos son sinónimo de programación visual. Actualmente existe cierto debate sobre el potencial, la abstracción y la necesidad de los grafos de nodos y los lenguajes de programación visual.

  • Los defensores de la programación visual suelen destacar cómo simplifica la programación al abstraer muchos detalles y exponer únicamente los controles necesarios para su dominio. [ 5 ] Estos controles son los parámetros de los nodos que controlan su comportamiento y los enlaces entre ellos.
  • Critics of visual programming generally emphasize how it does not offer enough control, and how for more complex tasks it becomes necessary to author source code.[6] However, these more complex tasks often fall outside the intended usage or domain of the node graph.

This remains an active area of debate with new discussions occurring in open forums to this day. The following are a few of the largest discussions to date.

  • Discussion on Hacker News, 2014
  • Discussion on Hacker News, 2019
  • Reddit discussion, 2019

Research studies tend to shed more details on these discussions and highlight more of the advantages and disadvantages of node graphs. They indicate that node graphs and visual programming are easy to understand for new users, but as the users move to more complex tasks they often need to resort to authoring textual source code.[7] Another survey focuses on peoples beliefs on the cognitive effects of visual programming, in which they found that professional programmers are the most skeptical of visual programming.[8] Other studies have shown in psychological experiments that visual programming can have significant positive effects on performance in cognitive tasks.[9]

Node graph

An example node graph

A node graph in the context of software architecture refers to an organization of software functionality into atomic units known as nodes, and where nodes can be connected to each other via links. The manipulation of nodes and links in the node graph can be often be accomplished through a programmable API or through a visual interface by using the mouse. In the diagram above, the node graph appears on the right-hand side.

In modern-day usage, the term "node graph" is an open compound word. However, in older software it was referred to as a "nodegraph", a closed compound word.

Node

Nodes perform some type of computation. They encapsulate this executable functionality and will often take inputs and produce outputs as a by-product of execution. A simple example is a node that adds two numbers together. The inputs are the two numbers to add and the output is the sum of the two numbers.

Nodes are analogous to mathematical functions of the following form.

outputsnodeA=fnodeA(inputsnodeA){\displaystyle {outputs}_{nodeA}=f_{nodeA}({inputs}_{nodeA})},

where fnodeA{\displaystyle f_{nodeA}} is the node's computation, inputsnodeA{\displaystyle inputs_{nodeA}} is a vector of the node's input values and outputsnodeA{\displaystyle {outputs}_{nodeA}} is a vector of the node's output values.

Visualmente, los nodos suelen representarse mediante rectángulos. Sin embargo, esta convención no se sigue en todas las aplicaciones. En el diagrama anterior, hay tres nodos etiquetados como "Vídeo", "Añadir estrella" y "Añadir círculo".

Parámetros del nodo

Los nodos suelen tener parámetros adicionales que definen su ejecución . Estos parámetros están respaldados por tipos de datos en el código fuente del nodo .

Matemáticamente, pueden considerarse valores de entrada adicionales para la función de cálculo del nodo. La única diferencia radica en que estos valores son controlados directamente por el usuario, en lugar de ser generados por otro nodo como resultado de su ejecución . Por ejemplo, en el ejemplo anterior sobre un nodo que suma dos números, podemos introducir un parámetro de sesgo para que el nodo pueda añadir un número fijo adicional a la suma.

Visualmente, los parámetros del nodo suelen mostrarse después de que el usuario haga clic en él. Esto ayuda a reducir la saturación visual del gráfico de nodos. En el diagrama anterior, vemos una ventana de parámetros que se abre junto al nodo "Agregar estrella".

Entradas y salidas de los nodos

Como se mencionó anteriormente, los nodos suelen tener entradas y salidas. Estas entradas y salidas están respaldadas por tipos de datos en el código fuente del nodo. Las entradas y salidas son cruciales para almacenar valores antes y después de la ejecución del nodo .

Matemáticamente, las entradas y salidas del nodo son análogas a los valores de entrada y salida de las funciones.

otpagtsnorteodmiA=FnorteodmiA(inortepagtsnorteodmiA){\displaystyle {outputs}_{nodeA}=f_{nodeA}({inputs}_{nodeA})},

dóndeFnorteodmiA{\displaystyle f_{nodeA}}es el cálculo del nodo,inortepagtsnorteodmiA{\displaystyle inputs_{nodeA}}es un vector de los valores de entrada del nodo yotpagtsnorteodmiA{\displaystyle {outputs}_{nodeA}}es un vector de los valores de salida del nodo.

Visualmente, las entradas y salidas de los nodos suelen representarse con círculos.

Los enlaces transfieren los valores almacenados en tipos de datos entre diferentes nodos. Son análogos a la composición matemática. Por ejemplo, si el nodo A envía sus salidas al nodo B, esto se puede representar matemáticamente de la siguiente manera.

otpagtsnorteodmiB=FnorteodmiB(FnorteodmiA(inortepagtsnorteodmiA)){\displaystyle {outputs}_{nodeB}=f_{nodeB}(f_{nodeA}({inputs}_{nodeA}))},

dóndeFnorteodmiB{\displaystyle f_{nodeB}}yFnorteodmiA{\displaystyle f_{nodeA}}son las operaciones realizadas por el nodo B y el nodo A,inortepagtsnorteodmiA{\displaystyle inputs_{nodeA}}es un vector de los valores de entrada del nodo A yotpagtsnorteodmiB{\displaystyle outputs_{nodeB}}es un vector de los valores de salida del nodo B.

Tipos de nodos

El tipo de un nodo indica qué operación de cálculo realizará al ejecutarse . A menudo, existen muchos tipos de nodos diferentes que participan en el grafo de nodos. A continuación, se muestran algunos ejemplos:

  • Nuke , un popular programa de composición de efectos visuales , incluye cientos de nodos. [ 10 ] cada uno de los cuales realiza tareas específicas relacionadas con la composición.
  • Katana, un popular software de apariencia e iluminación, incluye cientos de nodos. [ 11 ] cada uno de los cuales realiza tareas específicas relacionadas con la iluminación de escenas de gráficos por computadora .
  • Mari, un popular software de pintura 3D, incluye cientos de nodos. [ 12 ] cada uno de los cuales realiza tareas específicas relacionadas con la pintura 3D.

El tipo de nodo más importante para gestionar la complejidad es el nodo de grupo. Este nodo no ejecuta código de software como otros nodos. Simplemente agrupa un subconjunto de nodos conectados y gestiona las entradas y salidas del grupo. Esto oculta la complejidad dentro de los nodos de grupo y limita su acoplamiento con otros nodos externos. Esto da lugar a una jerarquía donde los grafos más pequeños se integran en los nodos de grupo. A continuación, se muestran ejemplos de nodos de grupo que se utilizan para agrupar un subconjunto de nodos conectados y simplificar el grafo.

  • Agrupar nodos en Nuke. [ 13 ]
  • Nodos de grupo en Katana. [ 14 ]

Interfaz de usuario

Las aplicaciones de software que utilizan la arquitectura de grafo de nodos normalmente exponen el grafo de nodos de forma visual o gráfica al usuario, permitiéndole realizar cambios en él. Mediante el ratón , los usuarios normalmente podrán:

  • crear nuevos nodos
  • editar parámetros en los nodos
  • conectar nodos entre sí
  • evaluar el grafo hasta un nodo determinado
  • ver los valores de salida actuales en los nodos

Con el creciente uso de grafos de nodos, actualmente se presta mayor atención a la creación de interfaces fáciles de usar. A menudo, estas nuevas interfaces son diseñadas por especialistas en interfaces de usuario y diseñadores gráficos. A continuación, se muestran algunas interfaces de usuario diseñadas por artistas y diseñadores.

  • Gráficos de nodos en Dribbble
  • Nodos en Dribbble

Grafos acíclicos dirigidos

Ejemplo de grafo dirigido acíclico

Muchos resultados teóricos de la teoría de grafos se aplican a los grafos de nodos, especialmente en lo que respecta a la topología . Este campo, donde los nodos se enlazan para formar grafos, está ampliamente estudiado.

Un aspecto que genera especial preocupación durante la evaluación de grafos de nodos son los ciclos . Cuando existen ciclos en el grafo de nodos, la evaluación nunca termina, ya que los nodos se ejecutan continuamente siguiendo los enlaces. Para evitar estos problemas, muchas arquitecturas de grafos de nodos se limitan a un subconjunto de grafos conocidos como grafos dirigidos acíclicos .

Uso en gráficos por computadora

Un ejemplo de interfaz de usuario basada en un grafo de nodos.

El uso de la arquitectura de grafos de nodos en el diseño de software es especialmente popular en las industrias del cine y los videojuegos . El diagrama anterior muestra una interfaz de usuario simplificada para una herramienta artística de edición y creación de vídeos. Los nodos se representan como rectángulos y se conectan entre sí mediante líneas curvas ( curvas de Bézier ). En el modelo operativo de este software, una secuencia de vídeo se transmite a través de las líneas al siguiente nodo, y cada nodo realiza modificaciones adicionales a la secuencia. En este ejemplo, un vídeo se traduce a 2D, otro se pixela y, finalmente, ambos se combinan.

A continuación se presentan algunos ejemplos de software que utiliza la arquitectura de grafo de nodos en las industrias del cine y los videojuegos .

  • Katana, Fundición
  • Houdini, SideFX
  • Nuke, Fundición
  • Mari, Fundición
  • Maya, Autodesk
  • Licuadora

Uso en aprendizaje automático

capas simples de redes neuronales

El uso de la arquitectura de grafos de nodos en el diseño de software se ha popularizado recientemente en aplicaciones de aprendizaje automático . El diagrama anterior muestra una red neuronal simple compuesta por tres capas: la capa de entrada, la capa oculta y la capa de salida. Los elementos de cada capa son pesos, conectados a los pesos de las demás capas. Durante la inferencia, el algoritmo de aprendizaje automático evalúa los pesos de la capa de salida mediante una secuencia de evaluaciones funcionales sobre los pesos de las capas anteriores. Durante el entrenamiento, el algoritmo utiliza la optimización para minimizar una función de pérdida , que depende de la diferencia entre los pesos de la capa de salida y los valores esperados. Los grafos de nodos se utilizan para visualizar, configurar y depurar estas capas de la red neuronal.

Los siguientes son ejemplos de software de aprendizaje automático que utiliza una arquitectura de grafo de nodos sin una interfaz gráfica para los grafos de nodos.

  • PyTorch, GitHub, Facebook
  • TensorFlow, GitHub, Google

A continuación se muestran algunos ejemplos de software de aprendizaje automático que utiliza la arquitectura de grafo de nodos .

  • Libro de gráficos, Cerbrec
  • PerceptiLabs, KDnuggets
  • Cognición profunda, Cognición profunda Inc.
  • Modelador de redes neuronales, IBM
  • Consola de red neuronal, Sony
  • Dígitos, nVIDIA

Véase también

Notas

  1. 1 2 3 Sutherland, William Robert (1966). La especificación gráfica en línea de procedimientos informáticos (Tesis). Instituto Tecnológico de Massachusetts. hdl : 1721.1/13474?show = full .
  2. 1 2 3 4 5 "GRAIL Lenguaje de entrada gráfica" (PDF) .
  3. Valverde, Sergi; Sole, Ricard V. (11 de julio de 2003). "Mundos pequeños jerárquicos en la arquitectura de software". arXiv : cond-mat/0307278 .
  4. "Representación y análisis de software". CiteSeerX 10.1.1.394.4865 . {{cite journal}}: Para citar una revista se requiere |journal=( ayuda )
  5. "La programación visual no es mala" .
  6. "Programación visual: por qué es una mala idea" . Octubre de 2018.
  7. "Fortalezas y debilidades de un lenguaje de programación visual en un contexto de aprendizaje con niños" (PDF) .
  8. "Programación visual: perspectivas desde la academia y la industria". 1997. doi : 10.1145/266399.266415 . S2CID 18983760 . {{cite journal}}: Para citar una revista se requiere |journal=( ayuda )
  9. Blackwell, AF (1996). «Teorías metacognitivas de la programación visual: ¿qué creemos que estamos haciendo?». Actas del Simposio IEEE de 1996 sobre Lenguajes Visuales . págs. 240–246 . doi : 10.1109/VL.1996.545293 . ISBN  0-8186-7508-X. S2CID 36822160 . 
  10. "Guía de referencia de Nuke" . learn.foundry.com . Consultado el 21 de diciembre de 2020 .
  11. "Guía de referencia de la katana" . learn.foundry.com . Consultado el 21 de diciembre de 2020 .
  12. "Guía de referencia de Mari" . learn.foundry.com . Consultado el 21 de diciembre de 2020 .
  13. "Nuke: Agrupación de nodos con el nodo de grupo" . learn.foundry.com . Consultado el 21 de diciembre de 2020 .
  14. "Katana: Agrupación de nodos" . learn.foundry.com . Consultado el 21 de diciembre de 2020 .

Referencias

  • Métricas de cambios en la arquitectura de software basadas en la distancia estructural
  • Representación y análisis de software
  • "Gramáticas de grafos y resolución de restricciones para estilos de arquitectura de software". 1998: 69–72 . CiteSeerX 10.1.1.108.9362 . {{cite journal}}: Para citar una revista se requiere |journal=( ayuda )
  • Palsingh, Rishi; Vandana, Vandana (2014). "Aplicación de la teoría de grafos en informática e ingeniería". Revista Internacional de Aplicaciones Informáticas . 104 (1): 1– 4. Bibcode : 2014IJCA..104a..10P . CiteSeerX 10.1.1.800.2735 . doi : 10.5120/18165-9025 . 
  • Thorat, Sushrut; Choudhari, Varad (2016). "Implementación de un diccionario inverso, basado en definiciones de palabras, utilizando una arquitectura de gráfico de nodos" (PDF) . arXiv : 1606.00025 .{{cite journal}}: Para citar una revista se requiere |journal=( ayuda )
  • "Representación y análisis de software". CiteSeerX 10.1.1.394.4865 . {{cite journal}}: Para citar una revista se requiere |journal=( ayuda )
  • Historia de la programación visual: desde Basic hasta Bubble
  • Software Scratch
  • Software Blockly
  • ¿Qué es la programación visual?