public static void inferenceOfUserAndProductStates(List<Edge<UserStates, ProductStates>> edges) {
    int iterationsNumber = 100;
    for (int i = 0; i < iterationsNumber; i++) {
      // Scheduling schema, which described in article:
      // 1) User -> Product
      // 2) User <- Product

      // User -> Product
      for (Edge<UserStates, ProductStates> edge : edges) {
        edge.updateMessagesNode1ToNode2();
      }
      for (Edge<UserStates, ProductStates> edge : edges) {
        edge.refreshMessagesNode1ToNode2();
      }

      // User <- Product
      for (Edge<UserStates, ProductStates> edge : edges) {
        edge.updateMessagesNode2ToNode1();
      }
      for (Edge<UserStates, ProductStates> edge : edges) {
        edge.refreshMessagesNode2ToNode1();
      }

      // Alternative scheduling schema:
      // Simultaneous passing of messages:
      // User -> Product
      // User <- Product
      //
      // for (Edge edge : edges) {
      // edge.updateMessagesNode1ToNode2();
      // edge.updateMessagesNode2ToNode1();
      // }
      // for (Edge edge : edges) {
      // edge.refreshMessagesNode1ToNode2();
      // edge.refreshMessagesNode2ToNode1();
      // }
    }
  }