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