Skip to content
This repository was archived by the owner on Dec 2, 2023. It is now read-only.
This repository was archived by the owner on Dec 2, 2023. It is now read-only.

AttributeError: 'NoneType' object has no attribute 'sum' #73

Description

@mrocklin

I'm probably doing something silly here, but I was confused by this error:

In [1]: import tangent

In [2]: import numpy as np

In [3]: def f(x):
   ...:     return np.exp(x).sum() + 1
   ...: 
   ...: df = tangent.grad(f)
   ...: 
   ...: 
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-3-2246896ce926> in <module>()
      2     return np.exp(x).sum() + 1
      3 
----> 4 df = tangent.grad(f)

~/workspace/tangent/tangent/grad_util.py in grad(func, wrt, optimized, preserve_result, check_dims, verbose)
    386       check_dims=check_dims,
    387       input_derivative=INPUT_DERIVATIVE.DefaultOne,
--> 388       verbose=verbose)
    389 
    390 

~/workspace/tangent/tangent/grad_util.py in autodiff(func, wrt, optimized, motion, mode, preserve_result, check_dims, input_derivative, verbose)
    290   # Generate the derivative
    291   node, namespace = autodiff_tree(func, wrt, motion, mode, preserve_result,
--> 292                                   check_dims, verbose)
    293 
    294   if mode == 'reverse' and motion == 'joint':

~/workspace/tangent/tangent/grad_util.py in autodiff_tree(func, wrt, motion, mode, preserve_result, check_dims, verbose)
    144 
    145   node, required = autodiff_ast(func, wrt, motion, mode, preserve_result,
--> 146                                 check_dims, verbose)
    147   final.body.extend(node.body)
    148 

~/workspace/tangent/tangent/grad_util.py in autodiff_ast(func, wrt, motion, mode, preserve_result, check_dims, verbose)
     88         for the returned function to run.
     89   """
---> 90   node = annotate.resolve_calls(func)
     91   node = desugar.explicit_loop_indexes(node)
     92   fence.validate(node, inspect.getsource(func))

~/workspace/tangent/tangent/annotate.py in resolve_calls(func)
    108   """
    109   node = quoting.parse_function(func)
--> 110   ResolveCalls(func).visit(node)
    111   return node
    112 

~/Software/miniconda/lib/python3.6/ast.py in visit(self, node)
    251         method = 'visit_' + node.__class__.__name__
    252         visitor = getattr(self, method, self.generic_visit)
--> 253         return visitor(node)
    254 
    255     def generic_visit(self, node):

~/Software/miniconda/lib/python3.6/ast.py in generic_visit(self, node)
    259                 for item in value:
    260                     if isinstance(item, AST):
--> 261                         self.visit(item)
    262             elif isinstance(value, AST):
    263                 self.visit(value)

~/Software/miniconda/lib/python3.6/ast.py in visit(self, node)
    251         method = 'visit_' + node.__class__.__name__
    252         visitor = getattr(self, method, self.generic_visit)
--> 253         return visitor(node)
    254 
    255     def generic_visit(self, node):

~/workspace/tangent/tangent/annotate.py in visit_FunctionDef(self, node)
     43 
     44   def visit_FunctionDef(self, node):
---> 45     self.generic_visit(node)
     46     anno.setanno(node, 'func', self.func)
     47 

~/Software/miniconda/lib/python3.6/ast.py in generic_visit(self, node)
    259                 for item in value:
    260                     if isinstance(item, AST):
--> 261                         self.visit(item)
    262             elif isinstance(value, AST):
    263                 self.visit(value)

~/Software/miniconda/lib/python3.6/ast.py in visit(self, node)
    251         method = 'visit_' + node.__class__.__name__
    252         visitor = getattr(self, method, self.generic_visit)
--> 253         return visitor(node)
    254 
    255     def generic_visit(self, node):

~/Software/miniconda/lib/python3.6/ast.py in generic_visit(self, node)
    261                         self.visit(item)
    262             elif isinstance(value, AST):
--> 263                 self.visit(value)
    264 
    265 

~/Software/miniconda/lib/python3.6/ast.py in visit(self, node)
    251         method = 'visit_' + node.__class__.__name__
    252         visitor = getattr(self, method, self.generic_visit)
--> 253         return visitor(node)
    254 
    255     def generic_visit(self, node):

~/Software/miniconda/lib/python3.6/ast.py in generic_visit(self, node)
    261                         self.visit(item)
    262             elif isinstance(value, AST):
--> 263                 self.visit(value)
    264 
    265 

~/Software/miniconda/lib/python3.6/ast.py in visit(self, node)
    251         method = 'visit_' + node.__class__.__name__
    252         visitor = getattr(self, method, self.generic_visit)
--> 253         return visitor(node)
    254 
    255     def generic_visit(self, node):

~/workspace/tangent/tangent/annotate.py in visit_Call(self, node)
     64                     node.id, self.func.__name__))
     65 
---> 66     func = resolve(node.func)
     67     # If the user has used the @tangent.trace decorator,
     68     # then we'll switch to tracing the function.

~/workspace/tangent/tangent/annotate.py in resolve(node)
     51     def resolve(node):
     52       if isinstance(node, gast.Attribute):
---> 53         return getattr(resolve(node.value), node.attr)
     54       if isinstance(node, gast.Name):
     55         if node.id in self.namespace:

AttributeError: 'NoneType' object has no attribute 'sum'

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions