Path: blob/main/frontend/vue/components/Statevector/StatevectorBinaryEncoding.vue
4034 views
<template>
<StatevectorBaseWidget
class="statevector-binary-encoding"
:number-of-elements="4"
:amplitude-disk-data="amplitudeDiskData"
>
<template #default>
<slot />
<div class="statevector-binary-encoding__warning">
{{ areAllValuesZero ? 'Cannot analyze all false values' : ' ' }}
</div>
</template>
<template #input-elements>
<bx-checkbox
v-for="(value, index) in inputData"
:key="index"
:checked="value"
:label-text="inputLabels[index]"
@bx-checkbox-changed="inputChangedHandler($event, index)"
/>
</template>
</StatevectorBaseWidget>
</template>
<script lang="ts">
import { defineComponent } from 'vue-demi'
import { Amplitude } from '../AmplitudeDisk/amplitude'
import { randomValue } from '../../../ts/utilities'
import StatevectorBaseWidget from './StatevectorBaseWidget.vue'
import 'carbon-web-components/es/components/checkbox/checkbox.js'
const numberOfElements = 4
export default defineComponent({
name: 'StatevectorBinaryEncoding',
components: {
StatevectorBaseWidget
},
data () {
return {
inputData: [] as boolean[],
inputLabels: ['00', '01', '10', '11'],
areAllValuesZero: false,
amplitudeDiskData: [] as Amplitude[]
}
},
mounted () {
this.inputData = Array.from({ length: numberOfElements }, _ => randomValue(1, 0, 1) === 1) as boolean[]
if (this.inputData.filter(value => value).length === 0) {
this.inputData[0] = true
}
this.amplitudeDiskData = this.transformFunction(this.inputData)
},
methods: {
transformFunction (inputValues: boolean[]) : Amplitude[] {
let valuesCount = inputValues.filter(value => value).length
this.areAllValuesZero = valuesCount === 0
if (this.areAllValuesZero) {
valuesCount = inputValues.length
}
const magnitude = 1 / Math.sqrt(valuesCount)
return Array.from({ length: inputValues.length }, (_, index: number) => {
const isOn = inputValues[index] || this.areAllValuesZero
return { phase: 0, magnitude: isOn ? magnitude : 0 }
})
},
inputChangedHandler (value: any, index: number) {
this.inputData[index] = value.target.checked
this.amplitudeDiskData = this.transformFunction(this.inputData)
}
}
})
</script>
<style lang="scss" scoped>
@import 'carbon-components/scss/globals/scss/typography';
@import '~/../scss/variables/colors.scss';
.statevector-binary-encoding {
&__warning {
@include type-style('body-short-01');
color: $status-color-wrong;
margin: $spacing-03 0;
}
}
</style>