private Hashtable<String, Double> evaluateGlobalObjectRank(Digraph digraph, JSONObject jsonObj) {
		double d = 0.2;
		double transferRate = 0.2;
		Hashtable<String, Double> objectRankHT = new Hashtable<String, Double>();
		JSONArray topSortedNodesArray = null;
		int nVertices = digraph.nVertices();
		double base = 1.0/ nVertices;
		double val = 0.0;
		if( nVertices > 0 )
			val = (1.0-d) / nVertices;
		try {
			topSortedNodesArray = jsonObj.getJSONArray("nodes");
			for( int i = 0; i < topSortedNodesArray.length(); i++ ) {
				JSONObject nodeObj = topSortedNodesArray.getJSONObject(i);
				String nodeId = nodeObj.getString("nodeId");
				if( nodeObj.has("rankFactor") ) {
					double rankFactor = nodeObj.getDouble("rankFactor");
					objectRankHT.put(nodeId, (d * base + val) * (1.0 + rankFactor) );
				}
				else
					objectRankHT.put(nodeId, d * base + val);
			}
			for( int i = 0; i < topSortedNodesArray.length(); i++ ) {
				JSONObject nodeObj = topSortedNodesArray.getJSONObject(i);
				String nodeId = nodeObj.getString("nodeId");
				//System.out.println(nodeId);
				double nodeOR = objectRankHT.get(nodeId);
				List<String> adjList = digraph.getAdjList(nodeId);
				double alpha = 0.0;
				if( adjList.size() > 0 )
					alpha = transferRate / adjList.size();
				for( String adjNode : adjList ) {
					double adjNodeOR = objectRankHT.get(adjNode);
					objectRankHT.put(adjNode, adjNodeOR + nodeOR * alpha );
				}
			}
		}
		catch (JSONException e) {
			e.printStackTrace();
		}
		return objectRankHT;
	}