El sombrerero loco

¿Se ha preguntado alguna vez por qué el Sombrerero loco de Alicia en el país de las maravillas era un loco sombrerero y no un loco de otro tipo?

El sistema nervioso puede resultar dañado por la exposición a cualquiera de una serie de sustancias químicas tóxicas llamadas neurotoxinas, que pueden penetrar en la circulación general procedentes del tubo digestivo, de los pulmones, o a través de la piel. Por ejemplo, los metales pesados como el mercurio y el plomo pueden acumularse en el encéfalo y dañarlo de forma permanente, produciendo una psicosis tóxica (demencia crónica producida por una neurotoxina).

En la Inglaterra de los siglos 18 y 19, los fabricantes de sombreros frecuentemente se volvían locos debido al mercurio que empleaban para preparar el fieltro que utilizaban para hacer los sombreros. Algo parecido sucede con la palabra chalado [en inglés, ‘crackpot’], que originalmente hacía referencia a la psicosis tóxica observada en algunas personas –fundamentalmente en las pobres- que preparaban su té en una tetera [‘pot’] de cerámica agrietada [‘crack’] soldada con plomo.

Extraído de Biopsicología 6Ed por John P.J. Pinel.

La importancia del contexto en la percepción del color

La percepción del color se encuentra fuertemente influenciada por el contexto. Dos regiones desde las que se observa la misma luz (mismo espectro de radiación electromagnética) nos pueden parecer diferentes dependiendo del entorno que las rodea, fenómeno conocido como contraste de color (Figura A). De la misma forma, regiones de objetos que reflejan, transmiten o emiten espectros de luz diferentes podrían parecer del mismo color, fenómeno conocido como constancia de color (Figura B).

Ilustración de contraste y constancia de color

En la figura A se observa como los dos recuadros de idéntica reflectancia que se muestran en la parte inferior en ausencia de contexto, parecen tener colores muy diferentes. En la figura B, los recuadros tienen distinta reflectancia y a pesar de ello parecen tener el mismo color. Puede comprobarlo utilizando un programa de tratamiento de imagen y midiendo los valores RGB que presenta su monitor en dichas áreas.

El fenómeno de la constancia de color ha fascinado a multitud de científicos. Aunque estos fenómenos eran bien conocidos en el siglo 19 no adquirieron un lugar central en la teoría de la percepción del color hasta los trabajos de Land en la década de los 50.

Edwin H. Land, fundador de la compañía Polaroid es uno de los más famosos investigadores en el área de la constancia de color. En 1959 realizó una serie de experimentos con resultados bastante asombrosos después de los cuales desarrollo, junto con John J. McCann uno de los primeros modelos computaciones de constancia de color, la teoría retinex.

De acuerdo a la teoría retinex, el procesado de la información visual comienza con los receptores de la retina. Dentro de la retina, tres tipos de sensores miden la luz en las partes roja, verde y azul del espectro. Esta información visual es posteriormente procesada de forma independiente para cada banda de color.

En sus experimentos utilizaban estímulos similares a las famosas pinturas del artista Piet Mondrian, parecidas a la imagen que se muestra a continuación, que componían colocando papeles coloreados sobre un lienzo de forma aleatoria. Al conjunto se le aplicaba una capa mate para reducir los posibles efectos de la reflectancia especular.

mondrian

Para iluminar el mondrian se utilizaban tres proyectores con un filtro paso banda estrecho. El primer filtro permitía el paso de la luz de longitudes de onda corta (luz azul), el segundo permitía longitudes de onda medias (luz verde), y el tercero permitía el paso a las longitudes de onda largas (luz roja). La cantidad de luz emitida por cada proyector se podía controlar.

Se encendían todos los proyectores y se ajustaban para que cada papel coloreado del mondrian pareciera fuertemente coloreados, buscando sobre todo que los papeles blancos parecieran ‘buenos blancos’.

