A simple pipeline can adjust raw readings and clamp each derived value before reporting.

Program

Play the program to choose an offset and watch each score pass through the same transform.

offset
normalize_scores_pipeline.f90
Replay: real traced execution (multi-file project)
program normalize_scores_pipeline_demo
    implicit none
    integer :: raw(3)
    integer :: offset
    integer :: normalized(3)
    integer :: i

    raw = [2, 5, 9]
    offset = 1
    do i = 1, 3
        normalized(i) = max(0, raw(i) + offset)
    end do
    print '(I0, 1X, I0, 1X, I0)', normalized(1), normalized(2), normalized(3)
end program normalize_scores_pipeline_demo
program normalize_scores_pipeline_demo
    implicit none
    integer :: raw(3)
    integer :: offset
    integer :: normalized(3)
    integer :: i

    raw = [2, 5, 9]
    offset = -2
    do i = 1, 3
        normalized(i) = max(0, raw(i) + offset)
    end do
    print '(I0, 1X, I0, 1X, I0)', normalized(1), normalized(2), normalized(3)
end program normalize_scores_pipeline_demo
program normalize_scores_pipeline_demo
    implicit none
    integer :: raw(3)
    integer :: offset
    integer :: normalized(3)
    integer :: i

    raw = [2, 5, 9]
    offset = 3
    do i = 1, 3
        normalized(i) = max(0, raw(i) + offset)
    end do
    print '(I0, 1X, I0, 1X, I0)', normalized(1), normalized(2), normalized(3)
end program normalize_scores_pipeline_demo
  1. raw ← [2, 5, 9]

    8raw = [2, 5, 9]9offset = 1
    values this step[2, 5, 9]raw
  2. offset ← 1

    8raw = [2, 5, 9]9offset = 110do i = 1, 3
    values this step1offset
  3. i ← 1

    9offset = 110do i = 1, 311    normalized(i) = max(0, raw(i) + offset)
    values this step1i
  4. normalized(1) ← 3

    10do i = 1, 311    normalized(i) = max(0, raw(i) + offset)12end do
    values this step3normalized(1)2raw(1)1offset
  5. i ← 2

    9offset = 110do i = 1, 311    normalized(i) = max(0, raw(i) + offset)
    values this step2i
  6. normalized(2) ← 6

    10do i = 1, 311    normalized(i) = max(0, raw(i) + offset)12end do
    values this step6normalized(2)5raw(2)1offset
  7. i ← 3

    9offset = 110do i = 1, 311    normalized(i) = max(0, raw(i) + offset)
    values this step3i
  8. normalized(3) ← 10

    10do i = 1, 311    normalized(i) = max(0, raw(i) + offset)12end do
    values this step10normalized(3)9raw(3)1offset
  9. print '(I0, 1X, I0, 1X, I0)', normalized(1), normalized(2), normalized…

    12    end do13    print '(I0, 1X, I0, 1X, I0)', normalized(1), normalized(2), normalized(3)14end program normalize_scores_pipeline_demo
    output3 6 10
    values this step[3, 6, 10]normalized
  1. raw ← [2, 5, 9]

    8raw = [2, 5, 9]9offset = -2
    values this step[2, 5, 9]raw
  2. offset ← -2

    8raw = [2, 5, 9]9offset = -210do i = 1, 3
    values this step-2offset
  3. i ← 1

    9offset = -210do i = 1, 311    normalized(i) = max(0, raw(i) + offset)
    values this step1i
  4. normalized(1) ← 0

    10do i = 1, 311    normalized(i) = max(0, raw(i) + offset)12end do
    values this step0normalized(1)2raw(1)-2offset
  5. i ← 2

    9offset = -210do i = 1, 311    normalized(i) = max(0, raw(i) + offset)
    values this step2i
  6. normalized(2) ← 3

    10do i = 1, 311    normalized(i) = max(0, raw(i) + offset)12end do
    values this step3normalized(2)5raw(2)-2offset
  7. i ← 3

    9offset = -210do i = 1, 311    normalized(i) = max(0, raw(i) + offset)
    values this step3i
  8. normalized(3) ← 7

    10do i = 1, 311    normalized(i) = max(0, raw(i) + offset)12end do
    values this step7normalized(3)9raw(3)-2offset
  9. print '(I0, 1X, I0, 1X, I0)', normalized(1), normalized(2), normalized…

    12    end do13    print '(I0, 1X, I0, 1X, I0)', normalized(1), normalized(2), normalized(3)14end program normalize_scores_pipeline_demo
    output0 3 7
    values this step[0, 3, 7]normalized
  1. raw ← [2, 5, 9]

    8raw = [2, 5, 9]9offset = 3
    values this step[2, 5, 9]raw
  2. offset ← 3

    8raw = [2, 5, 9]9offset = 310do i = 1, 3
    values this step3offset
  3. i ← 1

    9offset = 310do i = 1, 311    normalized(i) = max(0, raw(i) + offset)
    values this step1i
  4. normalized(1) ← 5

    10do i = 1, 311    normalized(i) = max(0, raw(i) + offset)12end do
    values this step5normalized(1)2raw(1)3offset
  5. i ← 2

    9offset = 310do i = 1, 311    normalized(i) = max(0, raw(i) + offset)
    values this step2i
  6. normalized(2) ← 8

    10do i = 1, 311    normalized(i) = max(0, raw(i) + offset)12end do
    values this step8normalized(2)5raw(2)3offset
  7. i ← 3

    9offset = 310do i = 1, 311    normalized(i) = max(0, raw(i) + offset)
    values this step3i
  8. normalized(3) ← 12

    10do i = 1, 311    normalized(i) = max(0, raw(i) + offset)12end do
    values this step12normalized(3)9raw(3)3offset
  9. print '(I0, 1X, I0, 1X, I0)', normalized(1), normalized(2), normalized…

    12    end do13    print '(I0, 1X, I0, 1X, I0)', normalized(1), normalized(2), normalized(3)14end program normalize_scores_pipeline_demo
    output5 8 12
    values this step[5, 8, 12]normalized
transform Each raw reading is adjusted by the same offset.
clamp `max(0, raw(i) + offset)` prevents negative normalized scores.
pipeline The loop applies one transformation step to every element.