public MatrixND<Double> run(double error) {
   MatrixND<Double> data = new MatrixNDImpl<Double>(dimensions, 1.0);
   while (!finish(error)) {
     os.iterate(data, 0);
     fs.iterate(data, 1);
     fo.iterate(data, new int[] {2});
     f.iterate(data, new int[] {1, 2});
   }
   return data;
 }