Команда: step
Если есть основания думать, что сценарий может не выполнять то, что нужно пользователю, можно указать AMPL выполнить его по одной команде за раз. Это средство можно использовать для предоставления элементарной формы «символического отладчика» для сценариев.
Чтобы пошагово пройти по сценарию, который не выполняет никаких других сценариев, необходимо установить для параметра single_step значение 1 со значения по умолчанию, равного "0". Например для сценария:
model steelT.mod; data steelT.dat; option solution_precision 10; option solver_msg 0; set AVAIL3 default {}; param avail3_obj {AVAIL3}; param avail3_dual {AVAIL3}; let avail[3] := 0; param previous_dual default Infinity; repeat { let avail[3] := avail[3] + 1; solve; if Time[3].dual = previous_dual then continue; let AVAIL3 := AVAIL3 union {avail[3]}; let avail3_obj[avail[3]] := Total_Profit; let avail3_dual[avail[3]] := Time[3].dual; if Time[3].dual = 0 then break; let previous_dual := Time[3].dual; } display avail3_obj, avail3_dual;
можно указать:
option single_step 1; commands steelT.sa7; steelT.sa7:2(18) data ... <2>ampl:
Выражение steelT.sa7: 2 (18) представляет собой имя файла, номер строки и номер символа, где AMPL остановился при обработке сценария. За ним следует начало следующей команды (данных), которая будет выполнена. Строка amp: <2> указывает уровень вложенности ввода. ‘2’ означает, что выполнение входит в область действия commands, которая, в свою очередь, была выдана в исходном потоке ввода. На этом этапе можно использовать команду step для выполнения отдельных команд скрипта. Для выполнения одной команды необходимо ввести step:
<2>ampl: step steelT.sa7:4(36) option ... <2>ampl: step steelT.sa7:5(66) option ... <2>ampl: step steelT.sa7:11(167) let ... <2>ampl:
Если после step указать число, тогда заданное этим числом количество команд будет выполнено. Подсчитываются все команды, кроме тех, которые имеют отношение к объявлениям модели, таким как model и param. Каждый step возвращает к приглашению AMPL. Можно продолжать "шагать" по командам до завершения сценария, а можно в любой момент отобразить нужные значения, чтобы увидеть, работает ли сценарий. Представленная ниже последовательность захватывает точку, где изменяется двойное значение:
<2>ampl: display avail[3], Time[3].dual, previous_dual; avail[3] = 22 Time[3].dual = 3620 previous_dual = 3620 <2>ampl: step steelT.sa7:17(317) continue ... <2>ampl: step steelT.sa7:15(237) let ... <2>ampl: step steelT.sa7:16(270) solve ... <2>ampl: step steelT.sa7:17(280) if ... <2>ampl: step steelT.sa7:19(331) let ... <2>ampl: display avail[3], Time[3].dual, previous_dual; avail[3] = 23 Time[3].dual = 3500 previous_dual = 3620 <2>ampl:
Команда: Next
Любая серия команд AMPL может быть набрана при пошаговом вводе. После каждой команды приглашение <2>amp возвращается, чтобы напомнить пользователю, что он все еще находится в этом режиме и может использовать step для продолжения выполнения сценария.
Чтобы помочь пройти через длинные составные команды for, repeat, или if, AMPL предлагает несколько альтернатив для step. Команда next проходит мимо составной команды, и не заходит в нее. Если бы мы начинали с самого начала, каждое next вызывало бы выполнение следующего оператора. В случае repeat будет выполнена вся команда, а выполнение остановится только на команде display в строке 28:
ampl: option single_step 1; ampl: commands steelT.sa7; steelT.sa7:2(18) data ... <2>ampl: next steelT.sa7:4(36) option ... <2>ampl: next steelT.sa7:5(66) option ... <2>ampl: next steelT.sa7:11(167) let ... <2>ampl: next steelT.sa7:14(225) repeat ... <2>ampl: next steelT.sa7:28(539) display ... <2>ampl:
Команда: skip
Введите next n, чтобы пройти мимо n команд. Команды skip и skip n работают как step и step n, за исключением того, что они пропускают следующие 1 или n команд в сценарии, а не выполняют их.