Coverage for src/fad/Matrices.py : 23%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1#!/usr/bin/env python3
3import numpy as np
4from FADiff import FADiff
7class Vect:
8 def __init__(self, vect, der=None, parents=[], name=None, new_input=False):
9 self._val = np.array(vect)
10 if new_input:
11 self._der = {}
12 for vec_var in FADiff._fadvect_inputs:
13 self._der[vec_var] = 0
14 vec_var._der[self] = 0
15 self._der[self] = der * np.identity(len(vect))
16 FADiff._fadvect_inputs.append(self)
17 else:
18 self._der = der
19 self._name = name # TODO: Utilize if have time?
20 self._parents = parents
22 def __sub__(self, other):
23 try:
24 der = {}
25 for var, part_der in self._der.items():
26 der[var] = part_der - other._der.get(var)
27 parents = self._set_parents(self, other)
28 return Vect(self._val - other._val, der, parents)
29 except AttributeError:
30 parents = self._set_parents(self)
31 return Vect(self._val - other, self._der, parents)
33 def __rsub__(self, other):
34 return self.__sub__(other)
36 @property
37 def val(self):
38 return [self._val]
40 @property
41 def der(self):
42 '''Returns partial derivatives wrt all root input vars used'''
43 parents = []
44 for var, part_der in self._der.items():
45 if var in self._parents:
46 parents.append(part_der)
47 if parents: # For output vars
48 return parents
49 elif self in FADiff._fadvect_inputs: # For input vars (no parents)
50 return [self._der[self]]
52 @staticmethod
53 def _set_parents(var1, var2=None):
54 '''Sets parent/grandparent vars used (including root input vars)'''
55 parents = []
56 parents.append(var1)
57 for parent in var1._parents:
58 parents.append(parent)
59 if var2:
60 parents.append(var2)
61 for parent in var2._parents:
62 parents.append(parent)
63 parents = list(set(parents))
64 return parents