qite.hpp 2.95 KB
Newer Older
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
/*******************************************************************************
 * Copyright (c) 2019 UT-Battelle, LLC.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * and Eclipse Distribution License v1.0 which accompanies this
 * distribution. The Eclipse Public License is available at
 * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution
 *License is available at https://eclipse.org/org/documents/edl-v10.php
 *
 * Contributors:
 *   Thien Nguyen - initial API and implementation
 *******************************************************************************/
#pragma once

#include "Algorithm.hpp"

namespace xacc {
namespace algorithm {
class QITE : public Algorithm {
public:
  bool initialize(const HeterogeneousMap &parameters) override;
  const std::vector<std::string> requiredParameters() const override;

  void execute(const std::shared_ptr<AcceleratorBuffer> buffer) const override;
  std::vector<double> execute(const std::shared_ptr<AcceleratorBuffer> buffer,
               const std::vector<double> &parameters) override;
  const std::string name() const override { return "qite"; }
  const std::string description() const override { return ""; }
  DEFINE_ALGORITHM_CLONE(QITE)
Nguyen, Thien's avatar
Nguyen, Thien committed
30
31
32
private:
  // Construct the Trotter propagate circuit up to current time step.
  std::shared_ptr<CompositeInstruction> constructPropagateCircuit() const;
33
34
35
  // Calculate the current energy, i.e.
  // the value of the observable at the current Trotter step.
  double calcCurrentEnergy(int in_nbQubits) const;
Nguyen, Thien's avatar
Nguyen, Thien committed
36
37
38
39
40
41
42
43

  // Calculate approximate A operator observable at the current Trotter step.
  // Params:
  // in_kernel: the kernel to evolve the system to this time step
  // in_hmTerm: the H term to be approximate by the A term 
  // i.e. emulate the imaginary time evolution of that H term.
  std::shared_ptr<Observable> calcAOps(const std::shared_ptr<AcceleratorBuffer>& in_buffer, std::shared_ptr<CompositeInstruction> in_kernel, std::shared_ptr<Observable> in_hmTerm) const;

Nguyen, Thien's avatar
Nguyen, Thien committed
44
45
46
47
48
private:
  // Number of Trotter steps
  int m_nbSteps;
  // dBeta, i.e. step size
  double m_dBeta;
Nguyen, Thien's avatar
Nguyen, Thien committed
49
50
  // Accelerator
  std::shared_ptr<Accelerator> m_accelerator;
Nguyen, Thien's avatar
Nguyen, Thien committed
51
  // Hamiltonian Observable, i.e. H = Sum(h_i)
Nguyen, Thien's avatar
Nguyen, Thien committed
52
  std::shared_ptr<Observable> m_observable;
Nguyen, Thien's avatar
Nguyen, Thien committed
53
54
55
56
57
58
59
  // Ansatz circuit (apply before Trotter steps)
  CompositeInstruction* m_ansatz;
  // List of A operators for each time step
  // which approximates the imaginary-time step 
  // of the Hamiltonian observable
  // i.e. exp(-iAt) -> exp(-Ht)
  mutable std::vector<std::shared_ptr<Observable>> m_approxOps;
60
61
  // Energy value achieved at a Trotter step
  mutable std::vector<double> m_energyAtStep;
62
63
  // If a pure analytical run is requested.
  bool m_analytical;
Nguyen, Thien's avatar
Nguyen, Thien committed
64
65
66
67
  // For analytical solver only: the initial state
  // For accelerator-based simulation, the Ansatz is used to
  // prepare the initial state.
  int m_initialState;
68
69
70
};
} // namespace algorithm
} // namespace xacc