Skip to content

Commit c4446f0

Browse files
authored
Merge pull request #32 from rochisha0/prep-qutip-qtrl-0.1.4
Bugfix release - 0.1.4
2 parents 9b69548 + cbe5cb6 commit c4446f0

File tree

8 files changed

+49
-35
lines changed

8 files changed

+49
-35
lines changed

.github/workflows/test.yml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ jobs:
2323
python-version: '3.10'
2424
- case-name: qutip-5.0
2525
os: ubuntu-latest
26-
qutip-version: '==5.0.1'
26+
qutip-version: '==5.0.*'
2727
python-version: '3.9'
2828

2929
steps:
@@ -36,14 +36,12 @@ jobs:
3636
- name: Install QuTiP from PyPI
3737
if: ${{ matrix.qutip-version != '' && ! startsWith( matrix.qutip-version, '@') }}
3838
run: |
39-
python -m pip install 'numpy>=1.19,<2.0'
4039
python -m pip install ${{ matrix.qutip-pre }} 'qutip${{ matrix.qutip-version }}'
4140
4241
- name: Install QuTiP from GitHub
4342
if: ${{ startsWith( matrix.qutip-version, '@') }}
4443
run: |
4544
python -m pip install scipy cython
46-
python -m pip install 'numpy>=1.19,<2.0'
4745
python -m pip install 'git+https://github.com/qutip/qutip.git${{ matrix.qutip-version }}'
4846
4947
- name: Install qutip-qtrl

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.1.3
1+
0.1.4

doc/changelog.rst

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,17 @@
22
Changelog
33
*********
44

