Commit 917ed0d9 authored by Nguyen, Thien Minh's avatar Nguyen, Thien Minh
Browse files

Added Python API to control PassManager

parent f9e71d41
Loading
Loading
Loading
Loading
+40 −0
Original line number Diff line number Diff line
@@ -448,6 +448,46 @@ PYBIND11_MODULE(_pyqcor, m) {
      py::arg("name"), py::arg("p") = PyHeterogeneousMap(),
      "Set the QPU backend.");

  m.def(
      "set_opt_level",
      [](int level) { xacc::internal_compiler::__opt_level = level; },
      py::arg("level"), "Set QCOR runtime optimization level.");

  m.def(
      "add_pass",
      [](const std::string &pass_name) {
        // Note: we expect __user_opt_passes to be a comma-separated list of
        // pass names.
        if (xacc::internal_compiler::__user_opt_passes.empty()) {
          xacc::internal_compiler::__user_opt_passes = pass_name;
        } else {
          xacc::internal_compiler::__user_opt_passes += ("," + pass_name);
        }
      },
      py::arg("pass_name"),
      "Add an optimization pass to be run by the PassManager.");

  m.def(
      "get_placement_names",
      []() {
        std::vector<std::string> result;
        auto ir_transforms = xacc::getServices<xacc::IRTransformation>();
        for (const auto &plugin : ir_transforms) {
          if (plugin->type() == xacc::IRTransformationType::Placement) {
            result.emplace_back(plugin->name());
          }
        }
        return result;
      },
      "Get names of all available placement plugins.");

  m.def(
      "set_placement",
      [](const std::string &placement_name) {
        xacc::internal_compiler::__placement_name = placement_name;
      },
      py::arg("placement_name"), "Set the placement strategy.");

  m.def("qalloc", &::qalloc, py::return_value_policy::reference, "");
  py::class_<xacc::internal_compiler::qreg>(m, "qreg", "")
      .def("size", &xacc::internal_compiler::qreg::size, "")
+41 −0
Original line number Diff line number Diff line
import unittest
from qcor import *

class TestKernelJIT(unittest.TestCase):
    def test_opt_level(self):
        @qjit
        def test1(q : qreg):
            H(q[0])
            X(q[0])
            H(q[0])

        q = qalloc(1)
        comp = test1.extract_composite(q)
        self.assertEqual(comp.nInstructions(), 3)   
        # Activate opt-level 1
        set_opt_level(1)
        comp_opt = test1.extract_composite(q)
        # Should become 1 gate: Z, i.e. Rz(pi)
        self.assertEqual(comp_opt.nInstructions(), 1)   
    
    def test_placement_query(self):
        placement_names = get_placement_names()
        self.assertTrue(len(placement_names) > 0)   
        print(placement_names)

    # Don't run this test since it requires remote IBM access.
    # def test_placement(self):
    #     @qjit
    #     def test2(q : qreg):
    #         CX(q[0], q[3])
        
    #     set_qpu('ibm:ibmqx2')
    #     set_placement('swap-shortest-path')
    #     q = qalloc(5)
    #     comp = test2.extract_composite(q)
    #     print(comp)
    #     # This becomes 1 SWAP + 1 CNOT => 4 CNOT's
    #     self.assertEqual(comp.nInstructions(), 4)    

if __name__ == '__main__':
  unittest.main()
 No newline at end of file