From d0fde286953349e5054f3bfeb28f578affe6b666 Mon Sep 17 00:00:00 2001 From: Christopher Granade Date: Tue, 23 Jun 2020 20:59:17 -0700 Subject: [PATCH 1/4] Register new display encoders when loading packages. --- src/Core/Core.csproj | 6 ++-- src/Kernel/IQSharpEngine.cs | 68 ++++++++++++++++++++++++++++++++++++- src/Tool/appsettings.json | 24 ++++++------- 3 files changed, 82 insertions(+), 16 deletions(-) diff --git a/src/Core/Core.csproj b/src/Core/Core.csproj index 036b02f2ca..90adde7b52 100644 --- a/src/Core/Core.csproj +++ b/src/Core/Core.csproj @@ -34,9 +34,9 @@ - - - + + + diff --git a/src/Kernel/IQSharpEngine.cs b/src/Kernel/IQSharpEngine.cs index 759b89114b..b6a3141c85 100644 --- a/src/Kernel/IQSharpEngine.cs +++ b/src/Kernel/IQSharpEngine.cs @@ -17,6 +17,7 @@ using Microsoft.Jupyter.Core.Protocol; using Newtonsoft.Json; using System.Threading.Tasks; +using System.Collections.Immutable; namespace Microsoft.Quantum.IQSharp.Kernel { @@ -41,7 +42,8 @@ public IQSharpEngine( PerformanceMonitor performanceMonitor, IShellRouter shellRouter, IEventService eventService, - IMagicSymbolResolver magicSymbolResolver + IMagicSymbolResolver magicSymbolResolver, + IReferences references ) : base(shell, shellRouter, context, logger, services) { this.performanceMonitor = performanceMonitor; @@ -65,6 +67,8 @@ IMagicSymbolResolver magicSymbolResolver RegisterSymbolResolver(this.SymbolsResolver); RegisterSymbolResolver(this.MagicResolver); + RegisterPackageLoadedEvent(services, logger, references); + // Handle new shell messages. shellRouter.RegisterHandlers(); @@ -75,9 +79,71 @@ IMagicSymbolResolver magicSymbolResolver Process.GetCurrentProcess().Id ); + eventService?.TriggerServiceInitialized(this); } + /// + /// Registers an event handler that searches newly loaded packages + /// for extensions to this engine (in particular, for result encoders). + /// + private void RegisterPackageLoadedEvent(IServiceProvider services, ILogger logger, IReferences references) + { + var knownAssemblies = references + .Assemblies + .Select(asm => asm.Assembly.GetName()) + .ToImmutableHashSet() + // Except assemblies known at compile-time as well. + .Add(typeof(StateVectorToHtmlResultEncoder).Assembly.GetName()); + foreach (var knownAssembly in knownAssemblies) System.Console.WriteLine($"{knownAssembly.FullName}"); + + // Register new display encoders when packages load. + references.PackageLoaded += (sender, args) => + { + logger.LogDebug("Scanning for display encoders after loading {Package}.", args.PackageId); + foreach (var assembly in references.Assemblies.Select(asm => asm.Assembly)) + { + if (!knownAssemblies.Contains(assembly.GetName())) + { + // Look for display encoders in the new assembly. + logger.LogDebug("Found new assembly {Name}, looking for display encoders.", assembly.FullName); + var relevantTypes = assembly + .GetTypes() + .Where(type => + !type.IsAbstract && + !type.IsInterface && + typeof(IResultEncoder).IsAssignableFrom(type) + ); + + foreach (var type in relevantTypes) + { + logger.LogDebug( + "Found display encoder {TypeName} in {AssemblyName}; registering.", + type.FullName, + assembly.FullName + ); + + // Try and instantiate the new result encoder, but if it fails, that is likely + // a non-critical failure that should result in a warning. + try + { + RegisterDisplayEncoder(ActivatorUtilities.CreateInstance(services, type) as IResultEncoder); + } + catch (Exception ex) + { + logger.LogWarning( + ex, + "Encountered exception loading result encoder {TypeName} from {AssemblyName}.", + type.FullName, assembly.FullName + ); + } + } + knownAssemblies = knownAssemblies.Add(assembly.GetName()); + } + } + }; + } + internal ISnippets Snippets { get; } internal ISymbolResolver SymbolsResolver { get; } diff --git a/src/Tool/appsettings.json b/src/Tool/appsettings.json index 7eeb65f8a6..e22856859f 100644 --- a/src/Tool/appsettings.json +++ b/src/Tool/appsettings.json @@ -6,21 +6,21 @@ }, "AllowedHosts": "*", "DefaultPackageVersions": [ - "Microsoft.Quantum.Compiler::0.11.2006.403", + "Microsoft.Quantum.Compiler::0.12.20062320-beta", - "Microsoft.Quantum.CsharpGeneration::0.11.2006.403", - "Microsoft.Quantum.Development.Kit::0.11.2006.403", - "Microsoft.Quantum.Simulators::0.11.2006.403", - "Microsoft.Quantum.Xunit::0.11.2006.403", + "Microsoft.Quantum.CsharpGeneration::0.12.20062320-beta", + "Microsoft.Quantum.Development.Kit::0.12.20062320-beta", + "Microsoft.Quantum.Simulators::0.12.20062320-beta", + "Microsoft.Quantum.Xunit::0.12.20062320-beta", - "Microsoft.Quantum.Standard::0.11.2006.403", - "Microsoft.Quantum.Chemistry::0.11.2006.403", - "Microsoft.Quantum.Chemistry.Jupyter::0.11.2006.403", - "Microsoft.Quantum.MachineLearning::0.11.2006.403", - "Microsoft.Quantum.Numerics::0.11.2006.403", + "Microsoft.Quantum.Standard::0.12.20062320-beta", + "Microsoft.Quantum.Chemistry::0.12.20062320-beta", + "Microsoft.Quantum.Chemistry.Jupyter::0.12.20062320-beta", + "Microsoft.Quantum.MachineLearning::0.12.20062320-beta", + "Microsoft.Quantum.Numerics::0.12.20062320-beta", - "Microsoft.Quantum.Katas::0.11.2006.403", + "Microsoft.Quantum.Katas::0.12.20062320-beta", - "Microsoft.Quantum.Research::0.11.2006.403" + "Microsoft.Quantum.Research::0.12.20062320-beta" ] } From 09d21a6de55a87c7e3b8eecfa2383d549b9bdf80 Mon Sep 17 00:00:00 2001 From: Christopher Granade Date: Tue, 23 Jun 2020 22:33:21 -0700 Subject: [PATCH 2/4] Addressing feedback. --- build/ci.yml | 2 +- src/Kernel/IQSharpEngine.cs | 66 ++++++++++++++++++------------------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/build/ci.yml b/build/ci.yml index 54fb79c335..b22a3f0af4 100644 --- a/build/ci.yml +++ b/build/ci.yml @@ -4,7 +4,7 @@ trigger: variables: Build.Major: 0 - Build.Minor: 11 + Build.Minor: 12 Drops.Dir: $(Build.ArtifactStagingDirectory)/drops IQSharp.Hosting.Env: 'build-agent-iqsharp' diff --git a/src/Kernel/IQSharpEngine.cs b/src/Kernel/IQSharpEngine.cs index b6a3141c85..bdf8c13292 100644 --- a/src/Kernel/IQSharpEngine.cs +++ b/src/Kernel/IQSharpEngine.cs @@ -101,45 +101,45 @@ private void RegisterPackageLoadedEvent(IServiceProvider services, ILogger logge references.PackageLoaded += (sender, args) => { logger.LogDebug("Scanning for display encoders after loading {Package}.", args.PackageId); - foreach (var assembly in references.Assemblies.Select(asm => asm.Assembly)) + foreach (var assembly in references.Assemblies + .Select(asm => asm.Assembly) + .Where(asm => !knownAssemblies.Contains(asm.GetName())) + ) { - if (!knownAssemblies.Contains(assembly.GetName())) + // Look for display encoders in the new assembly. + logger.LogDebug("Found new assembly {Name}, looking for display encoders.", assembly.FullName); + var relevantTypes = assembly + .GetTypes() + .Where(type => + !type.IsAbstract && + !type.IsInterface && + typeof(IResultEncoder).IsAssignableFrom(type) + ); + + foreach (var type in relevantTypes) { - // Look for display encoders in the new assembly. - logger.LogDebug("Found new assembly {Name}, looking for display encoders.", assembly.FullName); - var relevantTypes = assembly - .GetTypes() - .Where(type => - !type.IsAbstract && - !type.IsInterface && - typeof(IResultEncoder).IsAssignableFrom(type) - ); - - foreach (var type in relevantTypes) + logger.LogDebug( + "Found display encoder {TypeName} in {AssemblyName}; registering.", + type.FullName, + assembly.FullName + ); + + // Try and instantiate the new result encoder, but if it fails, that is likely + // a non-critical failure that should result in a warning. + try { - logger.LogDebug( - "Found display encoder {TypeName} in {AssemblyName}; registering.", - type.FullName, - assembly.FullName + RegisterDisplayEncoder(ActivatorUtilities.CreateInstance(services, type) as IResultEncoder); + } + catch (Exception ex) + { + logger.LogWarning( + ex, + "Encountered exception loading result encoder {TypeName} from {AssemblyName}.", + type.FullName, assembly.FullName ); - - // Try and instantiate the new result encoder, but if it fails, that is likely - // a non-critical failure that should result in a warning. - try - { - RegisterDisplayEncoder(ActivatorUtilities.CreateInstance(services, type) as IResultEncoder); - } - catch (Exception ex) - { - logger.LogWarning( - ex, - "Encountered exception loading result encoder {TypeName} from {AssemblyName}.", - type.FullName, assembly.FullName - ); - } } - knownAssemblies = knownAssemblies.Add(assembly.GetName()); } + knownAssemblies = knownAssemblies.Add(assembly.GetName()); } }; } From f6d993e0b6061af22facbc483254f0581415fde6 Mon Sep 17 00:00:00 2001 From: Christopher Granade Date: Thu, 25 Jun 2020 09:34:45 -0700 Subject: [PATCH 3/4] Allowlist Azure Client display encoders. --- src/Kernel/IQSharpEngine.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Kernel/IQSharpEngine.cs b/src/Kernel/IQSharpEngine.cs index 67ee292527..a79b3d1894 100644 --- a/src/Kernel/IQSharpEngine.cs +++ b/src/Kernel/IQSharpEngine.cs @@ -18,6 +18,7 @@ using Newtonsoft.Json; using System.Threading.Tasks; using System.Collections.Immutable; +using Microsoft.Quantum.IQSharp.AzureClient; namespace Microsoft.Quantum.IQSharp.Kernel { @@ -98,7 +99,8 @@ private void RegisterPackageLoadedEvent(IServiceProvider services, ILogger logge .Select(asm => asm.Assembly.GetName()) .ToImmutableHashSet() // Except assemblies known at compile-time as well. - .Add(typeof(StateVectorToHtmlResultEncoder).Assembly.GetName()); + .Add(typeof(StateVectorToHtmlResultEncoder).Assembly.GetName()) + .Add(typeof(AzureClientErrorToHtmlEncoder).Assembly.GetName()); foreach (var knownAssembly in knownAssemblies) System.Console.WriteLine($"{knownAssembly.FullName}"); // Register new display encoders when packages load. From c689748ca506db38b2ec08574b7c0f2c6bafb813 Mon Sep 17 00:00:00 2001 From: Christopher Granade Date: Thu, 25 Jun 2020 10:12:32 -0700 Subject: [PATCH 4/4] Fix bug in compiler by updating to include fix. --- src/Core/Core.csproj | 6 +++--- src/Tool/appsettings.json | 30 +++++++++++++++--------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/Core/Core.csproj b/src/Core/Core.csproj index 4f92582d04..6bfdb7f9ac 100644 --- a/src/Core/Core.csproj +++ b/src/Core/Core.csproj @@ -34,9 +34,9 @@ - - - + + + diff --git a/src/Tool/appsettings.json b/src/Tool/appsettings.json index 2d041f240b..f6951ce8db 100644 --- a/src/Tool/appsettings.json +++ b/src/Tool/appsettings.json @@ -6,26 +6,26 @@ }, "AllowedHosts": "*", "DefaultPackageVersions": [ - "Microsoft.Quantum.Compiler::0.12.20062320-beta", + "Microsoft.Quantum.Compiler::0.12.20062505-beta", - "Microsoft.Quantum.CsharpGeneration::0.12.20062320-beta", - "Microsoft.Quantum.Development.Kit::0.12.20062320-beta", - "Microsoft.Quantum.Simulators::0.12.20062320-beta", - "Microsoft.Quantum.Xunit::0.12.20062320-beta", + "Microsoft.Quantum.CsharpGeneration::0.12.20062505-beta", + "Microsoft.Quantum.Development.Kit::0.12.20062505-beta", + "Microsoft.Quantum.Simulators::0.12.20062505-beta", + "Microsoft.Quantum.Xunit::0.12.20062505-beta", - "Microsoft.Quantum.Standard::0.12.20062320-beta", - "Microsoft.Quantum.Chemistry::0.12.20062320-beta", - "Microsoft.Quantum.Chemistry.Jupyter::0.12.20062320-beta", - "Microsoft.Quantum.MachineLearning::0.12.20062320-beta", - "Microsoft.Quantum.Numerics::0.12.20062320-beta", + "Microsoft.Quantum.Standard::0.12.20062505-beta", + "Microsoft.Quantum.Chemistry::0.12.20062505-beta", + "Microsoft.Quantum.Chemistry.Jupyter::0.12.20062505-beta", + "Microsoft.Quantum.MachineLearning::0.12.20062505-beta", + "Microsoft.Quantum.Numerics::0.12.20062505-beta", - "Microsoft.Quantum.Katas::0.12.20062320-beta", + "Microsoft.Quantum.Katas::0.12.20062505-beta", - "Microsoft.Quantum.Research::0.12.20062320-beta", + "Microsoft.Quantum.Research::0.12.20062505-beta", - "Microsoft.Quantum.Providers.IonQ::0.12.20062320-beta", - "Microsoft.Quantum.Providers.Honeywell::0.12.20062320-beta", - "Microsoft.Quantum.Providers.QCI::0.12.20062320-beta" + "Microsoft.Quantum.Providers.IonQ::0.12.20062505-beta", + "Microsoft.Quantum.Providers.Honeywell::0.12.20062505-beta", + "Microsoft.Quantum.Providers.QCI::0.12.20062505-beta" ] }