Initializing help system before first use

Producing formatted output

In some of the previous examples the procedures write and writeln have been used for displaying data, solution values and some accompanying text. To produce better formatted output, these procedures can be combined with the formatting procedure strfmt. In its simplest form, strfmt's second argument indicates the (minimum) space reserved for writing the first argument and its placement within this space (negative values mean left justified printing, positive right justified). When writing a real, a third argument may be used to specify the maximum number of digits after the decimal point.

For example, if file fo.mos contains

model FO
 parameters
  r = 1.0         ! A real
  i = 0           ! An integer
 end-parameters

 writeln("i is ", i)
 writeln("i is ", strfmt(i,6) )
 writeln("i is ", strfmt(i,-6) )
 writeln("r is ", r)
 writeln("r is ", strfmt(r,6) )
 writeln("r is ",strfmt(r,10,4) )
end-model

and we run Mosel thus:

mosel exec fo 'i=123, r=1.234567'

we get output

i is 123
i is    123
i is 123
r is 1.23457
r is 1.23457
r is     1.2346

The following example (model transport2.mos) prints out the solution of model `Transport' (Section A transport example) in table format. The reader may be reminded that the objective of this problem is to compute the product flows from a set of plants (PLANT) to a set of sales regions (REGION) so as to minimize the total cost. The solution needs to comply with the capacity limits of the plants (PLANTCAP) and satisfy the demand DEMAND of all regions.

 procedure print_table
  declarations
   rsum: array(REGION) of integer    ! Auxiliary data table for printing
   psum,ct,iflow: integer            ! Counters
  end-declarations

          ! Print heading and the first line of the table
  writeln("\nProduct Distribution\n", "="*20)
  writeln(strfmt("Sales Region",48))
  write(strfmt("",15), "| ")
  forall(r in REGION) write(strfmt(r,9))
  writeln(" |", strfmt("TOTAL",6), " Capacity")
  writeln("-"*80)

         ! Print the solution values of the flow variables and
         ! calculate totals per region and per plant
  ct:=0
  forall(p in PLANT, ct as counter) do
    if ct=2 then
      write(" Plant ", strfmt(p,-8), "|")
    else
      write("       ", strfmt(p,-8), "|")
    end-if
    psum:=0
    forall(r in REGION) do
      iflow:=integer(getsol(flow(p,r)))
      psum += iflow
      rsum(r) += iflow
      if iflow<>0 then
        write(strfmt(iflow,9))
      else
        write("      -- ")
      end-if
    end-do
    writeln("  |", strfmt(psum,6), strfmt(integer(PLANTCAP(p)),8))
  end-do

         ! Print the column totals
  writeln("-"*80)
  write(strfmt(" TOTAL",-15), "|")
  prsum:=0
  forall(r in REGION) write(strfmt(rsum(r),9))
  writeln("  |", strfmt(sum(r in REGION) rsum(r),6))

         ! Print demand of every region
  write(strfmt(" Demand",-15), "|")
  forall(r in REGION) write(strfmt(integer(DEMAND(r)),9))

         ! Print objective function value
  writeln("\n\nTotal cost of distribution = ", strfmt(getobjval/1e6,0,3),
          " million.")

 end-procedure

Notice the shorthand "-"*80 meaning that the string '-' is repeated 80 times. This functionality is provided by the module mmsystem, however, it is generally more efficient to work with the type text for such string operations (see Section Text handling and regular expressions).

With the data from Chapter More advanced modeling features the procedure print_table produces the following output:

Product Distribution
====================
                                    Sales Region
               |  Scotland    North    SWest    SEast Midlands | TOTAL Capacity
--------------------------------------------------------------------------------
       Corby   |      --        80      --       920     2000  |  3000    3000
 Plant Deeside |      --      1450     1000      --       250  |  2700    2700
       Glasgow |     2840     1270      --       --       --   |  4110    4500
       Oxford  |      --       --      1600     1900      500  |  4000    4000
--------------------------------------------------------------------------------
 TOTAL         |     2840     2800     2600     2820     2750  | 13810
 Demand        |     2840     2800     2600     2820     2750

Total cost of distribution = 81.018 million.

© 2001-2020 Fair Isaac Corporation. All rights reserved. This documentation is the property of Fair Isaac Corporation (“FICO”). Receipt or possession of this documentation does not convey rights to disclose, reproduce, make derivative works, use, or allow others to use it except solely for internal evaluation purposes to determine whether to purchase a license to the software described in this documentation, or as otherwise set forth in a written software license agreement between you and FICO (or a FICO affiliate). Use of this documentation and the software described in it must conform strictly to the foregoing permitted uses, and no other use is permitted.