Commit a020296b authored by Thien Nguyen's avatar Thien Nguyen
Browse files

Merge branch 'master' into tnguyen/develop

parents 6f9717b9 52148127
Loading
Loading
Loading
Loading
+42 −0
Original line number Diff line number Diff line
name: "Linux CI"

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]
  schedule:
    # Daily run
    - cron:  '30 1 * * *'  

jobs:
  build:
    runs-on: ubuntu-latest
    name: "Linux CI"
    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Create Build Environment
        run: cmake -E make_directory build
      
      - name: Install dependencies
        run: sudo apt-get -y update && sudo apt-get install -y --no-install-recommends gfortran libopenmpi-dev ninja-build libssl-dev libcurl4-openssl-dev python3 libpython3-dev python3-pip libblas-dev liblapack-dev
      
      - name: Build XACC
        run: cd $HOME && git clone --recursive https://github.com/eclipse/xacc && cd xacc && mkdir build && cd build && cmake .. -GNinja && cmake --build . --target install
      
      - name: Build ExaTN
        run: cd $HOME && git clone --recursive https://github.com/ornl-qci/exatn && cd exatn && mkdir build && cd build && cmake .. -DBLAS_LIB=ATLAS -DBLAS_PATH=/usr/lib/x86_64-linux-gnu && make -j$(nproc) install

      - name: Configure
        working-directory: build/
        run: cmake $GITHUB_WORKSPACE -DXACC_DIR=$HOME/.xacc -DTNQVM_BUILD_TESTS=TRUE -DEXATN_DIR=$HOME/.exatn
    
      - name: Build
        working-directory: build/
        run: cmake --build . --target install
      
      - name: Test
        working-directory: build/
        run: ctest --output-on-failure
 No newline at end of file
