Run an expert MLP.
423{
424 const GRLMLP& expert =
m_MLPs[isector];
425 vector<float> weights = expert.get_weights();
426 vector<float> bias = expert.get_bias();
427 vector<int> total_bit_bias = expert.get_total_bit_bias();
428 vector<int> int_bit_bias = expert.get_int_bit_bias();
429 vector<bool> is_signed_bias = expert.get_is_signed_bias();
430 vector<int> rounding_bias = expert.get_rounding_bias();
431 vector<int> saturation_bias = expert.get_saturation_bias();
432 vector<int> total_bit_accum = expert.get_total_bit_accum();
433 vector<int> int_bit_accum = expert.get_int_bit_accum();
434 vector<bool> is_signed_accum = expert.get_is_signed_accum();
435 vector<int> rounding_accum = expert.get_rounding_accum();
436 vector<int> saturation_accum = expert.get_saturation_accum();
437 vector<int> total_bit_weight = expert.get_total_bit_weight();
438 vector<int> int_bit_weight = expert.get_int_bit_weight();
439 vector<bool> is_signed_weight = expert.get_is_signed_weight();
440 vector<int> rounding_weight = expert.get_rounding_weight();
441 vector<int> saturation_weight = expert.get_saturation_weight();
442 vector<int> total_bit_relu = expert.get_total_bit_relu();
443 vector<int> int_bit_relu = expert.get_int_bit_relu();
444 vector<bool> is_signed_relu = expert.get_is_signed_relu();
445 vector<int> rounding_relu = expert.get_rounding_relu();
446 vector<int> saturation_relu = expert.get_saturation_relu();
447 vector<int> total_bit = expert.get_total_bit();
448 vector<int> int_bit = expert.get_int_bit();
449 vector<bool> is_signed = expert.get_is_signed();
450 vector<int> rounding = expert.get_rounding();
451 vector<int> saturation = expert.get_saturation();
452 vector<vector<int>> W_input = expert.get_W_input();
453 vector<vector<int>> I_input = expert.get_I_input();
454
455
456
457 vector<float> layerinput = input;
458
459
460 for (size_t i = 0; i < layerinput.size(); ++i) {
461
462 int W_arr[24] = { 12, 12, 11, 11, 8, 8, 7, 7, 5, 6, 6, 6, 8, 8, 6, 5, 4, 5, 7, 7, 6, 4, 5, 5 };
463 int I_arr[24] = { 12, 12, 11, 11, 10, 9, 7, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 };
464 if (i != 23) {
465 layerinput[i] = sim_input_layer_t(layerinput[i]);
466 layerinput[i] = sim_ap_dense_0_iq(layerinput[i], W_arr[i], I_arr[i]);
467
468 } else layerinput[i] = 0;
469 }
470
471
472 vector<float> layeroutput = {};
473 unsigned num_layers = expert.get_number_of_layers();
474
475 unsigned num_total_neurons = 0;
476 unsigned iw = 0;
477 for (unsigned i_layer = 0; i_layer < num_layers - 1; i_layer++) {
478
479 unsigned num_neurons = expert.get_number_of_nodes_layer(i_layer + 1);
480 layeroutput.clear();
481 layeroutput.assign(num_neurons, 0.);
482 layeroutput.shrink_to_fit();
483
484 for (unsigned io = 0; io < num_neurons; ++io) {
485 float bias_raw = bias[io + num_total_neurons];
486 float bias_fixed = sim_fixed(bias_raw, total_bit_bias[i_layer], int_bit_bias[i_layer], is_signed_bias[i_layer],
487 rounding_bias[i_layer], saturation_bias[i_layer]);
488 float bias_contrib = sim_fixed(bias_fixed, total_bit_accum[i_layer], int_bit_accum[i_layer], is_signed_accum[i_layer],
489 rounding_accum[i_layer], saturation_accum[i_layer]);
490 layeroutput[io] = bias_contrib;
491
492 }
493 num_total_neurons += num_neurons;
494
495
496 unsigned num_inputs = layerinput.size();
497 for (unsigned ii = 0; ii < num_inputs; ++ii) {
498 float input_val = layerinput[ii];
499 for (unsigned io = 0; io < num_neurons; ++io) {
500 float weight_raw = weights[iw];
501 float weight_fixed = sim_fixed(weight_raw, total_bit_weight[i_layer], int_bit_weight[i_layer], is_signed_weight[i_layer],
502 rounding_weight[i_layer], saturation_weight[i_layer]);
503 float product = input_val * weight_fixed;
504 float contrib = sim_fixed(product, total_bit_accum[i_layer], int_bit_accum[i_layer], is_signed_accum[i_layer],
505 rounding_accum[i_layer], saturation_accum[i_layer]);
506 layeroutput[io] += contrib;
507 ++iw;
508 }
509 }
510
511 if (i_layer < num_layers - 2) {
512
513 for (unsigned io = 0; io < num_neurons; ++io) {
514 float fixed_val = sim_fixed(layeroutput[io], total_bit[i_layer], int_bit[i_layer], is_signed[i_layer], rounding[i_layer],
515 saturation[i_layer]);
516 float relu_val = (fixed_val > 0) ? fixed_val : 0;
517 layeroutput[io] = sim_fixed(relu_val, total_bit_relu[i_layer], int_bit_relu[i_layer], is_signed_relu[i_layer],
518 rounding_relu[i_layer], saturation_relu[i_layer]);
519 }
520
521
522
523 layerinput.clear();
524 layerinput.assign(num_neurons, 0);
525 layerinput.shrink_to_fit();
526
527 for (unsigned i = 0; i < num_neurons; ++i) {
528
529 layerinput[i] = sim_ap_fixed(layeroutput[i], W_input[i_layer][i], I_input[i_layer][i], false, 1, 4, 0);
530
531 }
532 if (i_layer == 0) {}
533 else if (i_layer == 1) {
534
535 layerinput[1] = 0;
536 layerinput[10] = 0;
537 layerinput[18] = 0;
538
539 } else if (i_layer == 2) {
540 layerinput[2] = 0;
541 layerinput[16] = 0;
542
543 }
544
545
546 } else {
547
548
549
550 float final_fixed = sim_result_t(layeroutput[0]);
551
552 return final_fixed;
553 }
554 }
555 return 0;
556}