- 
                Notifications
    You must be signed in to change notification settings 
- Fork 213
[WIP] How to build a vibrational Hamiltonian #1402
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
          
     Open
      
      
            soranjh
  wants to merge
  16
  commits into
  master
  
    
      
        
          
  
    
      Choose a base branch
      
     
    
      
        
      
      
        
          
          
        
        
          
            
              
              
              
  
           
        
        
          
            
              
              
           
        
       
     
  
        
          
            
          
            
          
        
       
    
      
from
vibrational_hamiltonian
  
      
      
   
  
    
  
  
  
 
  
      
    base: master
Could not load branches
            
              
  
    Branch not found: {{ refName }}
  
            
                
      Loading
              
            Could not load tags
            
            
              Nothing to show
            
              
  
            
                
      Loading
              
            Are you sure you want to change the base?
            Some commits from the old base branch may be removed from the timeline,
            and old review comments may become outdated.
          
          
  
     Open
                    Changes from all commits
      Commits
    
    
            Show all changes
          
          
            16 commits
          
        
        Select commit
          Hold shift + click to select a range
      
      13ab25d
              
                add intro
              
              
                soranjh 6456359
              
                add christiansen
              
              
                soranjh f99a2e9
              
                add pes code
              
              
                soranjh d497621
              
                add hamiltonians
              
              
                soranjh 2bb78e8
              
                Merge branch 'master' into vibrational_hamiltonian
              
              
                soranjh da1912e
              
                Merge branch 'master' into vibrational_hamiltonian
              
              
                soranjh 05408be
              
                Apply suggestions from code review
              
              
                soranjh 1f15615
              
                add conc and refs
              
              
                soranjh d846ef2
              
                fix conflict
              
              
                soranjh d50ef96
              
                update intro
              
              
                soranjh d24b3ea
              
                update intro
              
              
                soranjh 8f20d59
              
                Merge branch 'master' into vibrational_hamiltonian
              
              
                soranjh 8200c95
              
                Merge branch 'master' into vibrational_hamiltonian
              
              
                soranjh 9b7fd75
              
                add images
              
              
                soranjh 7a3c394
              
                rename file
              
              
                soranjh b288ee8
              
                optimize false
              
              
                soranjh File filter
Filter by extension
Conversations
          Failed to load comments.   
        
        
          
      Loading
        
  Jump to
        
          Jump to file
        
      
      
          Failed to load files.   
        
        
          
      Loading
        
  Diff view
Diff view
There are no files selected for viewing
        
          
          Binary file added
          
            BIN
              
                +37.6 KB
              
          
        
  ...mo_thumbnails/large_demo_thumbnails/thumbnail_large_vibrational_hamiltonian.png
  
  
      
      
   
        
      
      
    
      
      Loading
      
  Sorry, something went wrong. Reload?
      Sorry, we cannot display this file.
      Sorry, this file is invalid so it cannot be displayed.
      
    
        
          
          Binary file added
          
            BIN
              
                +35.2 KB
              
          
        
  ...mo_thumbnails/opengraph_demo_thumbnails/OGthumbnail_vibrational_hamiltonian.png
  
  
      
      
   
        
      
      
    
      
      Loading
      
  Sorry, something went wrong. Reload?
      Sorry, we cannot display this file.
      Sorry, this file is invalid so it cannot be displayed.
      
    
        
          
          Binary file added
          
            BIN
              
                +7.26 KB
              
          
        
  ...c/demo_thumbnails/regular_demo_thumbnails/thumbnail_vibrational_hamiltonian.png
  
  
      
      
   
        
      
      
    
      
      Loading
      
  Sorry, something went wrong. Reload?
      Sorry, we cannot display this file.
      Sorry, this file is invalid so it cannot be displayed.
      
    
        
          
          
            67 changes: 67 additions & 0 deletions
          
          67 
        
  demonstrations/tutorial_how_to_build_vibrational_hamiltonians.metadata.json
  
  
      
      
   
        
      
      
    
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
              | Original file line number | Diff line number | Diff line change | 
