PROBLEM SymbReg CODE << double[,] x; double[] y; int[] variables; int[] rows; double RSquared(IEnumerable xs, IEnumerable ys) { // calculate Pearson's correlation in one pass over xs and ys double sumx = 0.0; double sumy = 0.0; double sumxSq = 0.0; double sumySq = 0.0; double sumxy = 0.0; int n = 0; var xEnum = xs.GetEnumerator(); var yEnum = ys.GetEnumerator(); while(xEnum.MoveNext() & yEnum.MoveNext()) { sumx += xEnum.Current; sumy += yEnum.Current; sumxSq += xEnum.Current * xEnum.Current; sumySq += yEnum.Current * yEnum.Current; sumxy += xEnum.Current * yEnum.Current; n++; } System.Diagnostics.Debug.Assert(!(xEnum.MoveNext() | yEnum.MoveNext())); double num; double den; double r = 0.0; num = sumxy - ( ( sumx * sumy ) / n ); den = Math.Sqrt( ( sumxSq - ( sumx * sumx ) / n ) * ( sumySq - ( sumy * sumy ) / n ) ); if(den > 0){ r = num / den; } return r*r; } >> INIT << // generate 500 cases of poly-10 benchmark function int n = 500; variables = new int[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; var rand = new System.Random(); x = new double[n, 10]; y = new double[n]; for(int row = 0; row < n; row++) { for(int col = 0; col < 10; col++) { x[row, col] = rand.NextDouble() * 2.0 - 1.0; } y[row] = x[row, 0] * x[row, 1] + x[row, 2] * x[row, 3] + x[row, 4] * x[row, 5] + x[row, 0] * x[row, 6] + x[row, 8] + x[row, 2] * x[row, 5] + x[row, 9]; } rows = System.Linq.Enumerable.Range(0, n).ToArray(); >> NONTERMINALS Model<>. RPB<>. Addition<>. Subtraction<>. Multiplication<>. Division<>. TERMINALS Const<> CONSTRAINTS val IN RANGE <<-10.0>> .. <<10.0>> . Var<> CONSTRAINTS variable IN SET <> weight IN RANGE <<-10.0>> .. <<10.0>> . RULES Model<> = RPB<> . RPB<> = LOCAL << int variable; double w; >> Addition<> | Subtraction<> | Division<> | Multiplication<> | Var<> SEM << val = w * x[row, variable]; >> | Const<> . Addition<> = LOCAL << double x1, x2; >> RPB<> RPB<> SEM << val = x1 + x2; >> . Subtraction<> = LOCAL << double x1, x2; >> RPB<> RPB<> SEM << val = x1 - x2; >> . Division<> = LOCAL << double x1, x2; >> RPB<> RPB<> SEM << val = x1 / x2; >> . Multiplication<> = LOCAL << double x1, x2; >> RPB<> RPB<> SEM << val = x1 * x2; >> . MAXIMIZE << var predicted = rows.Select(r => { double result; Model(r, out result); /* we can call the root symbol directly */ return result; }); return RSquared(predicted, y); >> END SymbReg.