跳转到内容

GLPK/Fortran

来自维基教科书,开放世界中的开放书籍

Fortran 是一种高性能科学计算语言,起源于 1950 年代,至今仍在使用。


GNU gfortran 的绑定

[编辑 | 编辑源代码]

Jeff Kelly 提供了以下 GNU gfortran GLPK 语言绑定。有关更多详细信息和讨论,请参阅下一部分

        use ISO_C_BINDING

        implicit none

c GNU GLP integer and real control and problem attribute declarations.

        integer(c_int) :: GLP_MIN
        integer(c_int) :: GLP_MAX

        integer(c_int) :: GLP_FR
        integer(c_int) :: GLP_LO
        integer(c_int) :: GLP_UP
        integer(c_int) :: GLP_DB
        integer(c_int) :: GLP_FX

        integer(c_int) :: GLP_ON
        integer(c_int) :: GLP_OFF

        integer(c_int) :: GLP_PRIMAL
        integer(c_int) :: GLP_DUALP
        integer(c_int) :: GLP_DUAL

        integer(c_int) :: GLP_UNDEF
        integer(c_int) :: GLP_FEAS
        integer(c_int) :: GLP_INFEAS
        integer(c_int) :: GLP_NOFEAS
        integer(c_int) :: GLP_OPT
        integer(c_int) :: GLP_UNBND

        integer(c_int) :: GLP_CV
        integer(c_int) :: GLP_IV
        integer(c_int) :: GLP_BV

        integer(c_int) :: GLP_ORD_NONE
        integer(c_int) :: GLP_ORD_QMD
        integer(c_int) :: GLP_ORD_AMD
        integer(c_int) :: GLP_ORD_SYMAMD

          parameter (GLP_MIN = 1)
          parameter (GLP_MAX = 2)

          parameter (GLP_FR = 1)
          parameter (GLP_LO = 2)
          parameter (GLP_UP = 3)
          parameter (GLP_DB = 4)
          parameter (GLP_FX = 5)

          parameter (GLP_ON = 1)
          parameter (GLP_OFF = 0)

          parameter (GLP_PRIMAL = 1)
          parameter (GLP_DUALP = 2)
          parameter (GLP_DUAL = 3)

        parameter (GLP_UNDEF = 1)
        parameter (GLP_FEAS = 2)
        parameter (GLP_INFEAS = 3)
        parameter (GLP_NOFEAS = 4)
        parameter (GLP_OPT = 5)
        parameter (GLP_UNBND = 6)

        parameter (GLP_CV = 1)
        parameter (GLP_IV = 2)
        parameter (GLP_BV = 3)

        parameter (GLP_ORD_NONE = 0)
        parameter (GLP_ORD_QMD = 1)
        parameter (GLP_ORD_AMD = 2)
        parameter (GLP_ORD_SYMAMD = 3)

c GNU GLP derived-type or structure definitions for their C-Language API interface.
c
c * Note that the intrinsic module ISO_C_BINDING is required.
c
c * Note that to interface the structure or derived-type to the C-language we can do
c   the following without using a pointer i.e., return = glp_init_smcp(problem1_set%msg_lev).
c
c   The idea is that because a derived-type or structure is simply a "blind" consecutive or
c   contiguous block of data then specifying the first component or item of the derived-type
c   is identical to the Fortran IV and Fortran 77 notion of passing in the first element of
c   an assumed array i.e., X(1) will pass in by reference all of the X(:) data.

c Simplex settings/options.

        type, bind(c) :: glp_smcp
          integer(c_int) :: msg_lev
          integer(c_int) :: meth
          integer(c_int) :: pricing
          integer(c_int) :: r_test
          real(c_double) :: tol_bnd
          real(c_double) :: tol_dj
          real(c_double) :: tol_piv
          real(c_double) :: obj_ll
          real(c_double) :: obj_ul
          integer(c_int) :: it_lim
          integer(c_int) :: tm_lim
          integer(c_int) :: out_frq
          integer(c_int) :: out_dly
          integer(c_int) :: presolve
          real(c_double) :: foo_bar(0:35)
        end type glp_smcp

