FSharp.Azure.Quantum 1.2.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package FSharp.Azure.Quantum --version 1.2.0
                    
NuGet\Install-Package FSharp.Azure.Quantum -Version 1.2.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="FSharp.Azure.Quantum" Version="1.2.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="FSharp.Azure.Quantum" Version="1.2.0" />
                    
Directory.Packages.props
<PackageReference Include="FSharp.Azure.Quantum" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add FSharp.Azure.Quantum --version 1.2.0
                    
#r "nuget: FSharp.Azure.Quantum, 1.2.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package FSharp.Azure.Quantum@1.2.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=FSharp.Azure.Quantum&version=1.2.0
                    
Install as a Cake Addin
#tool nuget:?package=FSharp.Azure.Quantum&version=1.2.0
                    
Install as a Cake Tool

FSharp.Azure.Quantum

Quantum-First F# Library - Solve combinatorial optimization problems using quantum algorithms (QAOA) with automatic cloud/local backend selection.

NuGet License

✨ Status: Production Ready (v2.0.0)

Architecture: 100% Quantum-Only - Classical algorithms removed per design philosophy

Current Features (v2.0.0):

  • 6 Quantum Optimization Builders: Graph Coloring, MaxCut, Knapsack, TSP, Portfolio, Network Flow
  • QAOA Implementation: Quantum Approximate Optimization Algorithm with parameter optimization
  • F# Computation Expressions: Idiomatic, type-safe problem specification
  • C# Interop: Fluent API extensions for C# developers
  • Multiple Backends: LocalBackend (simulation), Azure Quantum (IonQ, Rigetti)
  • Automatic Backend Selection: Local simulation or cloud quantum hardware
  • Circuit Building: Low-level quantum circuit construction and optimization

📖 Table of Contents

  1. Quick Start - Start here! Get running in 5 minutes
  2. Problem Builders - High-level APIs for 6 optimization problems
  3. Architecture - How the library is organized
  4. C# Interop - Using from C#
  5. Backend Selection - Local vs Cloud quantum execution

🚀 Quick Start

Installation

dotnet add package FSharp.Azure.Quantum

Example: Graph Coloring (Register Allocation)

open FSharp.Azure.Quantum

// Define register allocation problem using computation expression
let problem = graphColoring {
    node "R1" conflictsWith ["R2"; "R3"]
    node "R2" conflictsWith ["R1"; "R4"]
    node "R3" conflictsWith ["R1"; "R4"]
    node "R4" conflictsWith ["R2"; "R3"]
    colors ["EAX"; "EBX"; "ECX"; "EDX"]
}

// Solve using quantum optimization (automatic local simulation)
match GraphColoring.solve problem 4 None with
| Ok solution ->
    solution.Assignments 
    |> Map.iter (fun node color -> 
        printfn "%s → %s" node color)
    printfn "Colors used: %d" solution.ColorsUsed
| Error msg -> 
    printfn "Error: %s" msg

What happens:

  1. Computation expression builds graph coloring problem
  2. GraphColoring.solve calls QuantumGraphColoringSolver internally
  3. QAOA quantum algorithm encodes problem as QUBO
  4. LocalBackend simulates quantum circuit (≤10 qubits)
  5. Returns color assignments with validation

🎯 Problem Builders

1. Graph Coloring

Use Case: Register allocation, frequency assignment, exam scheduling

open FSharp.Azure.Quantum

let problem = graphColoring {
    node "Task1" conflictsWith ["Task2"; "Task3"]
    node "Task2" conflictsWith ["Task1"; "Task4"]
    node "Task3" conflictsWith ["Task1"; "Task4"]
    node "Task4" conflictsWith ["Task2"; "Task3"]
    colors ["Slot A"; "Slot B"; "Slot C"]
    objective MinimizeColors
}

match GraphColoring.solve problem 3 None with
| Ok solution ->
    printfn "Valid coloring: %b" solution.IsValid
    printfn "Colors used: %d/%d" solution.ColorsUsed 3
    printfn "Conflicts: %d" solution.ConflictCount
| Error msg -> printfn "Error: %s" msg

2. MaxCut

Use Case: Circuit design, community detection, load balancing