Posteriormente se utilizaba un fotómetro telescópico para medir la luz reflejada por un área determinada dentro del mondrian. Ellos seleccionaron un rectángulo blanco y midieron la luz que reflejaba (la luminancia) para cada uno de los tres proyectores, es decir, se hicieron tres mediciones cada una con uno solo de los proyectores encendido.

A continuación se eligió un rectángulo que parecía marrón oscuro y ajustaron los proyectores de luz para que los resultados fueran idénticos a las medidas anteriores.

Incluso aunque la luminancia media era equivalente a la del rectángulo blanco, es decir, el objeto estaba reflejando la misma luz que reflejaba el parche blanco cuando le medimos, el color seguía siendo percibido como marrón oscuro. Se repitió el experimento para los diferentes colores y en cada uno de los casos es color percibido permanecía constante.

Con este experimento, Land y McCann demostraron que el color percibido en un área de una imagen no depende exclusivamente de la luz observada en esa área.

Referencias | Neuroscience | Color constancy

Pinceladas de evolución

Los algoritmos genéticos están inspirados en la teoría de la evolución de Darwin y forman parte de la computación evolutiva, área de rápido crecimiento dentro del campo de la inteligencia artificial.

Los seres vivos están compuestos por células. En cada una de la células de un organismo se encuentra el mismo conjunto de cromosomas. Los cromosomas son cadenas de ADN y sirven como modelo para el organismo, es decir, el organismo se construirá o desarrollará en base a las instrucciones codificadas en su cromosomas.

Representación de un cromosoma

Un cromosoma está compuesto por genes, bloques de ADN. Cada gen codifica una proteína particular. Se podría decir que cada gen codifica un rasgo, como por ejemplo el color de los ojos. Los diferentes rasgos son llamados alelos (ojos azules, ojos marrones). Cada gen tiene su propia posición dentro del cromosoma.

El conjunto completo de material genético (todos los cromosomas) es llamado genoma. Un conjunto particular de genes del genoma se llama genotipo. El genotipo es la base para el fenotipo, las características físicas y mentales que presentara el organismo al desarrollarse.

Durante la reproducción, el material genético de cada uno de los padres se recombina al formarse los gametos, células cuyo material genético se fusionará en la fecundación. Existe un complicado conjunto de sistemas encargados de asegurar la integridad de la molécula de ADN con el fin de preservar la información hereditaria y reparar la mayor parte de las alteraciones que pueda experimentar, sin embargo, aproximadamente uno de cada mil errores no es corregido por lo que la información se ve alterada de una generación a la siguiente apareciendo lo que se denomina mutación, que hace referencia a cualquier cambio permanente en el material génico no debido a la segregación independiente de los cromosomas o a la recombinación que ocurre durante el proceso de meiosis.

Las mutaciones se producen al azar y son generalmente perjudiciales, aunque en ocasiones también ocurren mutaciones beneficiosas que confieren alguna ventaja a las células en las que aparecen.

Tanto las recombinaciones como las mutaciones beneficiosas son las causas de las grandes variaciones que muestran los individuos de una misma especie. Los individuos que presenten una mejor adaptación a su entorno es más probable que tengan descendientes formados en base a su material genético.

Los algoritmos genéticos permiten encontrar buenas soluciones para una clase de problemas cuya solución sería difícil de encontrar utilizando otros métodos. Conceptualmente establecen una analogía entre el conjunto de soluciones de un problema y el conjunto de individuos de una población. Cada individuo representa una posible solución al problema y se parte de un conjunto de individuos normalmente generado al azar que se hará evolucionar de tal forma que las nuevas generaciones contengan soluciones mejores para el problema a resolver.

