Source code for afnio.autodiff.graph
from typing import NamedTuple, Optional, Tuple
[docs]
class Node:
def __init__(self, next_functions: Optional[Tuple["GradientEdge"]] = None):
self._next_functions = next_functions if next_functions else ()
self._name = None
self.node_id = None
def __repr__(self):
return f"<afnio.autodiff.function.{self.name()} object at {hex(id(self))}>"
def __str__(self):
return f"<{self.name()} object at {hex(id(self))}>"
[docs]
def apply(self, *args):
raise NotImplementedError("Subclasses should implement this method.")
[docs]
def name(self) -> str:
r"""Return the name.
Example::
>>> import afnio
>>> import afnio.cognitive.functional as F
>>> a = hf.Variable("Hello,", requires_grad=True)
>>> b = hf.Variable("world!", requires_grad=True)
>>> c = F.sum([a, b])
>>> assert isinstance(c.grad_fn, afnio.autodiff.graph.Node)
>>> print(c.grad_fn.name())
SumBackward0
"""
return self._name
@property
def next_functions(self) -> Tuple["GradientEdge"]:
return self._next_functions
@next_functions.setter
def next_functions(self, edges: Tuple["GradientEdge", ...]):
self._next_functions = edges
[docs]
class GradientEdge(NamedTuple):
"""Object representing a given gradient edge within the autodiff graph.
To get the gradient edge where a given Variable gradient will be computed,
you can do ``edge = autodiff.graph.get_gradient_edge(variable)``.
"""
node: Node
output_nr: int
def __repr__(self):
name = (
f"<{self.node.name()} object at {hex(id(self.node))}>"
if self.node
else "None"
)
return f"({name}, {self.output_nr})"
def __str__(self):
name = (
f"<{self.node.name()} object at {hex(id(self.node))}>"
if self.node
else "None"
)
return f"({name}, {self.output_nr})"