Skip to content

Commit

Permalink
Full integration with IBM Q 🥳
Browse files Browse the repository at this point in the history
  • Loading branch information
TheNewJavaman committed Dec 4, 2021
1 parent 6ed553d commit 760f70a
Show file tree
Hide file tree
Showing 31 changed files with 619 additions and 136 deletions.
18 changes: 10 additions & 8 deletions api/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,37 +4,39 @@ plugins {
id("org.jetbrains.dokka")
}

group = "net.javaman"
version = "0.1.0"

repositories {
mavenCentral()
}

val jvmTarget: String by ext
val datetimeVersion: String by ext
val coroutinesVersion: String by ext
val jupiterVersion: String by ext

kotlin {
jvm {
val main by compilations.getting {
kotlinOptions {
jvmTarget = "11"
jvmTarget = jvmTarget
}
}
val test by compilations.getting {
kotlinOptions {
jvmTarget = "11"
jvmTarget = jvmTarget
}
}
}
sourceSets {
val commonMain by getting {
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.3.1")
api("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0-RC")
implementation("org.jetbrains.kotlinx:kotlinx-datetime:$datetimeVersion")
api("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion")
}
}
val jvmMain by getting {}
val jvmTest by getting {
dependencies {
implementation("org.junit.jupiter:junit-jupiter:5.7.0")
implementation("org.junit.jupiter:junit-jupiter:$jupiterVersion")
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package net.javaman.brackt.api.quantum

import net.javaman.brackt.api.util.assertions.assert
import kotlin.math.PI

/**
* A named set of registers that hold [Qubit] and [Bit] lists
Expand Down Expand Up @@ -31,8 +30,18 @@ class QuantumCircuit constructor(
val numBits: Int = numQubits,
//private val qubits: List<Qubit> = List(numQubits) { Qubit(it) },
//private val bits: List<Bit> = List(numBits) { Bit(it) },
private val circuit: MutableList<QuantumGate> = mutableListOf()
val circuit: MutableList<QuantumGate> = mutableListOf()
) {
constructor(
name: String? = null,
numQubits: Int,
numBits: Int = numQubits,
circuit: MutableList<QuantumGate> = mutableListOf(),
block: QuantumCircuit.() -> Unit
) : this(name, numQubits, numBits, circuit) {
block()
}

fun compose(block: QuantumCircuit.() -> Unit) = block()

fun runMacro(block: () -> Pair<QuantumMacro, QubitMap>) {
Expand Down Expand Up @@ -86,20 +95,12 @@ class QuantumCircuit constructor(
}

fun p(qubit: Int, phi: Double) {
assert {
qubit < numQubits &&
-PI <= phi && phi <= PI
}
assert { qubit < numQubits }
circuit.add(QuantumGate.Phase(qubit, phi))
}

fun u(qubit: Int, theta: Double, phi: Double, lambda: Double) {
assert {
qubit < numQubits &&
-PI <= theta && theta <= PI &&
-PI <= phi && phi <= PI &&
-PI <= lambda && lambda <= PI
}
assert { qubit < numQubits }
circuit.add(QuantumGate.U(qubit, theta, phi, lambda))
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ package net.javaman.brackt.api.quantum
/**
* All necessary quantum operations are derived from this class
*
* Should consider un-sealing this interface if providers offer custom gates
* Custom providers can implement this interface and write extensions for [QuantumCircuit]
*/
sealed interface QuantumGate {
interface QuantumGate {
data class Identity(val qubit: Int) : QuantumGate
data class PauliX(val qubit: Int) : QuantumGate
data class PauliY(val qubit: Int) : QuantumGate
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package net.javaman.brackt.api.quantum

import net.javaman.brackt.api.util.assertions.assert
import kotlin.jvm.JvmStatic

/**
* Allows creating reusable pieces of [QuantumCircuit]s.
Expand All @@ -18,14 +19,35 @@ import net.javaman.brackt.api.util.assertions.assert
* }
* ```
*/
class QuantumMacro private constructor(val block: QuantumCircuit.(qubitMap: QubitMap) -> Unit) {
constructor(numQubits: Int, macro: QuantumCircuit.(qubitMap: QubitMap) -> Unit) : this({ qubitMap ->
assert { numQubits == qubitMap.size }
macro(qubitMap)
})
class QuantumMacro(val numQubits: Int, val macro: QuantumCircuit.(qubitMap: QubitMap) -> Unit) {
var safeMacro: QuantumCircuit.(qubitMap: QubitMap) -> Unit

companion object {
@JvmStatic
val swap = QuantumMacro(numQubits = 2) { qubitMap ->
cx(qubitMap[0], qubitMap[1])
cx(qubitMap[1], qubitMap[0])
cx(qubitMap[0], qubitMap[1])
}

@JvmStatic
val cz = QuantumMacro(numQubits = 2) { qubitMap ->
h(qubitMap[0])
cx(qubitMap[1], qubitMap[0])
h(qubitMap[0])
}
}

init {
val thisMacro = this
safeMacro = { qubitMap ->
assert { thisMacro.numQubits == qubitMap.size }
macro(qubitMap)
}
}

operator fun invoke(qc: QuantumCircuit, qubitMap: QubitMap) {
block(qc, qubitMap)
safeMacro(qc, qubitMap)
}

infix fun onQubits(qubitMap: QubitMap) = Pair(this, qubitMap)
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,5 @@ fun String.censor(visibleDigits: Int = 3): String {
return CharArray(min(max(length - visibleDigits, 0), visibleDigits)) { 'X' }.concatToString() +
substring(length - visibleDigits)
}


Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package net.javaman.brackt.api.util.formatters

/**
* Unescape a URL
*/
expect fun String.decodedUrl(): String
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package net.javaman.brackt.api.util.formatters


Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package net.javaman.brackt.api.util.formatters

import java.net.URLDecoder

actual fun String.decodedUrl(): String = URLDecoder.decode(this, "UTF-8")
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ actual class PropertyManager {
val allProperties = mutableMapOf<String, Any>()
allProperties.putAll(customProperties)
allProperties.putAll(System.getenv())
val value = allProperties[key] ?: throw UninitializedPropertyException("Could not find key=$key")
val value = allProperties[key] ?: throw UninitializedPropertyException("Could not find key ($key)")
return value as T
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,10 +70,10 @@ class QuantumCircuitTest {
qc.compose {
// Initialize all qubits in superposition
repeat(n) { h(it) }
cz(0, 1)
// todo cz
repeat(n) { h(it) }
repeat(n) { z(it) }
cz(0, 1)
// todo cz
repeat(n) { h(it) }
}
}
Expand Down
33 changes: 31 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,11 +1,40 @@
val detektVersion: String by project

plugins {
kotlin("multiplatform") version "1.6.0" apply false
kotlin("plugin.serialization") version "1.6.0" apply false
id("org.jetbrains.dokka") version "1.6.0"
id("io.gitlab.arturbosch.detekt") version "1.19.0-RC2" apply false
id("maven-publish")
}

repositories {
mavenCentral()
subprojects {
group = "net.javaman"
version = "0.1.0"

apply(plugin = "maven-publish")
apply(plugin = "io.gitlab.arturbosch.detekt")

ext {
set("jvmTarget", "11")
set("datetimeVersion", "0.3.1")
set("coroutinesVersion", "1.6.0-RC")
set("ktorVersion", "1.6.5")
set("jupiterVersion", "5.7.0")
}

configure<PublishingExtension> {
repositories {
maven {
name = "GitHubPackages"
url = uri("https://maven.pkg.github.com/TheNewJavaman/brac-kt")
credentials {
username = System.getenv("GITHUB_USERNAME")
password = System.getenv("GITHUB_TOKEN")
}
}
}
}
}

tasks.dokkaHtmlMultiModule.configure {
Expand Down
29 changes: 17 additions & 12 deletions ibmq-provider/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,45 +1,50 @@
plugins {
kotlin("multiplatform")
kotlin("plugin.serialization") version "1.6.0"
id("io.gitlab.arturbosch.detekt")
kotlin("plugin.serialization")
id("org.jetbrains.dokka")
}

group = "net.javaman"
version = "0.1.0"

repositories {
mavenCentral()
}

val jvmTarget: String by ext
val datetimeVersion: String by ext
val coroutinesVersion: String by ext
val ktorVersion: String by ext
val jupiterVersion: String by ext

kotlin {
jvm {
val main by compilations.getting {
kotlinOptions {
jvmTarget = "11"
jvmTarget = jvmTarget
}
}
val test by compilations.getting {
kotlinOptions {
jvmTarget = "11"
jvmTarget = jvmTarget
}
}
}
sourceSets {
val commonMain by getting {
dependencies {
api(project(":api"))
implementation("io.ktor:ktor-client-core:1.6.5")
implementation("io.ktor:ktor-client-cio:1.6.5")
implementation("io.ktor:ktor-client-serialization:1.6.5")
api("org.jetbrains.kotlinx:kotlinx-datetime:0.3.1")
implementation("io.ktor:ktor-client-core:$ktorVersion")
implementation("io.ktor:ktor-client-cio:$ktorVersion")
implementation("io.ktor:ktor-client-serialization:$ktorVersion")
api("org.jetbrains.kotlinx:kotlinx-datetime:$datetimeVersion")
}
}
val jvmTest by getting {
dependencies {
implementation("org.junit.jupiter:junit-jupiter:5.7.0")
implementation("org.junit.jupiter:junit-jupiter:$jupiterVersion")
}
}
all {
languageSettings.optIn("kotlin.RequiresOptIn")
}
}
}

Expand Down
Loading

0 comments on commit 760f70a

Please sign in to comment.