De forma general el proceso es el siguiente:

  1. Generar una población aleatoria de n cromosomas (posibles soluciones al problema).
  2. Evaluar la adaptación f(x) de cada cromosoma x en la población. Dicha función evaluara la bondad de la solución que presenta cada cromosoma.
  3. Si se cumple la condición de finalización (típicamente el haber encontrado una solución aceptable o llegar a un número de generaciones máximo) detener el algoritmo.
  4. Generar una nueva población. El proceso de crear una nueva generación típicamente se divide en cuatro pasos: Selección, Cruzamiento, Mutación y reemplazo.
  5. Reemplazar la antigua generación por la nueva.
  6. Ir al paso 2.

Un ejemplo de resolución de este tipo de problemas lo encontramos en la reciente implementación por Roger Alsing de un algoritmo genético para aproximar una imagen utilizando un número pequeño de polígonos traslucidos.

Aproximación mediante poligonos de una fotografía de Darwin utilizando un algoritmo genético

El funcionamiento del algoritmo, variante del proceso descrito anteriormente, se puede resumir en los siguientes pasos, tal y como Roger describe en su blog:

  1. Generar una cadena de ADN de forma aleatoria. Esta cadena contendrá las instrucciones para pintar cada uno de los polígonos que aparecen en pantalla.
  2. Generar una nueva cadena de ADN copiando la cadena de ADN anterior mutándola ligeramente.
  3. Utilizar la cadena para representar los polígonos en pantalla.
  4. Comparar el resultado con la imagen original.
  5. Si la nueva imagen se parece más a la imagen original sobrescribir la cadena de ADN original con la nueva cadena.
  6. Repetir desde 1.

Se puso su implementación a prueba con una imagen arbitraria y se dejo evolucionar al ‘organismo’ durante aproximadamente media hora. En el siguiente video se puede ver el proceso de evolución acelerado por un factor de 32.

La imagen final generada se corresponde con la generación 117653 y está compuesta por un total de 78 polígonos con una media de 8 puntos por polígono.

Se puede descargar el código fuente del programa en el blog de Roger Alsing.

Fuentes| Introduction to Genetic Algorithms | Wikipedia | Fundamentos biológicos de la conducta

Fiji – Silverlight en el escritorio

Fiji es un proyecto experimental que permite ejecutar aplicaciones Silverlight fuera del navegador, es decir, como aplicaciones de escritorio en su propia ventana. Su objetivo final es coger los archivos de aplicación (.xap) de Silverlight y utilizarles para generar un archivo ejecutable que no necesite del navegador para funcionar.

Para ello se utiliza el mismo mecanismo que algunos navegadores utilizan para cargar sus plugins, NPAPI (Netscape Plugin API).

Para utilizar Fiji solo es necesario pasarle como parámetro la ruta completa del archivo .xap que contiene la aplicación Silverlight, por ejemplo, “fiji.exe C:\AplicacionSilverlight.xap”.

Fiji ejecutando SpecNIX (emulador de ZX Spectrum para Silverlight)

Redes Neuronales Artificiales

A juicio de Rumelhart, el cognitivismo clásico centró sus esfuerzos explicativos de la mente en el nivel lógico o funcional, es decir, se consideraba a la mente como un programa de ordenador (software) y se suponía que dicho programa podría ejecutarse en cualquier máquina, pues se entiende que el nivel físico, es decir, el cerebro (wetware), se basará en sistemas de propósito general de tipo von Newmann. Esto se conoce como la metáfora del ordenador.

Los conexionistas, sin embargo, dirigieron su mirada al nivel de implementación, el cerebro, pues consideraban que a partir de él se podrían diseñar más adecuadamente algoritmos que se puedan utilizar para explicar los fenómenos mentales. Por lo tanto, la metáfora del ordenador fue sustituida por la metáfora cerebral de la mente abandonando la computación de estilo simbólico por una computación inspirada en el funcionamiento cerebral.

Al mirar hacia la mente, lo primero que se observó, gracias a los pioneros trabajos de Santiago Ramón y Cajal fue un entramado de células conectadas entre sí. Estas células, las neuronas se pueden dividir funcional y anatómicamente en tres zonas: el cuerpo celular o soma, axón y dendritas. Cada neurona recibe información a través de las dendritas, la procesa principalmente en el soma y la proyectan a través del axón. La conexión entre axones y dendritas recibe el nombre de sinapsis. El siguiente video muestra un resumen de lo que son las neuronas.

