code: public <M> Graph<K, VV, EV> runGatherSumApplyIteration(
  			org.apache.flink.graph.gsa.GatherFunction<VV, EV, M> gatherFunction, SumFunction<VV, EV, M> sumFunction,
  			ApplyFunction<K, VV, M> applyFunction, int maximumNumberOfIterations,
  			GSAConfiguration parameters) {
  
  		GatherSumApplyIteration<K, VV, EV, M> iteration = GatherSumApplyIteration.withEdges(
  				edges, gatherFunction, sumFunction, applyFunction, maximumNumberOfIterations);
  
  		iteration.configure(parameters);
  
  		DataSet<Vertex<K, VV>> newVertices = vertices.runOperation(iteration);
  
  		return new Graph<>(newVertices, this.edges, this.context);
  	}
docs: Runs a Gather-Sum-Apply iteration on the graph with configuration options.
  
  @param gatherFunction the gather function collects information about adjacent vertices and edges
  @param sumFunction the sum function aggregates the gathered information
  @param applyFunction the apply function updates the vertex values with the aggregates
  @param maximumNumberOfIterations maximum number of iterations to perform
  @param parameters the iteration configuration parameters
  @param <M> the intermediate type used between gather, sum and apply
  
  @return the updated Graph after the gather-sum-apply iteration has converged or
  after maximumNumberOfIterations.