# Output operand requires a reduction, but reduction is not enabled

**URL:** <https://www.ruby-forum.com/t/output-operand-requires-a-reduction-but-reduction-is-not-enabled/239714>\
**Category:** GNU Radio\
**Created:** [March 11, 2014, 3:31pm UTC](https://www.ruby-forum.com/t/output-operand-requires-a-reduction-but-reduction-is-not-enabled/239714 "2014-03-11T15:31:41Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![musicdenotation](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/ea666f/32.png) [@musicdenotation](https://www.ruby-forum.com/u/musicdenotation)\
**Post date:** [March 11, 2014, 3:31pm UTC](https://www.ruby-forum.com/t/output-operand-requires-a-reduction-but-reduction-is-not-enabled/239714/1 "2014-03-11T15:31:41Z")

</div>

Thanks Martin, this is clear and makes sense. I should have read the  
numpy data types more thoroughly and worked it out. Anyway…

My collaborators are writing their Wireless Network Coding bits in  
Python. Once I get this block working, I can combined it with the relay  
work I was doing and we will have a pretty exciting setup to report!! 🙂

I have one more problem though…

I have

"out\_bA1 = output\_items[0]

…  
…code  
…

out\_bA1[0:len(est\_bA1m)] = est\_bA1m"

where

out\_bA1.shape = (1,)  
est\_bA1m.shape = (3840,)

I get the error " output operand requires a reduction, but reduction is  
not enabled"

_Sometimes_ I get

out\_bA1.shape = (2,)  
est\_bA1m.shape = (3840,)

and I get the error “operands could not be broadcast together with  
shapes (2) (3840)”

I wondered if the problem is with ‘forecast’ (which I have not changed  
since the template was created by gr\_modtool) or having to  
set\_output\_multiple? The scheduling aspect of GNU radio seems complex.

If I use

" out\_bA1 = est\_bA1m"

Then it _runs_ OK, but the output of the block i.e. output\_items[0] is  
then no longer altered and 0’s are output.

Many thanks,

David

---

<div class="post-metadata">

**Author:** ![divotdave](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/bbe5ce/32.png) [@divotdave](https://www.ruby-forum.com/u/divotdave)\
**Post date:** [March 11, 2014, 3:59pm UTC](https://www.ruby-forum.com/t/output-operand-requires-a-reduction-but-reduction-is-not-enabled/239714/2 "2014-03-11T15:59:42Z")

</div>

On 03/11/2014 03:30 PM, David Halls wrote:

> Thanks Martin, this is clear and makes sense. I should have read the  
> numpy data types more thoroughly and worked it out. Anyway…
> 
> My collaborators are writing their Wireless Network Coding bits in  
> Python. Once I get this block working, I can combined it with the relay  
> work I was doing and we will have a pretty exciting setup to report!! 🙂

That is very interesting to hear – I hope you’ll be publishing some  
papers and code around network coding!

> out\_bA1[0:len(est\_bA1m)] = est\_bA1m"
> 
> out\_bA1.shape = (2,)  
> est\_bA1m.shape = (3840,)
> 
> and I get the error “operands could not be broadcast together with  
> shapes (2) (3840)”
> 
> I wondered if the problem is with ‘forecast’ (which I have not changed  
> since the template was created by gr\_modtool) or having to  
> set\_output\_multiple? The scheduling aspect of GNU radio seems complex.

This is a Python error, basically it’s saying that the arrays have the  
wrong shapes.

Note that in your example, out\_bA1 has a limited size before you do any  
assigning. Make sure you stay within valid index ranges.

If you want to do it very fool-proof (albeit ugly), try:

for i in range(len(out\_bA1)):  
out\_bA1[i] = # whatever  
if i (matches whatever condition):  
break

> If I use
> 
> " out\_bA1 = est\_bA1m"
> 
> Then it _runs_ OK, but the output of the block i.e. output\_items[0] is  
> then no longer altered and 0’s are output.

That’s because you’re rebinding out\_bA1, and the original buffer is not  
written to.

MB

---

<div class="post-metadata">

**Author:** ![divotdave](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/bbe5ce/32.png) [@divotdave](https://www.ruby-forum.com/u/divotdave)\
**Post date:** [March 12, 2014, 9:32am UTC](https://www.ruby-forum.com/t/output-operand-requires-a-reduction-but-reduction-is-not-enabled/239714/3 "2014-03-12T09:32:30Z")

</div>

On 03/11/2014 04:24 PM, David Halls wrote:

> Please see the papers we’ve submitted so far this year. Not exactly WNC,  
> yet… We’re putting one together as we speak though.
> 
> I am not sure I understand your reply fully…
> 
> Len(out\_bA1) is only 1 or 2, so I can only set one or two elements?

Is this before or after you assign something? What’s  
len(output\_items[0])?

> How can I extend the length of out\_bA1, so I can output all of est\_bA1m?

You can’t, not in the work function. You can do things like  
set\_output\_multiple() to influence the size of the output buffer.

> Or alternatively Is it possible for me to set
> 
> “output\_items[0][0:len(est\_bA1m)] = est\_bA1m”

That would work, if len(est\_bA1m) \< len(output\_items[0]) AND they have  
the right “shape” (in matrix terms).

---

<div class="post-metadata">

**Author:** ![divotdave](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/bbe5ce/32.png) [@divotdave](https://www.ruby-forum.com/u/divotdave)\
**Post date:** [March 12, 2014, 10:14am UTC](https://www.ruby-forum.com/t/output-operand-requires-a-reduction-but-reduction-is-not-enabled/239714/4 "2014-03-12T10:14:31Z")

</div>

Hi,

Yes, the len(output\_items[0]), is either 1 or 2…

If I set\_output\_multiple to 10, then this value raises to 10.

It is dominated by the fact that one of the inputs to my block is much  
lower than the other?? Input[0] is the data stream and has say 768  
items, input[1] is the packet average SNR, so it only has 1 or 2 items  
in the same period.

Forecast is currently

```
    For I in range (len(ninput_items_required)):
            Ninput_items_required[i] = noutput_items

```

Does this need to be altered for my case where I have two inputs with  
very different requirements.

If I ever get my head around the scheduler in GNU radio, it will be a  
happy day 🙂

D

---

<div class="post-metadata">

**Author:** ![divotdave](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/bbe5ce/32.png) [@divotdave](https://www.ruby-forum.com/u/divotdave)\
**Post date:** [March 12, 2014, 10:24am UTC](https://www.ruby-forum.com/t/output-operand-requires-a-reduction-but-reduction-is-not-enabled/239714/5 "2014-03-12T10:24:16Z")

</div>

On 11.03.2014 17:10, David Halls wrote:

> Hi,
> 
> Yes, the len(output\_items[0]), is either 1 or 2…
> 
> If I set\_output\_multiple to 10, then this value raises to 10.

Can you post the entire block code?

M

---

<div class="post-metadata">

**Author:** ![divotdave](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/bbe5ce/32.png) [@divotdave](https://www.ruby-forum.com/u/divotdave)\
**Post date:** [March 28, 2014, 12:38pm UTC](https://www.ruby-forum.com/t/output-operand-requires-a-reduction-but-reduction-is-not-enabled/239714/6 "2014-03-28T12:38:24Z")

</div>

Hi Martin,

Sorry for the very slow reply. Life is hectic here!

I found that if I removed the SNR input, that provides many few inputs  
that the other (its an SNR value _per packet_, so there is only 1 input  
item to this for every 768 to the other input), the output buffer  
increases to

Out\_bA1.shape(512,)  
Est\_bA1m.shape(3840,)  
Len(out\_bA1) = 512

So the output buffer seems dominated by the input that has fewer items  
coming in???

I managed to resolve the problem completely by changing

Ninput\_items\_required[i] = noutput\_items/pow(2,13)

In ‘forecast’, perhaps there are more elegant solutions, but this seems  
to work fine (there is only one output).

Regards,

David