En 1943, dos neurocientíficos, Warren McCulloch y Walter Pitts, propusieron un modelo de neurona básico siendo pioneros en el intento de definir formalmente las neuronas como elementos computacionales y en explorar las consecuencias de sus propiedades. Desde su definición, a pesar de los grandes avances en el campo de la neurociencia, las redes neuronales artificiales no han cambiado mucho con respecto a las que propusieron en su día McCulloch y Pitts.

Es importante recalcar que dicho modelo no pretende ser una teoría del funcionamiento del cerebro del cual cada día se descubren cosas nuevas sino más bien la definición de un modelo de computación inspirado en el cerebro que permita diseñar sistemas artificiales inteligentes para resolver problemas concretos.

Diseccionando la neurona artificial

Al igual que sus homologas biológicas, cada neurona consta de varias entradas y de una salida. Una neurona recibe información del entorno o de otras neuronas a través de las conexiones o sinapsis de sus entradas. La información recibida determinará el estado o nivel de activación de la neurona en base a una función de activación.

El estado de una neurona puede tomar valores continuos o discretos. Las neuronas descritas por McCulloch y Pitts podían estar únicamente en dos estados: activadas (1) y desactivadas (0). El estado de una neurona se transmitirá a su salida a través de la función de salida, que típicamente será la función identidad, es decir, el estado será igual a la salida.

Formando redes neuronales

De forma análoga a como las neuronas del cerebro crean complejos circuitos, una red neuronal artificial está formada por múltiples neuronas conectadas entre sí.

Las conexiones entre las neuronas se definen utilizando un parámetro denominado peso sináptico. Dependiendo de si el peso es positivo o negativo la naturaleza de la conexión será excitante o inhibitoria. Además, el valor absoluto del peso indicará la fuerza de la conexión.

Si tenemos una neurona activada cuya salida este conectada a varias neuronas, esta neurona propiciara la activación de las neuronas con las cuales se conecta a través de conexiones excitantes y dificultara la activación de aquellas neuronas con las cuales se conecte a través de conexiones inhibitorias. Todo ello con una fuerza proporcional al valor absoluto del peso de la conexión.

El valor de todos los pesos de la red neuronal en un momento temporal dado es lo que va a especificar el patrón de conectividad que será lo que determine como responderá la red a las señales que reciba. Los procesos de aprendizaje de las redes neuronales se basan en ir ajustando el patrón de conectividad hasta que la red se comporte de la forma deseada para un problema concreto. Existe diversas técnicas para ello. Algunas redes neuronales se ‘entrenarán’ para un problema concreto y posteriormente se impedirá el reajuste de su patrón de conectividad durante su funcionamiento mientras que otras técnicas de aprendizaje pueden permitir a la red adaptarse modificando su patrón de conectividad sobre la marcha.

Ejemplo

En el siguiente diagrama se muestran las conexiones de una red neuronal (ANN) formada por 9 neuronas: {a, b, c, d, e, f, g, h, i}. Además, en cada conexión se muestra su peso sináptico, que se recuerda que indica la naturaleza y la fuerza de esa conexión.

De forma alternativa, el diagrama anterior puede verse como una matriz de nxn, siendo n el número de neuronas, que representa el patrón de conectividad. Además, podemos representar el estado o nivel de activación de cada neurona como un vector columna de tamaño n. En la figura siguiente podemos ver tanto la matriz de conexiones como el vector de estado de las neuronas.

Las columnas indican el origen de las conexiones y las filas el destino. Así si miramos a la primera columna y la tercera fila tenemos que la neurona ‘a’ está conectada a la neurona ‘b’ con una fuerza de ‘0.4’ tal y como se podía ver en el grafo. Además, si observamos el vector de estado vemos que inicialmente la única neurona activa es la ‘c’ (recordemos que en el modelo que estamos considerando una neurona solo puede estar activada o desactivada).