c Interior-point settings/options.

        type, bind(c) :: glp_iptcp
          integer(c_int) :: msg_lev
          integer(c_int) :: ord_alg
          real(c_double) :: foo_bar(0:47)
        end type glp_iptcp

c GNU GLP interface block definitions for their C-Language API interface.

        interface

          function glp_create_prob() bind(C,name="glp_create_prob")
            use ISO_C_BINDING
cGCC$ ATTRIBUTES DLLIMPORT:: glp_create_prob
             integer(c_int) :: glp_create_prob
          end function

              subroutine glp_set_prob_name(prob,probname) bind(C,name="glp_set_prob_name")
            use ISO_C_BINDING
cGCC$ ATTRIBUTES DLLIMPORT :: glp_set_prob_name
              integer(c_int), value :: prob
              character(c_char) :: probname(*)
            end subroutine

          function glp_init_smcp(parm_struct) bind(C,name="glp_init_smcp")
            use ISO_C_BINDING
cGCC$ ATTRIBUTES DLLIMPORT :: glp_init_smcp
            integer(c_int) :: glp_init_smcp
            integer(c_int) :: parm_struct
          end function

          function glp_init_iptcp(parm_struct) bind(C,name="glp_init_iptcp")
            use ISO_C_BINDING
cGCC$ ATTRIBUTES DLLIMPORT :: glp_init_iptcp
            integer(c_int) :: glp_init_iptcp
            integer(c_int) :: parm_struct
          end function

            subroutine glp_set_obj_dir(prob,objdir) bind(C,name="glp_set_obj_dir")
            use ISO_C_BINDING
cGCC$ ATTRIBUTES DLLIMPORT :: glp_set_obj_dir
              integer(c_int), value :: prob
              integer(c_int), value :: objdir
            end subroutine

            function glp_add_rows(prob,nrs) bind(C,name="glp_add_rows")
            use ISO_C_BINDING
cGCC$ ATTRIBUTES DLLIMPORT :: glp_add_rows
            integer(c_int) :: glp_add_rows
                integer(c_int), value :: prob
                integer(c_int), value :: nrs
            end function

              function glp_add_cols(prob,ncs) bind(C,name="glp_add_cols")
            use ISO_C_BINDING
cGCC$ ATTRIBUTES DLLIMPORT :: glp_add_cols
            integer(c_int) :: glp_add_cols
              integer(c_int), value :: prob
              integer(c_int), value :: ncs
            end function

            subroutine glp_set_obj_coef(prob,j,coef) bind(C,name="glp_set_obj_coef")
            use ISO_C_BINDING
cGCC$ ATTRIBUTES DLLIMPORT :: glp_set_obj_coef
              integer(c_int), value :: prob
              integer(c_int), value :: j
              real(c_double), value :: coef
            end subroutine

            subroutine glp_set_row_bnds(prob,i,type,lb,ub) bind(C,name="glp_set_row_bnds")
            use ISO_C_BINDING
cGCC$ ATTRIBUTES DLLIMPORT :: glp_set_row_bnds
              integer(c_int), value :: prob
              integer(c_int), value :: i
              integer(c_int), value :: type
              real(c_double), value :: lb
              real(c_double), value :: ub
            end subroutine

            subroutine glp_set_row_name(prob,i,name) bind(C,name="glp_set_row_name")
            use ISO_C_BINDING
cGCC$ ATTRIBUTES DLLIMPORT :: glp_set_row_name
                integer(c_int), value :: prob
                integer(c_int), value :: i
                character(c_char) :: name(*)
            end subroutine

            subroutine glp_set_col_bnds(prob,j,type,lb,ub) bind(C,name="glp_set_col_bnds")
            use ISO_C_BINDING
cGCC$ ATTRIBUTES DLLIMPORT :: glp_set_col_bnds
                integer(c_int), value :: prob
                integer(c_int), value :: j
                integer(c_int), value :: type
                real(c_double), value :: lb
                real(c_double), value :: ub
            end subroutine

            subroutine glp_set_col_name(prob,j,name) bind(C,name="glp_set_col_name")
            use ISO_C_BINDING
