Repository: AgnostiqHQ/covalent (python)

Issue:
Overloading the `__pow__` method in Electron class
Something as simple as the following would fail to dispatch right now because Electron class doesn't have the `__pow__` method defined similar to `__add__`, `__mul__`, etc.. Adding that would solve the issue.

```python
@ct.electron
def g(x):
    return 42 * x

@ct.lattice
def workflow(x):
    res = g(x)
    return res ** 2
```

Pull request:
fixes #1835
<!--
⚠️ Your pull request title should be short detailed and understandable for all.
⚠️ Add a note to /CHANGELOG.md summarizing the changes.
⚠️ If your pull request fixes an open issue, please link to the issue.
⚠️ Ensure that your branch is up-to-date with the base branch.
-->
#1835 
- [x] I have added the tests to cover my changes.
- [x] I have updated the documentation and CHANGELOG accordingly.
- [x] I have read the CONTRIBUTING document.


Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9dc84c08..756d14cf 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -35,6 +35,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 ### Added
 
 - Documentation and test cases for database triggers.
+- Added the `__pow__` method to the `Electron` class
 
 ### Docs
 
diff --git a/covalent/_workflow/electron.py b/covalent/_workflow/electron.py
index 05e4ee6d..d8697d83 100644
--- a/covalent/_workflow/electron.py
+++ b/covalent/_workflow/electron.py
@@ -155,6 +155,7 @@ class Electron:
             "-": operator.sub,
             "*": operator.mul,
             "/": operator.truediv,
+            "**": operator.pow,
         }
 
         def rename(op1: Any, op: str, op2: Any) -> Callable:
@@ -243,6 +244,9 @@ class Electron:
     def __rtruediv__(self, other):
         return self.get_op_function(other, self, "/")
 
+    def __pow__(self, other):
+        return self.get_op_function(self, other, "**")
+
     def __int__(self):
         return int()
 


Test patch:
diff --git a/tests/covalent_tests/workflow/electron_test.py b/tests/covalent_tests/workflow/electron_test.py
index 18d6cedc..5b9f45a7 100644
--- a/tests/covalent_tests/workflow/electron_test.py
+++ b/tests/covalent_tests/workflow/electron_test.py
@@ -17,7 +17,7 @@
 """Unit tests for electron"""
 
 import json
-from unittest.mock import MagicMock
+from unittest.mock import ANY, MagicMock
 
 import pytest
 
@@ -655,3 +655,22 @@ def test_replace_electrons():
     assert (
         workflow.transport_graph.get_node_value(0, "status") == RESULT_STATUS.PENDING_REPLACEMENT
     )
+
+
+def test_electron_pow_method(mocker):
+    mock_electron_get_op_function = mocker.patch.object(
+        Electron, "get_op_function", return_value=Electron
+    )
+
+    @ct.electron
+    def g(x):
+        return 42 * x
+
+    @ct.lattice
+    def workflow(x):
+        res = g(x)
+        return res**2
+
+    workflow.build_graph(2)
+
+    mock_electron_get_op_function.assert_called_with(ANY, 2, "**")