blob: 67c8163bbe31444a8097778c859e501a1307177b [file] [log] [blame] [edit]
/*
* Copyright (c) 2021, Alliance for Open Media. All rights reserved
*
* This source code is subject to the terms of the BSD 3-Clause Clear License
* and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear
* License was not distributed with this source code in the LICENSE file, you
* can obtain it at aomedia.org/license/software-license/bsd-3-c-c/. If the
* Alliance for Open Media Patent License 1.0 was not distributed with this
* source code in the PATENTS file, you can obtain it at
* aomedia.org/license/patent-license/.
*/
#include "aom_ports/aom_timer.h"
#include "av1/encoder/encodeframe_utils.h"
#include "av1/encoder/partition_ml.h"
// Computes residual stats on a transformed and quantized residual of the
// block. This is used as ML features for prediction. The information computed
// is NNZ (Number of Non-Zero coefficients of the transformed and quantized
// residual), MAX_COEFF, PSNR.
void compute_residual_stats(AV1_COMP *const cpi, ThreadData *td,
MACROBLOCK *x, BLOCK_SIZE bsize,
ResidualStats *out) {
AV1_COMMON *cm = &cpi->common;
MACROBLOCKD *const xd = &x->e_mbd;
TX_SIZE tx_size = max_txsize_rect_lookup[bsize];
const int plane = 0;
const int block = 0;
struct macroblock_plane *const p = &x->plane[plane];
struct macroblockd_plane *const pd = &xd->plane[plane];
memset(out, 0, sizeof(ResidualStats));
av1_subtract_plane(x, bsize, plane, cm->width, cm->height
);
const uint16_t *src = x->plane[0].src.buf;
const uint16_t *dst = xd->plane[0].dst.buf;
const int src_stride = x->plane[0].src.stride;
const int dst_stride = xd->plane[0].dst.stride;
out->var = cpi->fn_ptr[bsize].vf(src, src_stride, dst, dst_stride, &out->sse);
const int num_blk = mi_size_wide[bsize] * mi_size_high[bsize];
struct aom_internal_error_info error;
AOM_CHECK_MEM_ERROR(&error, p->eobs,
aom_memalign(32, num_blk * sizeof(p->eobs[0])));
p->coeff = td->shared_coeff_buf.coeff_buf[plane];
p->qcoeff = td->shared_coeff_buf.qcoeff_buf[plane];
p->dqcoeff = td->shared_coeff_buf.dqcoeff_buf[plane];
tran_low_t *const dqcoeff = p->dqcoeff + BLOCK_OFFSET(block);
tran_low_t *const qcoeff = p->qcoeff + BLOCK_OFFSET(block);
tran_low_t *const coeff = p->coeff + BLOCK_OFFSET(block);
AOM_CHECK_MEM_ERROR(&error, p->bobs,
aom_memalign(32, num_blk * sizeof(p->bobs[0])));
AOM_CHECK_MEM_ERROR(
&error, p->txb_entropy_ctx,
aom_memalign(32, num_blk * sizeof(p->txb_entropy_ctx[0])));
TxfmParam txfm_param;
QUANT_PARAM quant_param;
av1_setup_xform(cm, x, plane, tx_size, DCT_DCT, CCTX_NONE, &txfm_param);
av1_setup_quant(tx_size, 0, AV1_XFORM_QUANT_B, cpi->oxcf.q_cfg.quant_b_adapt,
&quant_param);
av1_setup_qmatrix(&cm->quant_params, xd, plane, tx_size, DCT_DCT,
&quant_param);
av1_xform_quant(cm, x, plane, block, 0, 0, bsize, &txfm_param, &quant_param);
const int n_coeffs = av1_get_max_eob(txfm_param.tx_size);
for (int i = 0; i < n_coeffs; i++) {
int abs_qcoeff = abs(qcoeff[i]);
out->satd += abs(coeff[i]);
out->satdq += abs_qcoeff;
out->q_coeff_max = AOMMAX(out->q_coeff_max, abs_qcoeff);
out->q_coeff_nonz += qcoeff[i] != 0;
}
if (p->eobs[block]) {
txfm_param.eob = p->eobs[block];
av1_highbd_inv_txfm_add(dqcoeff, pd->dst.buf, pd->dst.stride, &txfm_param);
}
int sse = 0;
for (int i = 0; i < block_size_high[bsize]; i++) {
for (int j = 0; j < block_size_wide[bsize]; j++) {
int d = pd->dst.buf[i * pd->dst.stride + j] -
x->plane[plane].src.buf[i * x->plane[plane].src.stride + j];
sse += d * d;
}
}
double mse =
((double)sse) / (block_size_high[bsize] * block_size_wide[bsize]);
out->psnr = (float)(sse == 0 ? 70 : AOMMIN(70, 20 * log10(255 / sqrt(mse))));
// TODO: figure out the way to do it w/o allocations
p->coeff = NULL;
p->qcoeff = NULL;
p->dqcoeff = NULL;
aom_free(p->eobs);
p->eobs = NULL;
aom_free(p->bobs);
p->bobs = NULL;
aom_free(p->txb_entropy_ctx);
p->txb_entropy_ctx = NULL;
}
#define ZERO_ARRAY(arr) memset(arr, 0, sizeof(arr))
#define MAX_BLK_SIZE (MAX_TX_SIZE << 1)
#define MAX_BLK_SQUARE (MAX_BLK_SIZE * MAX_BLK_SIZE)
#define MAX_TX_RECT (MAX_TX_SIZE * MAX_BLK_SIZE)
static AOM_INLINE void av1_ml_part_split_features_square(AV1_COMP *const cpi,
MACROBLOCK *x,
int mi_row, int mi_col,
BLOCK_SIZE bsize,
float *out_features) {
const AV1_COMMON *const cm = &cpi->common;
MACROBLOCKD *xd = &x->e_mbd;
MB_MODE_INFO *const mbmi = xd->mi[0];
const int w_mi = mi_size_wide[bsize];
const int h_mi = mi_size_high[bsize];
DECLARE_ALIGNED(16, uint16_t, intrapred[MAX_TX_SQUARE]);
// plus top line and left column
BLOCK_SIZE subsize_sq = get_partition_subsize(
get_partition_subsize(bsize, PARTITION_HORZ), PARTITION_VERT);
if (subsize_sq == BLOCK_INVALID) {
subsize_sq = get_partition_subsize(
get_partition_subsize(bsize, PARTITION_VERT), PARTITION_HORZ);
}
if (subsize_sq != BLOCK_INVALID) {
const int w_sub_mi = mi_size_wide[subsize_sq];
const int h_sub_mi = mi_size_high[subsize_sq];
TX_SIZE tx_sub_size = max_txsize_rect_lookup[subsize_sq];
unsigned int best_sub_sse[2][2][3] = {
{ { INT_MAX, INT_MAX, INT_MAX }, { INT_MAX, INT_MAX, INT_MAX } },
{ { INT_MAX, INT_MAX, INT_MAX }, { INT_MAX, INT_MAX, INT_MAX } }
};
unsigned int best_sub_var[2][2][3] = {
{ { INT_MAX, INT_MAX, INT_MAX }, { INT_MAX, INT_MAX, INT_MAX } },
{ { INT_MAX, INT_MAX, INT_MAX }, { INT_MAX, INT_MAX, INT_MAX } }
};
PREDICTION_MODE best_sub_mode[2][2][3] = {
{ { MODE_INVALID, MODE_INVALID, MODE_INVALID },
{ MODE_INVALID, MODE_INVALID, MODE_INVALID } },
{ { MODE_INVALID, MODE_INVALID, MODE_INVALID },
{ MODE_INVALID, MODE_INVALID, MODE_INVALID } }
};
for (int row_off = 0, r_idx = 0; row_off < h_mi;
row_off += h_sub_mi, ++r_idx) {
int mi_row_left = xd->tile.mi_row_end - mi_row - row_off;
// Don't process beyond the tile boundary
if (mi_row_left < 0) break;
for (int col_off = 0, c_idx = 0; col_off < w_mi;
col_off += w_sub_mi, ++c_idx) {
int mi_col_left = xd->tile.mi_col_end - mi_col - col_off;
// Don't process beyond the tile boundary
if (mi_col_left < 0) break;
int src_off = (row_off << 2) * x->plane[0].src.stride + (col_off << 2);
xd->mb_to_top_edge = (-mi_row - row_off) << MI_SUBPEL_SIZE_LOG2;
xd->mb_to_left_edge = (-mi_col - col_off) << MI_SUBPEL_SIZE_LOG2;
mbmi->sb_type[0] = subsize_sq;
xd->up_available = (mi_row + row_off) > 0;
xd->left_available = (mi_col + col_off) > 0;
for (PREDICTION_MODE intra_sub_mode = INTRA_MODE_START;
intra_sub_mode < INTRA_MODE_END; ++intra_sub_mode) {
memset(intrapred, 0, sizeof(intrapred));
xd->up_available = (mi_row + row_off) > 0;
xd->left_available = (mi_col + col_off) > 0;
av1_predict_intra_block(
cm, xd, w_sub_mi << MI_SIZE_LOG2, h_sub_mi << MI_SIZE_LOG2,
tx_sub_size, intra_sub_mode, 0, 0,
x->plane[0].src.buf + src_off, x->plane[0].src.stride, intrapred,
MAX_TX_SIZE, 0, 0, 0);
unsigned int curr_sse = 0, curr_var = 0;
curr_var = cpi->fn_ptr[txsize_to_bsize[tx_sub_size]].vf(
x->plane[0].src.buf + src_off, x->plane[0].src.stride, intrapred,
MAX_TX_SIZE, &curr_sse);
for (int cand = 0; cand < 3; cand++) {
if (curr_sse < best_sub_sse[r_idx][c_idx][cand]) {
for (int s = 2; s > cand; s--) {
best_sub_sse[r_idx][c_idx][s] =
best_sub_sse[r_idx][c_idx][s - 1];
best_sub_var[r_idx][c_idx][s] =
best_sub_var[r_idx][c_idx][s - 1];
best_sub_mode[r_idx][c_idx][s] =
best_sub_mode[r_idx][c_idx][s - 1];
}
best_sub_sse[r_idx][c_idx][cand] = curr_sse;
best_sub_var[r_idx][c_idx][cand] = curr_var;
best_sub_mode[r_idx][c_idx][cand] = intra_sub_mode;
break;
}
}
}
if (out_features) {
const int sub_area_log2 =
mi_size_wide_log2[subsize_sq] + mi_size_high_log2[subsize_sq] + 4;
for (int cand = 0; cand < 3; ++cand) {
int foff = r_idx * 4 + c_idx * 2 + cand * 8;
out_features[FEATURE_INTRA_NORM_BEST_SSE_0_00 + foff] = logf(
1.0f + (best_sub_sse[r_idx][c_idx][cand] >> sub_area_log2));
out_features[FEATURE_INTRA_NORM_BEST_VAR_0_00 + foff] = logf(
1.0f + (best_sub_var[r_idx][c_idx][cand] >> sub_area_log2));
}
}
}
}
}
}
static AOM_INLINE void av1_ml_part_split_features_none(AV1_COMP *const cpi,
MACROBLOCK *x,
int mi_row, int mi_col,
BLOCK_SIZE bsize,
float *out_features) {
const AV1_COMMON *const cm = &cpi->common;
MACROBLOCKD *xd = &x->e_mbd;
MB_MODE_INFO *const mbmi = xd->mi[0];
const int w_mi = mi_size_wide[bsize];
const int h_mi = mi_size_high[bsize];
TX_SIZE tx_size = max_txsize_rect_lookup[bsize];
unsigned int tx_w = tx_size_wide_unit[tx_size];
unsigned int tx_h = tx_size_high_unit[tx_size];
DECLARE_ALIGNED(16, uint16_t, intrapred[MAX_BLK_SQUARE]);
xd->mb_to_top_edge = -mi_row << MI_SUBPEL_SIZE_LOG2;
xd->mb_to_left_edge = -mi_col << MI_SUBPEL_SIZE_LOG2;
mbmi->sb_type[0] = bsize;
unsigned int best_sse[3] = { INT_MAX, INT_MAX, INT_MAX };
unsigned int best_var[3] = { 0, 0, 0 };
PREDICTION_MODE best_mode[3] = { MODE_INVALID, MODE_INVALID, MODE_INVALID };
for (PREDICTION_MODE intra_mode = INTRA_MODE_START;
intra_mode < INTRA_MODE_END; ++intra_mode) {
unsigned int curr_sse = 0, curr_var = 0;
memset(intrapred, 0, sizeof(intrapred));
for (int row_off = 0; row_off < h_mi; row_off += tx_h) {
for (int col_off = 0; col_off < w_mi; col_off += tx_w) {
int src_off = (row_off << 2) * x->plane[0].src.stride + (col_off << 2);
int intr_off = (row_off << 2) * MAX_BLK_SIZE + (col_off << 2);
xd->up_available = (mi_row + row_off) > 0;
xd->left_available = (mi_col + col_off) > 0;
av1_predict_intra_block(
cm, xd, w_mi << MI_SIZE_LOG2, h_mi << MI_SIZE_LOG2, tx_size,
intra_mode, 0, 0, x->plane[0].src.buf + src_off,
x->plane[0].src.stride, intrapred + intr_off, MAX_BLK_SIZE, 0, 0,
0);
unsigned int tmp = 0;
curr_var += cpi->fn_ptr[txsize_to_bsize[tx_size]].vf(
x->plane[0].src.buf + src_off, x->plane[0].src.stride,
intrapred + intr_off, MAX_BLK_SIZE, &tmp);
curr_sse += tmp;
}
}
for (int cand = 0; cand < 3; cand++) {
if (curr_sse < best_sse[cand]) {
for (int s = 2; s > cand; s--) {
best_sse[s] = best_sse[s - 1];
best_var[s] = best_var[s - 1];
best_mode[s] = best_mode[s - 1];
}
best_sse[cand] = curr_sse;
best_var[cand] = curr_var;
best_mode[cand] = intra_mode;
break;
}
}
}
if (out_features) {
const int blk_area_log2 =
mi_size_wide_log2[bsize] + mi_size_high_log2[bsize] + 4;
out_features[FEATURE_INTRA_NORM_BEST_0_SSE] =
logf(1.0f + (best_sse[0] >> blk_area_log2));
out_features[FEATURE_INTRA_NORM_BEST_0_VAR] =
logf(1.0f + (best_var[0] >> blk_area_log2));
out_features[FEATURE_INTRA_NORM_BEST_1_SSE] =
logf(1.0f + (best_sse[1] >> blk_area_log2));
out_features[FEATURE_INTRA_NORM_BEST_1_VAR] =
logf(1.0f + (best_var[1] >> blk_area_log2));
out_features[FEATURE_INTRA_NORM_BEST_2_SSE] =
logf(1.0f + (best_sse[2] >> blk_area_log2));
out_features[FEATURE_INTRA_NORM_BEST_2_VAR] =
logf(1.0f + (best_var[2] >> blk_area_log2));
}
}
static AOM_INLINE void av1_ml_part_split_features(AV1_COMP *const cpi,
MACROBLOCK *x, int mi_row,
int mi_col, BLOCK_SIZE bsize,
bool search_none_after_rect,
float *out_features) {
MACROBLOCKD *xd = &x->e_mbd;
MB_MODE_INFO *const mbmi = xd->mi[0];
av1_setup_src_planes(x, cpi->source, mi_row, mi_col, 1, NULL);
if (out_features) {
// Q_INDEX
const int dc_q =
av1_dc_quant_QTX(x->qindex, 0, cpi->common.seq_params.base_y_dc_delta_q,
xd->bd) >>
(xd->bd - 8);
out_features[FEATURE_INTRA_LOG_QP_SQUARED] =
logf(1.0f + (float)((int64_t)dc_q * (int64_t)dc_q) /
(256 << (2 * QUANT_TABLE_BITS)));
// Neighbor stuff
const int has_above = !!xd->above_mbmi;
const int has_left = !!xd->left_mbmi;
const BLOCK_SIZE above_bsize =
has_above ? xd->above_mbmi->sb_type[xd->tree_type == CHROMA_PART]
: bsize;
const BLOCK_SIZE left_bsize =
has_left ? xd->left_mbmi->sb_type[xd->tree_type == CHROMA_PART] : bsize;
out_features[FEATURE_INTRA_HAS_ABOVE] = (float)has_above;
out_features[FEATURE_INTRA_LOG_ABOVE_WIDTH] =
(float)mi_size_wide_log2[above_bsize];
out_features[FEATURE_INTRA_LOG_ABOVE_HEIGHT] =
(float)mi_size_high_log2[above_bsize];
out_features[FEATURE_INTRA_HAS_LEFT] = (float)has_left;
out_features[FEATURE_INTRA_LOG_LEFT_WIDTH] =
(float)mi_size_wide_log2[left_bsize];
out_features[FEATURE_INTRA_LOG_LEFT_HEIGHT] =
(float)mi_size_high_log2[left_bsize];
out_features[FEATURE_INTRA_SWITCH] = search_none_after_rect;
out_features[FEATURE_INTRA_PART_T] = xd->tree_type;
}
int old1 = xd->mb_to_top_edge;
int old2 = xd->mb_to_left_edge;
int old3 = mbmi->sb_type[0];
int old4 = mbmi->mrl_index;
mbmi->mrl_index = 0;
av1_ml_part_split_features_square(cpi, x, mi_row, mi_col, bsize,
out_features);
av1_ml_part_split_features_none(cpi, x, mi_row, mi_col, bsize, out_features);
xd->mb_to_top_edge = old1;
xd->mb_to_left_edge = old2;
mbmi->sb_type[0] = old3;
mbmi->mrl_index = old4;
aom_clear_system_state();
}
bool model_in_list(MODEL_TYPE model_type, MODEL_TYPE* out, int num_models) {
for (int i = 0; i < num_models; i++)
if (out[i] == model_type) return true;
return false;
}
struct ModelParams {
float thresh_low;
float thresh_high;
int qp_low;
int qp_high;
};
#define USE_MODEL(tgt_intra, tgt_level, tgt_bsize, model_type, low, high, qp_low, qp_high) {\
if (tgt_intra == intra && (tgt_level == harsh_level || ds_mode) && tgt_bsize == bsize && *num_models < 12) { \
if (!ds_mode || !model_in_list(model_type, out, *num_models)) { \
out[*num_models] = model_type; \
struct ModelParams tmp = {low, high, qp_low, qp_high}; \
params[*num_models] = tmp; \
*num_models += 1; \
} \
} \
}
static void get_model_type(bool intra, BLOCK_SIZE bsize, int harsh_level,
bool ds_mode, MODEL_TYPE* out, struct ModelParams* params, int* num_models) {
// TODO: de-dup the guys
*num_models = 0;
// intra lvl blk model low high qp_l qp_h
USE_MODEL(false, 1, BLOCK_64X64, MODEL_INTER_NONE_64X64_110, 0.15f, 0.55f, 75, 110) // 0.95
USE_MODEL(false, 0, BLOCK_64X64, MODEL_INTER_NONE_64X64_110, 0.10f, 0.68f, 75, 110) // 0.97
USE_MODEL(false, -1, BLOCK_64X64, MODEL_INTER_NONE_64X64_110, 0.07f, 0.76f, 75, 110) // 0.98
USE_MODEL(false, -2, BLOCK_64X64, MODEL_INTER_NONE_64X64_110, 0.05f, 0.85f, 75, 110) // 0.99
USE_MODEL(false, 1, BLOCK_64X64, MODEL_INTER_NONE_64X64_135, 0.17f, 0.57f, 111, 135) // 0.95
USE_MODEL(false, 0, BLOCK_64X64, MODEL_INTER_NONE_64X64_135, 0.10f, 0.70f, 111, 135) // 0.97
USE_MODEL(false, -1, BLOCK_64X64, MODEL_INTER_NONE_64X64_135, 0.07f, 0.78f, 111, 135) // 0.98
USE_MODEL(false, -2, BLOCK_64X64, MODEL_INTER_NONE_64X64_135, 0.05f, 0.87f, 111, 135) // 0.99
USE_MODEL(false, 1, BLOCK_64X64, MODEL_INTER_NONE_64X64_160, 0.17f, 0.57f, 136, 160) // 0.95
USE_MODEL(false, 0, BLOCK_64X64, MODEL_INTER_NONE_64X64_160, 0.10f, 0.70f, 136, 160) // 0.97
USE_MODEL(false, -1, BLOCK_64X64, MODEL_INTER_NONE_64X64_160, 0.07f, 0.78f, 136, 160) // 0.98
USE_MODEL(false, -2, BLOCK_64X64, MODEL_INTER_NONE_64X64_160, 0.05f, 0.87f, 136, 160) // 0.99
USE_MODEL(false, 1, BLOCK_64X64, MODEL_INTER_NONE_64X64_185, 0.15f, 0.55f, 161, 185) // 0.95
USE_MODEL(false, 0, BLOCK_64X64, MODEL_INTER_NONE_64X64_185, 0.10f, 0.68f, 161, 185) // 0.97
USE_MODEL(false, -1, BLOCK_64X64, MODEL_INTER_NONE_64X64_185, 0.07f, 0.76f, 161, 185) // 0.98
USE_MODEL(false, -2, BLOCK_64X64, MODEL_INTER_NONE_64X64_185, 0.05f, 0.85f, 161, 185) // 0.99
USE_MODEL(false, 1, BLOCK_64X64, MODEL_INTER_NONE_64X64_210, 0.17f, 0.57f, 186, 210) // 0.95
USE_MODEL(false, 0, BLOCK_64X64, MODEL_INTER_NONE_64X64_210, 0.10f, 0.70f, 186, 210) // 0.97
USE_MODEL(false, -1, BLOCK_64X64, MODEL_INTER_NONE_64X64_210, 0.07f, 0.78f, 186, 210) // 0.98
USE_MODEL(false, -2, BLOCK_64X64, MODEL_INTER_NONE_64X64_210, 0.05f, 0.87f, 186, 210) // 0.99
USE_MODEL(false, 1, BLOCK_64X64, MODEL_INTER_NONE_64X64_235, 0.17f, 0.57f, 211, 235) // 0.95
USE_MODEL(false, 0, BLOCK_64X64, MODEL_INTER_NONE_64X64_235, 0.10f, 0.70f, 211, 235) // 0.97
USE_MODEL(false, -1, BLOCK_64X64, MODEL_INTER_NONE_64X64_235, 0.07f, 0.78f, 211, 235) // 0.98
USE_MODEL(false, -2, BLOCK_64X64, MODEL_INTER_NONE_64X64_235, 0.05f, 0.87f, 211, 235) // 0.99
USE_MODEL(false, 1, BLOCK_64X32, MODEL_INTER_NONE_64X32_110, 0.17f, 0.62f, 75, 110) // 0.95
USE_MODEL(false, 0, BLOCK_64X32, MODEL_INTER_NONE_64X32_110, 0.12f, 0.73f, 75, 110) // 0.97
USE_MODEL(false, -1, BLOCK_64X32, MODEL_INTER_NONE_64X32_110, 0.09f, 0.80f, 75, 110) // 0.98
USE_MODEL(false, -2, BLOCK_64X32, MODEL_INTER_NONE_64X32_110, 0.06f, 0.88f, 75, 110) // 0.99
USE_MODEL(false, 1, BLOCK_64X32, MODEL_INTER_NONE_64X32_135, 0.09f, 0.49f, 111, 135) // 0.95
USE_MODEL(false, 0, BLOCK_64X32, MODEL_INTER_NONE_64X32_135, 0.05f, 0.62f, 111, 135) // 0.97
USE_MODEL(false, -1, BLOCK_64X32, MODEL_INTER_NONE_64X32_135, 0.05f, 0.72f, 111, 135) // 0.98
USE_MODEL(false, -2, BLOCK_64X32, MODEL_INTER_NONE_64X32_135, 0.05f, 0.84f, 111, 135) // 0.99
USE_MODEL(false, 1, BLOCK_64X32, MODEL_INTER_NONE_64X32_160, 0.17f, 0.62f, 136, 160) // 0.95
USE_MODEL(false, 0, BLOCK_64X32, MODEL_INTER_NONE_64X32_160, 0.12f, 0.73f, 136, 160) // 0.97
USE_MODEL(false, -1, BLOCK_64X32, MODEL_INTER_NONE_64X32_160, 0.09f, 0.80f, 136, 160) // 0.98
USE_MODEL(false, -2, BLOCK_64X32, MODEL_INTER_NONE_64X32_160, 0.06f, 0.88f, 136, 160) // 0.99
USE_MODEL(false, 1, BLOCK_64X32, MODEL_INTER_NONE_64X32_185, 0.09f, 0.49f, 161, 185) // 0.95
USE_MODEL(false, 0, BLOCK_64X32, MODEL_INTER_NONE_64X32_185, 0.05f, 0.62f, 161, 185) // 0.97
USE_MODEL(false, -1, BLOCK_64X32, MODEL_INTER_NONE_64X32_185, 0.05f, 0.72f, 161, 185) // 0.98
USE_MODEL(false, -2, BLOCK_64X32, MODEL_INTER_NONE_64X32_185, 0.05f, 0.84f, 161, 185) // 0.99
USE_MODEL(false, 1, BLOCK_64X32, MODEL_INTER_NONE_64X32_210, 0.17f, 0.62f, 186, 210) // 0.95
USE_MODEL(false, 0, BLOCK_64X32, MODEL_INTER_NONE_64X32_210, 0.12f, 0.73f, 186, 210) // 0.97
USE_MODEL(false, -1, BLOCK_64X32, MODEL_INTER_NONE_64X32_210, 0.09f, 0.80f, 186, 210) // 0.98
USE_MODEL(false, -2, BLOCK_64X32, MODEL_INTER_NONE_64X32_210, 0.06f, 0.88f, 186, 210) // 0.99
USE_MODEL(false, 1, BLOCK_64X32, MODEL_INTER_NONE_64X32_235, 0.09f, 0.49f, 211, 235) // 0.95
USE_MODEL(false, 0, BLOCK_64X32, MODEL_INTER_NONE_64X32_235, 0.05f, 0.62f, 211, 235) // 0.97
USE_MODEL(false, -1, BLOCK_64X32, MODEL_INTER_NONE_64X32_235, 0.05f, 0.72f, 211, 235) // 0.98
USE_MODEL(false, -2, BLOCK_64X32, MODEL_INTER_NONE_64X32_235, 0.05f, 0.84f, 211, 235) // 0.99
USE_MODEL(false, 1, BLOCK_32X64, MODEL_INTER_NONE_32X64_110, 0.18f, 0.60f, 75, 110) // 0.95
USE_MODEL(false, 0, BLOCK_32X64, MODEL_INTER_NONE_32X64_110, 0.12f, 0.72f, 75, 110) // 0.97
USE_MODEL(false, -1, BLOCK_32X64, MODEL_INTER_NONE_32X64_110, 0.09f, 0.79f, 75, 110) // 0.98
USE_MODEL(false, -2, BLOCK_32X64, MODEL_INTER_NONE_32X64_110, 0.06f, 0.88f, 75, 110) // 0.99
USE_MODEL(false, 1, BLOCK_32X64, MODEL_INTER_NONE_32X64_135, 0.19f, 0.63f, 111, 135) // 0.95
USE_MODEL(false, 0, BLOCK_32X64, MODEL_INTER_NONE_32X64_135, 0.12f, 0.74f, 111, 135) // 0.97
USE_MODEL(false, -1, BLOCK_32X64, MODEL_INTER_NONE_32X64_135, 0.09f, 0.82f, 111, 135) // 0.98
USE_MODEL(false, -2, BLOCK_32X64, MODEL_INTER_NONE_32X64_135, 0.05f, 0.90f, 111, 135) // 0.99
USE_MODEL(false, 1, BLOCK_32X64, MODEL_INTER_NONE_32X64_160, 0.18f, 0.60f, 136, 160) // 0.95
USE_MODEL(false, 0, BLOCK_32X64, MODEL_INTER_NONE_32X64_160, 0.12f, 0.72f, 136, 160) // 0.97
USE_MODEL(false, -1, BLOCK_32X64, MODEL_INTER_NONE_32X64_160, 0.09f, 0.79f, 136, 160) // 0.98
USE_MODEL(false, -2, BLOCK_32X64, MODEL_INTER_NONE_32X64_160, 0.06f, 0.88f, 136, 160) // 0.99
USE_MODEL(false, 1, BLOCK_32X64, MODEL_INTER_NONE_32X64_185, 0.19f, 0.63f, 161, 185) // 0.95
USE_MODEL(false, 0, BLOCK_32X64, MODEL_INTER_NONE_32X64_185, 0.12f, 0.74f, 161, 185) // 0.97
USE_MODEL(false, -1, BLOCK_32X64, MODEL_INTER_NONE_32X64_185, 0.09f, 0.82f, 161, 185) // 0.98
USE_MODEL(false, -2, BLOCK_32X64, MODEL_INTER_NONE_32X64_185, 0.05f, 0.90f, 161, 185) // 0.99
USE_MODEL(false, 1, BLOCK_32X64, MODEL_INTER_NONE_32X64_210, 0.18f, 0.60f, 186, 210) // 0.95
USE_MODEL(false, 0, BLOCK_32X64, MODEL_INTER_NONE_32X64_210, 0.12f, 0.72f, 186, 210) // 0.97
USE_MODEL(false, -1, BLOCK_32X64, MODEL_INTER_NONE_32X64_210, 0.09f, 0.79f, 186, 210) // 0.98
USE_MODEL(false, -2, BLOCK_32X64, MODEL_INTER_NONE_32X64_210, 0.06f, 0.88f, 186, 210) // 0.99
USE_MODEL(false, 1, BLOCK_32X64, MODEL_INTER_NONE_32X64_235, 0.19f, 0.63f, 211, 235) // 0.95
USE_MODEL(false, 0, BLOCK_32X64, MODEL_INTER_NONE_32X64_235, 0.12f, 0.74f, 211, 235) // 0.97
USE_MODEL(false, -1, BLOCK_32X64, MODEL_INTER_NONE_32X64_235, 0.09f, 0.82f, 211, 235) // 0.98
USE_MODEL(false, -2, BLOCK_32X64, MODEL_INTER_NONE_32X64_235, 0.05f, 0.90f, 211, 235) // 0.99
USE_MODEL(false, 1, BLOCK_32X32, MODEL_INTER_NONE_32X32_110, 0.18f, 0.71f, 75, 110) // 0.95
USE_MODEL(false, 0, BLOCK_32X32, MODEL_INTER_NONE_32X32_110, 0.12f, 0.80f, 75, 110) // 0.97
USE_MODEL(false, -1, BLOCK_32X32, MODEL_INTER_NONE_32X32_110, 0.08f, 0.85f, 75, 110) // 0.98
USE_MODEL(false, -2, BLOCK_32X32, MODEL_INTER_NONE_32X32_110, 0.05f, 0.91f, 75, 110) // 0.99
USE_MODEL(false, 1, BLOCK_32X32, MODEL_INTER_NONE_32X32_135, 0.16f, 0.61f, 111, 135) // 0.95
USE_MODEL(false, 0, BLOCK_32X32, MODEL_INTER_NONE_32X32_135, 0.11f, 0.71f, 111, 135) // 0.97
USE_MODEL(false, -1, BLOCK_32X32, MODEL_INTER_NONE_32X32_135, 0.08f, 0.78f, 111, 135) // 0.98
USE_MODEL(false, -2, BLOCK_32X32, MODEL_INTER_NONE_32X32_135, 0.05f, 0.87f, 111, 135) // 0.99
USE_MODEL(false, 1, BLOCK_32X32, MODEL_INTER_NONE_32X32_160, 0.18f, 0.71f, 136, 160) // 0.95
USE_MODEL(false, 0, BLOCK_32X32, MODEL_INTER_NONE_32X32_160, 0.12f, 0.80f, 136, 160) // 0.97
USE_MODEL(false, -1, BLOCK_32X32, MODEL_INTER_NONE_32X32_160, 0.08f, 0.85f, 136, 160) // 0.98
USE_MODEL(false, -2, BLOCK_32X32, MODEL_INTER_NONE_32X32_160, 0.05f, 0.91f, 136, 160) // 0.99
USE_MODEL(false, 1, BLOCK_32X32, MODEL_INTER_NONE_32X32_185, 0.16f, 0.61f, 161, 185) // 0.95
USE_MODEL(false, 0, BLOCK_32X32, MODEL_INTER_NONE_32X32_185, 0.11f, 0.71f, 161, 185) // 0.97
USE_MODEL(false, -1, BLOCK_32X32, MODEL_INTER_NONE_32X32_185, 0.08f, 0.78f, 161, 185) // 0.98
USE_MODEL(false, -2, BLOCK_32X32, MODEL_INTER_NONE_32X32_185, 0.05f, 0.87f, 161, 185) // 0.99
USE_MODEL(false, 1, BLOCK_32X32, MODEL_INTER_NONE_32X32_210, 0.18f, 0.71f, 186, 210) // 0.95
USE_MODEL(false, 0, BLOCK_32X32, MODEL_INTER_NONE_32X32_210, 0.12f, 0.80f, 186, 210) // 0.97
USE_MODEL(false, -1, BLOCK_32X32, MODEL_INTER_NONE_32X32_210, 0.08f, 0.85f, 186, 210) // 0.98
USE_MODEL(false, -2, BLOCK_32X32, MODEL_INTER_NONE_32X32_210, 0.05f, 0.91f, 186, 210) // 0.99
USE_MODEL(false, 1, BLOCK_32X32, MODEL_INTER_NONE_32X32_235, 0.16f, 0.61f, 211, 235) // 0.95
USE_MODEL(false, 0, BLOCK_32X32, MODEL_INTER_NONE_32X32_235, 0.11f, 0.71f, 211, 235) // 0.97
USE_MODEL(false, -1, BLOCK_32X32, MODEL_INTER_NONE_32X32_235, 0.08f, 0.78f, 211, 235) // 0.98
USE_MODEL(false, -2, BLOCK_32X32, MODEL_INTER_NONE_32X32_235, 0.05f, 0.87f, 211, 235) // 0.99
USE_MODEL(false, 1, BLOCK_32X16, MODEL_INTER_NONE_32X16_110, 0.14f, 0.69f, 75, 110) // 0.95
USE_MODEL(false, 0, BLOCK_32X16, MODEL_INTER_NONE_32X16_110, 0.11f, 0.77f, 75, 110) // 0.97
USE_MODEL(false, -1, BLOCK_32X16, MODEL_INTER_NONE_32X16_110, 0.10f, 0.82f, 111, 135) // 0.98
USE_MODEL(false, -2, BLOCK_32X16, MODEL_INTER_NONE_32X16_110, 0.07f, 0.88f, 111, 135) // 0.99
USE_MODEL(false, 1, BLOCK_32X16, MODEL_INTER_NONE_32X16_135, 0.21f, 0.74f, 111, 135) // 0.95
USE_MODEL(false, 0, BLOCK_32X16, MODEL_INTER_NONE_32X16_135, 0.14f, 0.82f, 111, 135) // 0.97
USE_MODEL(false, -1, BLOCK_32X16, MODEL_INTER_NONE_32X16_135, 0.10f, 0.88f, 111, 135) // 0.98
USE_MODEL(false, -2, BLOCK_32X16, MODEL_INTER_NONE_32X16_135, 0.05f, 0.94f, 111, 135) // 0.99
USE_MODEL(false, 1, BLOCK_32X16, MODEL_INTER_NONE_32X16_160, 0.14f, 0.69f, 136, 160) // 0.95
USE_MODEL(false, 0, BLOCK_32X16, MODEL_INTER_NONE_32X16_160, 0.11f, 0.77f, 136, 160) // 0.97
USE_MODEL(false, -1, BLOCK_32X16, MODEL_INTER_NONE_32X16_160, 0.10f, 0.82f, 136, 160) // 0.98
USE_MODEL(false, -2, BLOCK_32X16, MODEL_INTER_NONE_32X16_160, 0.07f, 0.88f, 136, 160) // 0.99
USE_MODEL(false, 1, BLOCK_32X16, MODEL_INTER_NONE_32X16_185, 0.21f, 0.74f, 161, 185) // 0.95
USE_MODEL(false, 0, BLOCK_32X16, MODEL_INTER_NONE_32X16_185, 0.14f, 0.82f, 161, 185) // 0.97
USE_MODEL(false, -1, BLOCK_32X16, MODEL_INTER_NONE_32X16_185, 0.10f, 0.88f, 161, 185) // 0.98
USE_MODEL(false, -2, BLOCK_32X16, MODEL_INTER_NONE_32X16_185, 0.05f, 0.94f, 161, 185) // 0.99
USE_MODEL(false, 1, BLOCK_32X16, MODEL_INTER_NONE_32X16_210, 0.14f, 0.69f, 186, 210) // 0.95
USE_MODEL(false, 0, BLOCK_32X16, MODEL_INTER_NONE_32X16_210, 0.11f, 0.77f, 186, 210) // 0.97
USE_MODEL(false, -1, BLOCK_32X16, MODEL_INTER_NONE_32X16_210, 0.10f, 0.82f, 186, 210) // 0.98
USE_MODEL(false, -2, BLOCK_32X16, MODEL_INTER_NONE_32X16_210, 0.07f, 0.88f, 186, 210) // 0.99
USE_MODEL(false, 1, BLOCK_32X16, MODEL_INTER_NONE_32X16_235, 0.21f, 0.74f, 211, 235) // 0.95
USE_MODEL(false, 0, BLOCK_32X16, MODEL_INTER_NONE_32X16_235, 0.14f, 0.82f, 211, 235) // 0.97
USE_MODEL(false, -1, BLOCK_32X16, MODEL_INTER_NONE_32X16_235, 0.10f, 0.88f, 211, 235) // 0.98
USE_MODEL(false, -2, BLOCK_32X16, MODEL_INTER_NONE_32X16_235, 0.05f, 0.94f, 211, 235) // 0.99
USE_MODEL(false, 1, BLOCK_16X32, MODEL_INTER_NONE_16X32_110, 0.15f, 0.70f, 75, 110) // 0.95
USE_MODEL(false, 0, BLOCK_16X32, MODEL_INTER_NONE_16X32_110, 0.11f, 0.78f, 75, 110) // 0.97
USE_MODEL(false, -1, BLOCK_16X32, MODEL_INTER_NONE_16X32_110, 0.09f, 0.83f, 75, 110) // 0.98
USE_MODEL(false, -2, BLOCK_16X32, MODEL_INTER_NONE_16X32_110, 0.06f, 0.89f, 75, 110) // 0.99
USE_MODEL(false, 1, BLOCK_16X32, MODEL_INTER_NONE_16X32_135, 0.21f, 0.73f, 111, 135) // 0.95
USE_MODEL(false, 0, BLOCK_16X32, MODEL_INTER_NONE_16X32_135, 0.14f, 0.80f, 111, 135) // 0.97
USE_MODEL(false, -1, BLOCK_16X32, MODEL_INTER_NONE_16X32_135, 0.10f, 0.84f, 111, 135) // 0.98
USE_MODEL(false, -2, BLOCK_16X32, MODEL_INTER_NONE_16X32_135, 0.05f, 0.91f, 111, 135) // 0.99
USE_MODEL(false, 1, BLOCK_16X32, MODEL_INTER_NONE_16X32_160, 0.15f, 0.70f, 136, 160) // 0.95
USE_MODEL(false, 0, BLOCK_16X32, MODEL_INTER_NONE_16X32_160, 0.11f, 0.78f, 136, 160) // 0.97
USE_MODEL(false, -1, BLOCK_16X32, MODEL_INTER_NONE_16X32_160, 0.09f, 0.83f, 136, 160) // 0.98
USE_MODEL(false, -2, BLOCK_16X32, MODEL_INTER_NONE_16X32_160, 0.06f, 0.89f, 136, 160) // 0.99
USE_MODEL(false, 1, BLOCK_16X32, MODEL_INTER_NONE_16X32_185, 0.21f, 0.73f, 161, 185) // 0.95
USE_MODEL(false, 0, BLOCK_16X32, MODEL_INTER_NONE_16X32_185, 0.14f, 0.80f, 161, 185) // 0.97
USE_MODEL(false, -1, BLOCK_16X32, MODEL_INTER_NONE_16X32_185, 0.10f, 0.84f, 161, 185) // 0.98
USE_MODEL(false, -2, BLOCK_16X32, MODEL_INTER_NONE_16X32_185, 0.05f, 0.91f, 161, 185) // 0.99
USE_MODEL(false, 1, BLOCK_16X32, MODEL_INTER_NONE_16X32_210, 0.15f, 0.70f, 186, 210) // 0.95
USE_MODEL(false, 0, BLOCK_16X32, MODEL_INTER_NONE_16X32_210, 0.11f, 0.78f, 186, 210) // 0.97
USE_MODEL(false, -1, BLOCK_16X32, MODEL_INTER_NONE_16X32_210, 0.09f, 0.83f, 186, 210) // 0.98
USE_MODEL(false, -2, BLOCK_16X32, MODEL_INTER_NONE_16X32_210, 0.06f, 0.89f, 186, 210) // 0.99
USE_MODEL(false, 1, BLOCK_16X32, MODEL_INTER_NONE_16X32_235, 0.21f, 0.73f, 211, 235) // 0.95
USE_MODEL(false, 0, BLOCK_16X32, MODEL_INTER_NONE_16X32_235, 0.14f, 0.80f, 211, 235) // 0.97
USE_MODEL(false, -1, BLOCK_16X32, MODEL_INTER_NONE_16X32_235, 0.10f, 0.84f, 211, 235) // 0.98
USE_MODEL(false, -2, BLOCK_16X32, MODEL_INTER_NONE_16X32_235, 0.05f, 0.91f, 211, 235) // 0.99
USE_MODEL(false, 1, BLOCK_16X16, MODEL_INTER_NONE_16X16_110, 0.22f, 0.85f, 75, 110) // 0.95
USE_MODEL(false, 0, BLOCK_16X16, MODEL_INTER_NONE_16X16_110, 0.15f, 0.90f, 75, 110) // 0.97
USE_MODEL(false, -1, BLOCK_16X16, MODEL_INTER_NONE_16X16_110, 0.12f, 0.93f, 75, 110) // 0.98
USE_MODEL(false, -2, BLOCK_16X16, MODEL_INTER_NONE_16X16_110, 0.08f, 0.96f, 75, 110) // 0.99
USE_MODEL(false, 1, BLOCK_16X16, MODEL_INTER_NONE_16X16_135, 0.25f, 0.77f, 111, 135) // 0.95
USE_MODEL(false, 0, BLOCK_16X16, MODEL_INTER_NONE_16X16_135, 0.15f, 0.84f, 111, 135) // 0.97
USE_MODEL(false, -1, BLOCK_16X16, MODEL_INTER_NONE_16X16_135, 0.09f, 0.87f, 111, 135) // 0.98
USE_MODEL(false, -2, BLOCK_16X16, MODEL_INTER_NONE_16X16_135, 0.05f, 0.92f, 111, 135) // 0.99
USE_MODEL(false, 1, BLOCK_16X16, MODEL_INTER_NONE_16X16_160, 0.22f, 0.85f, 136, 160) // 0.95
USE_MODEL(false, 0, BLOCK_16X16, MODEL_INTER_NONE_16X16_160, 0.15f, 0.90f, 136, 160) // 0.97
USE_MODEL(false, -1, BLOCK_16X16, MODEL_INTER_NONE_16X16_160, 0.12f, 0.93f, 136, 160) // 0.98
USE_MODEL(false, -2, BLOCK_16X16, MODEL_INTER_NONE_16X16_160, 0.08f, 0.96f, 136, 160) // 0.99
USE_MODEL(false, 1, BLOCK_16X16, MODEL_INTER_NONE_16X16_185, 0.25f, 0.77f, 161, 185) // 0.95
USE_MODEL(false, 0, BLOCK_16X16, MODEL_INTER_NONE_16X16_185, 0.15f, 0.84f, 161, 185) // 0.97
USE_MODEL(false, -1, BLOCK_16X16, MODEL_INTER_NONE_16X16_185, 0.09f, 0.87f, 161, 185) // 0.98
USE_MODEL(false, -2, BLOCK_16X16, MODEL_INTER_NONE_16X16_185, 0.05f, 0.92f, 161, 185) // 0.99
USE_MODEL(false, 1, BLOCK_16X16, MODEL_INTER_NONE_16X16_210, 0.22f, 0.85f, 186, 210) // 0.95
USE_MODEL(false, 0, BLOCK_16X16, MODEL_INTER_NONE_16X16_210, 0.15f, 0.90f, 186, 210) // 0.97
USE_MODEL(false, -1, BLOCK_16X16, MODEL_INTER_NONE_16X16_210, 0.12f, 0.93f, 186, 210) // 0.98
USE_MODEL(false, -2, BLOCK_16X16, MODEL_INTER_NONE_16X16_210, 0.08f, 0.96f, 186, 210) // 0.99
USE_MODEL(false, 1, BLOCK_16X16, MODEL_INTER_NONE_16X16_235, 0.25f, 0.77f, 211, 235) // 0.95
USE_MODEL(false, 0, BLOCK_16X16, MODEL_INTER_NONE_16X16_235, 0.15f, 0.84f, 211, 235) // 0.97
USE_MODEL(false, -1, BLOCK_16X16, MODEL_INTER_NONE_16X16_235, 0.09f, 0.87f, 211, 235) // 0.98
USE_MODEL(false, -2, BLOCK_16X16, MODEL_INTER_NONE_16X16_235, 0.05f, 0.92f, 211, 235) // 0.99
USE_MODEL(false, 1, BLOCK_16X8, MODEL_INTER_NONE_16X8_110, 0.17f, 0.82f, 75, 110) // 0.95
USE_MODEL(false, 0, BLOCK_16X8, MODEL_INTER_NONE_16X8_110, 0.11f, 0.87f, 75, 110) // 0.97
USE_MODEL(false, -1, BLOCK_16X8, MODEL_INTER_NONE_16X8_110, 0.08f, 0.90f, 75, 110) // 0.98
USE_MODEL(false, -2, BLOCK_16X8, MODEL_INTER_NONE_16X8_110, 0.06f, 0.93f, 75, 110) // 0.99
USE_MODEL(false, 1, BLOCK_16X8, MODEL_INTER_NONE_16X8_135, 0.18f, 0.84f, 111, 135) // 0.95
USE_MODEL(false, 0, BLOCK_16X8, MODEL_INTER_NONE_16X8_135, 0.12f, 0.89f, 111, 135) // 0.97
USE_MODEL(false, -1, BLOCK_16X8, MODEL_INTER_NONE_16X8_135, 0.10f, 0.92f, 111, 135) // 0.98
USE_MODEL(false, -2, BLOCK_16X8, MODEL_INTER_NONE_16X8_135, 0.07f, 0.96f, 111, 135) // 0.99
USE_MODEL(false, 1, BLOCK_16X8, MODEL_INTER_NONE_16X8_160, 0.17f, 0.82f, 136, 160) // 0.95
USE_MODEL(false, 0, BLOCK_16X8, MODEL_INTER_NONE_16X8_160, 0.11f, 0.87f, 136, 160) // 0.97
USE_MODEL(false, -1, BLOCK_16X8, MODEL_INTER_NONE_16X8_160, 0.08f, 0.90f, 136, 160) // 0.98
USE_MODEL(false, -2, BLOCK_16X8, MODEL_INTER_NONE_16X8_160, 0.06f, 0.93f, 136, 160) // 0.99
USE_MODEL(false, 1, BLOCK_16X8, MODEL_INTER_NONE_16X8_185, 0.18f, 0.84f, 161, 185) // 0.95
USE_MODEL(false, 0, BLOCK_16X8, MODEL_INTER_NONE_16X8_185, 0.12f, 0.89f, 161, 185) // 0.97
USE_MODEL(false, -1, BLOCK_16X8, MODEL_INTER_NONE_16X8_185, 0.10f, 0.92f, 161, 185) // 0.98
USE_MODEL(false, -2, BLOCK_16X8, MODEL_INTER_NONE_16X8_185, 0.07f, 0.96f, 161, 185) // 0.99
USE_MODEL(false, 1, BLOCK_16X8, MODEL_INTER_NONE_16X8_210, 0.17f, 0.82f, 186, 210) // 0.95
USE_MODEL(false, 0, BLOCK_16X8, MODEL_INTER_NONE_16X8_210, 0.11f, 0.87f, 186, 210) // 0.97
USE_MODEL(false, -1, BLOCK_16X8, MODEL_INTER_NONE_16X8_210, 0.08f, 0.90f, 186, 210) // 0.98
USE_MODEL(false, -2, BLOCK_16X8, MODEL_INTER_NONE_16X8_210, 0.06f, 0.93f, 186, 210) // 0.99
USE_MODEL(false, 1, BLOCK_16X8, MODEL_INTER_NONE_16X8_235, 0.18f, 0.84f, 211, 235) // 0.95
USE_MODEL(false, 0, BLOCK_16X8, MODEL_INTER_NONE_16X8_235, 0.12f, 0.89f, 211, 235) // 0.97
USE_MODEL(false, -1, BLOCK_16X8, MODEL_INTER_NONE_16X8_235, 0.10f, 0.92f, 211, 235) // 0.98
USE_MODEL(false, -2, BLOCK_16X8, MODEL_INTER_NONE_16X8_235, 0.07f, 0.96f, 211, 235) // 0.99
USE_MODEL(false, 1, BLOCK_8X16, MODEL_INTER_NONE_8X16_110, 0.18f, 0.80f, 75, 110) // 0.95
USE_MODEL(false, 0, BLOCK_8X16, MODEL_INTER_NONE_8X16_110, 0.12f, 0.86f, 75, 110) // 0.97
USE_MODEL(false, -1, BLOCK_8X16, MODEL_INTER_NONE_8X16_110, 0.09f, 0.89f, 75, 110) // 0.98
USE_MODEL(false, -2, BLOCK_8X16, MODEL_INTER_NONE_8X16_110, 0.06f, 0.93f, 75, 110) // 0.99
USE_MODEL(false, 1, BLOCK_8X16, MODEL_INTER_NONE_8X16_135, 0.19f, 0.84f, 111, 135) // 0.95
USE_MODEL(false, 0, BLOCK_8X16, MODEL_INTER_NONE_8X16_135, 0.13f, 0.88f, 111, 135) // 0.97
USE_MODEL(false, -1, BLOCK_8X16, MODEL_INTER_NONE_8X16_135, 0.11f, 0.91f, 111, 135) // 0.98
USE_MODEL(false, -2, BLOCK_8X16, MODEL_INTER_NONE_8X16_135, 0.09f, 0.94f, 111, 135) // 0.99
USE_MODEL(false, 1, BLOCK_8X16, MODEL_INTER_NONE_8X16_160, 0.18f, 0.80f, 136, 160) // 0.95
USE_MODEL(false, 0, BLOCK_8X16, MODEL_INTER_NONE_8X16_160, 0.12f, 0.86f, 136, 160) // 0.97
USE_MODEL(false, -1, BLOCK_8X16, MODEL_INTER_NONE_8X16_160, 0.09f, 0.89f, 136, 160) // 0.98
USE_MODEL(false, -2, BLOCK_8X16, MODEL_INTER_NONE_8X16_160, 0.06f, 0.93f, 136, 160) // 0.99
USE_MODEL(false, 1, BLOCK_8X16, MODEL_INTER_NONE_8X16_185, 0.19f, 0.84f, 161, 185) // 0.95
USE_MODEL(false, 0, BLOCK_8X16, MODEL_INTER_NONE_8X16_185, 0.13f, 0.88f, 161, 185) // 0.97
USE_MODEL(false, -1, BLOCK_8X16, MODEL_INTER_NONE_8X16_185, 0.11f, 0.91f, 161, 185) // 0.98
USE_MODEL(false, -2, BLOCK_8X16, MODEL_INTER_NONE_8X16_185, 0.09f, 0.94f, 161, 185) // 0.99
USE_MODEL(false, 1, BLOCK_8X16, MODEL_INTER_NONE_8X16_210, 0.18f, 0.80f, 186, 210) // 0.95
USE_MODEL(false, 0, BLOCK_8X16, MODEL_INTER_NONE_8X16_210, 0.12f, 0.86f, 186, 210) // 0.97
USE_MODEL(false, -1, BLOCK_8X16, MODEL_INTER_NONE_8X16_210, 0.09f, 0.89f, 186, 210) // 0.98
USE_MODEL(false, -2, BLOCK_8X16, MODEL_INTER_NONE_8X16_210, 0.06f, 0.93f, 186, 210) // 0.99
USE_MODEL(false, 1, BLOCK_8X16, MODEL_INTER_NONE_8X16_235, 0.19f, 0.84f, 211, 235) // 0.95
USE_MODEL(false, 0, BLOCK_8X16, MODEL_INTER_NONE_8X16_235, 0.13f, 0.88f, 211, 235) // 0.97
USE_MODEL(false, -1, BLOCK_8X16, MODEL_INTER_NONE_8X16_235, 0.11f, 0.91f, 211, 235) // 0.98
USE_MODEL(false, -2, BLOCK_8X16, MODEL_INTER_NONE_8X16_235, 0.09f, 0.94f, 211, 235) // 0.99
USE_MODEL(false, 1, BLOCK_8X8, MODEL_INTER_NONE_8X8_110, 0.18f, 0.80f, 75, 110) // 0.95
USE_MODEL(false, 0, BLOCK_8X8, MODEL_INTER_NONE_8X8_110, 0.12f, 0.86f, 75, 110) // 0.97
USE_MODEL(false, -1, BLOCK_8X8, MODEL_INTER_NONE_8X8_110, 0.09f, 0.89f, 75, 110) // 0.98
USE_MODEL(false, -2, BLOCK_8X8, MODEL_INTER_NONE_8X8_110, 0.06f, 0.93f, 75, 110) // 0.99
USE_MODEL(false, 1, BLOCK_8X8, MODEL_INTER_NONE_8X8_135, 0.19f, 0.84f, 111, 135) // 0.95
USE_MODEL(false, 0, BLOCK_8X8, MODEL_INTER_NONE_8X8_135, 0.13f, 0.88f, 111, 135) // 0.97
USE_MODEL(false, -1, BLOCK_8X8, MODEL_INTER_NONE_8X8_135, 0.11f, 0.91f, 111, 135) // 0.98
USE_MODEL(false, -2, BLOCK_8X8, MODEL_INTER_NONE_8X8_135, 0.09f, 0.94f, 111, 135) // 0.99
USE_MODEL(false, 1, BLOCK_8X8, MODEL_INTER_NONE_8X8_160, 0.18f, 0.80f, 136, 160) // 0.95
USE_MODEL(false, 0, BLOCK_8X8, MODEL_INTER_NONE_8X8_160, 0.12f, 0.86f, 136, 160) // 0.97
USE_MODEL(false, -1, BLOCK_8X8, MODEL_INTER_NONE_8X8_160, 0.09f, 0.89f, 136, 160) // 0.98
USE_MODEL(false, -2, BLOCK_8X8, MODEL_INTER_NONE_8X8_160, 0.06f, 0.93f, 136, 160) // 0.99
USE_MODEL(false, 1, BLOCK_8X8, MODEL_INTER_NONE_8X8_185, 0.19f, 0.84f, 161, 185) // 0.95
USE_MODEL(false, 0, BLOCK_8X8, MODEL_INTER_NONE_8X8_185, 0.13f, 0.88f, 161, 185) // 0.97
USE_MODEL(false, -1, BLOCK_8X8, MODEL_INTER_NONE_8X8_185, 0.11f, 0.91f, 161, 185) // 0.98
USE_MODEL(false, -2, BLOCK_8X8, MODEL_INTER_NONE_8X8_185, 0.09f, 0.94f, 161, 185) // 0.99
USE_MODEL(false, 1, BLOCK_8X8, MODEL_INTER_NONE_8X8_210, 0.18f, 0.80f, 186, 210) // 0.95
USE_MODEL(false, 0, BLOCK_8X8, MODEL_INTER_NONE_8X8_210, 0.12f, 0.86f, 186, 210) // 0.97
USE_MODEL(false, -1, BLOCK_8X8, MODEL_INTER_NONE_8X8_210, 0.09f, 0.89f, 186, 210) // 0.98
USE_MODEL(false, -2, BLOCK_8X8, MODEL_INTER_NONE_8X8_210, 0.06f, 0.93f, 186, 210) // 0.99
USE_MODEL(false, 1, BLOCK_8X8, MODEL_INTER_NONE_8X8_235, 0.19f, 0.84f, 211, 235) // 0.95
USE_MODEL(false, 0, BLOCK_8X8, MODEL_INTER_NONE_8X8_235, 0.13f, 0.88f, 211, 235) // 0.97
USE_MODEL(false, -1, BLOCK_8X8, MODEL_INTER_NONE_8X8_235, 0.11f, 0.91f, 211, 235) // 0.98
USE_MODEL(false, -2, BLOCK_8X8, MODEL_INTER_NONE_8X8_235, 0.09f, 0.94f, 211, 235) // 0.99
USE_MODEL(false, 1, BLOCK_64X128, MODEL_INTER_NONE_64X128_110, 0.18f, 0.80f, 75, 110) // 0.95
USE_MODEL(false, 0, BLOCK_64X128, MODEL_INTER_NONE_64X128_110, 0.12f, 0.86f, 75, 110) // 0.97
USE_MODEL(false, -1, BLOCK_64X128, MODEL_INTER_NONE_64X128_110, 0.09f, 0.89f, 75, 110) // 0.98
USE_MODEL(false, -2, BLOCK_64X128, MODEL_INTER_NONE_64X128_110, 0.06f, 0.93f, 75, 110) // 0.99
USE_MODEL(false, 1, BLOCK_64X128, MODEL_INTER_NONE_64X128_135, 0.19f, 0.84f, 111, 135) // 0.95
USE_MODEL(false, 0, BLOCK_64X128, MODEL_INTER_NONE_64X128_135, 0.13f, 0.88f, 111, 135) // 0.97
USE_MODEL(false, -1, BLOCK_64X128, MODEL_INTER_NONE_64X128_135, 0.11f, 0.91f, 111, 135) // 0.98
USE_MODEL(false, -2, BLOCK_64X128, MODEL_INTER_NONE_64X128_135, 0.09f, 0.94f, 111, 135) // 0.99
USE_MODEL(false, 1, BLOCK_64X128, MODEL_INTER_NONE_64X128_160, 0.18f, 0.80f, 136, 160) // 0.95
USE_MODEL(false, 0, BLOCK_64X128, MODEL_INTER_NONE_64X128_160, 0.12f, 0.86f, 136, 160) // 0.97
USE_MODEL(false, -1, BLOCK_64X128, MODEL_INTER_NONE_64X128_160, 0.09f, 0.89f, 136, 160) // 0.98
USE_MODEL(false, -2, BLOCK_64X128, MODEL_INTER_NONE_64X128_160, 0.06f, 0.93f, 136, 160) // 0.99
USE_MODEL(false, 1, BLOCK_64X128, MODEL_INTER_NONE_64X128_185, 0.19f, 0.84f, 161, 185) // 0.95
USE_MODEL(false, 0, BLOCK_64X128, MODEL_INTER_NONE_64X128_185, 0.13f, 0.88f, 161, 185) // 0.97
USE_MODEL(false, -1, BLOCK_64X128, MODEL_INTER_NONE_64X128_185, 0.11f, 0.91f, 161, 185) // 0.98
USE_MODEL(false, -2, BLOCK_64X128, MODEL_INTER_NONE_64X128_185, 0.09f, 0.94f, 161, 185) // 0.99
USE_MODEL(false, 1, BLOCK_64X128, MODEL_INTER_NONE_64X128_210, 0.18f, 0.80f, 186, 210) // 0.95
USE_MODEL(false, 0, BLOCK_64X128, MODEL_INTER_NONE_64X128_210, 0.12f, 0.86f, 186, 210) // 0.97
USE_MODEL(false, -1, BLOCK_64X128, MODEL_INTER_NONE_64X128_210, 0.09f, 0.89f, 186, 210) // 0.98
USE_MODEL(false, -2, BLOCK_64X128, MODEL_INTER_NONE_64X128_210, 0.06f, 0.93f, 186, 210) // 0.99
USE_MODEL(false, 1, BLOCK_64X128, MODEL_INTER_NONE_64X128_235, 0.19f, 0.84f, 211, 235) // 0.95
USE_MODEL(false, 0, BLOCK_64X128, MODEL_INTER_NONE_64X128_235, 0.13f, 0.88f, 211, 235) // 0.97
USE_MODEL(false, -1, BLOCK_64X128, MODEL_INTER_NONE_64X128_235, 0.11f, 0.91f, 211, 235) // 0.98
USE_MODEL(false, -2, BLOCK_64X128, MODEL_INTER_NONE_64X128_235, 0.09f, 0.94f, 211, 235) // 0.99
USE_MODEL(false, 1, BLOCK_128X64, MODEL_INTER_NONE_128X64_110, 0.18f, 0.80f, 75, 110) // 0.95
USE_MODEL(false, 0, BLOCK_128X64, MODEL_INTER_NONE_128X64_110, 0.12f, 0.86f, 75, 110) // 0.97
USE_MODEL(false, -1, BLOCK_128X64, MODEL_INTER_NONE_128X64_110, 0.09f, 0.89f, 75, 110) // 0.98
USE_MODEL(false, -2, BLOCK_128X64, MODEL_INTER_NONE_128X64_110, 0.06f, 0.93f, 75, 110) // 0.99
USE_MODEL(false, 1, BLOCK_128X64, MODEL_INTER_NONE_128X64_135, 0.19f, 0.84f, 111, 135) // 0.95
USE_MODEL(false, 0, BLOCK_128X64, MODEL_INTER_NONE_128X64_135, 0.13f, 0.88f, 111, 135) // 0.97
USE_MODEL(false, -1, BLOCK_128X64, MODEL_INTER_NONE_128X64_135, 0.11f, 0.91f, 111, 135) // 0.98
USE_MODEL(false, -2, BLOCK_128X64, MODEL_INTER_NONE_128X64_135, 0.09f, 0.94f, 111, 135) // 0.99
USE_MODEL(false, 1, BLOCK_128X64, MODEL_INTER_NONE_128X64_160, 0.18f, 0.80f, 136, 160) // 0.95
USE_MODEL(false, 0, BLOCK_128X64, MODEL_INTER_NONE_128X64_160, 0.12f, 0.86f, 136, 160) // 0.97
USE_MODEL(false, -1, BLOCK_128X64, MODEL_INTER_NONE_128X64_160, 0.09f, 0.89f, 136, 160) // 0.98
USE_MODEL(false, -2, BLOCK_128X64, MODEL_INTER_NONE_128X64_160, 0.06f, 0.93f, 136, 160) // 0.99
USE_MODEL(false, 1, BLOCK_128X64, MODEL_INTER_NONE_128X64_185, 0.19f, 0.84f, 161, 185) // 0.95
USE_MODEL(false, 0, BLOCK_128X64, MODEL_INTER_NONE_128X64_185, 0.13f, 0.88f, 161, 185) // 0.97
USE_MODEL(false, -1, BLOCK_128X64, MODEL_INTER_NONE_128X64_185, 0.11f, 0.91f, 161, 185) // 0.98
USE_MODEL(false, -2, BLOCK_128X64, MODEL_INTER_NONE_128X64_185, 0.09f, 0.94f, 161, 185) // 0.99
USE_MODEL(false, 1, BLOCK_128X64, MODEL_INTER_NONE_128X64_210, 0.18f, 0.80f, 186, 210) // 0.95
USE_MODEL(false, 0, BLOCK_128X64, MODEL_INTER_NONE_128X64_210, 0.12f, 0.86f, 186, 210) // 0.97
USE_MODEL(false, -1, BLOCK_128X64, MODEL_INTER_NONE_128X64_210, 0.09f, 0.89f, 186, 210) // 0.98
USE_MODEL(false, -2, BLOCK_128X64, MODEL_INTER_NONE_128X64_210, 0.06f, 0.93f, 186, 210) // 0.99
USE_MODEL(false, 1, BLOCK_128X64, MODEL_INTER_NONE_128X64_235, 0.19f, 0.84f, 211, 235) // 0.95
USE_MODEL(false, 0, BLOCK_128X64, MODEL_INTER_NONE_128X64_235, 0.13f, 0.88f, 211, 235) // 0.97
USE_MODEL(false, -1, BLOCK_128X64, MODEL_INTER_NONE_128X64_235, 0.11f, 0.91f, 211, 235) // 0.98
USE_MODEL(false, -2, BLOCK_128X64, MODEL_INTER_NONE_128X64_235, 0.09f, 0.94f, 211, 235) // 0.99
USE_MODEL(false, 1, BLOCK_128X128, MODEL_INTER_NONE_128X128_110, 0.18f, 0.80f, 75, 110) // 0.95
USE_MODEL(false, 0, BLOCK_128X128, MODEL_INTER_NONE_128X128_110, 0.12f, 0.86f, 75, 110) // 0.97
USE_MODEL(false, -1, BLOCK_128X128, MODEL_INTER_NONE_128X128_110, 0.09f, 0.89f, 75, 110) // 0.98
USE_MODEL(false, -2, BLOCK_128X128, MODEL_INTER_NONE_128X128_110, 0.06f, 0.93f, 75, 110) // 0.99
USE_MODEL(false, 1, BLOCK_128X128, MODEL_INTER_NONE_128X128_135, 0.19f, 0.84f, 111, 135) // 0.95
USE_MODEL(false, 0, BLOCK_128X128, MODEL_INTER_NONE_128X128_135, 0.13f, 0.88f, 111, 135) // 0.97
USE_MODEL(false, -1, BLOCK_128X128, MODEL_INTER_NONE_128X128_135, 0.11f, 0.91f, 111, 135) // 0.98
USE_MODEL(false, -2, BLOCK_128X128, MODEL_INTER_NONE_128X128_135, 0.09f, 0.94f, 111, 135) // 0.99
USE_MODEL(false, 1, BLOCK_128X128, MODEL_INTER_NONE_128X128_160, 0.18f, 0.80f, 136, 160) // 0.95
USE_MODEL(false, 0, BLOCK_128X128, MODEL_INTER_NONE_128X128_160, 0.12f, 0.86f, 136, 160) // 0.97
USE_MODEL(false, -1, BLOCK_128X128, MODEL_INTER_NONE_128X128_160, 0.09f, 0.89f, 136, 160) // 0.98
USE_MODEL(false, -2, BLOCK_128X128, MODEL_INTER_NONE_128X128_160, 0.06f, 0.93f, 136, 160) // 0.99
USE_MODEL(false, 1, BLOCK_128X128, MODEL_INTER_NONE_128X128_185, 0.19f, 0.84f, 161, 185) // 0.95
USE_MODEL(false, 0, BLOCK_128X128, MODEL_INTER_NONE_128X128_185, 0.13f, 0.88f, 161, 185) // 0.97
USE_MODEL(false, -1, BLOCK_128X128, MODEL_INTER_NONE_128X128_185, 0.11f, 0.91f, 161, 185) // 0.98
USE_MODEL(false, -2, BLOCK_128X128, MODEL_INTER_NONE_128X128_185, 0.09f, 0.94f, 161, 185) // 0.99
USE_MODEL(false, 1, BLOCK_128X128, MODEL_INTER_NONE_128X128_210, 0.18f, 0.80f, 186, 210) // 0.95
USE_MODEL(false, 0, BLOCK_128X128, MODEL_INTER_NONE_128X128_210, 0.12f, 0.86f, 186, 210) // 0.97
USE_MODEL(false, -1, BLOCK_128X128, MODEL_INTER_NONE_128X128_210, 0.09f, 0.89f, 186, 210) // 0.98
USE_MODEL(false, -2, BLOCK_128X128, MODEL_INTER_NONE_128X128_210, 0.06f, 0.93f, 186, 210) // 0.99
USE_MODEL(false, 1, BLOCK_128X128, MODEL_INTER_NONE_128X128_235, 0.19f, 0.84f, 211, 235) // 0.95
USE_MODEL(false, 0, BLOCK_128X128, MODEL_INTER_NONE_128X128_235, 0.13f, 0.88f, 211, 235) // 0.97
USE_MODEL(false, -1, BLOCK_128X128, MODEL_INTER_NONE_128X128_235, 0.11f, 0.91f, 211, 235) // 0.98
USE_MODEL(false, -2, BLOCK_128X128, MODEL_INTER_NONE_128X128_235, 0.09f, 0.94f, 211, 235) // 0.99
USE_MODEL(false, 1, BLOCK_128X256, MODEL_INTER_NONE_128X256_110, 0.18f, 0.80f, 75, 110) // 0.95
USE_MODEL(false, 0, BLOCK_128X256, MODEL_INTER_NONE_128X256_110, 0.12f, 0.86f, 75, 110) // 0.97
USE_MODEL(false, -1, BLOCK_128X256, MODEL_INTER_NONE_128X256_110, 0.09f, 0.89f, 75, 110) // 0.98
USE_MODEL(false, -2, BLOCK_128X256, MODEL_INTER_NONE_128X256_110, 0.06f, 0.93f, 75, 110) // 0.99
USE_MODEL(false, 1, BLOCK_128X256, MODEL_INTER_NONE_128X256_135, 0.19f, 0.84f, 111, 135) // 0.95
USE_MODEL(false, 0, BLOCK_128X256, MODEL_INTER_NONE_128X256_135, 0.13f, 0.88f, 111, 135) // 0.97
USE_MODEL(false, -1, BLOCK_128X256, MODEL_INTER_NONE_128X256_135, 0.11f, 0.91f, 111, 135) // 0.98
USE_MODEL(false, -2, BLOCK_128X256, MODEL_INTER_NONE_128X256_135, 0.09f, 0.94f, 111, 135) // 0.99
USE_MODEL(false, 1, BLOCK_128X256, MODEL_INTER_NONE_128X256_160, 0.18f, 0.80f, 136, 160) // 0.95
USE_MODEL(false, 0, BLOCK_128X256, MODEL_INTER_NONE_128X256_160, 0.12f, 0.86f, 136, 160) // 0.97
USE_MODEL(false, -1, BLOCK_128X256, MODEL_INTER_NONE_128X256_160, 0.09f, 0.89f, 136, 160) // 0.98
USE_MODEL(false, -2, BLOCK_128X256, MODEL_INTER_NONE_128X256_160, 0.06f, 0.93f, 136, 160) // 0.99
USE_MODEL(false, 1, BLOCK_128X256, MODEL_INTER_NONE_128X256_185, 0.19f, 0.84f, 161, 185) // 0.95
USE_MODEL(false, 0, BLOCK_128X256, MODEL_INTER_NONE_128X256_185, 0.13f, 0.88f, 161, 185) // 0.97
USE_MODEL(false, -1, BLOCK_128X256, MODEL_INTER_NONE_128X256_185, 0.11f, 0.91f, 161, 185) // 0.98
USE_MODEL(false, -2, BLOCK_128X256, MODEL_INTER_NONE_128X256_185, 0.09f, 0.94f, 161, 185) // 0.99
USE_MODEL(false, 1, BLOCK_128X256, MODEL_INTER_NONE_128X256_210, 0.18f, 0.80f, 186, 210) // 0.95
USE_MODEL(false, 0, BLOCK_128X256, MODEL_INTER_NONE_128X256_210, 0.12f, 0.86f, 186, 210) // 0.97
USE_MODEL(false, -1, BLOCK_128X256, MODEL_INTER_NONE_128X256_210, 0.09f, 0.89f, 186, 210) // 0.98
USE_MODEL(false, -2, BLOCK_128X256, MODEL_INTER_NONE_128X256_210, 0.06f, 0.93f, 186, 210) // 0.99
USE_MODEL(false, 1, BLOCK_128X256, MODEL_INTER_NONE_128X256_235, 0.19f, 0.84f, 211, 235) // 0.95
USE_MODEL(false, 0, BLOCK_128X256, MODEL_INTER_NONE_128X256_235, 0.13f, 0.88f, 211, 235) // 0.97
USE_MODEL(false, -1, BLOCK_128X256, MODEL_INTER_NONE_128X256_235, 0.11f, 0.91f, 211, 235) // 0.98
USE_MODEL(false, -2, BLOCK_128X256, MODEL_INTER_NONE_128X256_235, 0.09f, 0.94f, 211, 235) // 0.99
USE_MODEL(false, 1, BLOCK_256X128, MODEL_INTER_NONE_256X128_110, 0.18f, 0.80f, 75, 110) // 0.95
USE_MODEL(false, 0, BLOCK_256X128, MODEL_INTER_NONE_256X128_110, 0.12f, 0.86f, 75, 110) // 0.97
USE_MODEL(false, -1, BLOCK_256X128, MODEL_INTER_NONE_256X128_110, 0.09f, 0.89f, 75, 110) // 0.98
USE_MODEL(false, -2, BLOCK_256X128, MODEL_INTER_NONE_256X128_110, 0.06f, 0.93f, 75, 110) // 0.99
USE_MODEL(false, 1, BLOCK_256X128, MODEL_INTER_NONE_256X128_135, 0.19f, 0.84f, 111, 135) // 0.95
USE_MODEL(false, 0, BLOCK_256X128, MODEL_INTER_NONE_256X128_135, 0.13f, 0.88f, 111, 135) // 0.97
USE_MODEL(false, -1, BLOCK_256X128, MODEL_INTER_NONE_256X128_135, 0.11f, 0.91f, 111, 135) // 0.98
USE_MODEL(false, -2, BLOCK_256X128, MODEL_INTER_NONE_256X128_135, 0.09f, 0.94f, 111, 135) // 0.99
USE_MODEL(false, 1, BLOCK_256X128, MODEL_INTER_NONE_256X128_160, 0.18f, 0.80f, 136, 160) // 0.95
USE_MODEL(false, 0, BLOCK_256X128, MODEL_INTER_NONE_256X128_160, 0.12f, 0.86f, 136, 160) // 0.97
USE_MODEL(false, -1, BLOCK_256X128, MODEL_INTER_NONE_256X128_160, 0.09f, 0.89f, 136, 160) // 0.98
USE_MODEL(false, -2, BLOCK_256X128, MODEL_INTER_NONE_256X128_160, 0.06f, 0.93f, 136, 160) // 0.99
USE_MODEL(false, 1, BLOCK_256X128, MODEL_INTER_NONE_256X128_185, 0.19f, 0.84f, 161, 185) // 0.95
USE_MODEL(false, 0, BLOCK_256X128, MODEL_INTER_NONE_256X128_185, 0.13f, 0.88f, 161, 185) // 0.97
USE_MODEL(false, -1, BLOCK_256X128, MODEL_INTER_NONE_256X128_185, 0.11f, 0.91f, 161, 185) // 0.98
USE_MODEL(false, -2, BLOCK_256X128, MODEL_INTER_NONE_256X128_185, 0.09f, 0.94f, 161, 185) // 0.99
USE_MODEL(false, 1, BLOCK_256X128, MODEL_INTER_NONE_256X128_210, 0.18f, 0.80f, 186, 210) // 0.95
USE_MODEL(false, 0, BLOCK_256X128, MODEL_INTER_NONE_256X128_210, 0.12f, 0.86f, 186, 210) // 0.97
USE_MODEL(false, -1, BLOCK_256X128, MODEL_INTER_NONE_256X128_210, 0.09f, 0.89f, 186, 210) // 0.98
USE_MODEL(false, -2, BLOCK_256X128, MODEL_INTER_NONE_256X128_210, 0.06f, 0.93f, 186, 210) // 0.99
USE_MODEL(false, 1, BLOCK_256X128, MODEL_INTER_NONE_256X128_235, 0.19f, 0.84f, 211, 235) // 0.95
USE_MODEL(false, 0, BLOCK_256X128, MODEL_INTER_NONE_256X128_235, 0.13f, 0.88f, 211, 235) // 0.97
USE_MODEL(false, -1, BLOCK_256X128, MODEL_INTER_NONE_256X128_235, 0.11f, 0.91f, 211, 235) // 0.98
USE_MODEL(false, -2, BLOCK_256X128, MODEL_INTER_NONE_256X128_235, 0.09f, 0.94f, 211, 235) // 0.99
USE_MODEL(false, 1, BLOCK_256X256, MODEL_INTER_NONE_256X256_110, 0.18f, 0.80f, 75, 110) // 0.95
USE_MODEL(false, 0, BLOCK_256X256, MODEL_INTER_NONE_256X256_110, 0.12f, 0.86f, 75, 110) // 0.97
USE_MODEL(false, -1, BLOCK_256X256, MODEL_INTER_NONE_256X256_110, 0.09f, 0.89f, 75, 110) // 0.98
USE_MODEL(false, -2, BLOCK_256X256, MODEL_INTER_NONE_256X256_110, 0.06f, 0.93f, 75, 110) // 0.99
USE_MODEL(false, 1, BLOCK_256X256, MODEL_INTER_NONE_256X256_135, 0.19f, 0.84f, 111, 135) // 0.95
USE_MODEL(false, 0, BLOCK_256X256, MODEL_INTER_NONE_256X256_135, 0.13f, 0.88f, 111, 135) // 0.97
USE_MODEL(false, -1, BLOCK_256X256, MODEL_INTER_NONE_256X256_135, 0.11f, 0.91f, 111, 135) // 0.98
USE_MODEL(false, -2, BLOCK_256X256, MODEL_INTER_NONE_256X256_135, 0.09f, 0.94f, 111, 135) // 0.99
USE_MODEL(false, 1, BLOCK_256X256, MODEL_INTER_NONE_256X256_160, 0.18f, 0.80f, 136, 160) // 0.95
USE_MODEL(false, 0, BLOCK_256X256, MODEL_INTER_NONE_256X256_160, 0.12f, 0.86f, 136, 160) // 0.97
USE_MODEL(false, -1, BLOCK_256X256, MODEL_INTER_NONE_256X256_160, 0.09f, 0.89f, 136, 160) // 0.98
USE_MODEL(false, -2, BLOCK_256X256, MODEL_INTER_NONE_256X256_160, 0.06f, 0.93f, 136, 160) // 0.99
USE_MODEL(false, 1, BLOCK_256X256, MODEL_INTER_NONE_256X256_185, 0.19f, 0.84f, 161, 185) // 0.95
USE_MODEL(false, 0, BLOCK_256X256, MODEL_INTER_NONE_256X256_185, 0.13f, 0.88f, 161, 185) // 0.97
USE_MODEL(false, -1, BLOCK_256X256, MODEL_INTER_NONE_256X256_185, 0.11f, 0.91f, 161, 185) // 0.98
USE_MODEL(false, -2, BLOCK_256X256, MODEL_INTER_NONE_256X256_185, 0.09f, 0.94f, 161, 185) // 0.99
USE_MODEL(false, 1, BLOCK_256X256, MODEL_INTER_NONE_256X256_210, 0.18f, 0.80f, 186, 210) // 0.95
USE_MODEL(false, 0, BLOCK_256X256, MODEL_INTER_NONE_256X256_210, 0.12f, 0.86f, 186, 210) // 0.97
USE_MODEL(false, -1, BLOCK_256X256, MODEL_INTER_NONE_256X256_210, 0.09f, 0.89f, 186, 210) // 0.98
USE_MODEL(false, -2, BLOCK_256X256, MODEL_INTER_NONE_256X256_210, 0.06f, 0.93f, 186, 210) // 0.99
USE_MODEL(false, 1, BLOCK_256X256, MODEL_INTER_NONE_256X256_235, 0.19f, 0.84f, 211, 235) // 0.95
USE_MODEL(false, 0, BLOCK_256X256, MODEL_INTER_NONE_256X256_235, 0.13f, 0.88f, 211, 235) // 0.97
USE_MODEL(false, -1, BLOCK_256X256, MODEL_INTER_NONE_256X256_235, 0.11f, 0.91f, 211, 235) // 0.98
USE_MODEL(false, -2, BLOCK_256X256, MODEL_INTER_NONE_256X256_235, 0.09f, 0.94f, 211, 235) // 0.99
USE_MODEL(false, 1, BLOCK_8X32, MODEL_INTER_NONE_8X32_110, 0.18f, 0.80f, 75, 110) // 0.95
USE_MODEL(false, 0, BLOCK_8X32, MODEL_INTER_NONE_8X32_110, 0.12f, 0.86f, 75, 110) // 0.97
USE_MODEL(false, -1, BLOCK_8X32, MODEL_INTER_NONE_8X32_110, 0.09f, 0.89f, 75, 110) // 0.98
USE_MODEL(false, -2, BLOCK_8X32, MODEL_INTER_NONE_8X32_110, 0.06f, 0.93f, 75, 110) // 0.99
USE_MODEL(false, 1, BLOCK_8X32, MODEL_INTER_NONE_8X32_135, 0.19f, 0.84f, 111, 135) // 0.95
USE_MODEL(false, 0, BLOCK_8X32, MODEL_INTER_NONE_8X32_135, 0.13f, 0.88f, 111, 135) // 0.97
USE_MODEL(false, -1, BLOCK_8X32, MODEL_INTER_NONE_8X32_135, 0.11f, 0.91f, 111, 135) // 0.98
USE_MODEL(false, -2, BLOCK_8X32, MODEL_INTER_NONE_8X32_135, 0.09f, 0.94f, 111, 135) // 0.99
USE_MODEL(false, 1, BLOCK_8X32, MODEL_INTER_NONE_8X32_160, 0.18f, 0.80f, 136, 160) // 0.95
USE_MODEL(false, 0, BLOCK_8X32, MODEL_INTER_NONE_8X32_160, 0.12f, 0.86f, 136, 160) // 0.97
USE_MODEL(false, -1, BLOCK_8X32, MODEL_INTER_NONE_8X32_160, 0.09f, 0.89f, 136, 160) // 0.98
USE_MODEL(false, -2, BLOCK_8X32, MODEL_INTER_NONE_8X32_160, 0.06f, 0.93f, 136, 160) // 0.99
USE_MODEL(false, 1, BLOCK_8X32, MODEL_INTER_NONE_8X32_185, 0.19f, 0.84f, 161, 185) // 0.95
USE_MODEL(false, 0, BLOCK_8X32, MODEL_INTER_NONE_8X32_185, 0.13f, 0.88f, 161, 185) // 0.97
USE_MODEL(false, -1, BLOCK_8X32, MODEL_INTER_NONE_8X32_185, 0.11f, 0.91f, 161, 185) // 0.98
USE_MODEL(false, -2, BLOCK_8X32, MODEL_INTER_NONE_8X32_185, 0.09f, 0.94f, 161, 185) // 0.99
USE_MODEL(false, 1, BLOCK_8X32, MODEL_INTER_NONE_8X32_210, 0.18f, 0.80f, 186, 210) // 0.95
USE_MODEL(false, 0, BLOCK_8X32, MODEL_INTER_NONE_8X32_210, 0.12f, 0.86f, 186, 210) // 0.97
USE_MODEL(false, -1, BLOCK_8X32, MODEL_INTER_NONE_8X32_210, 0.09f, 0.89f, 186, 210) // 0.98
USE_MODEL(false, -2, BLOCK_8X32, MODEL_INTER_NONE_8X32_210, 0.06f, 0.93f, 186, 210) // 0.99
USE_MODEL(false, 1, BLOCK_8X32, MODEL_INTER_NONE_8X32_235, 0.19f, 0.84f, 211, 235) // 0.95
USE_MODEL(false, 0, BLOCK_8X32, MODEL_INTER_NONE_8X32_235, 0.13f, 0.88f, 211, 235) // 0.97
USE_MODEL(false, -1, BLOCK_8X32, MODEL_INTER_NONE_8X32_235, 0.11f, 0.91f, 211, 235) // 0.98
USE_MODEL(false, -2, BLOCK_8X32, MODEL_INTER_NONE_8X32_235, 0.09f, 0.94f, 211, 235) // 0.99
USE_MODEL(false, 1, BLOCK_32X8, MODEL_INTER_NONE_32X8_110, 0.18f, 0.80f, 75, 110) // 0.95
USE_MODEL(false, 0, BLOCK_32X8, MODEL_INTER_NONE_32X8_110, 0.12f, 0.86f, 75, 110) // 0.97
USE_MODEL(false, -1, BLOCK_32X8, MODEL_INTER_NONE_32X8_110, 0.09f, 0.89f, 75, 110) // 0.98
USE_MODEL(false, -2, BLOCK_32X8, MODEL_INTER_NONE_32X8_110, 0.06f, 0.93f, 75, 110) // 0.99
USE_MODEL(false, 1, BLOCK_32X8, MODEL_INTER_NONE_32X8_135, 0.19f, 0.84f, 111, 135) // 0.95
USE_MODEL(false, 0, BLOCK_32X8, MODEL_INTER_NONE_32X8_135, 0.13f, 0.88f, 111, 135) // 0.97
USE_MODEL(false, -1, BLOCK_32X8, MODEL_INTER_NONE_32X8_135, 0.11f, 0.91f, 111, 135) // 0.98
USE_MODEL(false, -2, BLOCK_32X8, MODEL_INTER_NONE_32X8_135, 0.09f, 0.94f, 111, 135) // 0.99
USE_MODEL(false, 1, BLOCK_32X8, MODEL_INTER_NONE_32X8_160, 0.18f, 0.80f, 136, 160) // 0.95
USE_MODEL(false, 0, BLOCK_32X8, MODEL_INTER_NONE_32X8_160, 0.12f, 0.86f, 136, 160) // 0.97
USE_MODEL(false, -1, BLOCK_32X8, MODEL_INTER_NONE_32X8_160, 0.09f, 0.89f, 136, 160) // 0.98
USE_MODEL(false, -2, BLOCK_32X8, MODEL_INTER_NONE_32X8_160, 0.06f, 0.93f, 136, 160) // 0.99
USE_MODEL(false, 1, BLOCK_32X8, MODEL_INTER_NONE_32X8_185, 0.19f, 0.84f, 161, 185) // 0.95
USE_MODEL(false, 0, BLOCK_32X8, MODEL_INTER_NONE_32X8_185, 0.13f, 0.88f, 161, 185) // 0.97
USE_MODEL(false, -1, BLOCK_32X8, MODEL_INTER_NONE_32X8_185, 0.11f, 0.91f, 161, 185) // 0.98
USE_MODEL(false, -2, BLOCK_32X8, MODEL_INTER_NONE_32X8_185, 0.09f, 0.94f, 161, 185) // 0.99
USE_MODEL(false, 1, BLOCK_32X8, MODEL_INTER_NONE_32X8_210, 0.18f, 0.80f, 186, 210) // 0.95
USE_MODEL(false, 0, BLOCK_32X8, MODEL_INTER_NONE_32X8_210, 0.12f, 0.86f, 186, 210) // 0.97
USE_MODEL(false, -1, BLOCK_32X8, MODEL_INTER_NONE_32X8_210, 0.09f, 0.89f, 186, 210) // 0.98
USE_MODEL(false, -2, BLOCK_32X8, MODEL_INTER_NONE_32X8_210, 0.06f, 0.93f, 186, 210) // 0.99
USE_MODEL(false, 1, BLOCK_32X8, MODEL_INTER_NONE_32X8_235, 0.19f, 0.84f, 211, 235) // 0.95
USE_MODEL(false, 0, BLOCK_32X8, MODEL_INTER_NONE_32X8_235, 0.13f, 0.88f, 211, 235) // 0.97
USE_MODEL(false, -1, BLOCK_32X8, MODEL_INTER_NONE_32X8_235, 0.11f, 0.91f, 211, 235) // 0.98
USE_MODEL(false, -2, BLOCK_32X8, MODEL_INTER_NONE_32X8_235, 0.09f, 0.94f, 211, 235) // 0.99
USE_MODEL(false, 1, BLOCK_16X64, MODEL_INTER_NONE_16X64_110, 0.18f, 0.80f, 75, 110) // 0.95
USE_MODEL(false, 0, BLOCK_16X64, MODEL_INTER_NONE_16X64_110, 0.12f, 0.86f, 75, 110) // 0.97
USE_MODEL(false, -1, BLOCK_16X64, MODEL_INTER_NONE_16X64_110, 0.09f, 0.89f, 75, 110) // 0.98
USE_MODEL(false, -2, BLOCK_16X64, MODEL_INTER_NONE_16X64_110, 0.06f, 0.93f, 75, 110) // 0.99
USE_MODEL(false, 1, BLOCK_16X64, MODEL_INTER_NONE_16X64_135, 0.19f, 0.84f, 111, 135) // 0.95
USE_MODEL(false, 0, BLOCK_16X64, MODEL_INTER_NONE_16X64_135, 0.13f, 0.88f, 111, 135) // 0.97
USE_MODEL(false, -1, BLOCK_16X64, MODEL_INTER_NONE_16X64_135, 0.11f, 0.91f, 111, 135) // 0.98
USE_MODEL(false, -2, BLOCK_16X64, MODEL_INTER_NONE_16X64_135, 0.09f, 0.94f, 111, 135) // 0.99
USE_MODEL(false, 1, BLOCK_16X64, MODEL_INTER_NONE_16X64_160, 0.18f, 0.80f, 136, 160) // 0.95
USE_MODEL(false, 0, BLOCK_16X64, MODEL_INTER_NONE_16X64_160, 0.12f, 0.86f, 136, 160) // 0.97
USE_MODEL(false, -1, BLOCK_16X64, MODEL_INTER_NONE_16X64_160, 0.09f, 0.89f, 136, 160) // 0.98
USE_MODEL(false, -2, BLOCK_16X64, MODEL_INTER_NONE_16X64_160, 0.06f, 0.93f, 136, 160) // 0.99
USE_MODEL(false, 1, BLOCK_16X64, MODEL_INTER_NONE_16X64_185, 0.19f, 0.84f, 161, 185) // 0.95
USE_MODEL(false, 0, BLOCK_16X64, MODEL_INTER_NONE_16X64_185, 0.13f, 0.88f, 161, 185) // 0.97
USE_MODEL(false, -1, BLOCK_16X64, MODEL_INTER_NONE_16X64_185, 0.11f, 0.91f, 161, 185) // 0.98
USE_MODEL(false, -2, BLOCK_16X64, MODEL_INTER_NONE_16X64_185, 0.09f, 0.94f, 161, 185) // 0.99
USE_MODEL(false, 1, BLOCK_16X64, MODEL_INTER_NONE_16X64_210, 0.18f, 0.80f, 186, 210) // 0.95
USE_MODEL(false, 0, BLOCK_16X64, MODEL_INTER_NONE_16X64_210, 0.12f, 0.86f, 186, 210) // 0.97
USE_MODEL(false, -1, BLOCK_16X64, MODEL_INTER_NONE_16X64_210, 0.09f, 0.89f, 186, 210) // 0.98
USE_MODEL(false, -2, BLOCK_16X64, MODEL_INTER_NONE_16X64_210, 0.06f, 0.93f, 186, 210) // 0.99
USE_MODEL(false, 1, BLOCK_16X64, MODEL_INTER_NONE_16X64_235, 0.19f, 0.84f, 211, 235) // 0.95
USE_MODEL(false, 0, BLOCK_16X64, MODEL_INTER_NONE_16X64_235, 0.13f, 0.88f, 211, 235) // 0.97
USE_MODEL(false, -1, BLOCK_16X64, MODEL_INTER_NONE_16X64_235, 0.11f, 0.91f, 211, 235) // 0.98
USE_MODEL(false, -2, BLOCK_16X64, MODEL_INTER_NONE_16X64_235, 0.09f, 0.94f, 211, 235) // 0.99
USE_MODEL(false, 1, BLOCK_64X16, MODEL_INTER_NONE_64X16_110, 0.18f, 0.80f, 75, 110) // 0.95
USE_MODEL(false, 0, BLOCK_64X16, MODEL_INTER_NONE_64X16_110, 0.12f, 0.86f, 75, 110) // 0.97
USE_MODEL(false, -1, BLOCK_64X16, MODEL_INTER_NONE_64X16_110, 0.09f, 0.89f, 75, 110) // 0.98
USE_MODEL(false, -2, BLOCK_64X16, MODEL_INTER_NONE_64X16_110, 0.06f, 0.93f, 75, 110) // 0.99
USE_MODEL(false, 1, BLOCK_64X16, MODEL_INTER_NONE_64X16_135, 0.19f, 0.84f, 111, 135) // 0.95
USE_MODEL(false, 0, BLOCK_64X16, MODEL_INTER_NONE_64X16_135, 0.13f, 0.88f, 111, 135) // 0.97
USE_MODEL(false, -1, BLOCK_64X16, MODEL_INTER_NONE_64X16_135, 0.11f, 0.91f, 111, 135) // 0.98
USE_MODEL(false, -2, BLOCK_64X16, MODEL_INTER_NONE_64X16_135, 0.09f, 0.94f, 111, 135) // 0.99
USE_MODEL(false, 1, BLOCK_64X16, MODEL_INTER_NONE_64X16_160, 0.18f, 0.80f, 136, 160) // 0.95
USE_MODEL(false, 0, BLOCK_64X16, MODEL_INTER_NONE_64X16_160, 0.12f, 0.86f, 136, 160) // 0.97
USE_MODEL(false, -1, BLOCK_64X16, MODEL_INTER_NONE_64X16_160, 0.09f, 0.89f, 136, 160) // 0.98
USE_MODEL(false, -2, BLOCK_64X16, MODEL_INTER_NONE_64X16_160, 0.06f, 0.93f, 136, 160) // 0.99
USE_MODEL(false, 1, BLOCK_64X16, MODEL_INTER_NONE_64X16_185, 0.19f, 0.84f, 161, 185) // 0.95
USE_MODEL(false, 0, BLOCK_64X16, MODEL_INTER_NONE_64X16_185, 0.13f, 0.88f, 161, 185) // 0.97
USE_MODEL(false, -1, BLOCK_64X16, MODEL_INTER_NONE_64X16_185, 0.11f, 0.91f, 161, 185) // 0.98
USE_MODEL(false, -2, BLOCK_64X16, MODEL_INTER_NONE_64X16_185, 0.09f, 0.94f, 161, 185) // 0.99
USE_MODEL(false, 1, BLOCK_64X16, MODEL_INTER_NONE_64X16_210, 0.18f, 0.80f, 186, 210) // 0.95
USE_MODEL(false, 0, BLOCK_64X16, MODEL_INTER_NONE_64X16_210, 0.12f, 0.86f, 186, 210) // 0.97
USE_MODEL(false, -1, BLOCK_64X16, MODEL_INTER_NONE_64X16_210, 0.09f, 0.89f, 186, 210) // 0.98
USE_MODEL(false, -2, BLOCK_64X16, MODEL_INTER_NONE_64X16_210, 0.06f, 0.93f, 186, 210) // 0.99
USE_MODEL(false, 1, BLOCK_64X16, MODEL_INTER_NONE_64X16_235, 0.19f, 0.84f, 211, 235) // 0.95
USE_MODEL(false, 0, BLOCK_64X16, MODEL_INTER_NONE_64X16_235, 0.13f, 0.88f, 211, 235) // 0.97
USE_MODEL(false, -1, BLOCK_64X16, MODEL_INTER_NONE_64X16_235, 0.11f, 0.91f, 211, 235) // 0.98
USE_MODEL(false, -2, BLOCK_64X16, MODEL_INTER_NONE_64X16_235, 0.09f, 0.94f, 211, 235) // 0.99
USE_MODEL(false, 1, BLOCK_8X64, MODEL_INTER_NONE_8X64_110, 0.18f, 0.80f, 75, 110) // 0.95
USE_MODEL(false, 0, BLOCK_8X64, MODEL_INTER_NONE_8X64_110, 0.12f, 0.86f, 75, 110) // 0.97
USE_MODEL(false, -1, BLOCK_8X64, MODEL_INTER_NONE_8X64_110, 0.09f, 0.89f, 75, 110) // 0.98
USE_MODEL(false, -2, BLOCK_8X64, MODEL_INTER_NONE_8X64_110, 0.06f, 0.93f, 75, 110) // 0.99
USE_MODEL(false, 1, BLOCK_8X64, MODEL_INTER_NONE_8X64_135, 0.19f, 0.84f, 111, 135) // 0.95
USE_MODEL(false, 0, BLOCK_8X64, MODEL_INTER_NONE_8X64_135, 0.13f, 0.88f, 111, 135) // 0.97
USE_MODEL(false, -1, BLOCK_8X64, MODEL_INTER_NONE_8X64_135, 0.11f, 0.91f, 111, 135) // 0.98
USE_MODEL(false, -2, BLOCK_8X64, MODEL_INTER_NONE_8X64_135, 0.09f, 0.94f, 111, 135) // 0.99
USE_MODEL(false, 1, BLOCK_8X64, MODEL_INTER_NONE_8X64_160, 0.18f, 0.80f, 136, 160) // 0.95
USE_MODEL(false, 0, BLOCK_8X64, MODEL_INTER_NONE_8X64_160, 0.12f, 0.86f, 136, 160) // 0.97
USE_MODEL(false, -1, BLOCK_8X64, MODEL_INTER_NONE_8X64_160, 0.09f, 0.89f, 136, 160) // 0.98
USE_MODEL(false, -2, BLOCK_8X64, MODEL_INTER_NONE_8X64_160, 0.06f, 0.93f, 136, 160) // 0.99
USE_MODEL(false, 1, BLOCK_8X64, MODEL_INTER_NONE_8X64_185, 0.19f, 0.84f, 161, 185) // 0.95
USE_MODEL(false, 0, BLOCK_8X64, MODEL_INTER_NONE_8X64_185, 0.13f, 0.88f, 161, 185) // 0.97
USE_MODEL(false, -1, BLOCK_8X64, MODEL_INTER_NONE_8X64_185, 0.11f, 0.91f, 161, 185) // 0.98
USE_MODEL(false, -2, BLOCK_8X64, MODEL_INTER_NONE_8X64_185, 0.09f, 0.94f, 161, 185) // 0.99
USE_MODEL(false, 1, BLOCK_8X64, MODEL_INTER_NONE_8X64_210, 0.18f, 0.80f, 186, 210) // 0.95
USE_MODEL(false, 0, BLOCK_8X64, MODEL_INTER_NONE_8X64_210, 0.12f, 0.86f, 186, 210) // 0.97
USE_MODEL(false, -1, BLOCK_8X64, MODEL_INTER_NONE_8X64_210, 0.09f, 0.89f, 186, 210) // 0.98
USE_MODEL(false, -2, BLOCK_8X64, MODEL_INTER_NONE_8X64_210, 0.06f, 0.93f, 186, 210) // 0.99
USE_MODEL(false, 1, BLOCK_8X64, MODEL_INTER_NONE_8X64_235, 0.19f, 0.84f, 211, 235) // 0.95
USE_MODEL(false, 0, BLOCK_8X64, MODEL_INTER_NONE_8X64_235, 0.13f, 0.88f, 211, 235) // 0.97
USE_MODEL(false, -1, BLOCK_8X64, MODEL_INTER_NONE_8X64_235, 0.11f, 0.91f, 211, 235) // 0.98
USE_MODEL(false, -2, BLOCK_8X64, MODEL_INTER_NONE_8X64_235, 0.09f, 0.94f, 211, 235) // 0.99
USE_MODEL(false, 1, BLOCK_64X8, MODEL_INTER_NONE_64X8_110, 0.18f, 0.80f, 75, 110) // 0.95
USE_MODEL(false, 0, BLOCK_64X8, MODEL_INTER_NONE_64X8_110, 0.12f, 0.86f, 75, 110) // 0.97
USE_MODEL(false, -1, BLOCK_64X8, MODEL_INTER_NONE_64X8_110, 0.09f, 0.89f, 75, 110) // 0.98
USE_MODEL(false, -2, BLOCK_64X8, MODEL_INTER_NONE_64X8_110, 0.06f, 0.93f, 75, 110) // 0.99
USE_MODEL(false, 1, BLOCK_64X8, MODEL_INTER_NONE_64X8_135, 0.19f, 0.84f, 111, 135) // 0.95
USE_MODEL(false, 0, BLOCK_64X8, MODEL_INTER_NONE_64X8_135, 0.13f, 0.88f, 111, 135) // 0.97
USE_MODEL(false, -1, BLOCK_64X8, MODEL_INTER_NONE_64X8_135, 0.11f, 0.91f, 111, 135) // 0.98
USE_MODEL(false, -2, BLOCK_64X8, MODEL_INTER_NONE_64X8_135, 0.09f, 0.94f, 111, 135) // 0.99
USE_MODEL(false, 1, BLOCK_64X8, MODEL_INTER_NONE_64X8_160, 0.18f, 0.80f, 136, 160) // 0.95
USE_MODEL(false, 0, BLOCK_64X8, MODEL_INTER_NONE_64X8_160, 0.12f, 0.86f, 136, 160) // 0.97
USE_MODEL(false, -1, BLOCK_64X8, MODEL_INTER_NONE_64X8_160, 0.09f, 0.89f, 136, 160) // 0.98
USE_MODEL(false, -2, BLOCK_64X8, MODEL_INTER_NONE_64X8_160, 0.06f, 0.93f, 136, 160) // 0.99
USE_MODEL(false, 1, BLOCK_64X8, MODEL_INTER_NONE_64X8_185, 0.19f, 0.84f, 161, 185) // 0.95
USE_MODEL(false, 0, BLOCK_64X8, MODEL_INTER_NONE_64X8_185, 0.13f, 0.88f, 161, 185) // 0.97
USE_MODEL(false, -1, BLOCK_64X8, MODEL_INTER_NONE_64X8_185, 0.11f, 0.91f, 161, 185) // 0.98
USE_MODEL(false, -2, BLOCK_64X8, MODEL_INTER_NONE_64X8_185, 0.09f, 0.94f, 161, 185) // 0.99
USE_MODEL(false, 1, BLOCK_64X8, MODEL_INTER_NONE_64X8_210, 0.18f, 0.80f, 186, 210) // 0.95
USE_MODEL(false, 0, BLOCK_64X8, MODEL_INTER_NONE_64X8_210, 0.12f, 0.86f, 186, 210) // 0.97
USE_MODEL(false, -1, BLOCK_64X8, MODEL_INTER_NONE_64X8_210, 0.09f, 0.89f, 186, 210) // 0.98
USE_MODEL(false, -2, BLOCK_64X8, MODEL_INTER_NONE_64X8_210, 0.06f, 0.93f, 186, 210) // 0.99
USE_MODEL(false, 1, BLOCK_64X8, MODEL_INTER_NONE_64X8_235, 0.19f, 0.84f, 211, 235) // 0.95
USE_MODEL(false, 0, BLOCK_64X8, MODEL_INTER_NONE_64X8_235, 0.13f, 0.88f, 211, 235) // 0.97
USE_MODEL(false, -1, BLOCK_64X8, MODEL_INTER_NONE_64X8_235, 0.11f, 0.91f, 211, 235) // 0.98
USE_MODEL(false, -2, BLOCK_64X8, MODEL_INTER_NONE_64X8_235, 0.09f, 0.94f, 211, 235) // 0.99
// CWG-E070
USE_MODEL( true, -2, 15, MODEL_128X128, 0.3f, 0.98f, 60, 116)
USE_MODEL( true, -2, 12, MODEL_64X64, 0.03f, 0.7f, 60, 116)
USE_MODEL( true, -2, 9, MODEL_32X32, 0.052f, 0.45f, 60, 116)
USE_MODEL( true, -2, 6, MODEL_16X16, 0.002f, 0.35f, 60, 116)
USE_MODEL( true, -1, 15, MODEL_128X128, 0.4f, 0.97f, 60, 116)
USE_MODEL( true, -1, 12, MODEL_64X64, 0.1f, 0.7f, 60, 116)
USE_MODEL( true, -1, 9, MODEL_32X32, 0.052f, 0.45f, 60, 116)
USE_MODEL( true, -1, 6, MODEL_16X16, 0.005f, 0.32f, 60, 116)
USE_MODEL( true, 0, 15, MODEL_128X128, 0.5f, 0.95f, 60, 116)
USE_MODEL( true, 0, 12, MODEL_64X64, 0.2f, 0.66f, 60, 116)
USE_MODEL( true, 0, 9, MODEL_32X32, 0.07f, 0.44f, 60, 116)
USE_MODEL( true, 0, 6, MODEL_16X16, 0.01f, 0.3f, 60, 116)
USE_MODEL( true, 1, 15, MODEL_128X128, 0.7f, 0.95f, 60, 116)
USE_MODEL( true, 1, 12, MODEL_64X64, 0.25f, 0.7f, 60, 116)
USE_MODEL( true, 1, 9, MODEL_32X32, 0.07f, 0.25f, 60, 116)
USE_MODEL( true, 1, 6, MODEL_16X16, 0.01f, 0.15f, 60, 116)
// CWG-E135
USE_MODEL(false, -2, 12, MODEL_INTER_SPLIT_64X64, 0.01f, 1.f, 75, 150)
USE_MODEL(false, -2, 9, MODEL_INTER_SPLIT_32X32, 0.02f, 1.f, 75, 150)
USE_MODEL(false, -2, 6, MODEL_INTER_SPLIT_16X16, 0.05f, 1.f, 75, 150)
USE_MODEL(false, -2, 3, MODEL_INTER_SPLIT_8X8, 0.25f, 1.f, 75, 150)
USE_MODEL(false, -1, 12, MODEL_INTER_SPLIT_64X64, 0.01f, 1.f, 75, 150)
USE_MODEL(false, -1, 9, MODEL_INTER_SPLIT_32X32, 0.02f, 1.f, 75, 150)
USE_MODEL(false, -1, 6, MODEL_INTER_SPLIT_16X16, 0.05f, 1.f, 75, 150)
USE_MODEL(false, -1, 3, MODEL_INTER_SPLIT_8X8, 0.25f, 1.f, 75, 150)
USE_MODEL(false, 0, 12, MODEL_INTER_SPLIT_64X64, 0.01f, 1.f, 75, 150)
USE_MODEL(false, 0, 9, MODEL_INTER_SPLIT_32X32, 0.02f, 1.f, 75, 150)
USE_MODEL(false, 0, 6, MODEL_INTER_SPLIT_16X16, 0.05f, 1.f, 75, 150)
USE_MODEL(false, 0, 3, MODEL_INTER_SPLIT_8X8, 0.25f, 1.f, 75, 150)
USE_MODEL(false, 1, 12, MODEL_INTER_SPLIT_64X64, 0.02f, 1.f, 75, 150)
USE_MODEL(false, 1, 9, MODEL_INTER_SPLIT_32X32, 0.04f, 1.f, 75, 150)
USE_MODEL(false, 1, 6, MODEL_INTER_SPLIT_16X16, 0.1f, 1.f, 75, 150)
USE_MODEL(false, 1, 3, MODEL_INTER_SPLIT_8X8, 0.35f, 1.f, 75, 150)
// better CWG-E135
//USE_MODEL(false, 0, 12, MODEL_INTER_SPLIT_64X64, 0.25, 0.85, 75, 150)
//USE_MODEL(false, 0, 9, MODEL_INTER_SPLIT_32X32, 0.2, 0.7, 75, 150)
//USE_MODEL(false, 0, 6, MODEL_INTER_SPLIT_16X16, 0.2, 0.65, 75, 150)
//USE_MODEL(false, 0, 3, MODEL_INTER_SPLIT_8X8, 0.2, 0.7, 75, 150)
//USE_MODEL(false, 1, 12, MODEL_INTER_SPLIT_64X64, 0.35, 0.8, 75, 150)
//USE_MODEL(false, 1, 9, MODEL_INTER_SPLIT_32X32, 0.3, 0.65, 75, 150)
//USE_MODEL(false, 1, 6, MODEL_INTER_SPLIT_16X16, 0.25, 0.55, 75, 150)
//USE_MODEL(false, 1, 3, MODEL_INTER_SPLIT_8X8, 0.3, 0.45, 75, 150)
}
void features_subset(MODEL_TYPE model_type, float *ml_input,
float *ml_input_subset, int *ml_input_subset_len) {
if (model_type >= MODEL_INTER_SPLIT_64X64 && model_type <= MODEL_INTER_SPLIT_8X8)
*ml_input_subset_len = FEATURE_INTER_SQ_3_LOG_SATDQ + 1;
else
*ml_input_subset_len = FEATURE_INTER_MAX;
for (int i = 0; i < *ml_input_subset_len; i++) {
ml_input_subset[i] = ml_input[i];
}
}
static double log_mag(MV mv) {
double mag = sqrt(mv.col * mv.col + mv.row * mv.row);
return logf(1.0f + mag);
}
static double angle_rad(MV mv) {
double mag = sqrt(mv.col * mv.col + mv.row * mv.row);
return mag == 0 ? 0 : asin(mv.row / mag);
}
static void blk_features(const AV1_COMMON *const cm, float *out_features,
int o_psnr, int o_log_mag, int o_satdq, int o_satd,
SimpleMotionData *sms, int blk_area) {
out_features[o_psnr + 0] = sms->residual_stats.psnr - 35;
out_features[o_psnr + 1] =
((float)sms->residual_stats.q_coeff_max) / 1024;
out_features[o_psnr + 2] =
((float)sms->residual_stats.q_coeff_nonz) / blk_area;
out_features[o_log_mag + 0] = log_mag(sms->submv);
out_features[o_log_mag + 1] = angle_rad(sms->submv);
out_features[o_satdq] = logf(1.0f + sms->residual_stats.satdq);
out_features[o_satd] = logf(1.0f + sms->residual_stats.satd);
}
static void av1_ml_part_split_features_inter(AV1_COMP *const cpi, MACROBLOCK *x,
int mi_row, int mi_col,
BLOCK_SIZE bsize,
const TileInfo *tile_info,
ThreadData *td,
bool search_none_after_rect,
float *out_features) {
if (cpi->common.current_frame.frame_type != INTER_FRAME) return;
const AV1_COMMON *const cm = &cpi->common;
const MACROBLOCKD *xd = &x->e_mbd;
SimpleMotionData *blk_none =
av1_get_sms_data(cpi, tile_info, x, mi_row, mi_col, bsize, td, true, 1);
BLOCK_SIZE subsize_sq = get_partition_subsize(
get_partition_subsize(bsize, PARTITION_HORZ), PARTITION_VERT);
BLOCK_SIZE subsize_hor = get_partition_subsize(bsize, PARTITION_HORZ);
BLOCK_SIZE subsize_ver = get_partition_subsize(bsize, PARTITION_VERT);
if (subsize_sq == BLOCK_INVALID) {
subsize_sq = get_partition_subsize(
get_partition_subsize(bsize, PARTITION_VERT), PARTITION_HORZ);
}
if (subsize_sq != BLOCK_INVALID) {
int w_sub_mi = mi_size_wide[subsize_sq];
int h_sub_mi = mi_size_high[subsize_sq];
SimpleMotionData *blk_sq_0 =
av1_get_sms_data(cpi, tile_info, x, mi_row, mi_col, subsize_sq, td, true, 1);
SimpleMotionData *blk_sq_1 = av1_get_sms_data(
cpi, tile_info, x, mi_row, mi_col + w_sub_mi, subsize_sq, td, true, 1);
SimpleMotionData *blk_sq_2 = av1_get_sms_data(
cpi, tile_info, x, mi_row + h_sub_mi, mi_col, subsize_sq, td, true, 1);
SimpleMotionData *blk_sq_3 =
av1_get_sms_data(cpi, tile_info, x, mi_row + h_sub_mi,
mi_col + w_sub_mi, subsize_sq, td, true, 1);
if (out_features) {
int blk_area = block_size_wide[bsize] * block_size_high[bsize];
out_features[FEATURE_INTER_RD_MULT] = logf(1.0f + blk_none->rdmult);
out_features[FEATURE_INTER_SWITCH] = search_none_after_rect;
out_features[FEATURE_INTER_PART_T] = xd->tree_type;
blk_features(cm, out_features, FEATURE_INTER_FULL_PSNR,
FEATURE_INTER_FULL_LOG_MAG, FEATURE_INTER_FULL_LOG_SATDQ,
FEATURE_INTER_FULL_LOG_SATD, blk_none, blk_area);
blk_features(cm, out_features, FEATURE_INTER_SQ_0_PSNR,
FEATURE_INTER_SQ_0_LOG_MAG, FEATURE_INTER_SQ_0_LOG_SATDQ,
FEATURE_INTER_SQ_0_LOG_SATD, blk_sq_0, blk_area);
blk_features(cm, out_features, FEATURE_INTER_SQ_1_PSNR,
FEATURE_INTER_SQ_1_LOG_MAG, FEATURE_INTER_SQ_1_LOG_SATDQ,
FEATURE_INTER_SQ_1_LOG_SATD, blk_sq_1, blk_area);
blk_features(cm, out_features, FEATURE_INTER_SQ_2_PSNR,
FEATURE_INTER_SQ_2_LOG_MAG, FEATURE_INTER_SQ_2_LOG_SATDQ,
FEATURE_INTER_SQ_2_LOG_SATD, blk_sq_2, blk_area);
blk_features(cm, out_features, FEATURE_INTER_SQ_3_PSNR,
FEATURE_INTER_SQ_3_LOG_MAG, FEATURE_INTER_SQ_3_LOG_SATDQ,
FEATURE_INTER_SQ_3_LOG_SATD, blk_sq_3, blk_area);
}
}
if (subsize_hor != BLOCK_INVALID) {
int w_sub_mi = mi_size_wide[subsize_hor];
int h_sub_mi = mi_size_high[subsize_hor];
SimpleMotionData *blk_hor_0 =
av1_get_sms_data(cpi, tile_info, x, mi_row, mi_col, subsize_hor, td, true, 1);
SimpleMotionData *blk_hor_1 = av1_get_sms_data(
cpi, tile_info, x, mi_row + h_sub_mi, mi_col, subsize_hor, td, true, 1);
if (out_features) {
int blk_area = block_size_wide[bsize] * block_size_high[bsize];
blk_features(cm, out_features, FEATURE_INTER_HOR_0_PSNR,
FEATURE_INTER_HOR_0_LOG_MAG, FEATURE_INTER_HOR_0_LOG_SATDQ,
FEATURE_INTER_HOR_0_LOG_SATD, blk_hor_0, blk_area);
blk_features(cm, out_features, FEATURE_INTER_HOR_1_PSNR,
FEATURE_INTER_HOR_1_LOG_MAG, FEATURE_INTER_HOR_1_LOG_SATDQ,
FEATURE_INTER_HOR_1_LOG_SATD, blk_hor_1, blk_area);
}
}
if (subsize_ver != BLOCK_INVALID) {
int w_sub_mi = mi_size_wide[subsize_ver];
int h_sub_mi = mi_size_high[subsize_ver];
SimpleMotionData *blk_ver_0 =
av1_get_sms_data(cpi, tile_info, x, mi_row, mi_col, subsize_ver, td, true, 1);
SimpleMotionData *blk_ver_1 = av1_get_sms_data(
cpi, tile_info, x, mi_row, mi_col + w_sub_mi, subsize_ver, td, true, 1);
if (out_features) {
int blk_area = block_size_wide[bsize] * block_size_high[bsize];
blk_features(cm, out_features, FEATURE_INTER_VER_0_PSNR,
FEATURE_INTER_VER_0_LOG_MAG, FEATURE_INTER_VER_0_LOG_SATDQ,
FEATURE_INTER_VER_0_LOG_SATD, blk_ver_0, blk_area);
blk_features(cm, out_features, FEATURE_INTER_VER_1_PSNR,
FEATURE_INTER_VER_1_LOG_MAG, FEATURE_INTER_VER_1_LOG_SATDQ,
FEATURE_INTER_VER_1_LOG_SATD, blk_ver_1, blk_area);
}
}
aom_clear_system_state();
}
int av1_ml_part_split_infer(AV1_COMP *const cpi, MACROBLOCK *x, int mi_row,
int mi_col, BLOCK_SIZE bsize,
const TileInfo *tile_info, ThreadData *td,
bool search_none_after_rect,
bool* prune_list, MLResult* ml_results,
size_t* ml_count) {
*ml_count = 0;
for (int i = 0; i < 4; i++) {
prune_list[i] = false;
}
const MACROBLOCKD *xd = &x->e_mbd;
int qp = cpi->common.quant_params.base_qindex;
bool key_frame = cpi->common.current_frame.frame_type == KEY_FRAME;
const AV1_COMMON *const cm = &cpi->common;
int qp_offset;
switch (cm->seq_params.bit_depth) {
case AOM_BITS_10: qp_offset = qindex_10b_offset[1]; break;
case AOM_BITS_12: qp_offset = qindex_12b_offset[1]; break;
default: qp_offset = 0; break;
}
int harsh_level = key_frame ? cpi->sf.part_sf.prune_split_ml_level :
cpi->sf.part_sf.prune_split_ml_level_inter;
// use intra model only for key frames for now
if (xd->tree_type == CHROMA_PART) return ML_PART_DONT_FORCE;
MODEL_TYPE model_types[12];
struct ModelParams model_params[12];
int num_models = 0;
get_model_type(key_frame, bsize, harsh_level, !!ml_results, model_types,
model_params, &num_models);
float ml_input[FEATURE_INTER_MAX] = { 0.0f };
float ml_output[1] = { 0.0f };
bool has_features = false;
for (int mi = 0; mi < num_models; mi++) {
MODEL_TYPE model_type = model_types[mi];
struct ModelParams params = model_params[mi];
bool model_disabled =
qp > (params.qp_high + qp_offset) || qp < (params.qp_low + qp_offset);
if (model_disabled) continue;
if (!has_features) {
if (key_frame) {
av1_ml_part_split_features(cpi, x, mi_row, mi_col, bsize,
search_none_after_rect, ml_input);
} else {
av1_ml_part_split_features_inter(cpi, x, mi_row, mi_col, bsize,
tile_info, td, search_none_after_rect,
ml_input);
}
has_features = true;
}
//printf("%s l:%f h:%f qpl:%d qph:%d\n", get_model_name(model_type),
// params.thresh_low, params.thresh_high, params.qp_low,
// params.qp_high);
bool had_error = av2_part_prune_tflite_exec(&td->partition_model, ml_input,
ml_output, model_type);
assert(!had_error);
// When in dataset mode we still run ML but we don't do anything
// about the result.
// ml_results being NULL indicates, not need to collect
if (ml_results) {
params.thresh_low = 0;
params.thresh_high = 1;
MLResult* result = &ml_results[(*ml_count)++];
for (int i = 0; i < FEATURE_INTER_MAX; i++)
result->x[i] = ml_input[i];
result->y = ml_output[0];
result->model = model_type;
result->x_shape = get_model_n_features(model_type);
// also check the correctness of the inverse
struct InputSpec input_spec;
av2_model_input_spec(model_type, &input_spec);
if (input_spec.valid) {
for (int i = 0; i < result->x_shape; i++) {
float diff = 1 / input_spec.std[i] - input_spec.invstd[i];
if (diff >= 0.00005) {
printf("[%d] %f != 1/%f, %f\n", model_type, input_spec.invstd[i],
input_spec.std[i], diff);
break;
}
}
}
}
if (had_error)
continue;
else {
int part_type = get_model_part_type(model_type);
if (part_type >= 0 && part_type < 4) {
bool low_test = ml_output[0] < params.thresh_low;
bool high_test = ml_output[0] > params.thresh_high;
if (high_test) return ML_PART_FORCE_NONE + part_type;
if (low_test) prune_list[part_type] = true;
}
}
}
return ML_PART_DONT_FORCE;
}