#VS2017 – Namespaces principales para usar en Q#

 

Buenas!

Cuando creamos un fichero de Q# (extension .qs) el mismo suele estar definido por un Namespace y luego definir una serie de Namespaces que serán utilizados en nuestras operaciones

Usualmente se ve asi

Clipboard02.jpg

Los 2 namespaces que por defecto se agregan desde el template son

    open Microsoft.Quantum.Primitive;

Este namespace da acceso a operaciones básicas como las Hadamard Gates, CNOT Gates, etc. que son útiles para definir circuitos en operaciones cuánticas. La implementación de estas operaciones depende de la máquina de destino. Esto es importante ya que tendremos que tener en cuenta el proceso en un simulador o en X Quantum Computer.

    open Microsoft.Quantum.Canon;

El espacio de nombres Canon contiene muchas funciones útiles para crear circuitos más grandes, combinatorios y utilidades genéricas. La implementación de las operaciones en el Canon es independiente de la máquina de destino, ya que se construyen en la parte superior de las operaciones primitivas.

Happy QCoding!

Saludos @ Toronto

El Bruno

References

My Posts

 

#VS2017 – Liberando #Qubits utilizando Reset() y ResetAll() con Microsoft Quantum Development Kit

 

Buenas!

Ayer comente como la operación MResetZ() nos permite obtener el estado de un Qubit y liberar al mismo. Pues bien, al final de cada operación los Qubits tienen que ser liberados para que el simulador funcione correctamente.

Nota: La palabra en inglés es Release, la traducción de “liberado” no me termina de gustar.

En un código como el siguiente, donde se utiliza un Qubit y no se libera correctamente, nos encontraremos con el siguiente error:

I1

Microsoft.Quantum.Simulation.Simulators.Exceptions.ReleasedQubitsAreNotInZeroState

  HResult=0x80131500

  Message=Released qubits are not in zero state.

  Source=Microsoft.Quantum.Simulation.Simulators

Microsoft Quantum Development Kit nos ofrece una serie de operaciones que nos ayudan a liberar Qubits: Reset() y ResetAll(). Como su nombre lo indica Reset() esta pensado para liberar un único Qubit y ResetAll() para liberar un array de Qubits.

Dado un solo qubit, Reset() evalua su etado y se asegura que está en el estado |0⟩ tal que pueda ser liberado con seguridad

La siguientes 2 operaciones muestran ejemplos sobre como utilizar estas operaciones.

Happy QCoding!

Saludos @ Toronto

El Bruno

References

My Posts

 

#VS2017 – Using MResetZ() to reset #Qubits in Q# and Microsoft Quantum Development Kit

Hi!

After an intense week of events, this week it’s my turn to go back to the Quantum Computing studio. In this particular case, to a detail that we have to keep in mind when we work with Q #

When a qubit is in an eigenstate of the measurement operator, i.e., either in |0> or in |1>, we need to reset the Qubit before the end of an operation. Qubits need to be in |0> when they are released, so we have to manually reset the qubit before releasing it using the Z() operation if needed.

Well, let’s take as a basis one in which we initialize a Qubit and apply an operation Hadamard operation as shown in the following code

In line 10 I store the state of the Qubit in the return variable and then on lines 11 to 14 verify that the state of the same is Zero. If not, I need to reset the Qubit to Zero before the end of the operation on line 13.

Well, this code works, and that’s amazing! However when we use the Microsoft Quantum DevKit we also have an operation that allows us to obtain the status of a Qubit and release it in a single operation. This operation is MResetZ(). The same previous code using this operation it is much more nice to read

As we can see, the main change is in line 10 where I assign the state of the Qubit to the return variable and also reset the Qubit to Zero.

Finally, from a Console App I invoke both operations and the result is equal.

I1

GitHub Source Code link

Happy QCoding!

Greetings @ Toronto

El Bruno

References

My Posts

 

#VS2017 – Utilizando MResetZ() para liberar #Qubits en Q# con Microsoft Quantum Development Kit

Hola!

Despues de una semana intensa de eventos, esta semana me toca volver al estudio de Quantum Computing. En este caso en particular, a un detalle que tenemos que tener en cuenta cuando trabajamos con Q#

Cuando modificamos los estados de un Qubit, en mismo puede quedar en |0> o en |1>, Los Qubits necesidad de estar en estado 0> para ser liberados al final de cada operación. Es por ello que hay que restablecer este estado en cada Qubit antes de liberarlo.

