Source file measurement.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
let measure qreg target =
let ran_number = Utils.randfloat () in
let p0 = ref 0.0 in
for i = 0 to Register.dim qreg - 1 do
if i land (1 lsl target) = 0 then
p0 := !p0 +. (Complex.cmod (Register.get_amplitude qreg i)) ** 2.0
done;
if ran_number < !p0 then begin
for i = 0 to Register.dim qreg - 1 do
if i land (1 lsl target) <> 0 then
Register.set_amplitude qreg i Complex.zero
done;
let norm = sqrt !p0 in
for i = 0 to Register.dim qreg - 1 do
let amp = Register.get_amplitude qreg i in
Register.set_amplitude qreg i (Complex.cmul_scalar (1.0 /. norm) amp)
done
end else begin
for i = 0 to Register.dim qreg - 1 do
if i land (1 lsl target) = 0 then
Register.set_amplitude qreg i Complex.zero
done;
let norm = sqrt (1.0 -. !p0) in
for i = 0 to Register.dim qreg - 1 do
let amp = Register.get_amplitude qreg i in
Register.set_amplitude qreg i (Complex.cmul_scalar (1.0 /. norm) amp)
done
end