cGCC$ ATTRIBUTES DLLIMPORT :: glp_set_col_name
            integer(c_int), value :: prob
                integer(c_int), value :: j
                character(c_char) :: name(*)
            end subroutine

            subroutine glp_set_col_kind(prob,j,kind) bind(C,name="glp_set_col_kind")
            use ISO_C_BINDING
cGCC$ ATTRIBUTES DLLIMPORT :: glp_set_col_kind
                integer(c_int), value :: prob
            integer(c_int), value :: j
            integer(c_int), value :: kind
            end subroutine

            subroutine glp_load_matrix(prob,ne,ia,ja,ar) bind(C,name="glp_load_matrix")
            use ISO_C_BINDING
cGCC$ ATTRIBUTES DLLIMPORT :: glp_load_matrix
                integer(c_int), value :: prob
                integer(c_int), value :: ne
                integer(c_int) :: ia(*)
                integer(c_int) :: ja(*)
                real(c_double) :: ar(*)
            end subroutine

            subroutine glp_adv_basis(prob,flag) bind(C,name="glp_adv_basis")
            use ISO_C_BINDING
cGCC$ ATTRIBUTES DLLIMPORT :: glp_adv_basis
                integer(c_int), value :: prob
                integer(c_int), value :: flag
            end subroutine

            subroutine glp_cpx_basis(prob) bind(C,name="glp_cpx_basis")
            use ISO_C_BINDING
cGCC$ ATTRIBUTES DLLIMPORT :: glp_cpx_basis
                integer(c_int), value :: prob
            end subroutine

            function glp_simplex(prob,parm) bind(C,name="glp_simplex")
            use ISO_C_BINDING
cGCC$ ATTRIBUTES DLLIMPORT :: glp_simplex
            integer(c_int) :: glp_simplex
                integer(c_int), value :: prob
                integer(c_int) :: parm
            end function

            function glp_interior(prob,parm) bind(C,name="glp_interior")
            use ISO_C_BINDING
cGCC$ ATTRIBUTES DLLIMPORT :: glp_interior
            integer(c_int) :: glp_interior
                integer(c_int), value :: prob
                integer(c_int) :: parm
            end function

            function glp_write_lp(prob,parm,fname) bind(C,name="glp_write_lp")
            use ISO_C_BINDING
cGCC$ ATTRIBUTES DLLIMPORT :: glp_write_lp
            integer(c_int) :: glp_write_lp
                integer(c_int), value :: prob
                integer(c_int) :: parm
                character(c_char) :: fname(*)
            end function

            function glp_get_status(prob) bind(C,name="glp_get_status")
            use ISO_C_BINDING
cGCC$ ATTRIBUTES DLLIMPORT :: glp_get_status
            integer(c_int) :: glp_get_status
                integer(c_int), value :: prob
            end function

            function glp_ipt_status(prob) bind(C,name="glp_ipt_status")
            use ISO_C_BINDING
cGCC$ ATTRIBUTES DLLIMPORT :: glp_ipt_status
            integer(c_int) :: glp_ipt_status
                integer(c_int), value :: prob
            end function

            function glp_get_obj_val(prob) bind(C,name="glp_get_obj_val")
            use ISO_C_BINDING
cGCC$ ATTRIBUTES DLLIMPORT :: glp_get_obj_val
            real(c_double) :: glp_get_obj_val
                 integer(c_int), value :: prob
            end function

            function glp_ipt_obj_val(prob) bind(C,name="glp_ipt_obj_val")
            use ISO_C_BINDING
cGCC$ ATTRIBUTES DLLIMPORT :: glp_ipt_obj_val
            real(c_double) :: glp_ipt_obj_val
                integer(c_int), value :: prob
            end function

            function glp_get_col_prim(prob,j) bind(C,name="glp_get_col_prim")
            use ISO_C_BINDING