|---|---|---|
| @@ -0,0 +1,67 @@ | ||
| { | ||
| "title": "How to build vibrational Hamiltonians", | ||
| "authors": [ | ||
| { | ||
| "username": "ddhawan" | ||
| }, | ||
| { | ||
| "username": "austingmhuang" | ||
| }, | ||
| { | ||
| "username": "soran" | ||
| } | ||
| ], | ||
| "dateOfPublication": "2025-07-10T00:00:00+00:00", | ||
| "dateOfLastModification": "2025-07-10T00:00:00+00:00", | ||
| "categories": [ | ||
| "Getting Started", | ||
| "How-to" | ||
| ], | ||
| "tags": [], | ||
| "previewImages": [ | ||
| { | ||
| "type": "thumbnail", | ||
| "uri": "/_static/demo_thumbnails/regular_demo_thumbnails/thumbnail_how_to_build_spin_hamiltonians.png" | ||
| }, | ||
| { | ||
| "type": "large_thumbnail", | ||
| "uri": "/_static/demo_thumbnails/large_demo_thumbnails/thumbnail_large_how_to_build_spin_hamiltonians.png" | ||
| } | ||
| ], | ||
| "seoDescription": "Learn how to build vibrational Hamiltonians with PennyLane.", | ||
| "doi": "", | ||
| "references": [ | ||
| { | ||
| "id": "loaiza", | ||
| "type": "article", | ||
| "title": "Simulating near-infrared spectroscopy on a quantum computer for enhanced chemical detection", | ||
| "authors": "I. Loaiza *et al.*", | ||
| "journal": "arXiv:2504.10602", | ||
| "year": "2025", | ||
| "url": "https://arxiv.org/abs/2504.10602" | ||
| }, | ||
| { | ||
| "id": "motlagh", | ||
| "type": "article", | ||
| "title": "Quantum Algorithm for Vibronic Dynamics: Case Study on Singlet Fission Solar Cell Design", | ||
| "authors": "D. Motlagh *et al.*", | ||
| "journal": "arXiv:2411.13669", | ||
| "year": "2024", | ||
| "url": "https://arxiv.org/abs/2411.13669" | ||
| } | ||
| ], | ||
| "basedOnPapers": [], | ||
| "referencedByPapers": [], | ||
| "relatedContent": [ | ||
| { | ||
| "type": "demonstration", | ||
| "id": "tutorial_quantum_chemistry", | ||
| "weight": 1.0 | ||
| }, | ||
| { | ||
| "type": "demonstration", | ||
| "id": "tutorial_how_to_build_spin_hamiltonians", | ||
| "weight": 1.0 | ||
| } | ||
| ] | ||
| } | 
        
          
          
            203 changes: 203 additions & 0 deletions
          
          203 
        
  demonstrations/tutorial_how_to_build_vibrational_hamiltonians.py
  
  
      
      
   
        
      
      
    
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
              | Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,203 @@ | ||||||