Pues bien, tomemos como base una en la que inicializamos un Qubit y aplicamos una operación Hadamard operación como muestra el siguiente código

En la línea 10 almaceno el estado del Qubit en la variable de retorno y luego en las líneas 11 a 14 verifico que el estado del mismo sea Zero. En caso contrario, reseteo el estado Qubit a Zero antes del final de la operación en la línea 13.

Pues bien, este código funciona. Sin embargo, dentro del DevKit tenemos también una operación que nos permite obtener el estado de un Qubit y liberar el mismo en una única operación. Esta operación es MResetZ(). El mismo código anterior utilizando esta operación, se simplifica bastante

Como podemos ver, el principal cambio está en la línea 10 donde asigno el estado del Qubit a la variable de retorno y además reseteo el Qubit a Zero.

Finalmente, desde una ConsoleApp invoco a ambas operaciones y el resultado es igual.

I1

GitHub Source Code link

Happy QCoding!

Saludos @ Toronto

El Bruno

References

My Posts

 

#QuantumDevKit – Tipos de operaciones posibles a realizar con #Qubit en Q#

Clipboard02

Buenas!

Sigo en el Microsoft Tech Summit, asi que es momento de soltar otra píldora sobre algo interesantes aprendido de Microsoft Quantum Development Kit. En el post de hoy, hablare sobre las posibles operaciones que podemos realizar sobre un Qubit.

Pues bien, el post es corto:

La única operación permitida que podemos realizar con Qubits es la comparación (equality).

Esa es la única operación que podemos realizar sobre un Qubit con Q#. En realidad, esto no es tan así, podemos pasar Qubits como parámetros entre operaciones (siempre punteros fijos al mismo objeto), y si queremos modificar el estado de los mismos tenemos que utilizar operaciones propias de Q#.

Por ejemplo si queremos medir el estado de un Qubit, podemos utilizar la operación M()

let measure = M(qubit[0]);

Si, queremos cambiar el valor de zero a uno o viceversa en un Qubit, podemos utilizar la operación X()

X(qubit[0]);

Si, en cambio, queremos aplicar una transformación Hadamard a un Qubit, la operación es H() y la sintaxis seria

H(qubit[0]);

Casi todas las operaciones se pueden encontrar en [Microsoft.Quantum.Primitive]. Personalmente aconsejo leer y comprender un poco sobre cómo funcionan los conceptos de mecánica cuántica antes de comenzar a trabajar con este tipo de compuertas (Pauli Gates)

Happy QCoding!

Saludos @ Microsoft Tech Summit

El Bruno

References

Images

#Quantum – Capacidades e información de los emuladores en Microsoft Quantum Development Kit (tienes 16TB de RAM?)

36626328074_f9372acb8f_b

Buenas!

Hoy es día de Microsoft Tech Summit en Toronto, así que aprovechare para dejar un par de datos sobre los emuladores de Microsoft Quantum Development Kit.

Cuando creamos un proyecto de Q#, podemos ver que en el mismo tenemos un archivo en el Q # y el otro en un lenguaje de programación estándar, por ejemplo, C#. El enfoque que ha tomado Microsoft en este caso está basado en un esquema de coprocesador. Es muy parecido a cómo se programa una GPU o FPGA. Una vez programadas, podemos llamar ese código desde entornos externos, como una CPU.

Como todavía no tenemos acceso a Quantum Computers físicos, Microsoft Quantum Development Kit nos permite utilizar emuladores para trabajar con Q#. Hay dos clases en [Microsoft.Quantum.Simulation.Simulators] que nos permiten ejecutar emuladores, donde podemos trabajar con un numero finito de Qubits. La principal restricción que tenemos sobre la cantidad de Qubits esta dada por las características de Hardware del equipo de desarrollo.

Clipboard02

Así para simular 30 Qubits, necesitamos 16 GB de RAM. Sin embargo, si queremos agregar un nuevo Qubit, es decir trabajar con 31 Qubits tenemos que duplicar la RAM: 32 GB de RAM. Si hablamos de 40 Qubits, tenemos que pensar en 16TB de RAM. Es por esto que, una de las opciones del simulador es utilizar la capacidad de Azure para las simulaciones que requieran 40 Qubits o más.