+1 −1
Original line number Diff line number Diff line
| Branch | Status |
|:-------|:-------|
|master | [![pipeline status](https://code.ornl.gov/qci/tnqvm/badges/master/pipeline.svg)](https://code.ornl.gov/qci/tnqvm/commits/master) |
|master | [![Linux CI](https://github.com/ORNL-QCI/tnqvm/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/ORNL-QCI/tnqvm/actions/workflows/build.yml) |


# TNQVM Tensor Network XACC Accelerator
+346 −0
Original line number Diff line number Diff line
// Generated by f3c++
// https://github.com/QuantumComputingLab/f3cpp

// timestep 5001: hz = -1, Jx = -1 (dt = 0.05)


OPENQASM 2.0;
include "qelib1.inc";

qreg q[8];
rz(-0.449193037874753) q[0];
rz(-1.802073794132532) q[1];
rx(1.570796326794897) q[0];
rx(1.570796326794897) q[1];
cx q[0], q[1];
rx(0.365718050465142) q[0];
rz(0.025198415563410) q[1];
cx q[0], q[1];
rx(-1.570796326794897) q[0];
rx(-1.570796326794897) q[1];
rz(-2.482179400162583) q[0];
rz(-1.549739075009718) q[1];
rz(-3.510878416984094) q[2];
rz(-0.065556960190814) q[3];
rx(1.570796326794897) q[2];
rx(1.570796326794897) q[3];
cx q[2], q[3];
rx(0.665684852507842) q[2];
rz(0.329182668086685) q[3];
cx q[2], q[3];
rx(-1.570796326794897) q[2];
rx(-1.570796326794897) q[3];
rz(1.058388408239514) q[2];
rz(-3.765138338244192) q[3];
rz(-3.207149613780424) q[4];
rz(-0.369285763394639) q[5];
rx(1.570796326794897) q[4];
rx(1.570796326794897) q[5];
cx q[4], q[5];
rx(0.665684852507919) q[4];
rz(0.329182668086869) q[5];
cx q[4], q[5];
rx(-1.570796326794897) q[4];
rx(-1.570796326794897) q[5];
rz(1.523222305110296) q[4];
rz(-4.229972235114819) q[5];
rz(-1.802073794135100) q[6];
rz(-0.449193037872780) q[7];
rx(1.570796326794897) q[6];
rx(1.570796326794897) q[7];
cx q[6], q[7];
rx(0.365718050464814) q[6];
rz(0.025198415563096) q[7];
cx q[6], q[7];
rx(-1.570796326794897) q[6];
rx(-1.570796326794897) q[7];
rz(1.616998309690496) q[6];
rz(-2.584573545752337) q[7];
rz(-4.403784796516012) q[1];
rz(0.277207281097489) q[2];
rx(1.570796326794897) q[1];
rx(1.570796326794897) q[2];
cx q[1], q[2];
rx(1.536185437980538) q[1];
rz(-1.080664403908732) q[2];
cx q[1], q[2];
rx(-1.570796326794897) q[1];
rx(-1.570796326794897) q[2];
rz(1.856043615664599) q[1];
rz(-2.841028477493329) q[2];
rz(-1.323341354144761) q[3];
rz(2.813075963269627) q[4];
rx(1.570796326794897) q[3];
rx(1.570796326794897) q[4];
cx q[3], q[4];
rx(1.433699638074055) q[3];
rz(-1.063667096469060) q[4];
cx q[3], q[4];
rx(-1.570796326794897) q[3];
rx(-1.570796326794897) q[4];
rz(4.384236568155380) q[3];
rz(0.247090694559279) q[4];
rz(-0.717617382728032) q[5];
rz(1.854255779556143) q[6];
rx(1.570796326794897) q[5];
rx(1.570796326794897) q[6];
cx q[5], q[6];
rx(1.536185437980400) q[5];
rz(-1.080664403908949) q[6];
cx q[5], q[6];
rx(-1.570796326794897) q[5];
rx(-1.570796326794897) q[6];
rz(0.283459452761247) q[5];
rz(-2.288413709522929) q[6];
rz(-1.837647508673714) q[0];
rz(-1.596507477795650) q[1];
rx(1.570796326794897) q[0];
rx(1.570796326794897) q[1];
cx q[0], q[1];
rx(1.006979493224224) q[0];
rz(-0.906373195641380) q[1];
cx q[0], q[1];
rx(-1.570796326794897) q[0];
rx(-1.570796326794897) q[1];
rz(-3.180530366764885) q[0];
rz(2.887968033885314) q[1];
rz(-2.573720348002265) q[2];
rz(2.120550402239661) q[3];
rx(1.570796326794897) q[2];
rx(1.570796326794897) q[3];
cx q[2], q[3];
rx(1.465995356145336) q[2];
rz(-1.018361987969408) q[3];
cx q[2], q[3];
rx(-1.570796326794897) q[2];
rx(-1.570796326794897) q[3];
rz(3.689103172365694) q[2];
rz(-1.000680464538505) q[3];
rz(-3.167081684933269) q[4];
rz(0.584977028923230) q[5];
rx(1.570796326794897) q[4];
rx(1.570796326794897) q[5];
cx q[4], q[5];
rx(1.465995356145409) q[4];
rz(-1.018361987969343) q[5];
cx q[4], q[5];
rx(-1.570796326794897) q[4];
rx(-1.570796326794897) q[5];
rz(-0.985819297871667) q[4];
rz(-4.737878011728166) q[5];
rz(-0.593642806197733) q[6];
rz(-1.735253363087105) q[7];
rx(1.570796326794897) q[6];
rx(1.570796326794897) q[7];
cx q[6], q[7];
rx(1.006979493224258) q[6];
rz(-0.906373195641523) q[7];
cx q[6], q[7];
rx(-1.570796326794897) q[6];
rx(-1.570796326794897) q[7];
rz(-3.306049689882002) q[6];
rz(-2.164439132992629) q[7];
rz(-1.638057981268131) q[1];
rz(0.023478160869102) q[2];
rx(1.570796326794897) q[1];
rx(1.570796326794897) q[2];
cx q[1], q[2];
rx(1.279409798001958) q[1];
rz(-1.060228899372801) q[2];
cx q[1], q[2];
rx(-1.570796326794897) q[1];
rx(-1.570796326794897) q[2];
rz(1.593512537295745) q[1];
rz(-0.066499704104980) q[2];
rz(-1.146845459299346) q[3];
rz(-1.161706625968249) q[4];
rx(1.570796326794897) q[3];
rx(1.570796326794897) q[4];
cx q[3], q[4];
rx(1.328961699565094) q[3];
rz(-1.302796152132385) q[4];
cx q[3], q[4];
rx(-1.570796326794897) q[3];
rx(-1.570796326794897) q[4];
rz(-2.732502952763146) q[3];
rz(-2.717641786094243) q[4];
rz(2.167274037783015) q[5];
rz(1.414367088909146) q[6];
rx(1.570796326794897) q[5];
rx(1.570796326794897) q[6];
cx q[5], q[6];
rx(1.279409798001780) q[5];
rz(-1.060228899372882) q[6];
cx q[5], q[6];
rx(-1.570796326794897) q[5];
rx(-1.570796326794897) q[6];
rz(-0.156429237885751) q[5];
rz(0.596477710988119) q[6];
rz(-0.058840384977723) q[0];
rz(-0.475432642731875) q[1];
rx(1.570796326794897) q[0];
rx(1.570796326794897) q[1];
cx q[0], q[1];
rx(1.175552329634451) q[0];
rz(-1.017145323722306) q[1];
cx q[0], q[1];
rx(-1.570796326794897) q[0];
rx(-1.570796326794897) q[1];
rz(1.066052135851758) q[0];
rz(1.541267490028438) q[1];
rz(-3.806440891581418) q[2];
rz(-0.329376417277271) q[3];
rx(1.570796326794897) q[2];
rx(1.570796326794897) q[3];
cx q[2], q[3];
rx(1.487447324472897) q[2];
rz(-1.271273452769990) q[3];
cx q[2], q[3];
rx(-1.570796326794897) q[2];
rx(-1.570796326794897) q[3];
rz(4.383012563107418) q[2];
rz(0.905948088803272) q[3];
rz(-3.485830237533644) q[4];
rz(-0.574918704211103) q[5];
rx(1.570796326794897) q[4];
rx(1.570796326794897) q[5];
cx q[4], q[5];
rx(1.487447324472775) q[4];
rz(-1.271273452770193) q[5];
cx q[4], q[5];
rx(-1.570796326794897) q[4];
rx(-1.570796326794897) q[5];
rz(4.137470276173588) q[4];
rz(1.226558742851046) q[5];
rz(0.521602183575468) q[6];
rz(2.066661034840509) q[7];
rx(1.570796326794897) q[6];
rx(1.570796326794897) q[7];
cx q[6], q[7];
rx(1.175552329634467) q[6];
rz(-1.017145323722361) q[7];
cx q[6], q[7];
rx(-1.570796326794897) q[6];
rx(-1.570796326794897) q[7];
rz(0.495864708045612) q[6];
rz(-1.049194143219429) q[7];
rz(-3.151135919028184) q[1];
rz(0.413547596762959) q[2];
rx(1.570796326794897) q[1];
rx(1.570796326794897) q[2];
cx q[1], q[2];
rx(1.173554777724109) q[1];
rz(-1.053343877095374) q[2];
cx q[1], q[2];
rx(-1.570796326794897) q[1];
rx(-1.570796326794897) q[2];
rz(-1.157248730031938) q[1];
rz(-4.721932245823081) q[2];
rz(-1.534109032905480) q[3];
rz(-1.624038566690313) q[4];
rx(1.570796326794897) q[3];
rx(1.570796326794897) q[4];
cx q[3], q[4];
rx(1.421744642236235) q[3];
rz(-1.386942641312545) q[4];
cx q[3], q[4];
rx(-1.570796326794897) q[3];
rx(-1.570796326794897) q[4];
rz(3.088350413694376) q[3];
rz(3.178279947479210) q[4];
rz(-2.713183890161207) q[5];
rz(1.035859516545434) q[6];
rx(1.570796326794897) q[5];
rx(1.570796326794897) q[6];
cx q[5], q[6];
rx(1.173554777724108) q[5];
rz(-1.053343877095347) q[6];
cx q[5], q[6];
rx(-1.570796326794897) q[5];
rx(-1.570796326794897) q[6];
rz(-0.534936810249463) q[5];
rz(-4.283980216956104) q[6];
rz(-0.114624926055761) q[0];
rz(0.657401090928721) q[1];
rx(1.570796326794897) q[0];
rx(1.570796326794897) q[1];
cx q[0], q[1];
rx(1.195316191593321) q[0];
rz(-0.806471699361508) q[1];
cx q[0], q[1];
rx(-1.570796326794897) q[0];
rx(-1.570796326794897) q[1];
rz(-4.069849056122607) q[0];
rz(1.536001206122710) q[1];
rz(-2.785779920194301) q[2];
rz(1.021756052592507) q[3];
rx(1.570796326794897) q[2];
rx(1.570796326794897) q[3];
cx q[2], q[3];
rx(1.769454995749339) q[2];
rz(-0.939995706278444) q[3];
cx q[2], q[3];
rx(-1.570796326794897) q[2];
rx(-1.570796326794897) q[3];
rz(2.592552379387404) q[2];
rz(-1.214983593399404) q[3];
rz(-2.209766134778581) q[4];
rz(-0.689590048587170) q[5];
rx(1.570796326794897) q[4];
rx(1.570796326794897) q[5];
cx q[4], q[5];
rx(1.769454995749465) q[4];
rz(-0.939995706278364) q[5];
cx q[4], q[5];
rx(-1.570796326794897) q[4];
rx(-1.570796326794897) q[5];
rz(0.881206278207727) q[4];
rz(-0.638969807983685) q[5];
rz(-2.499052729327936) q[6];
rz(-1.140971300574265) q[7];
rx(1.570796326794897) q[6];
rx(1.570796326794897) q[7];
cx q[6], q[7];
rx(1.195316191593379) q[6];
rz(-0.806471699361643) q[7];
cx q[6], q[7];
rx(-1.570796326794897) q[6];
rx(-1.570796326794897) q[7];
rz(3.571417679810425) q[6];
rz(2.213336251056754) q[7];
rz(-0.832200103166020) q[1];
rz(-2.006018711265071) q[2];
rx(1.570796326794897) q[1];
rx(1.570796326794897) q[2];
cx q[1], q[2];
rx(1.450164434944621) q[1];
rz(-0.691409168631536) q[2];
cx q[1], q[2];
rx(-1.570796326794897) q[1];
rx(-1.570796326794897) q[2];
rz(-0.614618265362790) q[1];
rz(-1.060354056756206) q[2];
rz(-4.243760035533803) q[3];
rz(-0.056764599961135) q[4];
rx(1.570796326794897) q[3];
rx(1.570796326794897) q[4];
cx q[3], q[4];
rx(1.572314810168063) q[3];
rz(-0.603967516233261) q[4];
cx q[3], q[4];
rx(-1.570796326794897) q[3];
rx(-1.570796326794897) q[4];
rz(2.336999545742814) q[3];
rz(2.336999545742718) q[4];
rz(-1.916089177484090) q[5];
rz(0.273976076736314) q[6];
rx(1.570796326794897) q[5];
rx(1.570796326794897) q[6];
cx q[5], q[6];
rx(1.450164434944400) q[5];
rz(-0.691409168631768) q[6];
cx q[5], q[6];
rx(-1.570796326794897) q[5];
rx(-1.570796326794897) q[6];
rz(2.081238596833714) q[5];
rz(2.526974388226863) q[6];
+123 −36
Original line number Diff line number Diff line
#include "xacc.hpp"
#include "xacc_service.hpp"
#include "NoiseModel.hpp"
#include "Optimizer.hpp"
#include "xacc_observable.hpp"
#include "Algorithm.hpp"

int main(int argc, char **argv) {
  xacc::Initialize();
  xacc::set_verbose(true);
  // xacc::logToFile(true);
  // xacc::setLoggingLevel(2);
  // Number of qubits
  constexpr int NB_QUBITS = 4;
int benchmarkExaTnGen1()
{
 auto accelerator = xacc::getAccelerator("tnqvm",
                    {{"tnqvm-visitor", "exatn-gen"}
                    ,{"exatn-buffer-size-gb", 2}
                    ,{"reconstruct-layers", 4}
                    ,{"reconstruct-tolerance", 1e-3}
                    ,{"max-bond-dim", 2}
                    });
 xacc::qasm(R"(.compiler xasm
               .circuit deuteron_ansatz_h3_2
               .parameters t0, t1
               .qbit q
               X(q[0]);
               exp_i_theta(q, t0, {{"pauli", "X0 Y1 - Y0 X1"}});
               exp_i_theta(q, t1, {{"pauli", "X0 Z1 Y2 - X2 Z1 Y0"}});
              )");
 auto ansatz = xacc::getCompiled("deuteron_ansatz_h3_2");
 auto H_N_3 = xacc::quantum::getObservable("pauli",
               std::string("5.907 - 2.1433 X0X1 - 2.1433 Y0Y1 + .21829 Z0 - 6.125 Z1 + "
                           "9.625 - 9.625 Z2 - 3.91 X1 X2 - 3.91 Y1 Y2"));
 auto optimizer = xacc::getOptimizer("nlopt");
 auto buffer = xacc::qalloc(3);
 auto vqe = xacc::getAlgorithm("vqe");
 vqe->initialize({std::make_pair("ansatz", ansatz),
                  std::make_pair("observable", H_N_3),
                  std::make_pair("accelerator", accelerator),
                  std::make_pair("optimizer", optimizer)});
 auto energies = vqe->execute(buffer, {0.0684968, 0.17797});
 buffer->print();
 std::cout << "Energy = " << energies[0] << " VS correct = " << -2.04482 << "\n";
 //EXPECT_NEAR(energies[0], -2.04482, 0.1);
 return 0;
}


int benchmarkExaTnGen2()
{
 constexpr int NB_QUBITS = 8;
 constexpr int NB_ELECTRONS = NB_QUBITS / 2;
 // Using UCCSD as the base ansatz circuit
 auto tmp = xacc::getService<xacc::Instruction>("uccsd");
@@ -21,21 +57,72 @@ int main(int argc, char **argv) {
 const std::vector<double> params(uccsd->getVariables().size(), 1.0);
 auto evaled_uccsd = uccsd->operator()(params);
 std::cout << evaled_uccsd->toString() << "\n";
  // Exatn-general visitor parameters:
  // Number of layers to perform reconstruction
  constexpr int NB_LAYERS = 10;
  constexpr double RECONSTRUCTION_TOL = 1e-4;
  // Max bond dim
  constexpr int MAX_BOND_DIM = 64;
  auto accelerator = xacc::getAccelerator(
      "tnqvm", {{"tnqvm-visitor", "exatn-gen"},
                {"reconstruct-layers", NB_LAYERS},
                {"reconstruct-tolerance", RECONSTRUCTION_TOL},
                {"max-bond-dim", MAX_BOND_DIM}});
 /*
 auto accelerator_exatn_exact = xacc::getAccelerator("tnqvm",
      {{"tnqvm-visitor", "exatn:double"}
    //,{"bitstring", std::vector<int>(NB_QUBITS,-1)}
      ,{"exatn-buffer-size-gb", 2}
    //,{"exatn-contract-seq-optimizer", "cotengra"}
      });
 auto buffer1 = xacc::qalloc(NB_QUBITS);
 accelerator_exatn_exact->execute(buffer1, evaled_uccsd);
 buffer1->print();
 */
 constexpr int NB_LAYERS = 8;
 constexpr double RECONSTRUCTION_TOL = 1e-3;
 constexpr int MAX_BOND_DIM = 4;
 auto accelerator_exatn_approx = xacc::getAccelerator("tnqvm",
      {{"tnqvm-visitor", "exatn-gen"}
      ,{"exatn-buffer-size-gb", 2}
      ,{"reconstruct-layers", NB_LAYERS}
      ,{"reconstruct-tolerance", RECONSTRUCTION_TOL}
      ,{"max-bond-dim", MAX_BOND_DIM}
      });
 auto buffer2 = xacc::qalloc(NB_QUBITS);
 accelerator_exatn_approx->execute(buffer2, evaled_uccsd);
 buffer2->print();
 return 0;
}

	auto buffer = xacc::qalloc(NB_QUBITS);
	accelerator->execute(buffer, evaled_uccsd);
	buffer->print();
	xacc::Finalize();

int benchmarkExaTnGen3()
{
 constexpr int NB_QUBITS = 16;
 auto xasmCompiler = xacc::getCompiler("xasm");
 auto ir = xasmCompiler->compile(R"(__qpu__ void bell(qbit q) {
            H(q[0]);
            for (int i = 0; i < 15; i++) {
             CNOT(q[i], q[i + 1]);
            }
           })");
 std::vector<int> bitstring(NB_QUBITS, 0);
 auto program = ir->getComposite("bell");
 auto accelerator =
      xacc::getAccelerator("tnqvm", {{"tnqvm-visitor", "exatn-gen"},
                                     {"exatn-buffer-size-gb", 2},
                                     {"reconstruct-layers", 4},
                                     {"reconstruct-tolerance", 1e-4},
                                     {"max-bond-dim", 1},
                                     {"bitstring", bitstring}});
 auto qreg = xacc::qalloc(NB_QUBITS);
 accelerator->execute(qreg, program);
 qreg->print();
 const auto realAmpl = (*qreg)["amplitude-real"].as<double>();
 const auto imagAmpl = (*qreg)["amplitude-imag"].as<double>();
 std::cout << "Bell state amplitude = {" << realAmpl << "," << imagAmpl << "}\n";
 return 0;
}


int main(int argc, char **argv) {
 xacc::Initialize(argc, argv);
 xacc::set_verbose(true);
 //xacc::logToFile(true);
 //xacc::setLoggingLevel(1);
 int error_code = 0;
 //if(error_code == 0) error_code = benchmarkExaTnGen1();
 //if(error_code == 0) error_code = benchmarkExaTnGen2();
 if(error_code == 0) error_code = benchmarkExaTnGen3();
 xacc::Finalize();
 return error_code;
}
+65 −0
Original line number Diff line number Diff line
#include "xacc.hpp"
#include "xacc_service.hpp"
#include "xacc_observable.hpp"

#include <fstream>
#include <string>

const std::string QASM_SRC_FILE = "ASP_8q_5001.qasm";
constexpr int N_QUBITS = 8;

int main(int argc, char **argv) {

    // Initialize:
    xacc::Initialize(argc, argv);
    xacc::set_verbose(true);
    //xacc::logToFile(true);
    //xacc::setLoggingLevel(1);

    // Get Accelerator backend:
    auto accelerator_qpp = xacc::getAccelerator("qpp");
    auto accelerator_tnqvm_gen = xacc::getAccelerator("tnqvm",
                                 {{"tnqvm-visitor", "exatn-gen:float"},
                                  {"exatn-buffer-size-gb", 2},
                                  {"reconstruct-layers", 4},
                                  {"reconstruct-tolerance", 1e-5},
                                  {"max-bond-dim", 32}});
    auto accelerator = accelerator_qpp;

    // Read Source file:
    std::ifstream inFile;
    inFile.open(QASM_SRC_FILE);
    std::stringstream strStream;
    strStream << inFile.rdbuf();
    const std::string qasmSrcStr = strStream.str();

    // Get Compiler:
    auto compiler = xacc::getCompiler("staq");

    // Compile Circuit:
    auto IR = compiler->compile(qasmSrcStr);
    auto program = IR->getComposites()[0];

    // Define Observable:
    const std::string obs_str = [&](){
     std::string result = std::to_string(1.0/static_cast<double>(N_QUBITS)) + " Z0";
     for (int i = 1; i < N_QUBITS; ++i) {
      result += (" + " + std::to_string(1.0/static_cast<double>(N_QUBITS)) + " Z" + std::to_string(i));
     }
     return result;
    }();

    // Generate Composites for Observable:
    auto avg_mag = xacc::quantum::getObservable("pauli", obs_str);
    auto composites = avg_mag->observe(program);

    // Allocate Qubits and execute:
    auto buffer = xacc::qalloc(N_QUBITS);
    accelerator->execute(buffer, composites);
    buffer->print();
    const double avg_mag_result = avg_mag->postProcess(buffer);
    std::cout << "Result: " << avg_mag_result << std::endl;

    // Finalize:
    xacc::Finalize();
}
Loading