| r"""How to build vibrational Hamiltonians | ||||||
| ========================================= | ||||||
| Vibrational motions are crucial for describing the quantum properties of molecules and | ||||||
| materials. Molecular vibrations can affect the outcome of chemical reactions and there are several | ||||||
| vibrational spectroscopy techniques that provide valuable insight into understanding chemical | ||||||
| systems and processes [#loaiza]_ [#motlagh]_. Classical quantum | ||||||
| computations have been routinely implemented to describe vibrational motions of molecules. However, | ||||||
| for challenging vibrational systems, classical methods typically have fundamental theoretical | ||||||
| limitations that prevent their practical implementation. This makes quantum algorithms an ideal | ||||||
| choice where classical methods are not efficient or accurate. | ||||||
|  | ||||||
| Quantum algorithms require a precise description of the system Hamiltonian to compute vibrational | ||||||
| properties. In this demo, we learn how to use PennyLane features to construct and manipulate | ||||||
| different representations of vibrational Hamiltonians. We also briefly discuss the implementation of | ||||||
| the Hamiltonian in an interesting quantum algorithm for computing the vibrational dynamics of a | ||||||
| molecule. | ||||||
|  | ||||||
| .. figure:: ../_static/demo_thumbnails/opengraph_demo_thumbnails/OGthumbnail_vibrational_hamiltonian.png | ||||||
| :align: center | ||||||
| :width: 70% | ||||||
| :target: javascript:void(0) | ||||||
| """ | ||||||
|  | ||||||
| ###################################################################### | ||||||
| # Vibrational Hamiltonian | ||||||
| # ----------------------- | ||||||
| # A molecular vibrational Hamiltonian can be defined in terms of the kinetic energy operator of the | ||||||
| # nuclei, :math:`T`, and the potential energy operator, :math:`V`, which describes the interactions | ||||||
| # between the nuclei as: | ||||||
| # | ||||||
| # .. math:: | ||||||
| # | ||||||
| # H = T + V. | ||||||
| # | ||||||
| # The kinetic and potential energy operators can be written in terms of momentum and position | ||||||
| # operators, respectively. There are several ways to construct the potential energy operator which | ||||||
| # lead to different representations of the vibrational Hamiltonian. Here we explain some of these | ||||||
| # representations and provide PennyLane codes for constructing them. | ||||||
| # | ||||||
| # Christiansen representation | ||||||
| # ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||||||
| # The Christiansen representation of the vibrational Hamiltonian relies on the n-mode expansion of | ||||||
| # the potential energy surface :math:`V` over vibrational normal coordinates :math:`Q`. | ||||||
| # | ||||||
| # .. math:: | ||||||
| # | ||||||
| # V({Q}) = \sum_i V_1(Q_i) + \sum_{ij} V_2(Q_i,Q_j) + ..., | ||||||
| # | ||||||
| # This provides a general representation of the potential energy surface where the terms :math:`V_n` | ||||||
| # depend on :math:`n` vibrational modes at most. | ||||||
| # | ||||||
| # The Christiansen Hamiltonian is then constructed in second-quantization based on this potential | ||||||
| # energy surface in terms of bosonic creation :math:`b^{\dagger}` and annihilation :math:`b` | ||||||
| # operations: | ||||||
| # | ||||||
| # .. math:: | ||||||
| # | ||||||
| # H = \sum_{i}^M \sum_{k_i, l_i}^{N_i} C_{k_i, l_i}^{(i)} b_{k_i}^{\dagger} b_{l_i} + | ||||||
| # \sum_{i<j}^{M} \sum_{k_i,l_i}^{N_i} \sum_{k_j,l_j}^{N_j} C_{k_i k_j, l_i l_j}^{(i,j)} | ||||||
| # b_{k_i}^{\dagger} b_{k_j}^{\dagger} b_{l_i} b_{l_j}, | ||||||
| # | ||||||
| # where :math:`M` represents the number of normal modes and :math:`N` is the number of modals. | ||||||
| # Recall that a modal is a one-mode vibrational wave function defined as a function of a normal | ||||||
| # coordinate. The coefficients :math:`C` represent n-mode integrals which depend on the | ||||||
| # :math:`n`-mode contribution of the potential energy, :math:`V_n`, defined above. | ||||||
| # | ||||||
| # PennyLane provides a set of functions to construct the Christiansen Hamiltonian, either directly | ||||||
| # in one step or from its building blocks step by step. An important step in both methods is to | ||||||
| # construct the potential energy operator which is done based on | ||||||
| # single-point energy calculations along the normal modes of the molecule. The | ||||||
| # :func:`~.pennylane.qchem.vibrational_pes` function in PennyLane provides a convenient way to | ||||||
| # perform the potential energy calculations for a given molecule. The calculations are typically | ||||||
| # done by performing single-point energy calculations at small distances along the | ||||||
| # normal mode coordinates. Computing the energies for each mode separately provides the term | ||||||
| # :math:`V_1` while displacing atoms along two different modes simultaneously gives the term | ||||||
| # :math:`V_2` and so on. | ||||||
| # | ||||||
| # Let's look at an example for the HF molecule. | ||||||
|  | ||||||
| import numpy as np | ||||||
| import pennylane as qml | ||||||
|  | ||||||
| symbols = ['H', 'F'] | ||||||
| geometry = np.array([[0.0, 0.0, 0.0], [0.0, 0.0, 1.79]]) | ||||||
| mol = qml.qchem.Molecule(symbols, geometry) | ||||||
| pes = qml.qchem.vibrational_pes(mol, optimize=False) | ||||||
|  | ||||||
| ###################################################################### | ||||||
| # The :func:`~.pennylane.qchem.vibrational_pes` function creates a | ||||||
| # :class:`~.pennylane.qchem.VibrationalPES` object that stores the potential energy surface | ||||||
| # and vibrational information. This object is the input for several functions that we learn about | ||||||
| # here. For instance, the :func:`~.pennylane.qchem.christiansen_integrals` function accepts this | ||||||
| # object to compute the integrals needed to construct the Christiansen | ||||||
| # Hamiltonian defined above. | ||||||
|  | ||||||
| integrals = qml.qchem.vibrational.christiansen_integrals(pes, n_states=4) | ||||||
| h_bosonic = qml.qchem.christiansen_bosonic(integrals[0]) | ||||||
| print(h_bosonic) | ||||||
|  | ||||||
| ###################################################################### | ||||||
| # The bosonic Hamiltonian constructed with :func:`~.pennylane.qchem.christiansen_bosonic` can be | ||||||
| # mapped to its qubit form by using the :func:`~.pennylane.qchem.christiansen_mapping` function. | ||||||
|  | ||||||
| h_qubit = qml.bose.christiansen_mapping(h_bosonic) | ||||||
| h_qubit | ||||||
|  | ||||||
| ###################################################################### | ||||||
| # This provides a vibrational Hamiltonian in the qubit basis that can be used in any desired quantum | ||||||
| # algorithm in PennyLane. | ||||||
| # | ||||||
| # Note that PennyLane also provides the :func:`~.pennylane.qchem.christiansen_hamiltonian` function | ||||||
| # that uses the :class:`~.pennylane.qchem.VibrationalPES` object directly and builds the | ||||||
| # Christiansen Hamiltonian in qubit representation. | ||||||
|  | ||||||
| h_christiansen = qml.qchem.vibrational.christiansen_hamiltonian(pes,n_states=4) | ||||||
| There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 
        Suggested change
       
 | ||||||
