Commit 62096fa7 authored by Nguyen, Thien Minh's avatar Nguyen, Thien Minh
Browse files

Support non-zero initial spin state



Signed-off-by: default avatarThien Nguyen <nguyentm@ornl.gov>
parent 5362c511
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -89,6 +89,19 @@ ModelBuilder::createModel(ModelType type, const HeterogeneousMap &params) {
    };
    
    model.hamiltonian = H;
    // Non-zero initial spin state:
    if (std::find(hs_model.initial_spins.begin(), hs_model.initial_spins.end(),
                  1) != hs_model.initial_spins.end()) {
      auto initialSpinPrep = qcor::__internal__::create_composite("InitialSpin");
      auto provider = qcor::__internal__::get_provider();
      for (int i = 0; i < hs_model.initial_spins.size(); ++i) {
        if (hs_model.initial_spins[i] == 1) {
          initialSpinPrep->addInstruction(provider->createInstruction("X", i));
        }
      }
      model.user_defined_ansatz = std::make_shared<KernelFunctor>(initialSpinPrep);
    }

    return model;
  } else {
    qcor::error("Unknown model type.");
+7 −1
Original line number Diff line number Diff line
@@ -42,7 +42,13 @@ TimeDependentWorkflow::execute(const QuantumSimulationModel &model) {
    // std::cout << stepAnsatz.circuit->toString() << "\n";
    // First step:
    if (!totalCirc) {
      // If there is a state-prep circuit (non-zero initial state)
      if (model.user_defined_ansatz) {
        totalCirc = model.user_defined_ansatz->evaluate_kernel({});
        totalCirc->addInstructions(stepAnsatz.circuit->getInstructions());
      } else {
        totalCirc = stepAnsatz.circuit;
      }
    } else {
      // Append Trotter steps
      totalCirc->addInstructions(stepAnsatz.circuit->getInstructions());