let vertices = ["A"; "B"; "C"; "D"]
let edges = [
    ("A", "B", 1.0)
    ("B", "C", 2.0)
    ("C", "D", 1.0)
    ("D", "A", 1.0)
]

let problem = MaxCut.createProblem vertices edges

match MaxCut.solve problem None with
| Ok solution ->
    printfn "Partition S: %A" solution.PartitionS
    printfn "Partition T: %A" solution.PartitionT
    printfn "Cut value: %.2f" solution.CutValue
| Error msg -> printfn "Error: %s" msg

3. Knapsack (0/1)

Use Case: Resource allocation, portfolio selection, cargo loading

let items = [
    ("laptop", 3.0, 1000.0)   // (id, weight, value)
    ("phone", 0.5, 500.0)
    ("tablet", 1.5, 700.0)
    ("monitor", 2.0, 600.0)
]

let problem = Knapsack.createProblem items 5.0  // capacity = 5.0

match Knapsack.solve problem None with
| Ok solution ->
    printfn "Total value: $%.2f" solution.TotalValue
    printfn "Total weight: %.2f/%.2f" solution.TotalWeight problem.Capacity
    printfn "Items: %A" (solution.SelectedItems |> List.map (fun i -> i.Id))
| Error msg -> printfn "Error: %s" msg

4. Traveling Salesperson Problem (TSP)

Use Case: Route optimization, delivery planning, logistics

let cities = [
    ("Seattle", 0.0, 0.0)
    ("Portland", 1.0, 0.5)
    ("San Francisco", 2.0, 1.5)
    ("Los Angeles", 3.0, 3.0)
]

let problem = TSP.createProblem cities

match TSP.solve problem None with
| Ok tour ->
    printfn "Optimal route: %s" (String.concat " → " tour.Cities)
    printfn "Total distance: %.2f" tour.TotalDistance
| Error msg -> printfn "Error: %s" msg

5. Portfolio Optimization

Use Case: Investment allocation, asset selection, risk management

let assets = [
    ("AAPL", 0.12, 0.15, 150.0)  // (symbol, return, risk, price)
    ("GOOGL", 0.10, 0.12, 2800.0)
    ("MSFT", 0.11, 0.14, 350.0)
]

let problem = Portfolio.createProblem assets 10000.0  // budget

match Portfolio.solve problem None with
| Ok allocation ->
    printfn "Portfolio value: $%.2f" allocation.TotalValue
    printfn "Expected return: %.2f%%" (allocation.ExpectedReturn * 100.0)
    printfn "Risk: %.2f" allocation.Risk
    
    allocation.Allocations 
    |> List.iter (fun (symbol, shares, value) ->
        printfn "  %s: %.2f shares ($%.2f)" symbol shares value)
| Error msg -> printfn "Error: %s" msg

6. Network Flow

Use Case: Supply chain optimization, logistics, distribution planning

let nodes = [
    NetworkFlow.SourceNode("Factory", 100)
    NetworkFlow.IntermediateNode("Warehouse", 80)
    NetworkFlow.SinkNode("Store1", 40)
    NetworkFlow.SinkNode("Store2", 60)
]

let routes = [
    NetworkFlow.Route("Factory", "Warehouse", 5.0)
    NetworkFlow.Route("Warehouse", "Store1", 3.0)
    NetworkFlow.Route("Warehouse", "Store2", 4.0)
]

let problem = { NetworkFlow.Nodes = nodes; Routes = routes }

match NetworkFlow.solve problem None with
| Ok flow ->
    printfn "Total cost: $%.2f" flow.TotalCost
    printfn "Fill rate: %.1f%%" (flow.FillRate * 100.0)
| Error msg -> printfn "Error: %s" msg

🏗️ Architecture

3-Layer Quantum-Only Architecture