|  | ||||||
| ###################################################################### | ||||||
| # You can verify that the two Hamiltonians are identical. | ||||||
|         
                  austingmhuang marked this conversation as resolved.
              Show resolved
            Hide resolved | ||||||
| # | ||||||
| # Taylor representation | ||||||
| # ^^^^^^^^^^^^^^^^^^^^^ | ||||||
| # The Taylor representation of the vibrational Hamiltonian relies on a Taylor expansion of | ||||||
| # the potential energy surface :math:`V` in terms of the vibrational mass-weighted normal | ||||||
| # coordinate operators :math:`q`. | ||||||
| # | ||||||
| # .. math:: | ||||||
| # | ||||||
| # V = V_0 + \sum_i F_i q_i + \sum_{ij} F_{ij} q_i,q_j + .... | ||||||
| # | ||||||
| # Note that the force constants :math:`F` are derivatives of the potential energy surface. | ||||||
| # | ||||||
| # The Taylor Hamiltonian can then be constructed by defining the kinetic and potential energy | ||||||
| # components in terms of the momentum and position operators. | ||||||
| # | ||||||
| # .. math:: | ||||||
| # | ||||||
| # H = \sum_{i \ge j} K_{ij} p_i p_j + \sum_{i\ge j} \Phi_{ij}^{(2)} q_i q_j + | ||||||
| # \sum_{i \ge j \ge k} \Phi_{ijk}^{(3)} q_i q_j q_k + ..., | ||||||
| # | ||||||
| # where the coefficients :math:`\Phi` are obtained from the force constants :math:`F` after | ||||||
| # rearranging the terms in the potential energy operator according to the number of different modes. | ||||||
| # | ||||||
| # The :func:`~.pennylane.qchem.taylor_coeffs` function computes the coefficients :math:`\Phi` from | ||||||
| # a :class:`~.pennylane.qchem.VibrationalPES` object. | ||||||
|  | ||||||
| one, two = qml.qchem.taylor_coeffs(pes, min_deg=2, max_deg=4) | ||||||
|  | ||||||
| ###################################################################### | ||||||
| # We can then use these coefficients to construct a bosonic form of the Taylor Hamiltonian. | ||||||
|  | ||||||
| h_bosonic = qml.qchem.taylor_bosonic(coeffs=[one, two], freqs=pes.freqs, uloc=pes.uloc) | ||||||
| print(h_bosonic) | ||||||
|  | ||||||
| ###################################################################### | ||||||
| # This bosonic Hamiltonian can be mapped to the qubit basis using mapping schemes of | ||||||
| # :func:`~.pennylane.bose.binary_mapping` or :func:`~.pennylane.bose.unary_mapping` functions. | ||||||
|  | ||||||
| h_qubit = qml.binary_mapping(h_bosonic, n_states=4) | ||||||
| h_qubit | ||||||
|  | ||||||
| ###################################################################### | ||||||
| # This Hamiltonian can be used in any desired quantum algorithm in PennyLane. | ||||||
| # | ||||||
| # Note that PennyLane also provides the :func:`~.pennylane.qchem.taylor_hamiltonian` function | ||||||
| # that uses the :class:`~.pennylane.qchem.VibrationalPES` object directly and builds the qubit | ||||||
| # Taylor Hamiltonian. | ||||||
|  | ||||||
| h_taylor = qml.qchem.vibrational.taylor_hamiltonian(pes, n_states=4) | ||||||
|  | ||||||
| ###################################################################### | ||||||
| # You can verify that the two Hamiltonians are identical. | ||||||
| # | ||||||
| # Conclusion | ||||||
| # ---------- | ||||||
|         
                  soranjh marked this conversation as resolved.
              Show resolved
            Hide resolved | ||||||
