Commit ce69d956 authored by Mccaskey, Alex's avatar Mccaskey, Alex
Browse files

started on SwapInsertionIRTransformation

parent 8964f9f7
......@@ -193,6 +193,7 @@ void IBMAccelerator::execute(std::shared_ptr<AcceleratorBuffer> buffer,
// Create the URI, HTTP Client and Post and Get request
// add our headers to it - this contains the API key
std::cout << "QASM:\n" << qasmStr << "\n";
std::stringstream relSS;
relSS << "/api/Jobs?access_token=" << currentApiToken;
http::uri uri = http::uri(url);
......
......@@ -38,9 +38,10 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/ir)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/compiler)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/ir/instructions)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/ir/algorithms)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/ir/transformations)
file (GLOB_RECURSE HEADERS *.hpp)
file (GLOB SRC *.cpp compiler/*.cpp ir/*.cpp ir/instructions/*.cpp utils/*.cpp ir/algorithms/*.cpp)
file (GLOB SRC *.cpp compiler/*.cpp ir/*.cpp ir/instructions/*.cpp utils/*.cpp ir/algorithms/*.cpp ir/transformations/*.cpp)
# Set up dependencies to resources to track changes
usFunctionGetResourceSource(TARGET ${LIBRARY_NAME} OUT SRC)
......
......@@ -28,18 +28,6 @@
# Initial API and implementation - Alex McCaskey
#
#**********************************************************************************/
#set (PACKAGE_NAME "XACC Quantum Gate IR Runtime")
#set (PACKAGE_DESCIPTION "XACC Quantum Gate Model Intermediate Representation")
#set (LIBRARY_NAME xacc-gate-ir)
#include_directories(${CMAKE_CURRENT_SOURCE_DIR})
#include_directories(${CMAKE_CURRENT_SOURCE_DIR}/instructions)
#file (GLOB_RECURSE HEADERS *.hpp)
#file (GLOB SRC *.cpp instructions/*.cpp functions/*.cpp)
#add_library(${LIBRARY_NAME} SHARED ${SRC})
# Gather tests
file (GLOB test_files tests/*.cpp)
......
/***********************************************************************************
* Copyright (c) 2016, UT-Battelle
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the xacc nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Contributors:
* Initial API and implementation - Alex McCaskey
*
**********************************************************************************/
#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE SwapInsertionIRTransformationTester
#include <boost/test/included/unit_test.hpp>
#include "SwapInsertionIRTransformation.hpp"
#include "CNOT.hpp"
using namespace xacc;
using namespace xacc::quantum;
BOOST_AUTO_TEST_CASE(checkCreation) {
auto graph = std::make_shared<AcceleratorGraph>(5);
graph->addEdge(0,1);
graph->addEdge(0,2);
graph->addEdge(1,2);
graph->addEdge(2,3);
graph->addEdge(2,4);
graph->addEdge(3,4);
SwapInsertionIRTransformation t(graph);
auto f = std::make_shared<GateFunction>("foo");
auto cn1 = std::make_shared<CNOT>(0, 4);
f->addInstruction(cn1);
auto ir = std::make_shared<GateQIR>();
ir->addKernel(f);
auto newir = t.transform(ir);
}
BOOST_AUTO_TEST_CASE(checkAutoRegistration) {
}
#include "SwapInsertionIRTransformation.hpp"
namespace xacc {
namespace quantum {
std::shared_ptr<IR> SwapInsertionIRTransformation::transform(std::shared_ptr<IR> ir) {
auto newir = std::make_shared<GateQIR>();
for (auto kernel : ir->getKernels()) {
for (auto inst : kernel->getInstructions()) {
auto qbits = inst->bits();
// If we have 2 qubit gate that does not have a corresponding
// connection in the hardware, then we need to add swaps
if (qbits.size() == 2 && !graph->edgeExists(qbits[0], qbits[1])) {
std::vector<int> paths;
std::vector<double> distances;
graph->computeShortestPath(qbits[0], distances, paths);
}
}
}
}
}
}
#ifndef QUANTUM_GATE_IR_TRANSFORMATIONS_SWAPINSERTIONIRTRANSFORMATION_HPP_
#define QUANTUM_GATE_IR_TRANSFORMATIONS_SWAPINSERTIONIRTRANSFORMATION_HPP_
#include "Accelerator.hpp"
#include "IRTransformation.hpp"
#include "GateQIR.hpp"
namespace xacc {
namespace quantum {
class SwapInsertionIRTransformation : public IRTransformation {
protected:
std::shared_ptr<AcceleratorGraph> graph;
public:
SwapInsertionIRTransformation(std::shared_ptr<AcceleratorGraph> g) :graph(g) {}
virtual std::shared_ptr<IR> transform(std::shared_ptr<IR> ir);
virtual const std::string name() const {
return "swap-insertion";
}
virtual const std::string description() const {
return "";
}
};
}
}
#endif
......@@ -43,6 +43,11 @@
#include "Utils.hpp"
#include <utility>
#include <boost/graph/graph_traits.hpp>
#include <boost/graph/dijkstra_shortest_paths.hpp>
#include <boost/property_map/property_map.hpp>
using namespace boost;
namespace xacc {
......@@ -502,6 +507,29 @@ public:
stream.fail();
XACCError("Reading must be implemented by subclasses.");
}
void computeShortestPath(int startIndex,
std::vector<double>& distances, std::vector<int>& paths) {
typename property_map<adj_list, edge_weight_t>::type weightmap = get(edge_weight,
*_graph.get());
std::vector<vertex_type> p(num_vertices(*_graph.get()));
std::vector<int> d(num_vertices(*_graph.get()));
vertex_type s = vertex(startIndex, *_graph.get());
dijkstra_shortest_paths(*_graph.get(), s,
predecessor_map(
boost::make_iterator_property_map(p.begin(),
get(boost::vertex_index, *_graph.get()))).distance_map(
boost::make_iterator_property_map(d.begin(),
get(boost::vertex_index, *_graph.get()))));
for (int i = 0; i < p.size(); i++) {
std::cout << p[i] << "\n";
}
}
};
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment