code: public Map<Integer, int[][]> getGridNodesPerMoneyness() {
  
  		//See if the map has already been instantiated.
  		if(keyMap != null) {
  			return Collections.unmodifiableMap(keyMap);
  		}
  
  		//Otherwise create the map and return it.
  		Map<Integer, List<Set<Integer>>> newMap = new HashMap<>();
  
  		for(DataKey key : entryMap.keySet()) {
  			if(! newMap.containsKey(key.moneyness)) {
  				newMap.put(key.moneyness, new ArrayList<Set<Integer>>());
  				newMap.get(key.moneyness).add(new HashSet<Integer>());
  				newMap.get(key.moneyness).add(new HashSet<Integer>());
  			}
  			newMap.get(key.moneyness).get(0).add(key.maturity);
  			newMap.get(key.moneyness).get(1).add(key.tenor);
  		}
  
  		Map<Integer, int[][]> keyMap = new TreeMap<>();
  		for(int moneyness : newMap.keySet()) {
  			int[][] values = new int[2][];
  
  			values[0] = newMap.get(moneyness).get(0).stream().sorted().mapToInt(Integer::intValue).toArray();
  			values[1] = newMap.get(moneyness).get(1).stream().sorted().mapToInt(Integer::intValue).toArray();
  
  			keyMap.put(moneyness, values);
  		}
  		this.keyMap = keyMap;
  		return Collections.unmodifiableMap(keyMap);
  	}
docs: Get a view of the locations of swaptions in this lattice.
  The keys of the map are the levels of moneyness for which there are swaptions, sorted in ascending order.
  The entries for each moneyness consist of an array of arrays { maturities, tenors }, each sorted in ascending order.
  Note, there is no guarantee for the grid per moneyness to be regular.
  Hence, getValue may still throw a NullPointerException, even when using entries from this view.
  
  @return The view of recorded swaptions.