La función de activación utilizada es la función escalón. Para cada neurona, se calculará el sumatorio de todos los niveles que ingresa procedentes de otras unidades. Dicho sumatorio se conocerá como el valor que ingresa la neurona y será suministrado a la función de activación. En el caso de la función escalón, la salida será 1 (activación) en el caso de que su ingreso sea mayor que cero y 0 (inhibición) en caso contrario.

La vista matricial de la figura anterior facilita calcular los ingresos de la función de activación de cada neurona ya que lo reduce a una simple multiplicación matricial. Podemos simular la red neuronal multiplicando la matriz de conexiones por el vector de estado de tal forma que obtengamos un nuevo vector de estado.

Si calculamos los ingresos a partir de la figura anterior, es decir, realizamos la multiplicación, obtendremos el vector [0 0 0 0 0 0.3 0 0 –0.3] y al aplicar la función de activación a cada uno de sus valores tendremos [0 0 0 0 0 1 0 0 0]. Es decir, la red ha pasado de tener la neurona ‘c’ activa a tener la neurona ‘f’ activa en una iteración o  instante temporal. La aplicación recurrente de este procedimiento nos permite calcular la evolución de la red que en el caso que nos ocupa se muestra en la siguiente figura.

Algunas redes cambiaran indefinidamente a lo largo del tiempo, sin embargo, la red anterior, alcanzará el estado estacionario mostrado en t=6 para la mayoría de condiciones iniciales, lo cual convierte a dicho estado en un atractor puntual para esta red. El otro atractor de la red es el estado cero en el cual todas las neuronas estan desactivadas. Cualesquiera que sean las condiciones iniciales de esta red, a medida que evoluciona, terminará estancándose en uno de sus dos estados atractores.

La arquitectura de la red anterior es recurrente, y dispersa. Recurrente porque contiene bucles en las conexiones ( c->f->c ) y dispersa porque de todas las conexiones posibles (n^2=81), solo unas pocas se han realizado. Existen múltiples arquitecturas de redes neurales dependiendo de cómo se estructuran y conectan las neuronas que las componen.

Bibliografía:
From Computer to Brain – Foundations of Computational Neuroscience
Cognición humana: mente, ordenadores y neuronas

Manufactura personal

La impresión 3D es una realidad. Shapeways nos permite diseñar e imprimir nuestros propios modelos tridimensionales a un coste razonable al más puro estilo de la web 2.0. Recientemente Madox narraba como en aproximadamente dos horas y utilizando herramientas gratuitas había diseñado completamente una replica del stargate con un ‘iris’ funcional incluyendo en dicho tiempo el proceso de envío para la impresión.

Las siguientes imágenes muestran el resultado (se pueden ver más en el sitio original).

En el siguiente video se pueden ver algunos de los objetos que se pueden realizar mediante impresión tridimensional.

Y el siguiente muestra el proceso completo de producción desde el diseño hasta la impresión.

¿Qué nos deparará el futuro? la siguiente analogía de Phun Yan Yan es cuanto menos interesante.

Esta secuencia predefinida de aminoácidos conocida como la formula química de una proteína es definida (codificada) en una molécula llamada ADN. Las células humanas ordinarias tienen 46 moléculas enormes de ADN llamadas cromosomas. Cada célula humana literalmente ‘lee’ esas moléculas como un procesador leyendo instrucciones y literalmente ‘imprime’ las proteínas en una nano impresora tridimensional llamada ribosoma.

Vía FABBALOO

El modelo Kuramoto