| # The `qchem module <https://docs.pennylane.ai/en/latest/code/qml_qchem.html>`__ in PennyLane | ||||||
| # provides a set of tools that can be used to construct several representations of vibrational | ||||||
| # Hamiltonians. Here we learned how to use these tools to build vibrational Hamiltonians | ||||||
| # step-by-step and also use the PennyLane built-in functions to easily construct the Hamiltonians in | ||||||
| # one step. The qchem module provides | ||||||
| # `features <https://docs.pennylane.ai/en/latest/code/api/pennylane.qchem.vibrational_pes.html>`__ | ||||||
| # for constructing a vibrational potential energy surface efficiently using parallel executor | ||||||
| # options. The modular design of the vibrational features also facilitate further extension of the | ||||||
| # tools to support building other Hamiltonian types and representations and develop novel mapping | ||||||
| # methods intuitively. | ||||||
| # | ||||||
| # References | ||||||
| # ---------- | ||||||
| # | ||||||
| # .. [#loaiza] | ||||||
| # | ||||||
| # I. Loaiza *et al.*, | ||||||
| # "Simulating near-infrared spectroscopy on a quantum computer for enhanced chemical detection", | ||||||
| # arXiv:2504.10602, 2025. | ||||||
| # | ||||||
| # .. [#motlagh] | ||||||
| # | ||||||
| # D. Motlagh *et al.*, | ||||||
| # "Quantum Algorithm for Vibronic Dynamics: Case Study on Singlet Fission Solar Cell Design", | ||||||
| # arXiv:2411.13669, 2024. | ||||||
| # | ||||||
| # About the authors | ||||||
| # ----------------- | ||||||
| # | ||||||
      
      Oops, something went wrong.
        
    
  
  Add this suggestion to a batch that can be applied as a single commit.
  This suggestion is invalid because no changes were made to the code.
  Suggestions cannot be applied while the pull request is closed.
  Suggestions cannot be applied while viewing a subset of changes.
  Only one suggestion per line can be applied in a batch.
  Add this suggestion to a batch that can be applied as a single commit.
  Applying suggestions on deleted lines is not supported.
  You must change the existing code in this line in order to create a valid suggestion.
  Outdated suggestions cannot be applied.
  This suggestion has been applied or marked resolved.
  Suggestions cannot be applied from pending reviews.
  Suggestions cannot be applied on multi-line comments.
  Suggestions cannot be applied while the pull request is queued to merge.
  Suggestion cannot be applied right now. Please check back later.
  
    
  
    
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The demo simply constructs the Christiansen and Taylor hamiltonians, but doesn't actually use them in any quantum algorithm to compute the vibrational dynamics.