ptII icon indicating copy to clipboard operation
ptII copied to clipboard

Check multiport output actors for width and avoid "width ... cannot be uniquely inferred"

Open cxbrooks opened this issue 15 years ago • 1 comments

Note: the issue was created automatically with bugzilla2github tool

Original bug ID: BZ#351 From: @cxbrooks Reported version: 8.1.devel CC: [email protected]

cxbrooks avatar Sep 23 '10 08:09 cxbrooks

I discussed this with Edward and he said that the problem was with actor that were written in a certain style where the output port was a multiport and we used broadcast() on the port.

I searched the tree for all java files that contained both setMultiport and broadcast:

bash-3.2$ cd ~/ptII bash-3.2$ $PTII/adm/bin/ptIItxtfiles > /tmp/f bash-3.2$ grep .java /tmp/f > /tmp/j bash-3.2$ cat /tmp/j | xargs grep broadcast | awk '{print $1}' > /tmp/b.1 bash-3.2$ cat /tmp/j | xargs grep setMultiport | awk '{print $1}' > /tmp/m.1 bash-3.2$ comm -12 /tmp/b.1 /tmp/m.1 ./ptolemy/actor/lib/Accumulator.java: ./ptolemy/actor/lib/conversions/StringToXML.java: ./ptolemy/actor/lib/conversions/StringToXML.java: ./ptolemy/actor/lib/image/ImageReader.java: ./ptolemy/actor/lib/net/DatagramReader.java: ./ptolemy/actor/lib/net/DatagramWriter.java: ./ptolemy/actor/lib/net/DatagramWriter.java: ./ptolemy/actor/lib/security/KeyReader.java: ./ptolemy/actor/lib/x10/ApplianceController.java: ./ptolemy/actor/lib/x10/ApplianceController.java: ./ptolemy/actor/lib/x10/LampController.java: ./ptolemy/actor/lib/x10/LampController.java: ./ptolemy/actor/lib/xslt/XMLInclusion.java: ./ptolemy/actor/lib/xslt/XSLTransformer.java: ./ptolemy/actor/lib/xslt/XSLTransformer.java: ./ptolemy/actor/ptalon/lib/SplitReader.java: ./ptolemy/actor/test/IdentityActor.java: ./ptolemy/backtrack/automatic/ptolemy/actor/lib/Accumulator.java: ./ptolemy/domains/ci/lib/BackDropQueue.java: ./ptolemy/domains/ci/lib/BackDropQueue.java: ./ptolemy/domains/ci/lib/FrontDropQueue.java: ./ptolemy/domains/ci/lib/FrontDropQueue.java: ./ptolemy/domains/ci/lib/Queue.java: ./ptolemy/domains/ci/lib/Queue.java: ./ptolemy/domains/ct/demo/Helicopter/AccelerLinearizer.java: ./ptolemy/domains/ct/demo/Helicopter/AccelerLinearizer.java: ./ptolemy/domains/ct/demo/Helicopter/AccelerLinearizer.java: ./ptolemy/domains/ct/demo/Helicopter/AccelerLinearizer.java: ./ptolemy/domains/ct/demo/Helicopter/ClimbLinearizer.java: ./ptolemy/domains/ct/demo/Helicopter/ClimbLinearizer.java: ./ptolemy/domains/ct/demo/Helicopter/ClimbLinearizer.java: ./ptolemy/domains/ct/demo/Helicopter/ClimbLinearizer.java: ./ptolemy/domains/ct/demo/Helicopter/ControllerActor.java: ./ptolemy/domains/ct/demo/Helicopter/ControllerActor.java: ./ptolemy/domains/ct/demo/Helicopter/CruiseLinearizer.java: ./ptolemy/domains/ct/demo/Helicopter/CruiseLinearizer.java: ./ptolemy/domains/ct/demo/Helicopter/CruiseLinearizer.java: ./ptolemy/domains/ct/demo/Helicopter/CruiseLinearizer.java: ./ptolemy/domains/ct/demo/Helicopter/HelicopterActor.java: ./ptolemy/domains/ct/demo/Helicopter/HelicopterActor.java: ./ptolemy/domains/ct/demo/Helicopter/HelicopterActor.java: ./ptolemy/domains/ct/demo/Helicopter/HoverLinearizer.java: ./ptolemy/domains/ct/demo/Helicopter/HoverLinearizer.java: ./ptolemy/domains/ct/demo/Helicopter/HoverLinearizer.java: ./ptolemy/domains/ct/demo/Helicopter/HoverLinearizer.java: ./ptolemy/domains/ct/demo/Helicopter/XZHigherDerivatives.java: ./ptolemy/domains/ct/demo/Helicopter/XZHigherDerivatives.java: ./ptolemy/domains/ct/demo/Helicopter/XZHigherDerivatives.java: ./ptolemy/domains/ct/demo/Helicopter/XZHigherDerivatives.java: ./ptolemy/domains/dde/kernel/test/TwoPut.java: ./ptolemy/domains/dde/lib/DoubleFork.java: ./ptolemy/domains/de/lib/Derivative.java: ./ptolemy/domains/de/lib/Integrator.java: ./ptolemy/domains/de/lib/PID.java: ./ptolemy/domains/sdf/lib/SequenceToArray.java: ./ptolemy/domains/taskpt/lib/Alloc.java: ./ptolemy/domains/taskpt/lib/ChangePtr.java: ./ptolemy/domains/wireless/lib/network/mac/FilterMpdu.java: bash-3.2$