cGCC$ ATTRIBUTES DLLIMPORT :: glp_get_col_prim
            real(c_double) :: glp_get_col_prim
                  integer(c_int), value :: prob
            integer(c_int), value :: j
            end function

            function glp_ipt_col_prim(prob,j) bind(C,name="glp_ipt_col_prim")
            use ISO_C_BINDING
cGCC$ ATTRIBUTES DLLIMPORT :: glp_ipt_col_prim
            real(c_double) :: glp_ipt_col_prim
                integer(c_int), value :: prob
            integer(c_int), value :: j
            end function

            subroutine glp_erase_prob(prob) bind(C,name="glp_erase_prob")
            use ISO_C_BINDING
cGCC$ ATTRIBUTES DLLIMPORT :: glp_erase_prob
                integer(c_int), value :: prob
            end subroutine

            subroutine glp_delete_prob(prob) bind(C,name="glp_delete_prob")
            use ISO_C_BINDING
cGCC$ ATTRIBUTES DLLIMPORT :: glp_delete_prob
                integer(c_int), value :: prob
            end subroutine

        end interface

Fortran 2003 的绑定

[编辑 | 编辑源代码]

Jeff Kelly 提供了以下主程序示例,包含语言绑定。此代码使用 Intel Fortran 2003 编译器开发。

程序本身调用 GLPK 来

max c'*x such that A*x <= b and lower <= x <= upper

该示例包括必要的 Fortran 绑定,还展示了如何使用GLPKintsolcb()和 Fortran 的LOC()内在函数设置整数优化回调(如果需要)。

将 GLPK 与 Fortran 接口时最困难的部分是两个派生类型glp_smcp(单纯形设置)和glp_iocp(整数优化设置)。这些派生类型被视为“盲数组”,因此只需将盲数组的位模式与派生类型匹配,然后通过glp_init_smcp()传递它,例如(如下所示),第一个整数值problem1_set1%msg_lev像往常一样充当指向盲数组的整数指针。

主程序示例

[编辑 | 编辑源代码]
c Intel Fortran Calls to GLPK.

      integer(4) :: problem1_ptr
      character(80) :: problem1_name, problem_name

      type (glp_smcp) :: problem1_set1
      type (glp_iocp) :: problem1_set2

      integer(4) :: M, N, NZ
      integer(4) :: ROWS(NZ), COLS(NZ)
      real(8) :: L(N), U(N), LPOBJ, MIPOBJ, C(N), B(M), A(NZ)
      integer(4) :: status, i, j

      common /cbcommon/ N, problem1_ptr, problem1_name

      problem1_name = "GLPKproblem"

      problem1_ptr = glp_create_prob()
      problem_name = TRIM(problem1_name)//CHAR(0)
      call glp_set_prob_name(problem1_ptr,problem_name)

      status = glp_init_smcp(problem1_set1%msg_lev)
      problem1_set1%presolve = GLP_ON

      status = glp_init_iocp(problem1_set2%msg_lev)
      problem1_set2%fp_heur  = GLP_ON
      problem1_set2%cb_func = LOC(GLPKintsolcb)

      call glp_set_obj_dir(problem1_ptr,GLP_MAX)

      status = glp_add_rows(problem1_ptr,M)
      status = glp_add_cols(problem1_ptr,N)

      do i = 1,M
        if (constraint_type(i) == "E") then
          call glp_set_row_bnds(problem1_ptr,i,GLP_FX,B(i),0d+0)
        elseif (constraint_type(i) == "L") then
          call glp_set_row_bnds(problem1_ptr,i,GLP_UP,0d+0,B(i))
        elseif (constraint_type(i) == "G") then
          call glp_set_row_bnds(problem1_ptr,i,GLP_LO,B(i),0d+0)
        end if
      end do

      do j = 1,N
        call glp_set_col_bnds(problem1_ptr,j,GLP_DB,L(j),U(j))
        call glp_set_obj_coef(problem1_ptr,j,C(j))
        if ((L(j) == 0) .and. (U(j) == 1.0)) then
          call glp_set_col_kind(problem1_ptr,j,GLP_BV)
        else
          call glp_set_col_kind(problem1_ptr,j,GLP_CV)
        end if
      end do

      call glp_load_matrix(problem1_ptr,NZ,ROWS,COLS,A)

      status = glp_simplex(problem1_ptr,problem1_set1%msg_lev)
        LPOBJ = glp_get_obj_val(problem1_ptr)
        status = glp_get_status(problem1_ptr)

      status = glp_intopt(problem1_ptr,problem1_set2%msg_lev)
      MIPOBJ = glp_mip_obj_val(problem1_ptr)
        status = glp_mip_status(problem1_ptr)