Por último, tengo que comentar que, Q# nos permite tener un nivel abstracción alto para trabajar con modelos de Quantum Computing. Y, si bien, en este momento utilizamos emuladores para la ejecución de los algoritmos que creamos en Q#, en un futuro cercano podremos ejecutar estos algoritmos directamente en una Quantum Computer.

Happy QCoding!

Saludos @ Microsoft Tech Summit

El Bruno

References

Images

#Hololens – HoloToolkit Sharing: compartir Hologramas entre diferentes devices (Post 1 de N o lo que me cueste hacerlo funcionar …)

Hola !

Ahora que he encontrado un 2do set de Hololens para trabajar aquí en Toronto, llega el momento de volver a Unity3D y a HoloToolkit. Dentro del mismo, es momento de probar una de las features menos documentadas que hay: Sharing Holograms.

Una vez que hemos importado (de la forma correcta) el paquete de HoloToolkit Unity, podemos ver dentro de los Assets la carpeta Sharing.

Clipboard03.jpg

Este es el elemento que debemos agregar a nuestro proyecto de Unity para que el mismo tenga capacidades de “Sharing” con otras apps en Hololens. En las propiedades de este elemento vemos que el mismo utiliza un par de clases interesantes:

  • SharingStage.cs
  • SharingSessionTracker.cs
  • AutoJoinSession.cs
  • CustomMessages.cs

clipboard05

Como siempre, al faltar documentación relevante, os recomiendo ver el código de las mismas ya que es la forma más simple de comprender cómo funciona esta funcionalidad. Por ahora solo remarcar las propiedades de [Sharing Stage]

  • Client Role: define el tipo de cliente para una app de Sharing. Segun la documentación de la clase C#:

/// Set whether this app should be a Primary or Secondary client.
/// Primary: Connects directly to the Session Server, can create/join/leave sessions
/// Secondary: Connects to a Primary client. Cannot do any session management

  • Server Address y Server Port: La dirección IP y puerto del servidor que se utiliza para coordinar el sharing de información entre varios devices
  • Auto Discover Server: Solo con habilitar este check, nuestra app debería poder descubrir automáticamente un Sharing Server en la misma subnet. En mi caso, y tal vez por las restricciones de mi red local, no he podido descubrirlo automáticamente, por lo que he tenido que configurar a mano la dirección IP y el puerto.

Después de leer todo esto, llega el momento de preguntarse donde está Sharing Service. El server es un exe escondido en las entrañas del paquete de HoloToolkit.

$\HoloToolkit-Unity-master\External\HoloToolkit\Sharing\Server\SharingService.exe

Ahora ya podemos lanzar el executable y tener nuestro Sharing Service Up and Running.

Nota: Hay una opción para lanzar Sharing Service desde el menú de Unity. No he conseguido que funcione.

clipboard07

Ahora bien, más novedades, existen 2 formas de lanzar el Sharing Service

  • local, funcionando en modo app
  • servicio, funcionando como un servicio de Windows

clipboard09

Para este ejemplo lanzaré la app en modo local. En este momento podemos ver lo siguiente en la consola de comando

Clipboard11.jpg

C:\Hololens\Sharing\Server>SharingService.exe -local
Running Sharing Service locally. Enter ‘q’ to quit.
SharingService: ** Logging Session Began at 23:24:59, 10-6-2016
SharingService: ***********************************
SharingService: ****** Sharing Service OnStart ******
SharingService: ***********************************
SharingService: Server Info:
Build Version: 1.1.0.0
Schema Version: 15
SharingService: Listening for session list connections on port 20602 of all network devices of the local machine.
SharingService: Local IP addresses are:
SharingService: 172.16.80.1
SharingService: 192.168.0.19
SharingService: 169.254.80.80
SharingService: Created Session “Default” with ID 0 on port 20601

Cuando lanzamos una app creada que utilize el Asset de Sharing, con los valores correctamente configurados, podremos ver que el server detecta una nueva sesión y comienza a mostrar logs sobre la misma.

clipboard14

Pues bien, en el siguiente post sobre Sharing espero poder mostrar como 2 apps comparten y trabajan sobre un mismo holograma!

Saludos @ Toronto

El Bruno

References

#ALM – #TFS 15 RC2 ya está disponible, tu TFS puede competir con VS Team Services (o casi!)