5+
Version 0.1.4 (February 10, 2025)
6+
+++++++++++++++++++++++++++++
7+
8+
This patch implements changes necessary to support numpy v2.
9+
10+
Miscellaneous
11+
-------------
12+
13+
- Increase the sampling points in tests for pulse optimization (#27, Boxi Li).
14+
15+
516
Version 0.1.3 (June 24, 2024)
617
+++++++++++++++++++++++++++++
718

src/qutip_qtrl/dump.py

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import os
1212
import copy
1313
import numpy as np
14-
from numpy.compat import asbytes
1514

1615
# QuTiP control modules
1716
import qutip_qtrl.io as qtrlio
@@ -429,7 +428,7 @@ def writeout(self, f=None):
429428
for ois in self.iter_summary:
430429
if ois.idx == 0:
431430
fs.write(
432-
asbytes(
431+
str.encode(
433432
"{}\n{}\n".format(
434433
ois.get_header_line(self.summary_sep),
435434
ois.get_value_line(self.summary_sep),
@@ -438,7 +437,7 @@ def writeout(self, f=None):
438437
)
439438
else:
440439
fs.write(
441-
asbytes(
440+
str.encode(
442441
"{}\n".format(ois.get_value_line(self.summary_sep))
443442
)
444443
)
@@ -451,14 +450,14 @@ def writeout(self, f=None):
451450

452451
if self.dump_fid_err:
453452
if fall:
454-
fall.write(asbytes("Fidelity errors:\n"))
453+
fall.write(str.encode("Fidelity errors:\n"))
455454
np.savetxt(fall, self.fid_err_log)
456455
else:
457456
np.savetxt(self.fid_err_file, self.fid_err_log)
458457

459458
if self.dump_grad_norm:
460459
if fall:
461-
fall.write(asbytes("gradients norms:\n"))
460+
fall.write(str.encode("gradients norms:\n"))
462461
np.savetxt(fall, self.grad_norm_log)
463462
else:
464463
np.savetxt(self.grad_norm_file, self.grad_norm_log)
@@ -468,7 +467,9 @@ def writeout(self, f=None):
468467
for grad in self.grad_log:
469468
g_num += 1
470469
if fall:
471-
fall.write(asbytes("gradients (call {}):\n".format(g_num)))
470+
fall.write(
471+
str.encode("gradients (call {}):\n".format(g_num))
472+
)
472473
np.savetxt(fall, grad)
473474
else:
474475
fname = "{}-fid_err_gradients{}.{}".format(
@@ -709,7 +710,7 @@ def writeout(self, f=None):
709710
for ecs in self.evo_summary:
710711
if ecs.idx == 0:
711712
fs.write(
712-
asbytes(
713+
str.encode(
713714
"{}\n{}\n".format(
714715
ecs.get_header_line(self.summary_sep),
715716
ecs.get_value_line(self.summary_sep),
@@ -718,7 +719,7 @@ def writeout(self, f=None):
718719
)
719720
else:
720721
fs.write(
721-
asbytes(
722+
str.encode(
722723
"{}\n".format(ecs.get_value_line(self.summary_sep))
723724
)
724725
)
@@ -801,7 +802,7 @@ def writeout(self, f=None):
801802
# write all to this stream
802803
fall = f
803804
closefall = False
804-
f.write(asbytes("EVOLUTION COMPUTATION {}\n".format(self.idx)))
805+
f.write(str.encode("EVOLUTION COMPUTATION {}\n".format(self.idx)))
805806
elif f:
806807
fall = open(f, "wb")
807808
else:
@@ -813,7 +814,7 @@ def writeout(self, f=None):
813814
if self.ctrl_amps is not None:
814815
if fall:
815816
f = fall
816-
f.write(asbytes("Ctrl amps\n"))
817+
f.write(str.encode("Ctrl amps\n"))
817818
else:
818819
fname = "{}-ctrl_amps.{}".format(fnbase, dump.dump_file_ext)
819820
f = open(os.path.join(dump.dump_dir, fname), "wb")
@@ -829,14 +830,16 @@ def writeout(self, f=None):
829830
k = 0
830831
if fall:
831832
f = fall
832-
f.write(asbytes("Dynamics Generators\n"))
833+
f.write(str.encode("Dynamics Generators\n"))
833834
else:
834835
fname = "{}-dyn_gen.{}".format(fnbase, dump.dump_file_ext)
835836
f = open(os.path.join(dump.dump_dir, fname), "wb")
836837
closef = True
837838
for dg in self.dyn_gen:
838839
f.write(
839-
asbytes("dynamics generator for timeslot {}\n".format(k))
840+
str.encode(
841+
"dynamics generator for timeslot {}\n".format(k)
842+
)
840843
)
841844
np.savetxt(f, self.dyn_gen[k], delimiter=dump.data_sep)
842845
k += 1
@@ -848,13 +851,13 @@ def writeout(self, f=None):
848851
k = 0
849852
if fall:
850853
f = fall
851-
f.write(asbytes("Propagators\n"))
854+
f.write(str.encode("Propagators\n"))
852855
else:
853856
fname = "{}-prop.{}".format(fnbase, dump.dump_file_ext)
854857
f = open(os.path.join(dump.dump_dir, fname), "wb")
855858
closef = True
856859
for dg in self.dyn_gen:
857-
f.write(asbytes("Propagator for timeslot {}\n".format(k)))
860+
f.write(str.encode("Propagator for timeslot {}\n".format(k)))
858861
np.savetxt(f, self.prop[k], delimiter=dump.data_sep)
859862
k += 1
860863
if closef:
@@ -865,15 +868,15 @@ def writeout(self, f=None):
865868
k = 0
866869
if fall:
867870
f = fall
868-
f.write(asbytes("Propagator gradients\n"))
871+
f.write(str.encode("Propagator gradients\n"))
869872
else:
870873
fname = "{}-prop_grad.{}".format(fnbase, dump.dump_file_ext)
871874
f = open(os.path.join(dump.dump_dir, fname), "wb")
872875
closef = True
873876
for k in range(self.prop_grad.shape[0]):
874877
for j in range(self.prop_grad.shape[1]):
875878
f.write(
876-
asbytes(
879+
str.encode(
877880
"Propagator gradient for timeslot {} "
878881
"control {}\n".format(k, j)
879882
)
@@ -889,13 +892,13 @@ def writeout(self, f=None):
889892
k = 0
890893
if fall:
891894
f = fall
892-
f.write(asbytes("Forward evolution\n"))
895+
f.write(str.encode("Forward evolution\n"))
893896
else:
894897
fname = "{}-fwd_evo.{}".format(fnbase, dump.dump_file_ext)
895898
f = open(os.path.join(dump.dump_dir, fname), "wb")
896899
closef = True
897900
for dg in self.dyn_gen:
898-
f.write(asbytes("Evolution from 0 to {}\n".format(k)))
901+
f.write(str.encode("Evolution from 0 to {}\n".format(k)))
899902
np.savetxt(f, self.fwd_evo[k], delimiter=dump.data_sep)
900903
k += 1
901904
if closef:
@@ -906,13 +909,13 @@ def writeout(self, f=None):
906909
k = 0
907910
if fall:
908911
f = fall
909-
f.write(asbytes("Onward evolution\n"))
912+
f.write(str.encode("Onward evolution\n"))
910913
else:
911914
fname = "{}-onwd_evo.{}".format(fnbase, dump.dump_file_ext)
912915
f = open(os.path.join(dump.dump_dir, fname), "wb")
913916
closef = True
914917
for dg in self.dyn_gen:
915-
f.write(asbytes("Evolution from {} to end\n".format(k)))
918+
f.write(str.encode("Evolution from {} to end\n".format(k)))
916919
np.savetxt(f, self.fwd_evo[k], delimiter=dump.data_sep)
917920
k += 1
918921
if closef:
@@ -923,13 +926,15 @@ def writeout(self, f=None):
923926
k = 0
924927
if fall:
925928
f = fall
926-
f.write(asbytes("Onto evolution\n"))
929+
f.write(str.encode("Onto evolution\n"))
927930
else:
928931
fname = "{}-onto_evo.{}".format(fnbase, dump.dump_file_ext)
929932
f = open(os.path.join(dump.dump_dir, fname), "wb")
930933
closef = True
931934
for dg in self.dyn_gen:
932-
f.write(asbytes("Evolution from {} onto target\n".format(k)))
935+
f.write(
936+
str.encode("Evolution from {} onto target\n".format(k))
937+
)
933938
np.savetxt(f, self.fwd_evo[k], delimiter=dump.data_sep)
934939
k += 1
935940
if closef:

src/qutip_qtrl/fidcomp.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -622,7 +622,7 @@ def get_fid_err(self):
622622
)
623623

624624
if np.isnan(self.fid_err):
625-
self.fid_err = np.Inf
625+
self.fid_err = np.inf
626626

627627
if dyn.stats is not None:
628628
dyn.stats.num_fidelity_computes += 1
@@ -707,7 +707,7 @@ def compute_fid_err_grad(self):
707707
* np.real(_trace(evo_f_diff.conj().T.dot(evo_grad)))
708708
)
709709
if np.isnan(g):
710-
g = np.Inf
710+
g = np.inf
711711

712712
grad[k, j] = g
713713
if dyn.stats is not None:
@@ -786,7 +786,7 @@ def compute_fid_err_grad(self):
786786

787787
g = (fid_err_eps - curr_fid_err) / self.epsilon
788788
if np.isnan(g):
789-
g = np.Inf
789+
g = np.inf
790790

791791
grad[k, j] = g
792792

src/qutip_qtrl/optimresult.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,8 @@ def __init__(self):
8484

8585
def reset(self):
8686
self.fidelity = 0.0
87-
self.initial_fid_err = np.Inf
88-
self.fid_err = np.Inf
87+
self.initial_fid_err = np.inf
88+
self.fid_err = np.inf
8989
self.goal_achieved = False
9090
self.grad_norm_final = 0.0
9191
self.grad_norm_min_reached = False

src/qutip_qtrl/stats.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,21 +151,21 @@ def calculate(self):
151151
self.num_ctrl_amp_updates / float(self.num_iter)
152152
)
153153
except Exception:
154-
self.mean_num_ctrl_amp_updates_per_iter = np.NaN
154+
self.mean_num_ctrl_amp_updates_per_iter = np.nan
155155

156156
try:
157157
self.mean_num_timeslot_changes_per_update = (
158158
self.num_timeslot_changes / float(self.num_ctrl_amp_updates)
159159
)
160160
except Exception:
161-
self.mean_num_timeslot_changes_per_update = np.NaN
161+
self.mean_num_timeslot_changes_per_update = np.nan
162162

163163
try:
164164
self.mean_num_ctrl_amp_changes_per_update = (
165165
self.num_ctrl_amp_changes / float(self.num_ctrl_amp_updates)
166166
)
167167
except Exception:
168-
self.mean_num_ctrl_amp_changes_per_update = np.NaN
168+
self.mean_num_ctrl_amp_changes_per_update = np.nan
169169

170170
def _format_datetime(self, t, tot=0.0):
171171
dtStr = str(datetime.timedelta(seconds=t))

tests/test_control_pulseoptim.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -610,7 +610,7 @@ def _count_waves(system):
610610
],
611611
)
612612
class TestPeriodicControlFunction:
613-
num_tslots = 1_000
613+
num_tslots = 3_000
614614
evo_time = 10
615615

616616
@pytest.mark.parametrize("n_waves", [1, 5, 10, 100])

0 commit comments

Comments
 (0)