c Intel Fortran Callback to GLPK (if required).

      subroutine GLPKintsolcb(tree,info)
cDEC$ ATTRIBUTES DLLEXPORT, REFERENCE, ALIAS : "GLPKINTSOLCB" :: GLPKINTSOLCB

        implicit none

        integer(4) :: N
        integer(4) :: problem1_ptr
        character(80) :: problem1_name
        common /cbcommon/ N, problem1_ptr, problem1_name

        character(80) :: problem_name

        integer(4), intent(in) :: tree
cDEC$ ATTRIBUTES REFERENCE :: tree
        integer(4), optional, intent(in) :: info
cDEC$ ATTRIBUTES REFERENCE :: info

        real(8) :: x(1:N)

        integer(4) :: status, i

        interface

            integer(4) function glp_ios_reason(tree)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_ios_reason" :: glp_ios_reason
                    integer(4) :: tree
cDEC$ ATTRIBUTES REFERENCE :: tree
          end function

          integer(4) function glp_mip_status(prob)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_mip_status" :: glp_mip_status
                    integer(4) :: prob
cDEC$ ATTRIBUTES VALUE :: prob
            end function

          real(8) function glp_mip_obj_val(prob)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_mip_obj_val" :: glp_mip_obj_val
              integer(4) :: prob
cDEC$ ATTRIBUTES VALUE :: prob
          end function

            real(8) function glp_mip_col_val(prob,j)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_mip_col_val" :: glp_mip_col_val
                    integer(4) :: prob
cDEC$ ATTRIBUTES VALUE :: prob
            integer(4) :: j
cDEC$ ATTRIBUTES VALUE :: j
            end function

        end interface

        integer(4) :: GLP_IROWGEN
        integer(4) :: GLP_IBINGO
        integer(4) :: GLP_IHEUR
        integer(4) :: GLP_ICUTGEN
        integer(4) :: GLP_IBRANCH
        integer(4) :: GLP_ISELECT
        integer(4) :: GLP_IPREPRO

        parameter (GLP_IROWGEN =  1)
        parameter (GLP_IBINGO  =  2)
        parameter (GLP_IHEUR   =  3)
        parameter (GLP_ICUTGEN =  4)
        parameter (GLP_IBRANCH =  5)
        parameter (GLP_ISELECT =  6)
        parameter (GLP_IPREPRO =  7)

        select case (glp_ios_reason(tree))

        case (GLP_IBINGO)

          do i = 1,N
            x(i) = glp_mip_col_val(problem1_ptr,i)
          end do

        end select

      end subroutine GLPKintsolcb

