code: private int[][][] adapt( String names[], String domains[][], boolean exact) {
      int maplen = names.length;
      int map[][][] = new int[maplen][][];
      // Make sure all are compatible
      for( int c=0; c<names.length;++c) {
              // Now do domain mapping
        String ms[] = _domains[c];  // Model enum
        String ds[] =  domains[c];  // Data  enum
        if( ms == ds ) { // Domains trivially equal?
        } else if( ms == null ) {
          throw new IllegalArgumentException("Incompatible column: '" + _names[c] + "', expected (trained on) numeric, was passed a categorical");
        } else if( ds == null ) {
          if( exact )
            throw new IllegalArgumentException("Incompatible column: '" + _names[c] + "', expected (trained on) categorical, was passed a numeric");
          throw H2O.unimpl();     // Attempt an asEnum?
        } else if( !Arrays.deepEquals(ms, ds) ) {
          map[c] = getDomainMapping(_names[c], ms, ds, exact);
        } // null mapping is equal to identity mapping
      }
      return map;
    }
docs: Build an adaption array.  The length is equal to the Model's vector length.
  Each inner 2D-array is a
  compressed domain map from data domains to model domains - or null for non-enum
  columns, or null for identity mappings.  The extra final int[] is the
  column mapping itself, mapping from model columns to data columns. or -1
  if missing.
  If 'exact' is true, will throw if there are:
  any columns in the model but not in the input set;
  any enums in the data that the model does not understand
  any enums returned by the model that the data does not have a mapping for.
  If 'exact' is false, these situations will use or return NA's instead.