Of these, only StringToXML had the problem.

However the above test did not catch AudioCapture because AudioCapture does not call broadcast.

On 9/17/10 1:49 PM, Christopher Brooks wrote:

Hi Bert, Thanks! That was the fix.

I modified the exception:

ptolemy.kernel.util.IllegalActionException: The width of relation .AudioPlotterWidthProblem.relation can not be uniquely inferred. Please make the width inference deterministic by explicitly specifying the width of this relation. In the user interface, right click on the relation, select Configure and change the width. Note that some actors may need to have their Java code updated to call setDefaultWidth(1) on the output port. The relation is deeply connected to these ports: ptolemy.actor.TypedIOPort {.AudioPlotterWidthProblem.AudioCapture.output}ptolemy.actor.TypedIOPort {.AudioPlotterWidthProblem.SequenceScope.input} in .AudioPlotterWidthProblem.relation at ptolemy.actor.RelationWidthInference.inferWidths(RelationWidthInference.java:396) at ptolemy.actor.CompositeActor.inferWidths(CompositeActor.java:773) at ptolemy.actor.IORelation.getWidth(IORelation.java:321) at ptolemy.actor.IOPort._getWidth(IOPort.java:1694) at ptolemy.actor.IOPort.createReceivers(IOPort.java:566) at ptolemy.actor.AtomicActor.createReceivers(AtomicActor.java:227) at ptolemy.actor.Director._createReceivers(Director.java:1627) at ptolemy.actor.Director.preinitialize(Director.java:991) at ptolemy.domains.sdf.kernel.SDFDirector.preinitialize(SDFDirector.java:640) at ptolemy.actor.CompositeActor.preinitialize(CompositeActor.java:1727) at ptolemy.actor.Manager.preinitializeAndResolveTypes(Manager.java:983) at ptolemy.actor.Manager.initialize(Manager.java:643) at ptolemy.actor.Manager.execute(Manager.java:340) at ptolemy.actor.Manager.run(Manager.java:1164) at ptolemy.actor.Manager$3.run(Manager.java:1217)

One interesting question is: Should we be calling setDefaultWidth(1) on other actors? The following actors in actor.lib call setMultiport(true). Should any of them have their default widths set?