c Intel Fortran Bindings/Interface to GLPK.

      integer(4) :: GLP_MIN
      integer(4) :: GLP_MAX

      integer(4) :: GLP_FR
      integer(4) :: GLP_LO
      integer(4) :: GLP_UP
      integer(4) :: GLP_DB
      integer(4) :: GLP_FX

      integer(4) :: GLP_ON
      integer(4) :: GLP_OFF

      integer(4) :: GLP_PRIMAL
      integer(4) :: GLP_DUALP
      integer(4) :: GLP_DUAL

      integer(4) :: GLP_OPT
      integer(4) :: GLP_FEAS
      integer(4) :: GLP_INFEAS
      integer(4) :: GLP_NOFEAS
      integer(4) :: GLP_UNBND
      integer(4) :: GLP_UNDEF

      integer(4) :: GLP_CV
      integer(4) :: GLP_IV
      integer(4) :: GLP_BV

      integer(4) :: GLP_IROWGEN
      integer(4) :: GLP_IBINGO
      integer(4) :: GLP_IHEUR
      integer(4) :: GLP_ICUTGEN
      integer(4) :: GLP_IBRANCH
      integer(4) :: GLP_ISELECT
      integer(4) :: GLP_IPREPRO

        parameter (GLP_MIN = 1)
        parameter (GLP_MAX = 2)

        parameter (GLP_FR = 1)
        parameter (GLP_LO = 2)
        parameter (GLP_UP = 3)
        parameter (GLP_DB = 4)
        parameter (GLP_FX = 5)

        parameter (GLP_ON = 1)
        parameter (GLP_OFF = 0)

        parameter (GLP_PRIMAL = 1)
        parameter (GLP_DUALP  = 2)
        parameter (GLP_DUAL   = 3)

      parameter (GLP_UNDEF  = 1)
      parameter (GLP_FEAS   = 2)
      parameter (GLP_INFEAS = 3)
      parameter (GLP_NOFEAS = 4)
      parameter (GLP_OPT    = 5)
      parameter (GLP_UNBND  = 6)

      parameter (GLP_CV = 1)
      parameter (GLP_IV = 2)
      parameter (GLP_BV = 3)

      parameter (GLP_IROWGEN =  1)
      parameter (GLP_IBINGO  =  2)
      parameter (GLP_IHEUR   =  3)
      parameter (GLP_ICUTGEN =  4)
      parameter (GLP_IBRANCH =  5)
      parameter (GLP_ISELECT =  6)
      parameter (GLP_IPREPRO =  7)

      type, bind(c) :: glp_smcp
        integer (c_int) :: msg_lev
        integer (c_int) :: meth
        integer (c_int) :: pricing
        integer (c_int) :: r_test
        real (c_double) :: tol_bnd
        real (c_double) :: tol_dj
        real (c_double) :: tol_piv
        real (c_double) :: obj_ll
        real (c_double) :: obj_ul
        integer (c_int) :: it_lim
        integer (c_int) :: tm_lim
        integer (c_int) :: out_frq
        integer (c_int) :: out_dly
        integer (c_int) :: presolve
        real (c_double) :: foo_bar(0:35)
      end type glp_smcp

      type, bind(c) :: glp_iocp
        integer (c_int) :: msg_lev
        integer (c_int) :: br_tech
        integer (c_int) :: bt_tech
        real (c_double) :: tol_int
        real (c_double) :: tol_obj
        integer (c_int) :: tm_lim
        integer (c_int) :: out_frq
        integer (c_int) :: out_dly
        integer (c_int) :: cb_func
        integer (c_int) :: cb_info
        integer (c_int) :: cb_size
        integer (c_int) :: pp_tech
        real (c_double) :: mip_gap
        integer (c_int) :: mir_cuts
        integer (c_int) :: gmi_cuts
        integer (c_int) :: cov_cuts
        integer (c_int) :: clq_cuts
        integer (c_int) :: presolve
        integer (c_int) :: binarize
        integer (c_int) :: fp_heur
        real (c_double) :: foo_bar(0:29)
      end type glp_iocp

      interface

        integer(4) function glp_create_prob()
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_create_prob" :: glp_create_prob
        end function

        integer(4) function glp_init_smcp(parm_struct)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_init_smcp" :: glp_init_smcp
          integer(4) :: parm_struct
cDEC$ ATTRIBUTES REFERENCE :: parm_struct
        end function

          subroutine glp_set_prob_name(prob,probname)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_set_prob_name" :: glp_set_prob_name
            integer(4) :: prob
cDEC$ ATTRIBUTES VALUE :: prob
            character(*) :: probname
cDEC$ ATTRIBUTES REFERENCE :: probname
          end subroutine

          subroutine glp_set_obj_dir(prob,objdir)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_set_obj_dir" :: glp_set_obj_dir
            integer(4) :: prob
