

====
Tips
====


Reusing outputs
===============

WRITEME


Don't define new Ops unless you have to
=======================================

It is usually not useful to define Ops that can be easily
implemented using other already existing Ops. For example, instead of
writing a "sum_square_difference" Op, you should probably just write a
simple function:

.. testcode::

   from theano import tensor as tt

   def sum_square_difference(a, b):
       return tt.sum((a - b)**2)

Even without taking Theano's optimizations into account, it is likely
to work just as well as a custom implementation. It also supports all
data types, tensors of all dimensions as well as broadcasting, whereas
a custom implementation would probably only bother to support
contiguous vectors/matrices of doubles...


Use Theano's high order Ops when applicable
===========================================

Theano provides some generic Op classes which allow you to generate a
lot of Ops at a lesser effort. For instance, Elemwise can be used to
make :term:`elementwise` operations easily whereas DimShuffle can be
used to make transpose-like transformations. These higher order Ops
are mostly Tensor-related, as this is Theano's specialty.


.. _opchecklist:

Op Checklist
============

Use this list to make sure you haven't forgotten anything when
defining a new Op. It might not be exhaustive but it covers a lot of
common mistakes.

WRITEME