graph TB
    subgraph "Layer 1: High-Level Builders"
        GC["GraphColoring Builder<br/>graphColoring { }"]
        MC["MaxCut Builder<br/>MaxCut.createProblem"]
        KS["Knapsack Builder<br/>Knapsack.createProblem"]
        TS["TSP Builder<br/>TSP.createProblem"]
        PO["Portfolio Builder<br/>Portfolio.createProblem"]
        NF["NetworkFlow Builder<br/>NetworkFlow module"]
    end
    
    subgraph "Layer 2: Quantum Solvers"
        QGC["QuantumGraphColoringSolver<br/>(QAOA)"]
        QMC["QuantumMaxCutSolver<br/>(QAOA)"]
        QKS["QuantumKnapsackSolver<br/>(QAOA)"]
        QTS["QuantumTspSolver<br/>(QAOA)"]
        QPO["QuantumPortfolioSolver<br/>(QAOA)"]
        QNF["QuantumNetworkFlowSolver<br/>(QAOA)"]
    end
    
    subgraph "Layer 3: Quantum Backends"
        LOCAL["LocalBackend<br/>(≤10 qubits)"]
        IONQ["IonQBackend<br/>(Azure Quantum)"]
        RIGETTI["RigettiBackend<br/>(Azure Quantum)"]
    end
    
    GC --> QGC
    MC --> QMC
    KS --> QKS
    TS --> QTS
    PO --> QPO
    NF --> QNF
    
    QGC --> LOCAL
    QMC --> LOCAL
    QKS --> LOCAL
    QTS --> LOCAL
    QPO --> LOCAL
    QNF --> LOCAL
    
    QGC -.-> IONQ
    QMC -.-> IONQ
    QKS -.-> IONQ
    QTS -.-> IONQ
    QPO -.-> IONQ
    QNF -.-> IONQ
    
    QGC -.-> RIGETTI
    QMC -.-> RIGETTI
    QKS -.-> RIGETTI
    QTS -.-> RIGETTI
    QPO -.-> RIGETTI
    QNF -.-> RIGETTI
    
    style GC fill:#90EE90
    style MC fill:#90EE90
    style KS fill:#90EE90
    style TS fill:#90EE90
    style PO fill:#90EE90
    style NF fill:#90EE90
    style QGC fill:#FFA500
    style QMC fill:#FFA500
    style QKS fill:#FFA500
    style QTS fill:#FFA500
    style QPO fill:#FFA500
    style QNF fill:#FFA500
    style LOCAL fill:#4169E1
    style IONQ fill:#4169E1
    style RIGETTI fill:#4169E1

Layer Responsibilities

Layer 1: High-Level Builders 🟢