cDEC$ ATTRIBUTES VALUE :: prob
            integer(4) :: objdir
cDEC$ ATTRIBUTES VALUE :: objdir
          end subroutine

          integer(4) function glp_add_rows(prob,nrs)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_add_rows" :: glp_add_rows
            integer(4) :: prob
cDEC$ ATTRIBUTES VALUE :: prob
            integer(4) :: nrs
cDEC$ ATTRIBUTES VALUE :: nrs
          end function

          integer(4) function glp_add_cols(prob,ncs)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_add_cols" :: glp_add_cols
            integer(4) :: prob
cDEC$ ATTRIBUTES VALUE :: prob
            integer(4) :: ncs
cDEC$ ATTRIBUTES VALUE :: ncs
          end function

          subroutine glp_set_obj_coef(prob,j,coef)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_set_obj_coef" :: glp_set_obj_coef
            integer(4) :: prob
cDEC$ ATTRIBUTES VALUE :: prob
            integer(4) :: j
cDEC$ ATTRIBUTES VALUE :: j
            real(8) :: coef
cDEC$ ATTRIBUTES VALUE :: coef
          end subroutine

          subroutine glp_set_row_bnds(prob,i,type,lb,ub)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_set_row_bnds" :: glp_set_row_bnds
            integer(4) :: prob
cDEC$ ATTRIBUTES VALUE :: prob
            integer(4) :: i
cDEC$ ATTRIBUTES VALUE :: i
            integer(4) :: type
cDEC$ ATTRIBUTES VALUE :: type
            real(8) :: lb
cDEC$ ATTRIBUTES VALUE :: lb
            real(8) :: ub
cDEC$ ATTRIBUTES VALUE :: ub
          end subroutine

          subroutine glp_set_col_bnds(prob,j,type,lb,ub)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_set_col_bnds" :: glp_set_col_bnds
                  integer(4) :: prob
cDEC$ ATTRIBUTES VALUE :: prob
                  integer(4) :: j
cDEC$ ATTRIBUTES VALUE :: j
                  integer(4) :: type
cDEC$ ATTRIBUTES VALUE :: type
                  real(8) :: lb
cDEC$ ATTRIBUTES VALUE :: lb
                  real(8) :: ub
cDEC$ ATTRIBUTES VALUE :: ub
          end subroutine

          subroutine glp_load_matrix(prob,ne,ia,ja,ar)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_load_matrix" :: glp_load_matrix
                  integer(4) :: prob
cDEC$ ATTRIBUTES VALUE :: prob
                  integer(4) :: ne
cDEC$ ATTRIBUTES VALUE :: ne
                  integer(4) :: ia(*)
cDEC$ ATTRIBUTES REFERENCE :: ia
                  integer(4) :: ja(*)
cDEC$ ATTRIBUTES REFERENCE :: ja
                  real(8) :: ar(*)
cDEC$ ATTRIBUTES REFERENCE :: ar
          end subroutine

          integer(4) function glp_check_dup(m,n,ne,ia,ja)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_check_dup" :: glp_check_dup
                  integer(4) :: m
cDEC$ ATTRIBUTES VALUE :: m
                  integer(4) :: n
cDEC$ ATTRIBUTES VALUE :: n
                  integer(4) :: ne
cDEC$ ATTRIBUTES VALUE :: ne
                  integer(4) :: ia(*)
cDEC$ ATTRIBUTES REFERENCE :: ia
                  integer(4) :: ja(*)
cDEC$ ATTRIBUTES REFERENCE :: ja
          end function

          integer(4) function glp_simplex(prob,parm)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_simplex" :: glp_simplex
                  integer(4) :: prob
cDEC$ ATTRIBUTES VALUE :: prob
                  integer(4) :: parm
cDEC$ ATTRIBUTES REFERENCE :: parm
          end function

          integer(4) function glp_write_lp(prob,parm,fname)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_write_lp" :: glp_write_lp
                  integer(4) :: prob