Hola !

Durante el curso de ALM con los amigos de LemonCode, una de las preguntas que estaba esperando era la relacionada a las diferencias entre las capacidades y funcionalidades que tienen Team Foundation Server y Visual Studio Team Services.

Si bien, inicialmente las funcionalidades básicas son las mismas, VS Team Services recibe actualizaciones cada un par de semanas. Por lo general, luego hay que esperar un par de días / semanas hasta tener las mismas disponibles para TFS.

Por ejemplo, ahora que se ha liberado la RC2 de TFS15, en la misma podemos encontrar algunas funcionalidades que ya tenemos disponibles desde hace tiempo en VS Team Services.

A modo de ejemplo, dejo el listado de esta Release Candidate 2:

  • Seguir un WorkItem, ahora es fácil seguir el progreso en los WorkItems que nos interesan.
  • Búsqueda de Código fuente, ahora es más fácil encontrar código en cualquier lugar.
  • Mejor en la experiencia web para Git, incluyendo mejoras en las vistas de las branches y la gestión de Pull Requests, por ejemplo con la capacidad de autocompletar
  • Soporte para Docker, en Build y Release Management.
  • Release Management, en este aspecto hay muchas mejoras importantes.
  • Paridad entre MTM y TCM (web) , la paridad entre ambos productos está casi completa. Casi todas las funcionalidades de MTM están implementadas en TCM.
  • Soporte para extensiones de pago, ahora se puede comprar e instalar extensiones en TFS

Saludos @ Toronto

El Bruno

References

#Event – Creando #Hololens App por un developer 2D (#MeetUp #HangOut)

05

Hola !

Después de un tiempo aprendiendo un poco sobre las Hololens, ya es momento de comenzar a compartir lo aprendido en eventos de la comunidad. Aquí en Canadá ya tengo unos en vista, pero el 1ro será en un MeetUp en México. Mi participación será en formato HangOut así que todos se podrán conectar.

Tengo que agradecer al equipo de MeetUp de C# en México City, que me ha invitado. Y en especial a Satur (@SaturPimentel), que me ha animado a hacerlo.

Tengo que terminar de trabajar en algunos aspectos logísticos sobre cómo haré la presentación. Seguro que es, por lo menos interesante 😀

Saludos @ Toronto

El Bruno

References

 

#Net -.NET Standard, una única Library para gobernarlos a todos !

Hola !

Hace unos días, escuchaba un podcast de .NET Rocks donde el invitado comentaba los diferentes flavors que tenemos hoy de .NET.

Por ejemplo, cuando pensamos en .NET, siempre pensamos en .NET Framework, pero es fácil llegar a cinco o más implementaciones diferentes de .NET. Xamarin, Mono, Silverlight, .NET Core, .NET Compact Framework y muchas otras, son diferentes versiones de lo que inicialmente se pensó en una única plataforma. En el post donde se anuncia .NET Standard lo presentan así:

dotnet-today.png

Es por este motivo que nace .NET Standard como un unico set de APIS que deben ser implementadas en todas las plataformas. Dicho de otra manera, es una clase base con las funcionalidades básicas que podemos necesitar cuando creemos una aplicacion. Sin tener en cuenta si la misma es para cloud, desktop, mobile, etc.

dotnet-tomorrow.png

Creo que esto da una buena idea de lo que podemos esperar de .NET Standard en el futuro. Aunque los puntos que se comentan en el post son también interesantes:

  • Estándar de .NET es un conjunto de APIs que todas las plataformas .NET tienen que implementar. Esto unifica las plataformas .NET y previene la fragmentación futura.
  • .NET 2.0 estándar se implementarán por .NET Framework, .NET base y Xamarin. Para la base. net, esto añadirá muchas de las API existentes que han sido solicitadas.
  • Estándar de .NET 2.0 incluye una cuña de compatibilidad de binarios de .NET Framework, aumentando significativamente el conjunto de bibliotecas que se pueden hacer referencia de las bibliotecas .NET estándar.
  • Estándar de .NET reemplazará a bibliotecas de clases portables (PCLs) como la historia de herramientas para la construcción de las bibliotecas de .NET multiplataformas.
  • Puedes ver la definición de la API estándar de .NET en el repositorio estándar de dotnet en GitHub.

Saludos @ Toronto

El Bruno

References