Who uses it: End users (F# and C# developers)
Purpose: Business domain APIs with problem-specific validation

Features:

  • ✅ F# computation expressions (graphColoring { })
  • ✅ C# fluent APIs (CSharpBuilders.MaxCutProblem())
  • ✅ Type-safe problem specification
  • ✅ Domain-specific validation
  • ✅ Automatic backend creation (defaults to LocalBackend)

Example:

// F# computation expression
let problem = graphColoring {
    node "R1" conflictsWith ["R2"]
    colors ["Red"; "Blue"]
}

// Delegates to Layer 2
GraphColoring.solve problem 2 None
Layer 2: Quantum Solvers 🟠

Who uses it: High-level builders (internal delegation)
Purpose: QAOA implementations for specific problem types

Features:

  • ✅ Problem → QUBO encoding
  • ✅ QAOA circuit construction
  • ✅ Variational parameter optimization (Nelder-Mead)
  • ✅ Solution decoding and validation
  • ✅ Backend-agnostic (accepts IQuantumBackend)

Example:

// Called internally by GraphColoring.solve
QuantumGraphColoringSolver.solve 
    backend          // IQuantumBackend
    problem          // GraphColoringProblem
    quantumConfig    // QAOA parameters
Layer 3: Quantum Backends 🔵

Who uses it: Quantum solvers
Purpose: Quantum circuit execution

Backend Types:

Backend Qubits Speed Cost Use Case
LocalBackend ≤10 Fast (ms) Free Development, testing, small problems
IonQBackend 29+ (sim), 11 (QPU) Moderate (seconds) Paid Production, large problems
RigettiBackend 40+ (sim), 80 (QPU) Moderate (seconds) Paid Production, large problems

Example:

// Local simulation (default)
let backend = BackendAbstraction.createLocalBackend()

// Azure Quantum (cloud)
let backend = BackendAbstraction.createIonQBackend(
    connectionString,
    "ionq.simulator"
)

LocalBackend Internal Architecture

How LocalBackend simulates quantum circuits:

graph TB
    subgraph "LocalBackend (≤10 qubits)"
        INIT["StateVector.init<br/>|0⟩⊗n"]
        
        subgraph "Gate Operations"
            H["Hadamard (H)<br/>Superposition"]
            CNOT["CNOT<br/>Entanglement"]
            RX["RX(θ)<br/>X-axis rotation"]
            RY["RY(θ)<br/>Y-axis rotation"]
            RZ["RZ(θ)<br/>Z-axis rotation"]
        end
        
        subgraph "State Evolution"
            STATE["Complex State Vector<br/>2^n amplitudes"]
            MATRIX["Matrix Multiplication<br/>Gate × State"]
        end
        
        subgraph "Measurement"
            PROB["Compute Probabilities<br/>|amplitude|²"]
            SAMPLE["Sample Bitstrings<br/>(shots times)"]
            COUNT["Aggregate Counts<br/>{bitstring → frequency}"]
        end
        
        INIT --> H
        H --> STATE
        CNOT --> STATE
        RX --> STATE
        RY --> STATE
        RZ --> STATE
        
        STATE --> MATRIX
        MATRIX --> STATE
        
        STATE --> PROB
        PROB --> SAMPLE
        SAMPLE --> COUNT
    end
    
    subgraph "QAOA Circuit Example"
        Q0["Qubit 0: |0⟩"]
        Q1["Qubit 1: |0⟩"]
        
        H0["H"]
        H1["H"]
        
        COST["Cost Layer<br/>RZ(γ)"]
        MIX["Mixer Layer<br/>RX(β)"]
        
        MEAS["Measure<br/>→ '01'"]
        
        Q0 --> H0
        Q1 --> H1
        H0 --> COST
        H1 --> COST
        COST --> MIX
        MIX --> MEAS
    end
    
    COUNT --> MEAS
    
    style INIT fill:#90EE90
    style H fill:#FFD700
    style CNOT fill:#FFD700
    style RX fill:#FFD700
    style RY fill:#FFD700
    style RZ fill:#FFD700
    style STATE fill:#87CEEB
    style MATRIX fill:#87CEEB
    style PROB fill:#FFA07A
    style SAMPLE fill:#FFA07A
    style COUNT fill:#FFA07A
    style Q0 fill:#E6E6FA
    style Q1 fill:#E6E6FA
    style MEAS fill:#98FB98

Key Components:

  1. StateVector Module 🟢

    • Stores quantum state as complex amplitude array
    • Size: 2^n complex numbers (n = number of qubits)
    • Example: 3 qubits = 8 amplitudes
  2. Gate Module 🟡

    • Matrix representations of quantum gates
    • Applied via tensor products and matrix multiplication
    • Gates: H, CNOT, RX, RY, RZ, SWAP, CZ, etc.
  3. Measurement Module 🟠

    • Computes probabilities from amplitudes: P(x) = |amplitude(x)|²
    • Samples bitstrings according to probability distribution
    • Returns histogram: {bitstring → count}
  4. QAOA Integration 🟣

    • Cost layer: Problem-specific rotations (RZ gates)
    • Mixer layer: Standard X-rotations (RX gates)
    • Repeat for multiple QAOA layers (p-layers)

Performance:

  • 1-6 qubits: Instant (< 10ms)
  • 7-8 qubits: Fast (< 100ms)
  • 9-10 qubits: Moderate (< 1s)
  • 11+ qubits: ❌ Exceeds limit (exponential memory: 2^n)

💻 C# Interop

C# Fluent API

All problem builders have C#-friendly extensions:

using FSharp.Azure.Quantum;
using static FSharp.Azure.Quantum.CSharpBuilders;

// MaxCut
var vertices = new[] { "A", "B", "C", "D" };
var edges = new[] {
    (source: "A", target: "B", weight: 1.0),
    (source: "B", target: "C", weight: 2.0)
};
var problem = MaxCutProblem(vertices, edges);
var result = MaxCut.solve(problem, null);

// Knapsack
var items = new[] {
    (id: "laptop", weight: 3.0, value: 1000.0),
    (id: "phone", weight: 0.5, value: 500.0)
};
var problem = KnapsackProblem(items, capacity: 5.0);
var result = Knapsack.solve(problem, null);

// TSP
var cities = new[] {
    (name: "Seattle", x: 0.0, y: 0.0),
    (name: "Portland", x: 1.0, y: 0.5)
};
var problem = TspProblem(cities);
var result = TSP.solve(problem, null);

// Portfolio
var assets = new[] {
    (symbol: "AAPL", expectedReturn: 0.12, risk: 0.15, price: 150.0),
    (symbol: "MSFT", expectedReturn: 0.10, risk: 0.12, price: 300.0)
};
var problem = PortfolioProblem(assets, budget: 10000.0);
var result = Portfolio.solve(problem, null);

See: C# Usage Guide for complete examples


🔌 Backend Selection

Automatic Local Simulation (Default)

// No backend parameter = automatic LocalBackend creation
match GraphColoring.solve problem 3 None with
| Ok solution -> (* ... *)

What happens:

  1. Builder creates LocalBackend() automatically
  2. Simulates quantum circuit using state vectors
  3. ≤10 qubits supported (larger problems fail with error)

Explicit Cloud Backend

// Create Azure Quantum backend
let backend = BackendAbstraction.createIonQBackend(
    connectionString = "YOUR_CONNECTION_STRING",
    targetId = "ionq.simulator"  // or "ionq.qpu" for hardware
)

// Pass to solver
match GraphColoring.solve problem 3 (Some backend) with
| Ok solution -> 
    printfn "Backend used: %s" solution.BackendName

Backend Comparison

// Small problem: Use local simulation
let smallProblem = MaxCut.createProblem ["A"; "B"; "C"] [("A","B",1.0)]
let result1 = MaxCut.solve smallProblem None  // Fast, free

// Large problem: Use cloud backend
let largeProblem = MaxCut.createProblem 
    [for i in 1..20 -> sprintf "V%d" i]
    [for i in 1..19 -> (sprintf "V%d" i, sprintf "V%d" (i+1), 1.0)]

let backend = BackendAbstraction.createIonQBackend(conn, "ionq.simulator")
let result2 = MaxCut.solve largeProblem (Some backend)  // Scalable, paid

🧪 QAOA Algorithm Internals

How Quantum Optimization Works

QAOA (Quantum Approximate Optimization Algorithm):

  1. QUBO Encoding: Convert problem → Quadratic Unconstrained Binary Optimization

    Graph Coloring → Binary variables for node-color assignments
    MaxCut → Binary variables for partition membership
    
  2. Circuit Construction: Build parameterized quantum circuit

    |0⟩^n → H^⊗n → [Cost Layer (γ)] → [Mixer Layer (β)] → Measure
    
  3. Parameter Optimization: Find optimal (γ, β) using Nelder-Mead

    for iteration in 1..maxIterations do
        let cost = evaluateCost(gamma, beta)
        optimizer.Update(cost)
    
  4. Solution Extraction: Decode measurement results → problem solution

    Bitstring "0101" → [R1→Red, R2→Blue, R3→Red, R4→Blue]
    

QAOA Configuration

// Custom QAOA parameters
let quantumConfig : QuantumGraphColoringSolver.QuantumGraphColoringConfig = {
    OptimizationShots = 100        // Shots per optimization step
    FinalShots = 1000              // Shots for final measurement
    EnableOptimization = true      // Enable parameter optimization
    InitialParameters = (0.5, 0.5) // Starting (gamma, beta)
}

// Use custom config
let backend = BackendAbstraction.createLocalBackend()
match QuantumGraphColoringSolver.solve backend problem quantumConfig with
| Ok result -> (* ... *)

📚 Documentation


📊 Problem Size Guidelines

Problem Type Small (LocalBackend) Medium Large (Cloud Required)
Graph Coloring ≤10 nodes 10-15 nodes 15+ nodes
MaxCut ≤10 vertices 10-15 vertices 15+ vertices
Knapsack ≤10 items 10-15 items 15+ items
TSP ≤5 cities 5-8 cities 8+ cities
Portfolio ≤10 assets 10-15 assets 15+ assets
Network Flow ≤8 nodes 8-12 nodes 12+ nodes

Note: LocalBackend limited to 10 qubits. Larger problems require Azure Quantum backends.


🎯 Design Philosophy

Rule 1: Quantum-Only Library

FSharp.Azure.Quantum is a quantum-first library - NO classical algorithms.

Why?

  • ✅ Clear identity: Purpose-built for quantum optimization
  • ✅ No architectural confusion: Pure quantum algorithm library
  • ✅ Complements classical libraries: Use together with classical solvers when needed
  • ✅ Educational value: Learn quantum algorithms without classical fallbacks

What this means:

// ✅ QUANTUM: QAOA-based optimization
GraphColoring.solve problem 3 None

// ❌ NO CLASSICAL FALLBACK: If quantum fails, returns Error
// Users should use dedicated classical libraries for that use case

Clean API Layers

  1. High-Level Builders: Business domain APIs (register allocation, portfolio optimization)
  2. Quantum Solvers: QAOA implementations (algorithm experts)
  3. Quantum Backends: Circuit execution (hardware abstraction)

No leaky abstractions - Each layer has clear responsibilities.


🤝 Contributing

Contributions welcome! See CONTRIBUTING.md for guidelines.

Development principles:

  • Maintain quantum-only architecture (no classical algorithms)
  • Follow F# coding conventions
  • Provide C# interop for new builders
  • Include comprehensive tests
  • Document QAOA encodings for new problem types

📄 License

Unlicense - Public domain. Use freely for any purpose.


📞 Support


🚀 Roadmap

Current (v2.0.0):

  • ✅ 6 quantum optimization builders
  • ✅ QAOA parameter optimization
  • ✅ LocalBackend + Azure Quantum backends
  • ✅ F# + C# APIs

Future:

  • 🔄 VQE (Variational Quantum Eigensolver) for quantum chemistry
  • 🔄 QAOA warm-start strategies
  • 🔄 Constraint handling improvements
  • 🔄 Additional cloud backends (AWS Braket, IBM Quantum)

Status: Production Ready (v2.0.0) - Quantum-only architecture, 6 problem builders, full QAOA implementation

Last Updated: 2025-11-29

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on FSharp.Azure.Quantum:

Package Downloads
FSharp.Azure.Quantum.Topological

Topological quantum computing plugin for FSharp.Azure.Quantum. Provides anyon theory (Ising/Fibonacci/SU(2)_k), braiding compilation, gate-to-braid conversion, Majorana hardware simulator, noise models, and topological file format (.tqp). Seamlessly integrates with main package algorithms (Grover, QFT, QAOA) via IQuantumBackend interface. Requires FSharp.Azure.Quantum v1.3.10+.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.3.10 87 2/22/2026
1.3.9 90 2/19/2026
1.3.7 105 2/17/2026
1.3.6 101 2/13/2026
1.3.5 105 2/10/2026
1.3.4 106 1/25/2026
1.3.3 200 12/20/2025
1.3.2 187 12/13/2025
1.3.1 444 12/11/2025
1.2.9 445 12/8/2025
1.2.7 315 12/7/2025
1.2.5 208 12/4/2025
1.2.4 685 12/3/2025
1.2.3 685 12/1/2025
1.2.1 140 11/29/2025
1.2.0 140 11/29/2025
1.1.0 110 11/28/2025
1.0.0 191 11/28/2025
0.5.0-beta 205 11/25/2025
0.1.0-alpha 196 11/24/2025

v1.2.0: Quantum-First Architecture Release
- NEW: Quantum-first solver architecture with automatic quantum/classical routing
- NEW: Graph Coloring solver (quantum QAOA + classical API)
- NEW: MaxCut solver (quantum QAOA + classical API)
- NEW: Knapsack solver (quantum QAOA + classical API)
- NEW: Network Flow solver (quantum QAOA + classical API)
- Refactored TSP and Portfolio solvers to quantum-first architecture
- Improved solver organization: Classical/, Quantum/, Hybrid/ modules
- Fixed 13 test failures from architecture refactoring
- Updated examples to use new quantum-first APIs
- 896 tests passing
- Production-ready quantum-first optimization with classical fallback