Accumulator.java: input.setMultiport(true); Accumulator.java: reset.setMultiport(true); AddSubtract.java: plus.setMultiport(true); AddSubtract.java: minus.setMultiport(true); ArrayAppend.java: input.setMultiport(true); ArrayToElements.java: output.setMultiport(true); BooleanSelect.java: trueInput.setMultiport(true); BooleanSelect.java: falseInput.setMultiport(true); BooleanSelect.java: output.setMultiport(true); BooleanSwitch.java: input.setMultiport(true); BooleanSwitch.java: trueOutput.setMultiport(true); BooleanSwitch.java: falseOutput.setMultiport(true); BusAssembler.java: output.setMultiport(true); BusDisassembler.java: input.setMultiport(true); Commutator.java: input.setMultiport(true); ConfigurationSelect.java: trueInput.setMultiport(true); ConfigurationSelect.java: falseInput.setMultiport(true); ConfigurationSelect.java: output.setMultiport(true); ConfigurationSwitch.java: input.setMultiport(true); ConfigurationSwitch.java: trueOutput.setMultiport(true); ConfigurationSwitch.java: falseOutput.setMultiport(true); Distributor.java: output.setMultiport(true); ElementsToArray.java: input.setMultiport(true); LinearDifferenceEquationSystem.java: input.setMultiport(false); LinearDifferenceEquationSystem.java: output.setMultiport(false); MaxIndex.java: input.setMultiport(true); Maximum.java: input.setMultiport(true); Maximum.java: maximumValue.setMultiport(true); Maximum.java: channelNumber.setMultiport(true); Minimum.java: input.setMultiport(true); Minimum.java: minimumValue.setMultiport(true); Minimum.java: channelNumber.setMultiport(true); Multiplexor.java: input.setMultiport(true); MultiplyDivide.java: multiply.setMultiport(true); MultiplyDivide.java: divide.setMultiport(true); NonStrictTest.java: input.setMultiport(false); Publisher.java: input.setMultiport(true); Publisher.java: output.setMultiport(true); PublisherNonStrictTest.java: input.setMultiport(false); PublisherTest.java: input.setMultiport(true); Reader.java: output.setMultiport(true); Sampler.java: input.setMultiport(true); Sampler.java: output.setMultiport(true); Select.java: input.setMultiport(true); SingleTokenCommutator.java: input.setMultiport(true); Sink.java: input.setMultiport(true); Sleep.java: input.setMultiport(true); Sleep.java: output.setMultiport(true); Source.java: trigger.setMultiport(true); Subscriber.java: input.setMultiport(true); Subscriber.java: output.setMultiport(true); SubscriptionAggregator.java: output.setMultiport(false); Switch.java: output.setMultiport(true); Synchronizer.java: input.setMultiport(true); Synchronizer.java: output.setMultiport(true); Test.java: input.setMultiport(true); URLReader.java: output.setMultiport(true); VariableSleep.java: input.setMultiport(true); VariableSleep.java: output.setMultiport(true); VectorAssembler.java: input.setMultiport(true); VectorAssembler.java: output.setMultiport(false); VectorDisassembler.java: input.setMultiport(false); VectorDisassembler.java: output.setMultiport(true); WallClockTime.java: passThrough.setMultiport(true);

_Christopher

On 9/17/10 12:35 AM, Bert Rodiers wrote:

Hello Christopher,

I can't access any code here, but I was wondering whether the output of this component should be a multiport. If not and you don't want to change this to not break any existing models, you should threat this actor the same way as the Minimum Actor. See http://www.eecs.berkeley.edu/Pubs/TechRpts/2010/EECS-2010-120.pdf for details.

Regards, Bert

On Fri, Sep 17, 2010 at 4:27 AM, Christopher Brooks <cxh@ eecs.berkeley.edu <mailto:cxh@ eecs.berkeley.edu>> wrote:

Connecting an AudioCapture to a SequenceScope results in a width error?

ptolemy.kernel.util.IllegalActionException: The width of relation ..relation can not be uniquely inferred. Please make the width inference deterministic by explicitly specifying the width of this relation.The relation is deeply connected to these ports: ptolemy.actor.TypedIOPort {..AudioCapture.output}ptolemy.actor.TypedIOPort {..SequenceScope.input} in .<Unnamed Object>.relation at ptolemy.actor.RelationWidthInference.inferWidths(RelationWidthInference.java:396) at ptolemy.actor.CompositeActor.inferWidths(CompositeActor.java:773) at ptolemy.actor.IORelation.getWidth(IORelation.java:321) at ptolemy.actor.IOPort._getWidth(IOPort.java:1694) at ptolemy.actor.IOPort.createReceivers(IOPort.java:566) at ptolemy.actor.AtomicActor.createReceivers(AtomicActor.java:227) at ptolemy.actor.Director._createReceivers(Director.java:1615) at ptolemy.actor.Director.preinitialize(Director.java:982) at ptolemy.domains.sdf.kernel.SDFDirector.preinitialize(SDFDirector.java:640) at ptolemy.actor.CompositeActor.preinitialize(CompositeActor.java:1727) at ptolemy.actor.Manager.preinitializeAndResolveTypes(Manager.java:983) at ptolemy.actor.Manager.initialize(Manager.java:643) at ptolemy.actor.Manager.execute(Manager.java:340) at ptolemy.actor.Manager.run(Manager.java:1164) at ptolemy.actor.Manager$3.run(Manager.java:1217)

The width should probably default to 1?

cxbrooks avatar Sep 23 '10 08:09 cxbrooks