El fenómeno de la sincronización nos rodea: nuestro corazón, los ritmos circadianos, aplausos, generadores eléctricos… Ciertas especies de luciérnagas han cautivado a muchos viajeros en el Sudoeste Asiático, los cuales regresaban a sus lugares de origen contando historias de poblaciones inmensas de luciérnagas emitiendo luz intermitente de forma totalmente sincronizada creando grandes franjas de luz parpadeante en la oscuridad.

Su estudio se remonta a 1665, cuando Christiaan Huygens yacía enfermo en la cama con la compañía de dos relojes de péndulo. Después de unos días se dio cuenta de que los péndulos se movían de tal forma que cuando uno estaba completamente a la izquierda, el otro se encontraba completamente a la derecha, y viceversa.

Intrigado, modifico manualmente el ritmo de los péndulos pero con el tiempo siempre volvían a sincronizarse. La explicación que dio a lo que el llamaba “simpatía de dos relojes” fue que cada uno de los péndulos causaba un movimiento imperceptible en la pared de la que colgaba cada reloj y que dicho movimiento tendía a forzar la sincronización de de cada uno de los péndulos con el otro. El tiempo le daría la razón.

En el siguiente video se puede observar una versión de este fenómeno (con sonido se aprecia mejor).

El modelo Kuramoto fue motivado por el comportamiento de ciertos osciladores químicos y biológicos y permite modelar la sincronización y desincronización en grupos de osciladores acoplados. La ecuación que gobierna el sistema es la siguiente:

La limitada variedad de estados en los que el modelo se puede encontrar lo hace apropiado para el modelado de algunos sistemas utilizados en neurociencia.

En la siguiente aplicación, cuyo código se encuentra adjunto, puede observar como varía el comportamiento de 25 osciladores en función de la constante de acoplamiento (K). Al reiniciar la simulación se asignarán velocidades y fases iniciales aleatorias a cada uno de los osciladores.

Install Microsoft Silverlight

Referencias

NDepend

La gestión de la complejidad es uno de los principales retos a los que nos enfrentamos a la hora de desarrollar software. Recientemente Patrick Smacchia me invitó a probar NDepend, una potente herramienta que nos proporciona, de forma muy visual e interactiva, una gran cantidad de información sobre ensamblados .NET.

Su utilización simplifica la gestión de una base de código compleja al poder realizar medidas objetivas sobre el código y poder comparar su evolución en el tiempo. También  facilita la comunicación al poder ver de forma muy visual la estructura y dependencias del código. Además, combinada con reflector (herramienta con la que se puede integrar), nos puede facilitar enormemente la tarea de entender o evaluar ensamblados no escritos por nosotros.

Los diferentes gráficos y resultados mostrados a continuación son el resultado del análisis mediante NDepend a una sencilla aplicación que escribí hace tiempo. Se puede observar el informe HTML que fue generado automáticamente por la herramienta aquí.

NDepend facilita ver la estructura y las interrelaciones entre los diferentes componentes de un proyecto de software así como responder a preguntas sobre la calidad u otros aspectos del software en base a los numerosos indicadores o métricas incluidos. Además, podemos realizar nuestras propias preguntas sobre el código utilizando CQL (Code Query Language), un lenguaje de consultas similar a SQL.

Al cargar un conjunto de ensamblados en NDepend se realiza un completo análisis de los mismos. A partir de ese momento tendremos a nuestra disposición una gran cantidad de información que podemos visualizar bajo una agradable interface. Al termino del análisis también se generará un informe en HTML con la información más relevante.

Métricas

Tenemos diferentes métricas a nuestra disposición, las cuales pueden operar a diferentes niveles: espacios de nombres, ensamblados, tipos, métodos y campos. Las métricas nos permiten detectar potenciales problemas en la arquitectura del software y nos pueden indicar la necesidad de reestructurar el código (refactoring).

En la siguiente imagen se observa un gráfico generado por la herramienta que representa el número de líneas de código de cada uno de los métodos de una aplicación. Cada recuadro sombreado representa un método, y su tamaño es proporcional al número de líneas de las que está compuesto. Además, los métodos están agrupados dentro de los tipos que les contienen, por lo que podemos ver su peso especifico dentro de la aplicación.

