constraints for elemwise operations are added during construction
new approach to infering shapes
set shape to an expression if it cant be evaluated now
memoization optimization - the same rules-vector is not safed again and again by memoization
added matrix-chain-multiplication optimization
not applicable rules are skipped in apply-rules
improvements to differentiation
cleaned up repo