GAMS通用代数建模软件之GAMS Transfer R

摘要:GAMS Transfer R于2022年8月首次与GAMS主要版本一起发布,并已包含在所有后续的GAMS版本中。最近,我们将GAMS Transfer R开源并发布在CRAN上。在这篇文章中,将简要概述GAMS Transfer R,它是什么,它旨在帮助谁,

GAMS Transfer R于2022年8月首次与GAMS主要版本一起发布,并已包含在所有后续的GAMS版本中。最近,我们将GAMS Transfer R开源并发布在CRAN上。在这篇文章中,将简要概述GAMS Transfer R,它是什么,它旨在帮助谁,以及如何使用它。


什么是gamstransfer,我们为什么需要它?

虽然GAMS语法很强大,但它不是一种通用的编程语言。用户可能更喜欢依赖他们的偏好语言来执行任务不一定需要GAMS语言,例如来自各种数据源的数据处理I/O。对于使用R作为首选语言的用户来说,gamstransfer是一个能够与GAMS进行无缝数据交换的软件包。它提供了面向对象和直观的语法,用于读取和写入GDX文件,理解、分析和修改R中的GAMS数据。通过内部C++功能调用,gamstransfer具有很高的性能,能够将大量数据传输到GAMS,而不是处理单个符号的记录。


如何安装gamstransfer?

gamstransfer在CRAN上可用,可以通过R控制台中的单个命令安装:

install.packages("gamstransfer")


设计理念

gamstransfer与transfer家族中的其他产品(如transfer Python和transfer Matlab)的理念相一致。其核心思想是使用一个Container来封装所有数据。Container具有状态感知能力,维护符号之间的链接(例如域链接),并支持跨多个符号的分析和操作。读写操作通过容器方法进行read和write。


示例说明

读取GDX文件gams_data.GDX只需要一次power调用。以下是从GAMS模型库读取运输模型数据的示例。

library(gamstransfer)

m = Container$new("trnsport.gdx")

为了从这些数据中访问包含距离的参数,可以执行m[“d”]。要访问记录,可以使用m[“d”]$记录。目前,符号记录以R数据帧格式存储。

假设数据是R格式的(来自Excel、SQL等任何来源),将其写入GDX文件很容易,如下例所示。在这里,我们再次使用运输模型的数据。执行此操作的步骤如下:

1. 创建容器

2. 向容器中添加符号

3. 使用$write power调用

library(gamstransfer)

m = Container$new

# create the sets i, j

i = Set$new(m, "i", records = c("seattle", "san-diego"), description = "supply")

j = Set$new(m, "j", records = c("new-york", "chicago", "topeka"), description = "markets")

# add "d" parameter -- domain linked to set objects i and j

d = Parameter$new(m, "d", c(i, j), description = "distance in thousands of miles")

# create some data as a generic data frame

dist = data.frame(

from = c("seattle", "seattle", "seattle",

"san-diego", "san-diego", "san-diego"),

to = c("new-york", "chicago", "topeka",

"new-york", "chicago", "topeka"),

thousand_miles = c(2.5, 1.7, 1.8, 2.5, 1.8, 1.4)

)

# setRecords will automatically convert the dist data frame into

# a standard data frame format

d$setRecords(dist)


注意,对于集合,记录作为向量传递,对于参数d,则作为data.frame传递。一旦数据被加载到Container中,将其写入GDX文件就很容易了。


gamstransfer利用R6包提供的面向对象编程功能。所有符号和容器都是R6对象,使gamstransfer能够通过引用传递数据并保持符号之间的可靠链接。此外,gamstransfer使用了新的、开源的基于C++的GDX API和R中的Rcpp包,保证了较高的读写操作性能。我们经常在拥有上亿条记录的数据集上测试gamstransfer。


从GDXRRW过渡

到目前为止,R用户一直依赖GDXRRW工具。随着gamstransfer的出现,GDXRRW现在已被弃用,将不再包含在GAMS中。


北京天演融智软件有限公司(科学软件网)是GAMS软件在中国的授权经销商,为中国的用户提供优质的软件销售和培训服务。

来源:科学软件网

相关推荐