The Altair Community is migrating to a new platform to provide a better experience for you. In preparation for the migration, the Altair Community is on read-only mode from October 28 - November 6, 2024. Technical support via cases will continue to work as is. For any urgent requests from Students/Faculty members, please submit the form linked here
"Can I break the loop attributes prematurely?"
Dear all,
Can I break the loop attributes prematurely?
Alternatively, can I use some other loop operator that builds the resulting dataset in a similar way to loop attributes?
E.g.
Loop over all attributes, unless a certain amount of time has passed, then stop the loop and continue the process.
Best regards,
Wessel
Can I break the loop attributes prematurely?
Alternatively, can I use some other loop operator that builds the resulting dataset in a similar way to loop attributes?
E.g.
Loop over all attributes, unless a certain amount of time has passed, then stop the loop and continue the process.
Best regards,
Wessel
Tagged:
0
Answers
The Loop operator has a "limit time" option. You'd have to work at it but I suppose it would be possible.
regards
Andrew
To make it fail you can use a branch operator to send an empty data set into the example output so nothing will come back through for the loop.
In my example my criteria was just "%{loop_attribute}"=="att5". Hope that helps!
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<process version="6.1.000">
<context>
<input/>
<output/>
<macros/>
</context>
<operator activated="true" class="process" compatibility="6.1.000" expanded="true" name="Process">
<process expanded="true">
<operator activated="true" class="generate_data_user_specification" compatibility="6.1.000" expanded="true" height="60" name="Generate Data by User Specification" width="90" x="45" y="30">
<list key="attribute_values">
<parameter key="att1" value="1"/>
<parameter key="att2" value="1"/>
<parameter key="att3" value="1"/>
<parameter key="att4" value="1"/>
<parameter key="att5" value="1"/>
<parameter key="att6" value="1"/>
<parameter key="att7" value="1"/>
</list>
<list key="set_additional_roles"/>
</operator>
<operator activated="true" class="handle_exception" compatibility="6.1.000" expanded="true" height="76" name="Handle Exception" width="90" x="179" y="30">
<process expanded="true">
<operator activated="true" class="loop_attributes" compatibility="6.1.000" expanded="true" height="94" name="Loop Attributes" width="90" x="112" y="30">
<process expanded="true">
<operator activated="true" class="select_attributes" compatibility="6.1.000" expanded="true" height="76" name="Select Attributes" width="90" x="112" y="30">
<parameter key="attribute_filter_type" value="single"/>
<parameter key="attribute" value="%{loop_attribute}"/>
</operator>
<operator activated="true" class="branch" compatibility="6.1.000" expanded="true" height="94" name="Branch (2)" width="90" x="313" y="30">
<parameter key="condition_type" value="expression"/>
<parameter key="condition_value" value=""%{loop_attribute}"=="att5""/>
<process expanded="true">
<operator activated="true" class="remember" compatibility="6.1.000" expanded="true" height="60" name="Remember" width="90" x="112" y="30">
<parameter key="name" value="Test"/>
</operator>
<connect from_port="condition" to_op="Remember" to_port="store"/>
<connect from_op="Remember" from_port="stored" to_port="input 2"/>
<portSpacing port="source_condition" spacing="0"/>
<portSpacing port="source_input 1" spacing="0"/>
<portSpacing port="source_input 2" spacing="0"/>
<portSpacing port="sink_input 1" spacing="0"/>
<portSpacing port="sink_input 2" spacing="0"/>
<portSpacing port="sink_input 3" spacing="0"/>
</process>
<process expanded="true">
<connect from_port="input 1" to_port="input 1"/>
<portSpacing port="source_condition" spacing="0"/>
<portSpacing port="source_input 1" spacing="0"/>
<portSpacing port="source_input 2" spacing="0"/>
<portSpacing port="sink_input 1" spacing="0"/>
<portSpacing port="sink_input 2" spacing="0"/>
<portSpacing port="sink_input 3" spacing="0"/>
</process>
</operator>
<connect from_port="example set" to_op="Select Attributes" to_port="example set input"/>
<connect from_op="Select Attributes" from_port="example set output" to_op="Branch (2)" to_port="condition"/>
<connect from_op="Select Attributes" from_port="original" to_op="Branch (2)" to_port="input 1"/>
<connect from_op="Branch (2)" from_port="input 1" to_port="example set"/>
<connect from_op="Branch (2)" from_port="input 2" to_port="result 1"/>
<portSpacing port="source_example set" spacing="0"/>
<portSpacing port="sink_example set" spacing="0"/>
<portSpacing port="sink_result 1" spacing="0"/>
<portSpacing port="sink_result 2" spacing="0"/>
</process>
</operator>
<connect from_port="in 1" to_op="Loop Attributes" to_port="example set"/>
<connect from_op="Loop Attributes" from_port="example set" to_port="out 1"/>
<portSpacing port="source_in 1" spacing="0"/>
<portSpacing port="source_in 2" spacing="0"/>
<portSpacing port="sink_out 1" spacing="0"/>
<portSpacing port="sink_out 2" spacing="0"/>
</process>
<process expanded="true">
<connect from_port="in 1" to_port="out 1"/>
<portSpacing port="source_in 1" spacing="0"/>
<portSpacing port="source_in 2" spacing="0"/>
<portSpacing port="sink_out 1" spacing="0"/>
<portSpacing port="sink_out 2" spacing="0"/>
</process>
</operator>
<operator activated="true" class="recall" compatibility="6.1.000" expanded="true" height="60" name="Recall" width="90" x="313" y="30">
<parameter key="name" value="Test"/>
</operator>
<connect from_op="Generate Data by User Specification" from_port="output" to_op="Handle Exception" to_port="in 1"/>
<connect from_op="Recall" from_port="result" to_port="result 1"/>
<portSpacing port="source_input 1" spacing="0"/>
<portSpacing port="sink_result 1" spacing="0"/>
<portSpacing port="sink_result 2" spacing="0"/>
</process>
</operator>
</process>
I was aware of this option.
But the output from "Loop Attributes" is special.
It doesn't create a collection of "resulting example sets".
Instead it continuously keeps adding columns.
In my result I really need 1 dataset to be the result, not a collection of datasets.
edit:
Currently playing around with the handle exception, as suggested by bkriever, I'll update later.
Any suggestions?
Best regards,
Wessel
<process version="5.3.015">
<context>
<input/>
<output/>
<macros/>
</context>
<operator activated="true" class="process" compatibility="5.3.015" expanded="true" name="Process">
<process expanded="true">
<operator activated="true" class="generate_data" compatibility="5.3.015" expanded="true" height="60" name="Generate Data" width="90" x="45" y="30"/>
<operator activated="true" class="remember" compatibility="5.3.015" expanded="true" height="60" name="Remember" width="90" x="180" y="30">
<parameter key="name" value="A"/>
<parameter key="io_object" value="ExampleSet"/>
</operator>
<operator activated="true" class="loop" compatibility="5.3.015" expanded="true" height="76" name="Loop" width="90" x="313" y="30">
<parameter key="set_iteration_macro" value="true"/>
<parameter key="macro_name" value="Q"/>
<parameter key="macro_start_value" value="10"/>
<parameter key="iterations" value="12"/>
<process expanded="true">
<operator activated="true" class="recall" compatibility="5.3.015" expanded="true" height="60" name="Recall" width="90" x="179" y="75">
<parameter key="name" value="A"/>
<parameter key="io_object" value="ExampleSet"/>
</operator>
<operator activated="true" class="generate_attributes" compatibility="5.3.015" expanded="true" height="76" name="Generate Attributes" width="90" x="313" y="75">
<list key="function_descriptions">
<parameter key="att1 * %{Q}" value="att1 * %{Q}"/>
</list>
</operator>
<operator activated="true" class="remember" compatibility="5.3.015" expanded="true" height="60" name="Remember (2)" width="90" x="447" y="75">
<parameter key="name" value="A"/>
<parameter key="io_object" value="ExampleSet"/>
</operator>
<connect from_op="Recall" from_port="result" to_op="Generate Attributes" to_port="example set input"/>
<connect from_op="Generate Attributes" from_port="example set output" to_op="Remember (2)" to_port="store"/>
<portSpacing port="source_input 1" spacing="0"/>
<portSpacing port="source_input 2" spacing="0"/>
<portSpacing port="sink_output 1" spacing="0"/>
</process>
</operator>
<operator activated="true" class="recall" compatibility="5.3.015" expanded="true" height="60" name="Recall (2)" width="90" x="450" y="30">
<parameter key="name" value="A"/>
<parameter key="io_object" value="ExampleSet"/>
</operator>
<connect from_op="Generate Data" from_port="output" to_op="Remember" to_port="store"/>
<connect from_op="Remember" from_port="stored" to_op="Loop" to_port="input 1"/>
<connect from_op="Recall (2)" from_port="result" to_port="result 1"/>
<portSpacing port="source_input 1" spacing="0"/>
<portSpacing port="sink_result 1" spacing="0"/>
<portSpacing port="sink_result 2" spacing="0"/>
</process>
</operator>
</process>
What I really dislike about this way of doing things, is that the recall block does not have an import port.
So I need to be really careful not to get bugs from a incorrect execution order.
Having said this, big thanks awchisholm.
Never knew this could be used to remedy memory issues!
Best regards,
Wessel
Here's an example http://rapidminernotes.blogspot.co.uk/2012/11/using-subprocess-operator-to-stop.html
regards
Andrew