Table-Driven Calculations
Threshold Bracket Table
Last Matching Row
A bracket table can scan thresholds and keep the last matching row.
Program
Play the program to change an amount and see which bracket is selected.
threshold_bracket_table.f90
Replay: real traced execution (multi-file project)
program threshold_bracket_table_demo
implicit none
integer :: minimums(3)
integer :: factors(3)
integer :: amount
integer :: i
integer :: selected_factor
integer :: adjusted
minimums = [0, 10, 20]
factors = [1, 2, 3]
amount = 18
selected_factor = factors(1)
do i = 1, 3
if (amount >= minimums(i)) selected_factor = factors(i)
end do
adjusted = amount * selected_factor
print '(I0, 1X, I0)', selected_factor, adjusted
end program threshold_bracket_table_demo
program threshold_bracket_table_demo
implicit none
integer :: minimums(3)
integer :: factors(3)
integer :: amount
integer :: i
integer :: selected_factor
integer :: adjusted
minimums = [0, 10, 20]
factors = [1, 2, 3]
amount = 8
selected_factor = factors(1)
do i = 1, 3
if (amount >= minimums(i)) selected_factor = factors(i)
end do
adjusted = amount * selected_factor
print '(I0, 1X, I0)', selected_factor, adjusted
end program threshold_bracket_table_demo
program threshold_bracket_table_demo
implicit none
integer :: minimums(3)
integer :: factors(3)
integer :: amount
integer :: i
integer :: selected_factor
integer :: adjusted
minimums = [0, 10, 20]
factors = [1, 2, 3]
amount = 25
selected_factor = factors(1)
do i = 1, 3
if (amount >= minimums(i)) selected_factor = factors(i)
end do
adjusted = amount * selected_factor
print '(I0, 1X, I0)', selected_factor, adjusted
end program threshold_bracket_table_demo
minimums ← [0, 10, 20]
10minimums = [0, 10, 20]11factors = [1, 2, 3]values this step[0, 10, 20]minimumsfactors ← [1, 2, 3]
10minimums = [0, 10, 20]11factors = [1, 2, 3]12amount = 18values this step[1, 2, 3]factorsamount ← 18
11factors = [1, 2, 3]12amount = 1813selected_factor = factors(1)values this step18amountselected_factor ← 1
12amount = 1813selected_factor = factors(1)14do i = 1, 3values this step1selected_factori ← 1
13selected_factor = factors(1)14do i = 1, 315 if (amount >= minimums(i)) selected_factor = factors(i)values this step1iselected_factor ← 1
14do i = 1, 315 if (amount >= minimums(i)) selected_factor = factors(i)16end dovalues this step1selected_factor.true.amount >= minimums(1)i ← 2
13selected_factor = factors(1)14do i = 1, 315 if (amount >= minimums(i)) selected_factor = factors(i)values this step2iselected_factor ← 2
14do i = 1, 315 if (amount >= minimums(i)) selected_factor = factors(i)16end dovalues this step2selected_factor.true.amount >= minimums(2)i ← 3
13selected_factor = factors(1)14do i = 1, 315 if (amount >= minimums(i)) selected_factor = factors(i)values this step3iif (amount >= minimums(i)) selected_factor = factors(i)
14do i = 1, 315 if (amount >= minimums(i)) selected_factor = factors(i)16end dovalues this step.false.amount >= minimums(3)adjusted ← 36
16end do17adjusted = amount * selected_factor18print '(I0, 1X, I0)', selected_factor, adjustedvalues this step36adjusted18amount2selected_factorprint '(I0, 1X, I0)', selected_factor, adjusted
17 adjusted = amount * selected_factor18 print '(I0, 1X, I0)', selected_factor, adjusted19end program threshold_bracket_table_demooutput2 36values this step2selected_factor36adjusted
minimums ← [0, 10, 20]
10minimums = [0, 10, 20]11factors = [1, 2, 3]values this step[0, 10, 20]minimumsfactors ← [1, 2, 3]
10minimums = [0, 10, 20]11factors = [1, 2, 3]12amount = 8values this step[1, 2, 3]factorsamount ← 8
11factors = [1, 2, 3]12amount = 813selected_factor = factors(1)values this step8amountselected_factor ← 1
12amount = 813selected_factor = factors(1)14do i = 1, 3values this step1selected_factori ← 1
13selected_factor = factors(1)14do i = 1, 315 if (amount >= minimums(i)) selected_factor = factors(i)values this step1iselected_factor ← 1
14do i = 1, 315 if (amount >= minimums(i)) selected_factor = factors(i)16end dovalues this step1selected_factor.true.amount >= minimums(1)i ← 2
13selected_factor = factors(1)14do i = 1, 315 if (amount >= minimums(i)) selected_factor = factors(i)values this step2iif (amount >= minimums(i)) selected_factor = factors(i)
14do i = 1, 315 if (amount >= minimums(i)) selected_factor = factors(i)16end dovalues this step.false.amount >= minimums(2)i ← 3
13selected_factor = factors(1)14do i = 1, 315 if (amount >= minimums(i)) selected_factor = factors(i)values this step3iif (amount >= minimums(i)) selected_factor = factors(i)
14do i = 1, 315 if (amount >= minimums(i)) selected_factor = factors(i)16end dovalues this step.false.amount >= minimums(3)adjusted ← 8
16end do17adjusted = amount * selected_factor18print '(I0, 1X, I0)', selected_factor, adjustedvalues this step8adjusted8amount1selected_factorprint '(I0, 1X, I0)', selected_factor, adjusted
17 adjusted = amount * selected_factor18 print '(I0, 1X, I0)', selected_factor, adjusted19end program threshold_bracket_table_demooutput1 8values this step1selected_factor8adjusted
minimums ← [0, 10, 20]
10minimums = [0, 10, 20]11factors = [1, 2, 3]values this step[0, 10, 20]minimumsfactors ← [1, 2, 3]
10minimums = [0, 10, 20]11factors = [1, 2, 3]12amount = 25values this step[1, 2, 3]factorsamount ← 25
11factors = [1, 2, 3]12amount = 2513selected_factor = factors(1)values this step25amountselected_factor ← 1
12amount = 2513selected_factor = factors(1)14do i = 1, 3values this step1selected_factori ← 1
13selected_factor = factors(1)14do i = 1, 315 if (amount >= minimums(i)) selected_factor = factors(i)values this step1iselected_factor ← 1
14do i = 1, 315 if (amount >= minimums(i)) selected_factor = factors(i)16end dovalues this step1selected_factor.true.amount >= minimums(1)i ← 2
13selected_factor = factors(1)14do i = 1, 315 if (amount >= minimums(i)) selected_factor = factors(i)values this step2iselected_factor ← 2
14do i = 1, 315 if (amount >= minimums(i)) selected_factor = factors(i)16end dovalues this step2selected_factor.true.amount >= minimums(2)i ← 3
13selected_factor = factors(1)14do i = 1, 315 if (amount >= minimums(i)) selected_factor = factors(i)values this step3iselected_factor ← 3
14do i = 1, 315 if (amount >= minimums(i)) selected_factor = factors(i)16end dovalues this step3selected_factor.true.amount >= minimums(3)adjusted ← 75
16end do17adjusted = amount * selected_factor18print '(I0, 1X, I0)', selected_factor, adjustedvalues this step75adjusted25amount3selected_factorprint '(I0, 1X, I0)', selected_factor, adjusted
17 adjusted = amount * selected_factor18 print '(I0, 1X, I0)', selected_factor, adjusted19end program threshold_bracket_table_demooutput3 75values this step3selected_factor75adjusted
threshold table
Threshold rows describe which factor applies for each amount range.
last match
Scanning in order keeps the factor from the last satisfied threshold.
table-driven branch
Changing the table data can change the decision without changing the loop shape.