提交 a035ef7a authored 作者: gdesjardins's avatar gdesjardins

Changed interface of incsubtensor (removed set_instead_of_inc parameter) and

instead created setsubtensor function. Also added python and rst documentation.
上级 af804be5
...@@ -610,9 +610,12 @@ row of a matrix x: ...@@ -610,9 +610,12 @@ row of a matrix x:
>>> x[T.arange(c.shape[0]), c] >>> x[T.arange(c.shape[0]), c]
Index-assignment is *not* supported. Index-assignment is *not* supported. If you want to do something like ``a[5]
If you want to do something like ``a[5] = b`` or ``a[5]+=b``, see :func:`setsubtensor`. = b`` or ``a[5]+=b``, see :func:`setsubtensor` and :func:`incsubtensor` below.
.. autofunction:: theano.tensor.basic.setsubtensor
.. autofunction:: theano.tensor.basic.incsubtensor
.. _tensor_operator_support: .. _tensor_operator_support:
......
...@@ -2260,10 +2260,31 @@ class SubtensorPrinter: ...@@ -2260,10 +2260,31 @@ class SubtensorPrinter:
pprint.assign(lambda pstate, r: r.owner and isinstance(r.owner.op, Subtensor), SubtensorPrinter()) pprint.assign(lambda pstate, r: r.owner and isinstance(r.owner.op, Subtensor), SubtensorPrinter())
def setsubtensor(x, y, idx_list, inplace=False):
"""
setsubtensor is meant to replicate the following numpy behaviour: x[i,j,k] = y
:param x: symbolic variable for the lvalue of = operation
:param y: symbolic variable for the rvalue of = operation
:param idx_list: tuple of length x.dim, containing indices with which to index x.
:param inplace: boolean to declare whether the operation is in place or not (False unless
called from within an optimization)
:Details: idx_list can be a tuple containing a mixture of numeric constants, symbolic
scalar values and standard numpy slice objects. i.e:
idx_list=(1,2,3), idx_list=(1,b,3) where b is an iscalar variable,
idx_list=(slice(start,stop,step),b,3) equivalent to x[start:stop:step, b, 3]
"""
the_op = IncSubtensor(idx_list, inplace, True)
return the_op(x, y, *Subtensor.collapse(idx_list, lambda entry: isinstance(entry, Variable)))
def incsubtensor(x, y, idx_list, inplace=False):
"""
incsubtensor is meant to replicate the following numpy behaviour: x[i,j,k] += y
def incsubtensor(x, y, idx_list, inplace=False, set_instead_of_inc=False): :see: theano.tensor.basic.setsubtensor
the_op = IncSubtensor(idx_list, inplace, set_instead_of_inc) """
the_op = IncSubtensor(idx_list, inplace, False)
return the_op(x, y, *Subtensor.collapse(idx_list, lambda entry: isinstance(entry, Variable))) return the_op(x, y, *Subtensor.collapse(idx_list, lambda entry: isinstance(entry, Variable)))
class IncSubtensor(Op): class IncSubtensor(Op):
......
...@@ -28,8 +28,13 @@ class Test_incsubtensor(unittest.TestCase): ...@@ -28,8 +28,13 @@ class Test_incsubtensor(unittest.TestCase):
sl2 = slice(sl2_end) sl2 = slice(sl2_end)
for do_set in [False,True]: for do_set in [False,True]:
a_incremented = T.incsubtensor(a, increment, [sl1, sl2], set_instead_of_inc=do_set)
f = theano.function([a, increment, sl2_end], a_incremented) if do_set:
resut = T.setsubtensor(a, increment, [sl1, sl2])
else:
resut = T.incsubtensor(a, increment, [sl1, sl2])
f = theano.function([a, increment, sl2_end], resut)
val_a = N.ones((5,5)) val_a = N.ones((5,5))
val_inc = 2.3 val_inc = 2.3
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论