私は最初のGNU MathProg(AMPL)プログラムを書いて、与えられた基数、ホスト数に対するHyperXトポロジの最小スイッチ(頂点) 、および二分の帯域幅。 http://cal.snu.ac.kr/files/2009.sc.hyperx.pdfMathProg(AMPL) - 別の変数で設定された変数配列
私は仕様書とサンプルプログラムを読んだことがありますが、非常に単純な構文エラーに固執しています。これは簡単な最初のプログラムです。私は次の2つの変数を持つ必要があります:L、ネットワークの次元の数、および長さLの配列S。ここで、Sの各要素は各次元のスイッチの数です。私MathProgプログラムでは、私が表現し、このように:
var L >= 1, integer;
var S{1 .. L} >= 2, integer;
私は$ glpsol --check --math hyperx.mod
を実行したときしかし、私は次のエラーを取得する:
hyperx.mod:28: operand following .. has invalid type
Context: ...isec ; param radix ; var L >= 1 , integer ; var S { 1 .. L }
誰もが、私はきちんとこの関係を表現する方法を説明するのに役立つことができれば、私は感謝するでしょう。また、私が参考にして追加の助けのために書いたプログラム全体を含めています。私のプログラムには多くの構文エラーがあることが予想されますが、私が最初のものを修正するまで、残りの部分を見つける方法はありません。問題の変数の
/*
* A MathProg linear program to find an optimal HyperX topology of a
* given network size, switch radix, and bisection bandwidth. Optimal
* is simplistically defined as minimum switch count network.
*
* A HyperX topology is a multi-dimensional network (graph) where, in
* each dimension, the switches are fully connected. Every switch
* (vertex) is a point in an L-dimensional integer lattic. Each switch
* is identified by a multi-index I = (I_1, ..., I_L) where 0 <= I_k <
* S_k for each k = 1..L, where S_k is the number of switches in each
* dimension. A switch connects to all others whose multi-index is the
* same in all but one coordinate.
*/
/* Network size in number of hosts. */
param hosts;
/* Desired bisection bandwidth. */
param bisec;
/* Maximum switch radix. */
param radix;
/* The number of dimensions in the HyperX. */
var L >= 1, integer;
/* The number of switches in each dimension. */
var S{1 .. L} >= 2, integer;
/*
* Relative bandwidth of the dimension, i.e., the number of links in a
* given dimension.
*/
var K{1 .. L} >= 1, integer;
/* The number Terminals (hosts) per switch */
var T >= 1, integer;
/* Minimize the total number of switches. */
minimize cost: prod{i in 1..L} S[i];
/* The total number of links must be less than the switch radix. */
s.t. Radix: T + sum{i in 1..L} K[i] * (S[i] - 1) <= radix;
/* There must be enough hosts in the network. */
s.t. Hosts: T * prod{i in 1..L} S[i] >= hosts;
/* There must be enough bandwidth. */
s.t. Bandwidth: min{K[i]*S[i]}/(2 * T) >= bisec;
/* The order of the dimensions doesn't matter, so constrain them */
s.t. SwitchDimen: forall{i in 1..(L-1)} S[i] <= S[i+1];
/*
* Bisection bandwidth depends on the smallest S_i * K_i, so we know
* that the smallest switch count dimension needs the most links.
*/
s.t. LinkDimen: forall{i in 1..(L-1)} K[i] >= K[i+1];
# TODO: I would like to constrain the search such that the number of
# terminals, T, is bounded to T >= (hosts/O), where O is the switch
# count of the smallest switch count topology discovered so far, but I
# don't know how to do this.
/* Data section */
data;
param hosts := 32
param bisec := 0.5
param radix := 64
end;