This article describes how to control Concurrency in a program. Concurrency is the setting that controls how many targets and sets are executed simultaneously, as well as how phase progression affects target ordering.
You can find the program-level Concurrency control by clicking on the Program node in the left panel (the one with the Program name at the top of the tree):
Program-Level vs Set-Level Concurrency
Concurrency is actually defined in two places: at the program level (affecting all targets in the program) and at the set level (affecting targets in that set and any subsets under that set). The examples below mostly refer to Program-Level concurrency. Set-Level concurrency is controlled by clicking on any Set. However, most of the time, it's OK to leave the Set level concurrency off ("Mode: None"), and just focus on the program-level concurrency. See Set-Level Concurrency for additional information.
This article has the following parts:
- Mode: None
- Mode: Basic
- Set-Level Concurrency
- Mode: Advanced
If Concurrency is set to None, then all targets and sets are simultaneously available. For example, in a program with the following structure:
If concurrency is set to "None" (at the program level and at each set level), then all four targets would be simultaneously available for exercising during data collection:
While editing the program, the Simulation panel (right side) lets you can see at a glance which targets will be eligible for exercising, as those are marked with a colored bar to the left of the target:
In this case, with concurrency set to None, both sets and all four targets are eligible for teaching at the same time, so they all have a colored bar.
Use Basic mode when you want sets or targets to be available sequentially rather than all at once.
This gives you control over four aspects of concurrency: Targets, Sets, Phase progression, and Maintenance target availability. Each of these is described in turn.
Targets at a Time
The Targets control lets you specify how many targets should be exercised at a time. At the program level, this controls how many targets are simultaneously available during data collection, regardless of what set they are from. For example, here is the above program when 1 target is eligible for execution at a time:
Notice that only the first target (Target 1-A) is eligible. In the simulation, you can transition the first target to completed to see what will happen next:
When the first target is completed, the 2nd target becomes eligible for exercising:
You can change the number of targets to exercise at a time by clicking the "1" and typing in a different number, e.g. "2":
Sets at a Time
You can also control the number of Sets to exercise at a time.
In the example above, if you set Targets to "3 at a time" and Sets to "All at once", you will get two targets from the first set and a third from the 2nd set (because there are no more targets in the first set):
However, if you change Sets to "1 at a time", then you will only get targets from the first set even though there may be less than 3 targets in that set:
With this setting, Target 2-A will not be eligible for data collection until all targets from Set 1 have been completed.
Note: if you want to control the number of targets yielded by each set (e.g. to have one target from each set at the same time), you will need to use the Set-Level Concurrency described at the end of this article.
This allows you to control how targets become eligible for exercising as they progress through phases. There are two choices:
Targets progress Independently
In this mode, the current target must progress through all its phases before being replaced by a new target. For example, if each target in the above program has an Assess and a Train phase, and "Targets at a time" is set to 1, then Target 1-A would proceed through each of its phases to completion before Target 1-B is introduced:
In this mode, all targets must progress through the current phase before any can be run in the next phase. E.g. if the targets have an Assess and a Train phase, and "Targets at a time" is set to 1, when Target 1-A transitions from Assess to Train, it becomes replaced by Target 1-B in Assess. When all targets have completed Assess, then Target 1-A is re-introduced in the Train phase:
Note: if you have "Targets at a time" set to "All at once", when Phases is set to "Targets Synchronized", each target will "disappear" from data collection when it transitions out of the first phase; and they will all "reappear" together in the next phase when the last target transitions:
You can dictate whether or not you want targets that are in the maintenance phase to always be available or if you want them to follow the phase progression rules. This option is found under the Phases section. Click the box to indicate that all maintenance targets should be available at all times.
When the maintenance targets are marked as always available, they will continue to be present despite the phase progression rules you have set up. In this example, the targets progress through each phase independently which means that a new target will not be introduced until Target 1-A progresses through all its phases. However, once Target 1-A reaches the Maintenance phase, Target 1-B is introduced into the Baseline phase. Both targets are available at the same time. If the "Maintenance targets always available" button is unselected, Target 1-B will not be introduced until Target 1-A completes the Maintenance phase. The maintenance rule can be set at any level and is primarily applied to Basic mode.
Please note: The maintenance rule only applies to targets within a set and does not apply to targets outside their set. For example, If you have the "Set rules" set to "1 at a time", Targets 2-A and 2-B will not be available until Both Targets 1-A and 1-B are through the Assess, Train, and Maintenance phases completely.
The third mode is Advanced. However, before discussing that mode, we will talk briefly about Set-Level concurrency.
As previously described, program-level concurrency is accessed by clicking the program name at the top of the tree in the left panel. Program-Level concurrency is the most commonly-used setting. However, you can also specify set-level concurrency by clicking on any set and then clicking on the Concurrency section within that set:
You should only use the Set-level concurrency when you want to run multiple sets simultaneously and you want to control the number of targets from each set. For example, if you have 2 sets and you want to run one target per set, first configure the Program Level concurrency to None:
This means that all sets will run at the same time. Then click on Set 1, turn on Basic mode, and configure the set to yield 1 target at a time:
Repeat the above for Set 2.
Now, each set will yield one target at a time, and they will both be eligible for execution at the same time:
You can combine Program-Level and Set-Level concurrency to create a powerful and flexible target workflow. Program-level restraints will be applied to the results yielded by the sets.
Advanced level concurrency lets you have very flexible control over how targets and phases progress:
Advanced concurrency mode is the most complex aspect of the program builder. Basic Mode will meet most requirements. If you feel that you need Advanced mode, we encourage you to contact Support for assistance.
You may create any number of "Concurrency Constraint" rules as you like. The rules will be applied in the order they appear. Each rule has several clauses.
The phase progression clause lets you specify whether the rule applies to a specific phase (such as "Train") or to each phase, or to the target regardless of phases:
If you leave it as "each phase", then the rule applies to all phases, affecting phase progression. For example, the above rule specifies that each phase should be performed 1 target at a time when there are no targets in preceding phases. This is equivalent to basic mode with "Phases:" set to "targets synchronized".
If you choose "specific phase", the rule rewrites itself to let you name a particular phase-type (e.g. "Assess"):
This allows you to control how specific phases are exercised. In the above example, targets in Assess phase are limited to 1 at a time, but targets in other phases will not be limited. E.g. if there are three targets in Assess, only the first will be eligible. When that target transitions to Train, the second Assess target will be eligible in parallel with the first (now in Train) target:
Note: when the phase scope clause is set to "specific phase", the rule rewrites itself so the phrase "specific phase" is no longer visible; it has been replaced by the word "phase" that appears after the specified phase-type; you can revert to "each phase" or "regardless of phase" by clicking the word "phase":
Setting the phase progression clause to "regardless of phase" is equivalent to basic mode with "Phases:" set to "targets independent", i.e. "Perform regardless of phase 1 target at a time" means that only 1 target will be eligible for exercising at a time no matter what phase the targets are in.
Last Reviewed: 9/8/22