cDEC$ ATTRIBUTES VALUE :: prob
                  integer(4) :: parm
cDEC$ ATTRIBUTES REFERENCE :: parm
                  character(*) :: fname
cDEC$ ATTRIBUTES REFERENCE :: fname
          end function

          integer(4) function glp_get_status(prob)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_get_status" :: glp_get_status
                  integer(4) :: prob
cDEC$ ATTRIBUTES VALUE :: prob
          end function

          real(8) function glp_get_obj_val(prob)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_get_obj_val" :: glp_get_obj_val
                  integer(4) :: prob
cDEC$ ATTRIBUTES VALUE :: prob
          end function

          real(8) function glp_get_col_prim(prob,j)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_get_col_prim" :: glp_get_col_prim
                  integer(4) :: prob
cDEC$ ATTRIBUTES VALUE :: prob
          integer(4) :: j
cDEC$ ATTRIBUTES VALUE :: j
          end function

        integer(4) function glp_init_iocp(parm_struct)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_init_iocp" :: glp_init_iocp

            integer(4) :: parm_struct
cDEC$ ATTRIBUTES REFERENCE :: parm_struct
        end function

          subroutine glp_set_col_kind(prob,j,kind)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_set_col_kind" :: glp_set_col_kind
                  integer(4) :: prob
cDEC$ ATTRIBUTES VALUE :: prob
          integer(4) :: j
cDEC$ ATTRIBUTES VALUE :: j
          integer(4) :: kind
cDEC$ ATTRIBUTES VALUE :: kind
          end subroutine

          integer(4) function glp_intopt(prob,parm)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_intopt" :: glp_intopt
                  integer(4) :: prob
cDEC$ ATTRIBUTES VALUE :: prob
                  integer(4) :: parm
cDEC$ ATTRIBUTES REFERENCE :: parm
          end function

          integer(4) function glp_mip_status(prob)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_mip_status" :: glp_mip_status
                  integer(4) :: prob
cDEC$ ATTRIBUTES VALUE :: prob
          end function

        real(8) function glp_mip_obj_val(prob)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_mip_obj_val" :: glp_mip_obj_val
            integer(4) :: prob
cDEC$ ATTRIBUTES VALUE :: prob
          end function

          real(8) function glp_mip_col_val(prob,j)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_mip_col_val" :: glp_mip_col_val
                  integer(4) :: prob
cDEC$ ATTRIBUTES VALUE :: prob
          integer(4) :: j
cDEC$ ATTRIBUTES VALUE :: j
          end function

        integer(4) function glp_ios_curr_node(tree)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_ios_curr_node" :: glp_ios_curr_node
          integer(4) :: tree
cDEC$ ATTRIBUTES REFERENCE :: tree
        end function

          subroutine glp_delete_prob(prob)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_delete_prob" :: glp_delete_prob
                  integer(4) :: prob
cDEC$ ATTRIBUTES VALUE :: prob
          end subroutine

          integer(4) function glp_ios_reason(tree)
cDEC$ ATTRIBUTES DLLIMPORT, ALIAS : "_glp_ios_reason" :: glp_ios_reason
                  integer(4) :: tree
cDEC$ ATTRIBUTES REFERENCE :: tree
          end function

        subroutine GLPKintsolcb(tree,info)
cDEC$ ATTRIBUTES DLLEXPORT, REFERENCE, ALIAS : "GLPKINTSOLCB" ::
GLPKINTSOLCB
          integer(4), intent(in) :: tree
cDEC$ ATTRIBUTES REFERENCE :: tree

c * Note that because "info" is always NULL in our case, we can completely remove it
c   from the argument list above.

          integer(4), optional, intent(in) :: info
cDEC$ ATTRIBUTES REFERENCE :: info
        end subroutine

      end interface

GLPK-Fortran

[编辑 | 编辑源代码]

可在 https://github.com/ArmstrongJ/GLPK-Fortran 找到 Jeff Armstrong 的 FORTRAN 90 绑定。开发于 2014 年停止。代码在 GPL 3 下获得许可。

华夏公益教科书