Loop#
- class gamspy.Loop(indices: Set | Alias | ImplicitSet | Condition | Domain | Sequence[Set | Alias])[source]#
Bases:
objectA context manager to execute a group of statements iteratively for each member of a set or domain.
The Loop class maps to the GAMS loop statement. It is particularly useful for cases where parallel assignments are not sufficient, such as iterative calculations, nested loops, or modifying models and solving them repeatedly.
- Parameters:
- indicesSet | Alias | ImplicitSet | Condition | Domain | Sequence[Set | Alias]
The controlling domain of the loop. This can be a single Set, a sequence of Sets, or a domain restricted by a logical condition (using .where).
- Attributes:
Examples
1. Simple iteration over a single Set:
>>> import gamspy as gp >>> m = gp.Container() >>> t = gp.Set(m, records=["1985", "1986", "1987"]) >>> pop = gp.Parameter(m, domain=t, records=[("1985", 3456)]) >>> growth = gp.Parameter(m, domain=t, records=[("1985", 25.3), ("1986", 27.3)]) >>> with gp.Loop(t): ... pop[t + 1] = pop[t] + growth[t]
2. Iteration with a logical condition (dollar condition): You can restrict the loop domain using the .where attribute on Sets or Domains.
>>> i = gp.Set(m, records=["i1", "i2", "i3"]) >>> j = gp.Set(m, records=["j1", "j2", "j3"]) >>> q = gp.Parameter(m, domain=[i, j], records=[("i1", "j1", 1), ("i1", "j2", 3)]) >>> x = gp.Parameter(m, records=1) >>> with gp.Loop(gp.Domain(i, j).where[q[i, j] > 0]): ... x[...] = x[...] + q[i, j]
3. Nested Loops: Loops can be nested using standard Python indentation.
>>> a = gp.Parameter(m, domain=[i, j]) >>> b = gp.Parameter(m) >>> a.generateRecords() >>> with gp.Loop(i): ... with gp.Loop(j): ... b[...] = a[i, j]
- property Break: None#
Breaks the execution of the current loop prematurely.
This property maps to the GAMS break statement. Note that you can only break out of the innermost loop currently executing. Attempting to break an outer loop from within an inner loop will raise a ValidationError.
- Raises:
- ValidationError
If attempting to break an outer loop without breaking the inner loop first.
Examples
>>> import gamspy as gp >>> m = gp.Container() >>> i = gp.Set(m, records=["i1", "i2", "i3"]) >>> j = gp.Set(m, records=["j1", "j2", "j3"]) >>> cnt = gp.Parameter(m, records=0) >>> with gp.Loop(i) as loop: ... with gp.Loop(j) as loop2: ... cnt[...] += 1 ... loop2.Break # Successfully breaks the inner loop ... loop.Break # Successfully breaks the outer loop
- property Continue: None#
Skips the remaining statements in the current iteration and proceeds to the next one.
This property maps to the GAMS continue statement. It gives additional control over the execution of loop structures by allowing you to bypass the rest of the loop block for the current domain element.
Examples
>>> import gamspy as gp >>> m = gp.Container() >>> i = gp.Set(m, records=["i1", "i2", "i3", "i4"]) >>> cnt = gp.Parameter(m, records=0) >>> with gp.Loop(i) as loop: ... with gp.If(gp.Ord(i) == 2): ... loop.Continue # Skips incrementing for "i2" ... cnt[...] += 1