La cantidad de información que proporciona el gráfico anterior es muy elevada, siendo además interactivo por lo que nos permite navegar a las estructuras representadas dentro del proyecto.

Entre las diferentes métricas a nuestra disposición destacamos las siguientes (tenemos un listado completo en el sitio web de la herramienta):

  • Longitud: en instrucciones de lenguaje intermedio (IL), o en líneas de código. Una gran longitud en nuestros tipos o clases podría indicar un exceso de responsabilidad para estas y por lo tanto aconsejar la necesidad de refactorización.
  • Aferencia: la aferencia es el número de vías de entrada o referencias hacia la entidad bajo observación. En otras palabras, si estamos trabajando a nivel de métodos, la aferencia de un método nos indicará el número de métodos que dependen de este método bajo observación. Este indicador nos muestra la ‘importancia’ que tiene una determinada entidad. Si una entidad es muy ‘importante’ será más difícil modificarla, porque el número de entidades que depende de ella será elevado y al hacerlo, alguno de ellos podría dejar de funcionar.
  • Eferencia: indica el número entidades de las que depende esta entidad. Por ejemplo, a nivel de tipo o clase, nos indicaría el número de clases de las que depende la clase bajo observación. En general, nos interesa mantener este número bajo. Idealmente, un tipo solo debería depender de los tipos inmediatamente inferiores a el en la jerarquía.

CQL

Las consultas predeterminadas que NDepend realiza sobre nuestro proyecto durante su análisis principal se agrupan en las categorías que muestra la siguiente figura.

Esta consultas nos proporcionan una evaluación de nuestro código en base a diferentes parámetros de calidad y son totalmente personalizables.

Dentro de cada uno de los grupos podemos ver cada una de las consultas y las partes del software que no han superado la prueba. Al seleccionar una de las consultas, además, dichas partes se resaltaran tanto en el gráfico como en el visor de resultados.

Dependencias

Un alto nivel de dependencias generalmente significará mayores problemas a la hora de realizar cambios o ampliar la funcionalidad de una aplicación. A través de la matriz de dependencias, podemos observar de forma gráfica e interactiva las dependencias entre los componentes del proyecto, lo cual nos facilita mantener dichas dependencias dentro de un nivel razonable. Por ejemplo, el que la segunda línea de la figura siguiente esté completa indica que todos los tipos de la aplicación dependen de tipos definidos en el ensamblado ‘mscorlib’, lo cual es de esperar ya que es el ensamblado principal del FrameWork.

La herramienta nos proporciona también diagramas en los que el grosor de las líneas entre nodos indica el grado de dependencia con respecto a un ensamblado concreto.

Comparaciones y otras características

Otra característica de NDepend es la comparación entre las diferentes versiones de un conjunto de ensamblados con lo que podemos ver su evolución y observar, por ejemplo, la efectividad de una etapa de refactorización del código.

Podemos ver un ejemplo de este escenario, así como de otros escenarios interesantes en el sitio web de NDepend bajo ‘Online Demos’.

Kit3D

Aunque hasta la siguiente versión de Silverlight no se dispondrá de aceleración hardware y soporte 3D, existen alternativas en desarrollo que implementan un motor de representación tridimensional vía software.

Una de ellas es Kit3D, un proyecto OpenSource que se encuentra en sus primeros estadios de desarrollo y cuya API es similar a la que presenta WPF para la representación tridimensional.

La siguiente demo ha sido construida en base a Kit3D. Se puede observar que debido a que la representación no es acelerada por hardware, el programa consume bastante CPU cuando se activa.

Install Microsoft Silverlight

Aquí se puede utilizar una demo basada en Kit3D que muestra escenas más complejas y permite controlar la cámara y la iluminación.

El autor de la libreria también tiene unas cuantas demos de sus posibilidades aquí.