Gams开发工具分解分析可视化

GAMS开发工具:重构、分析、可视化

(增加081109)

(此建议取决于GAMS软件技术基础设施提案与GAMS模型重构.)

伽马是一个DSL公司对于(经济)优化问题。

  • 公式/文件之间依赖关系的可视化
  • 支持重构
  • 测试框架
    • 系统的夜间运行
    • 连接到SVN存储库(跟踪最新工作版本等)
背景
FP(Haskell),“测试、调试和验证”,数学建模,敏捷软件开发(应包含单元测试和重构),软件体系结构
联系人
帕特里克·詹森(Chalmers),塞扎尔·伊昂斯库(研究.PIK)

笔记

学生问题:

  • 1.本提案和GAMS基础设施提案旨在构建一个使用GAMS源代码的开源基础设施。我的任务是通过添加特性来扩展这个基础设施。据我所知,我读了一些关于GAMS的文档,发现已经有了一个编程环境。所以我的问题是要构建的项目是否与可以从网站上下载的IDE类似?

帕特里克的回答:

(很高兴你已经开始做一些“相关工作”的研究-硕士论文最重要的部分之一是建立在当前“最新技术”的基础上,而不是重新发明轮子。我还没有尝试过GAMS IDE,所以我的评论可能有点偏离主题。)

不,我不希望这个项目的结果是一个IDE,而是可以用作IDE的“插件”或作为独立的“批处理模式”工具的软件组件。重点应该放在GAMS语言的语法和语义结构上,使用抽象语法树和源代码到源代码的转换。(理想情况下,我希望系统可以运行在模型源代码的svn版本历史上,并显示聚合结果。)

  • 2.我应该使用哪种语言和哪个平台?

帕特里克:我会说Haskell和Linux,但最重要的部分是可移植性(如果可能的话,独立于平台)。也许在使用http://www.graphviz.org/为了视觉化?Haskell非常擅长处理抽象语法树(也许有bnfconverter[1]),它是我最了解的语言。Linux有很好的软件开发支持和强大的开源传统。

[1]http://www.cs.chalmers.se/cs/Research/Language-technology/BNFC/

  • 3.编写测试框架,是否像Java中的Junit?它是否应该自动生成测试用例?

Patrik:这里的重要部分是支持回归测试,以帮助在重构或改进模型时检测问题(支持在特定更改前后进行测试和比较)。如果某些部分可以自动化,那就太好了,但是典型的GAMS模型的输入数据通常是相当大的浮点数矩阵,我预计很难自动生成这些矩阵。但是,自动测试“输入灵敏度”是很好的——在输入数据变化很小的情况下运行模型,并测量输出的变化(以确定输入不同部分的相对重要性)。用“微不足道”(可能是“全零”)或“边界线大小写”输入来测试模型,以捕捉错误。如果这个“特殊情况”能够(半)自动地从模型源代码分析中生成,那就太好了。跟踪不同版本模型源代码的解算器运行时也会很好。

  • 4.正如您所说,这个建议与GAMS模型重构密切相关。那么什么是对gam的重构支持呢?

帕特里克:一般来说,重构是关于源代码的语义保留转换。对于GAMS和他们在PIK的用户来说,其中一个需求是更改模型的源代码,使其运行更快,但仍然产生相同的结果。另一个需要是重新构造代码以提高可读性,但仍不改变行为。(它可以是重命名变量或方程、拆分或合并文件、在s{i+1}=sum{j=0}{i}(a_j)和s{i+1}=s}i+a}i等之间进行更改。)

目前GAMS支持将一个模型分成几个源文件(可以认为是子模型或子模块),但是没有真正的模块系统,因此对于GAMS优化程序来说,这都是一个很大的优化问题。当模型变得更复杂时,这就成了模型开发人员的一个问题。从概念上讲,他们谈论“组合子模型”,例如经济子模型和气候子模型,但是没有直接的语言支持来开发和测试子模型本身。在目前的系统中,他们犹豫着用更好的版本替换一个子模块,因为他们不确定会对整个系统产生什么影响。对依赖关系可视化和单元测试的支持可以让他们充分相信变化是可控的。


我希望这些答案能帮助你前进-如果你愿意的话,我们可以在下周安排一个会议来完成描述。

注意,这个项目需要与Eric Bergquist进行一些交互,他将负责GAMS模型重构我希望有更多的学生在GAMS软件技术基础设施也是平行的。(如果你有朋友在找硕士项目,你可以试着招募他们;-)