diff --git a/RecoTracker/LSTCore/interface/Common.h b/RecoTracker/LSTCore/interface/Common.h index 66d184f59902d..5ff20f5d4767b 100644 --- a/RecoTracker/LSTCore/interface/Common.h +++ b/RecoTracker/LSTCore/interface/Common.h @@ -64,7 +64,9 @@ namespace lst { }; struct Params_pLS { static constexpr int kLayers = 2, kHits = 4; + static constexpr int kEmbed = 6; using ArrayUxHits = edm::StdArray; + using ArrayFxEmbed = edm::StdArray; }; struct Params_LS { static constexpr int kLayers = 2, kHits = 4; @@ -84,9 +86,11 @@ namespace lst { }; struct Params_T5 { static constexpr int kLayers = 5, kHits = 10; + static constexpr int kEmbed = 6; using ArrayU8xLayers = edm::StdArray; using ArrayU16xLayers = edm::StdArray; using ArrayUxHits = edm::StdArray; + using ArrayFxEmbed = edm::StdArray; }; struct Params_pT5 { static constexpr int kLayers = 7, kHits = 14; diff --git a/RecoTracker/LSTCore/interface/PixelSegmentsSoA.h b/RecoTracker/LSTCore/interface/PixelSegmentsSoA.h index 3df0647d1669b..f4b021a870299 100644 --- a/RecoTracker/LSTCore/interface/PixelSegmentsSoA.h +++ b/RecoTracker/LSTCore/interface/PixelSegmentsSoA.h @@ -10,6 +10,7 @@ namespace lst { GENERATE_SOA_LAYOUT(PixelSegmentsSoALayout, SOA_COLUMN(uint4, pLSHitsIdxs), + SOA_COLUMN(Params_pLS::ArrayFxEmbed, plsEmbed), SOA_COLUMN(char, isDup), SOA_COLUMN(bool, partOfPT5), SOA_COLUMN(float, score), diff --git a/RecoTracker/LSTCore/interface/QuintupletsSoA.h b/RecoTracker/LSTCore/interface/QuintupletsSoA.h index 3a76b3a26c893..d627bf1d866a5 100644 --- a/RecoTracker/LSTCore/interface/QuintupletsSoA.h +++ b/RecoTracker/LSTCore/interface/QuintupletsSoA.h @@ -13,6 +13,7 @@ namespace lst { SOA_COLUMN(Params_T5::ArrayU16xLayers, lowerModuleIndices), // lower module index in each layer SOA_COLUMN(Params_T5::ArrayU8xLayers, logicalLayers), // layer ID SOA_COLUMN(Params_T5::ArrayUxHits, hitIndices), // hit indices + SOA_COLUMN(Params_T5::ArrayFxEmbed, t5Embed), // t5 embedding vector SOA_COLUMN(FPX, innerRadius), // inner triplet circle radius SOA_COLUMN(FPX, bridgeRadius), // "middle"/bridge triplet radius SOA_COLUMN(FPX, outerRadius), // outer triplet radius diff --git a/RecoTracker/LSTCore/interface/TripletsSoA.h b/RecoTracker/LSTCore/interface/TripletsSoA.h index 69c2d97449df3..dff20c5a984c9 100644 --- a/RecoTracker/LSTCore/interface/TripletsSoA.h +++ b/RecoTracker/LSTCore/interface/TripletsSoA.h @@ -13,10 +13,13 @@ namespace lst { SOA_COLUMN(Params_T3::ArrayU16xLayers, lowerModuleIndices), // lower module index in each layer SOA_COLUMN(Params_T3::ArrayU8xLayers, logicalLayers), // layer ID SOA_COLUMN(Params_T3::ArrayUxHits, hitIndices), // hit indices - SOA_COLUMN(FPX, betaIn), // beta/chord angle of the inner segment - SOA_COLUMN(float, centerX), // lower/anchor-hit based circle center x - SOA_COLUMN(float, centerY), // lower/anchor-hit based circle center y - SOA_COLUMN(float, radius), // lower/anchor-hit based circle radius + SOA_COLUMN(FPX, betaIn), // beta/chord angle of the inner segment + SOA_COLUMN(float, centerX), // lower/anchor-hit based circle center x + SOA_COLUMN(float, centerY), // lower/anchor-hit based circle center y + SOA_COLUMN(float, radius), // lower/anchor-hit based circle radius + SOA_COLUMN(float, fakeScore), // DNN confidence score for fake t3 + SOA_COLUMN(float, promptScore), // DNN confidence score for real (prompt) t3 + SOA_COLUMN(float, displacedScore), // DNN confidence score for real (displaced) t3 #ifdef CUT_VALUE_DEBUG SOA_COLUMN(float, zOut), SOA_COLUMN(float, rtOut), diff --git a/RecoTracker/LSTCore/interface/alpaka/Common.h b/RecoTracker/LSTCore/interface/alpaka/Common.h index c979ce8dc79c0..8a449819ddbf5 100644 --- a/RecoTracker/LSTCore/interface/alpaka/Common.h +++ b/RecoTracker/LSTCore/interface/alpaka/Common.h @@ -58,34 +58,44 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { namespace dnn { // Common constants for both DNNs - HOST_DEVICE_CONSTANT float kEta_norm = 2.5f; HOST_DEVICE_CONSTANT float kPhi_norm = kPi; HOST_DEVICE_CONSTANT float kEtaSize = 0.25f; // Bin size in eta. constexpr unsigned int kPtBins = 2; constexpr unsigned int kEtaBins = 10; + namespace plsembdnn { + HOST_DEVICE_CONSTANT float kEta_norm = 4.0f; + HOST_DEVICE_CONSTANT float kEtaErr_norm = 0.00139f; + HOST_DEVICE_CONSTANT float kWP[kEtaBins] = { + 0.9235f, 0.8974f, 0.9061f, 0.9431f, 0.8262f, 0.7998f, 0.7714f, 0.7017f, 0.6749f, 0.6624f}; + } // namespace plsembdnn + namespace t3dnn { + HOST_DEVICE_CONSTANT float kEta_norm = 2.5f; HOST_DEVICE_CONSTANT float kZ_max = 224.149505f; HOST_DEVICE_CONSTANT float kR_max = 98.932365f; + HOST_DEVICE_CONSTANT unsigned int kOutputFeatures = 3; HOST_DEVICE_CONSTANT float kWp_prompt[kPtBins][kEtaBins] = { - {0.4957, 0.5052, 0.5201, 0.5340, 0.4275, 0.4708, 0.4890, 0.4932, 0.5400, 0.5449}, - {0.0302, 0.0415, 0.0994, 0.1791, 0.1960, 0.2467, 0.3227, 0.3242, 0.2367, 0.2187}}; + {0.4957f, 0.5052f, 0.5201f, 0.5340f, 0.4275f, 0.4708f, 0.4890f, 0.4932f, 0.5400f, 0.5449f}, + {0.0302f, 0.0415f, 0.0994f, 0.1791f, 0.1960f, 0.2467f, 0.3227f, 0.3242f, 0.2367f, 0.2187f}}; HOST_DEVICE_CONSTANT float kWp_displaced[kPtBins][kEtaBins] = { - {0.0334, 0.0504, 0.0748, 0.0994, 0.1128, 0.1123, 0.1118, 0.1525, 0.1867, 0.1847}, - {0.0091, 0.0075, 0.0350, 0.0213, 0.0435, 0.0676, 0.1957, 0.1649, 0.1080, 0.1046}}; + {0.0334f, 0.0504f, 0.0748f, 0.0994f, 0.1128f, 0.1123f, 0.1118f, 0.1525f, 0.1867f, 0.1847f}, + {0.0091f, 0.0075f, 0.0350f, 0.0213f, 0.0435f, 0.0676f, 0.1957f, 0.1649f, 0.1080f, 0.1046f}}; } // namespace t3dnn namespace t5dnn { + HOST_DEVICE_CONSTANT float kEta_norm = 2.5f; HOST_DEVICE_CONSTANT float kZ_max = 267.2349854f; HOST_DEVICE_CONSTANT float kR_max = 110.1099396f; HOST_DEVICE_CONSTANT float kWp[kPtBins][kEtaBins] = { - {0.4493, 0.4939, 0.5715, 0.6488, 0.5709, 0.5938, 0.7164, 0.7565, 0.8103, 0.8593}, - {0.4488, 0.4448, 0.5067, 0.5929, 0.4836, 0.4112, 0.4968, 0.4403, 0.5597, 0.5067}}; + {0.4493f, 0.4939f, 0.5715f, 0.6488f, 0.5709f, 0.5938f, 0.7164f, 0.7565f, 0.8103f, 0.8593f}, + {0.4488f, 0.4448f, 0.5067f, 0.5929f, 0.4836f, 0.4112f, 0.4968f, 0.4403f, 0.5597f, 0.5067f}}; } // namespace t5dnn namespace pt3dnn { + HOST_DEVICE_CONSTANT float kEta_norm = 2.5f; HOST_DEVICE_CONSTANT float kWp[kEtaBins] = { - 0.189, 0.1805, 0.2267, 0.3104, 0.4719, 0.3159, 0.1372, 0.1571, 0.3198, 0.186}; + 0.189f, 0.1805f, 0.2267f, 0.3104f, 0.4719f, 0.3159f, 0.1372f, 0.1571f, 0.3198f, 0.186f}; HOST_DEVICE_CONSTANT float kWpHigh = 0.0473f; } // namespace pt3dnn diff --git a/RecoTracker/LSTCore/src/alpaka/Kernels.h b/RecoTracker/LSTCore/src/alpaka/Kernels.h index 62e5d12fc1fd0..e607a7087e1dc 100644 --- a/RecoTracker/LSTCore/src/alpaka/Kernels.h +++ b/RecoTracker/LSTCore/src/alpaka/Kernels.h @@ -2,6 +2,7 @@ #define RecoTracker_LSTCore_src_alpaka_Kernels_h #include "HeterogeneousCore/AlpakaInterface/interface/workdivision.h" +#include "FWCore/Utilities/interface/CMSUnrollLoop.h" #include "RecoTracker/LSTCore/interface/alpaka/Common.h" #include "RecoTracker/LSTCore/interface/ModulesSoA.h" @@ -249,7 +250,15 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { float dR2 = dEta * dEta + dPhi * dPhi; int nMatched = checkHitsT5(ix, jx, quintuplets); const int minNHitsForDup_T5 = 5; - if (dR2 < 0.001f || nMatched >= minNHitsForDup_T5) { + + float d2 = 0.f; + CMS_UNROLL_LOOP + for (unsigned int k = 0; k < Params_T5::kEmbed; ++k) { + float diff = quintuplets.t5Embed()[ix][k] - quintuplets.t5Embed()[jx][k]; + d2 += diff * diff; + } + + if (((dR2 < 0.001f || nMatched >= minNHitsForDup_T5) && d2 < 1.0f) || (dR2 < 0.02f && d2 < 0.1f)) { if (isPT5_jx || score_rphisum1 > score_rphisum2) { rmQuintupletFromMemory(quintuplets, ix, true); } else if (isPT5_ix || score_rphisum1 < score_rphisum2) { diff --git a/RecoTracker/LSTCore/src/alpaka/NeuralNetwork.h b/RecoTracker/LSTCore/src/alpaka/NeuralNetwork.h index 5f91f08e1bec2..66c3c621475dc 100644 --- a/RecoTracker/LSTCore/src/alpaka/NeuralNetwork.h +++ b/RecoTracker/LSTCore/src/alpaka/NeuralNetwork.h @@ -10,6 +10,8 @@ #include "T5NeuralNetworkWeights.h" #include "T3NeuralNetworkWeights.h" #include "pT3NeuralNetworkWeights.h" +#include "T5EmbedNetworkWeights.h" +#include "pLSEmbedNetworkWeights.h" namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { @@ -66,11 +68,11 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { const unsigned int mdIndex2, const unsigned int mdIndex3, const float radius, - const float betaIn) { + const float betaIn, + float (&output)[dnn::t3dnn::kOutputFeatures]) { // Constants for T3 DNN constexpr unsigned int kInputFeatures = 14; constexpr unsigned int kHiddenFeatures = 32; - constexpr unsigned int kOutputFeatures = 3; // Extract hit information float eta1 = alpaka::math::abs(acc, mds.anchorEta()[mdIndex1]); // inner T3 anchor hit 1 eta @@ -91,7 +93,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { // Build input feature vector matching training order float x[kInputFeatures] = { - eta1 / dnn::kEta_norm, // First hit eta normalized + eta1 / dnn::t3dnn::kEta_norm, // First hit eta normalized alpaka::math::abs(acc, phi1) / dnn::kPhi_norm, // First hit phi normalized z1 / dnn::t3dnn::kZ_max, // First hit z normalized r1 / dnn::t3dnn::kR_max, // First hit r normalized @@ -112,7 +114,6 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { float x_1[kHiddenFeatures]; // Layer 1 output float x_2[kHiddenFeatures]; // Layer 2 output - float x_3[kOutputFeatures]; // Layer 3 output (3 classes) // Layer 1: Linear + Relu linear_layer(x, x_1, dnn::t3dnn::wgtT_layer1, dnn::t3dnn::bias_layer1); @@ -123,17 +124,17 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { relu_activation(x_2); // Layer 3: Linear + Softmax - linear_layer( - x_2, x_3, dnn::t3dnn::wgtT_output_layer, dnn::t3dnn::bias_output_layer); - softmax_activation(acc, x_3); + linear_layer( + x_2, output, dnn::t3dnn::wgtT_output_layer, dnn::t3dnn::bias_output_layer); + softmax_activation(acc, output); // Get pt and eta bin indices float t3_pt = radius * lst::k2Rinv1GeVf * 2; uint8_t pt_index = (t3_pt > 5); uint8_t bin_index = (eta1 > 2.5f) ? (dnn::kEtaBins - 1) : static_cast(eta1 / dnn::kEtaSize); - return x_3[1] > dnn::t3dnn::kWp_prompt[pt_index][bin_index] || - x_3[2] > dnn::t3dnn::kWp_displaced[pt_index][bin_index]; + return output[1] > dnn::t3dnn::kWp_prompt[pt_index][bin_index] || + output[2] > dnn::t3dnn::kWp_displaced[pt_index][bin_index]; } } // namespace t3dnn @@ -157,7 +158,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { alpaka::math::log10(acc, pixelRadius), alpaka::math::log10(acc, pixRadiusError), alpaka::math::log10(acc, rzChiSquared), - alpaka::math::abs(acc, pixelEta) / dnn::kEta_norm}; + alpaka::math::abs(acc, pixelEta) / dnn::pt3dnn::kEta_norm}; float x1[kHiddenFeatures]; float x2[kHiddenFeatures]; @@ -227,7 +228,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { // Build the input feature vector using pairwise differences after the first hit float x[kInputFeatures] = { - eta1 / dnn::kEta_norm, // inner T3: First hit eta normalized + eta1 / dnn::t5dnn::kEta_norm, // inner T3: First hit eta normalized alpaka::math::abs(acc, phi1) / dnn::kPhi_norm, // inner T3: First hit phi normalized z1 / dnn::t5dnn::kZ_max, // inner T3: First hit z normalized r1 / dnn::t5dnn::kR_max, // inner T3: First hit r normalized @@ -288,6 +289,145 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { } } // namespace t5dnn + namespace t5embdnn { + template + ALPAKA_FN_ACC ALPAKA_FN_INLINE void runEmbed(TAcc const& acc, + MiniDoubletsConst mds, + unsigned int mdIndex1, + unsigned int mdIndex2, + unsigned int mdIndex3, + unsigned int mdIndex4, + unsigned int mdIndex5, + float innerRadius, + float outerRadius, + float bridgeRadius, + float fakeScore1, + float promptScore1, + float dispScore1, + float fakeScore2, + float promptScore2, + float dispScore2, + float (&embedding)[Params_T5::kEmbed]) { + constexpr unsigned int kInputFeatures = 30; + constexpr unsigned int kHiddenFeatures = 32; + + float eta1 = mds.anchorEta()[mdIndex1]; + float eta2 = alpaka::math::abs(acc, mds.anchorEta()[mdIndex2]); + float eta3 = alpaka::math::abs(acc, mds.anchorEta()[mdIndex3]); + float eta4 = alpaka::math::abs(acc, mds.anchorEta()[mdIndex4]); + float eta5 = alpaka::math::abs(acc, mds.anchorEta()[mdIndex5]); + + float phi1 = mds.anchorPhi()[mdIndex1]; + float phi2 = mds.anchorPhi()[mdIndex2]; + float phi3 = mds.anchorPhi()[mdIndex3]; + float phi4 = mds.anchorPhi()[mdIndex4]; + float phi5 = mds.anchorPhi()[mdIndex5]; + + float z1 = alpaka::math::abs(acc, mds.anchorZ()[mdIndex1]); + float z2 = alpaka::math::abs(acc, mds.anchorZ()[mdIndex2]); + float z3 = alpaka::math::abs(acc, mds.anchorZ()[mdIndex3]); + float z4 = alpaka::math::abs(acc, mds.anchorZ()[mdIndex4]); + float z5 = alpaka::math::abs(acc, mds.anchorZ()[mdIndex5]); + + float r1 = mds.anchorRt()[mdIndex1]; + float r2 = mds.anchorRt()[mdIndex2]; + float r3 = mds.anchorRt()[mdIndex3]; + float r4 = mds.anchorRt()[mdIndex4]; + float r5 = mds.anchorRt()[mdIndex5]; + + float x[kInputFeatures] = {eta1 / dnn::t5dnn::kEta_norm, + alpaka::math::cos(acc, phi1), + alpaka::math::sin(acc, phi1), + z1 / dnn::t5dnn::kZ_max, + r1 / dnn::t5dnn::kR_max, + + eta2 - alpaka::math::abs(acc, eta1), + cms::alpakatools::deltaPhi(acc, phi2, phi1), + (z2 - z1) / dnn::t5dnn::kZ_max, + (r2 - r1) / dnn::t5dnn::kR_max, + + eta3 - eta2, + cms::alpakatools::deltaPhi(acc, phi3, phi2), + (z3 - z2) / dnn::t5dnn::kZ_max, + (r3 - r2) / dnn::t5dnn::kR_max, + + eta4 - eta3, + cms::alpakatools::deltaPhi(acc, phi4, phi3), + (z4 - z3) / dnn::t5dnn::kZ_max, + (r4 - r3) / dnn::t5dnn::kR_max, + + eta5 - eta4, + cms::alpakatools::deltaPhi(acc, phi5, phi4), + (z5 - z4) / dnn::t5dnn::kZ_max, + (r5 - r4) / dnn::t5dnn::kR_max, + + 1.0f / innerRadius, + 1.0f / bridgeRadius, + 1.0f / outerRadius, + + fakeScore1, + promptScore1, + dispScore1, + (fakeScore2 - fakeScore1), + (promptScore2 - promptScore1), + (dispScore2 - dispScore1)}; + + float h1[kHiddenFeatures]; + float h2[kHiddenFeatures]; + + linear_layer(x, h1, dnn::t5embdnn::wgtT_fc1, dnn::t5embdnn::bias_fc1); + relu_activation(h1); + + linear_layer(h1, h2, dnn::t5embdnn::wgtT_fc2, dnn::t5embdnn::bias_fc2); + relu_activation(h2); + + linear_layer(h2, embedding, dnn::t5embdnn::wgtT_fc3, dnn::t5embdnn::bias_fc3); + } + + } // namespace t5embdnn + + namespace plsembdnn { + template + ALPAKA_FN_ACC ALPAKA_FN_INLINE void runEmbed(TAcc const& acc, + const float eta, + const float etaErr, + const float phi, + const float circleCenterX, + const float circleCenterY, + const float circleRadius, + const float ptIn, + const float ptErr, + const bool isQuad, + float (&embedding)[Params_pLS::kEmbed]) { + constexpr unsigned int kInputFeatures = 10; + constexpr unsigned int kHiddenFeatures = 32; + + float x[kInputFeatures] = {eta / dnn::plsembdnn::kEta_norm, + etaErr / dnn::plsembdnn::kEtaErr_norm, + alpaka::math::cos(acc, phi), + alpaka::math::sin(acc, phi), + 1.0f / ptIn, + alpaka::math::log10(acc, ptErr), + isQuad ? 1.0f : 0.0f, + alpaka::math::log10(acc, alpaka::math::abs(acc, circleCenterX)), + alpaka::math::log10(acc, alpaka::math::abs(acc, circleCenterY)), + alpaka::math::log10(acc, circleRadius)}; + + float h1[kHiddenFeatures]; + float h2[kHiddenFeatures]; + + linear_layer(x, h1, dnn::plsembdnn::wgtT_fc1, dnn::plsembdnn::bias_fc1); + relu_activation(h1); + + linear_layer(h1, h2, dnn::plsembdnn::wgtT_fc2, dnn::plsembdnn::bias_fc2); + relu_activation(h2); + + linear_layer( + h2, embedding, dnn::plsembdnn::wgtT_fc3, dnn::plsembdnn::bias_fc3); + } + + } // namespace plsembdnn + } // namespace ALPAKA_ACCELERATOR_NAMESPACE::lst #endif diff --git a/RecoTracker/LSTCore/src/alpaka/Quintuplet.h b/RecoTracker/LSTCore/src/alpaka/Quintuplet.h index d411e5ba9e84c..c52c6eabd895e 100644 --- a/RecoTracker/LSTCore/src/alpaka/Quintuplet.h +++ b/RecoTracker/LSTCore/src/alpaka/Quintuplet.h @@ -3,6 +3,7 @@ #include "HeterogeneousCore/AlpakaInterface/interface/workdivision.h" #include "FWCore/Utilities/interface/isFinite.h" +#include "FWCore/Utilities/interface/CMSUnrollLoop.h" #include "RecoTracker/LSTCore/interface/ObjectRangesSoA.h" #include "RecoTracker/LSTCore/interface/MiniDoubletsSoA.h" @@ -44,6 +45,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { float scores, uint8_t layer, unsigned int quintupletIndex, + const float (&t5Embed)[Params_T5::kEmbed], bool tightCutFlag) { quintuplets.tripletIndices()[quintupletIndex][0] = innerTripletIndex; quintuplets.tripletIndices()[quintupletIndex][1] = outerTripletIndex; @@ -86,6 +88,11 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { quintuplets.nonAnchorChiSquared()[quintupletIndex] = nonAnchorChiSquared; quintuplets.dBeta1()[quintupletIndex] = dBeta1; quintuplets.dBeta2()[quintupletIndex] = dBeta2; + + CMS_UNROLL_LOOP + for (unsigned int i = 0; i < Params_T5::kEmbed; ++i) { + quintuplets.t5Embed()[quintupletIndex][i] = t5Embed[i]; + } } //bounds can be found at http://uaf-10.t2.ucsd.edu/~bsathian/SDL/T5_RZFix/t5_rz_thresholds.txt @@ -1485,6 +1492,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { float& dBeta1, float& dBeta2, bool& tightCutFlag, + float (&t5Embed)[Params_T5::kEmbed], const float ptCut) { unsigned int firstSegmentIndex = triplets.segmentIndices()[innerTripletIndex][0]; unsigned int secondSegmentIndex = triplets.segmentIndices()[innerTripletIndex][1]; @@ -1599,6 +1607,24 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { tightCutFlag)) return false; + lst::t5embdnn::runEmbed(acc, + mds, + firstMDIndex, + secondMDIndex, + thirdMDIndex, + fourthMDIndex, + fifthMDIndex, + innerRadius, + outerRadius, + bridgeRadius, + triplets.fakeScore()[innerTripletIndex], + triplets.promptScore()[innerTripletIndex], + triplets.displacedScore()[innerTripletIndex], + triplets.fakeScore()[outerTripletIndex], + triplets.promptScore()[outerTripletIndex], + triplets.displacedScore()[outerTripletIndex], + t5Embed); + // 5 categories for sigmas float sigmas2[5], delta1[5], delta2[5], slopes[5]; bool isFlat[5]; @@ -1698,6 +1724,8 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { float innerRadius, outerRadius, bridgeRadius, regressionCenterX, regressionCenterY, regressionRadius, rzChiSquared, chiSquared, nonAnchorChiSquared, dBeta1, dBeta2; //required for making distributions + float t5Embed[Params_T5::kEmbed] = {0.f}; + bool tightCutFlag = false; bool success = runQuintupletDefaultAlgo(acc, modules, @@ -1723,6 +1751,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { dBeta1, dBeta2, tightCutFlag, + t5Embed, ptCut); if (success) { @@ -1776,6 +1805,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { scores, layer, quintupletIndex, + t5Embed, tightCutFlag); triplets.partOfT5()[quintuplets.tripletIndices()[quintupletIndex][0]] = true; diff --git a/RecoTracker/LSTCore/src/alpaka/Segment.h b/RecoTracker/LSTCore/src/alpaka/Segment.h index 3893f8799fe04..606fc20246bb4 100644 --- a/RecoTracker/LSTCore/src/alpaka/Segment.h +++ b/RecoTracker/LSTCore/src/alpaka/Segment.h @@ -4,6 +4,7 @@ #include #include "HeterogeneousCore/AlpakaInterface/interface/workdivision.h" +#include "FWCore/Utilities/interface/CMSUnrollLoop.h" #include "RecoTracker/LSTCore/interface/alpaka/Common.h" #include "RecoTracker/LSTCore/interface/SegmentsSoA.h" @@ -15,6 +16,8 @@ #include "RecoTracker/LSTCore/interface/EndcapGeometry.h" #include "RecoTracker/LSTCore/interface/ObjectRangesSoA.h" +#include "NeuralNetwork.h" + namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { ALPAKA_FN_ACC ALPAKA_FN_INLINE bool isTighterTiltedModules_seg(ModulesConst modules, unsigned int moduleIndex) { @@ -209,6 +212,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { ALPAKA_FN_ACC ALPAKA_FN_INLINE void addPixelSegmentToMemory(TAcc const& acc, Segments segments, PixelSegments pixelSegments, + PixelSeedsConst pixelSeeds, MiniDoubletsConst mds, unsigned int innerMDIndex, unsigned int outerMDIndex, @@ -267,6 +271,23 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { pixelSegments.circleCenterX()[pixelSegmentArrayIndex] = candidateCenterXs[bestIndex]; pixelSegments.circleCenterY()[pixelSegmentArrayIndex] = candidateCenterYs[bestIndex]; pixelSegments.circleRadius()[pixelSegmentArrayIndex] = circleRadius; + + float plsEmbed[Params_pLS::kEmbed]; + plsembdnn::runEmbed(acc, + pixelSeeds.eta()[pixelSegmentArrayIndex], + pixelSeeds.etaErr()[pixelSegmentArrayIndex], + pixelSeeds.phi()[pixelSegmentArrayIndex], + pixelSegments.circleCenterX()[pixelSegmentArrayIndex], + pixelSegments.circleCenterY()[pixelSegmentArrayIndex], + pixelSegments.circleRadius()[pixelSegmentArrayIndex], + pixelSeeds.ptIn()[pixelSegmentArrayIndex], + pixelSeeds.ptErr()[pixelSegmentArrayIndex], + static_cast(pixelSeeds.isQuad()[pixelSegmentArrayIndex]), + plsEmbed); + + CMS_UNROLL_LOOP for (unsigned k = 0; k < Params_pLS::kEmbed; ++k) { + pixelSegments.plsEmbed()[pixelSegmentArrayIndex][k] = plsEmbed[k]; + } } template @@ -794,6 +815,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { addPixelSegmentToMemory(acc, segments, pixelSegments, + pixelSeeds, mds, innerMDIndex, outerMDIndex, diff --git a/RecoTracker/LSTCore/src/alpaka/T5EmbedNetworkWeights.h b/RecoTracker/LSTCore/src/alpaka/T5EmbedNetworkWeights.h new file mode 100644 index 0000000000000..dbc86015688f8 --- /dev/null +++ b/RecoTracker/LSTCore/src/alpaka/T5EmbedNetworkWeights.h @@ -0,0 +1,315 @@ +#ifndef RecoTracker_LSTCore_src_alpaka_T5EmbedNetworkWeights_h +#define RecoTracker_LSTCore_src_alpaka_T5EmbedNetworkWeights_h + +#include + +#include "FWCore/Utilities/interface/HostDeviceConstant.h" + +namespace ALPAKA_ACCELERATOR_NAMESPACE::lst::dnn::t5embdnn { + + HOST_DEVICE_CONSTANT float bias_fc1[32] = { + 0.4077676f, -0.2279155f, -0.2884339f, 0.3470485f, 0.2260163f, 0.3343305f, 0.2159934f, 0.3737450f, + 0.5172617f, 0.4149252f, 0.4305608f, 0.8852963f, -0.0304266f, 0.4297696f, 0.3520102f, 0.1646055f, + 0.2715247f, 0.5041977f, -0.3354747f, 0.1381416f, -0.2057779f, -0.6174472f, 0.3763988f, 0.2417004f, + 0.6029384f, -0.5503362f, 0.1589353f, 0.0196475f, 0.1615662f, 0.4879072f, 0.7081229f, 0.0848025f}; + + HOST_DEVICE_CONSTANT const float wgtT_fc1[30][32] = { + {0.0024744f, -0.0393794f, 0.0012607f, -0.0463855f, -0.0008486f, -0.0039237f, 0.0104747f, 0.0094048f, + -0.0152672f, 0.0009938f, 0.0101450f, -0.0166616f, 0.0049875f, -0.0070639f, -0.0500429f, -0.0172534f, + 0.0688348f, 0.0009360f, -0.0225526f, 0.0062404f, 0.0079217f, -0.0171006f, -0.0016421f, -0.0123498f, + -0.0035078f, 0.0132192f, 0.0036508f, -0.0103952f, 0.0018321f, 0.0288714f, 0.0098612f, -0.0000296f}, + {-0.0058784f, -0.0120812f, 0.0049086f, 0.0155617f, 0.0009917f, -0.0040435f, 0.0133419f, -0.0072605f, + 0.0024925f, 0.0068197f, -0.0006385f, 0.0031977f, -0.0114677f, -0.0033108f, 0.0209282f, 0.0015631f, + 0.0125927f, -0.0031000f, -0.0068791f, -0.0123153f, -0.0049826f, -0.0070589f, 0.0026653f, 0.0113343f, + 0.0100663f, -0.0192249f, -0.0090349f, 0.0177071f, -0.0093298f, 0.0316960f, -0.0035137f, 0.0034051f}, + {-0.0012076f, -0.0271521f, 0.0020420f, -0.0111024f, 0.0028394f, 0.0007962f, -0.0022592f, -0.0033232f, + 0.0035402f, -0.0087297f, -0.0111310f, -0.0055134f, -0.0189009f, 0.0056956f, 0.0075314f, -0.0220869f, + -0.0052434f, 0.0041410f, 0.0126735f, 0.0046679f, -0.0063149f, -0.0643957f, 0.0093661f, -0.0139448f, + -0.0077514f, 0.0037926f, 0.0074050f, 0.0076167f, -0.0104248f, 0.0317166f, -0.0028450f, 0.0173832f}, + {0.1251217f, 0.1800787f, -0.1867869f, 0.1595200f, 0.1434205f, 0.1503779f, -0.4537136f, -0.5901821f, + 0.0563463f, 0.7319781f, -0.1496763f, -1.5963429f, 0.2045313f, 0.3836967f, -0.9270357f, -0.0226355f, + -0.2698695f, 0.3014301f, 0.1243785f, 0.1064028f, -0.1828626f, -0.0126028f, -0.6539689f, 0.4266773f, + 0.1370417f, -0.1538948f, -0.3513461f, 0.1182490f, -0.0221514f, -0.1990412f, -1.7690033f, -0.2758574f}, + {-0.5385936f, -0.0012131f, 1.0062443f, -0.0004652f, -1.5250168f, -0.6941552f, 0.4669687f, -0.3101588f, + -0.1252819f, -0.5553900f, 0.4493555f, -1.0237653f, 0.0137464f, -0.9620051f, -1.1179942f, 0.8291886f, + -0.4238032f, -0.9437180f, 0.4450281f, 0.4106119f, 2.0104270f, 1.1056167f, 1.1838503f, -0.2184737f, + -0.6447318f, 1.0383023f, 0.2861722f, 0.4638089f, 0.0827050f, -0.7214339f, -0.8271918f, 0.0903803f}, + {0.0925784f, -2.2875428f, 0.4228307f, 0.7384776f, -0.6291643f, -0.5331570f, 0.6747525f, -1.1195320f, + -0.4872814f, 1.1755321f, -0.2841410f, 0.7739045f, -0.5575562f, -0.8809059f, -0.2960616f, -8.8249207f, + 0.7914539f, -1.7136964f, 0.6188551f, -1.4344710f, 5.3693213f, -1.2444569f, -0.4813018f, -0.8091519f, + 0.8857184f, -2.0941384f, -0.2130339f, -0.5814816f, 0.3258826f, -0.2931088f, 1.4789020f, 0.4618642f}, + {0.6531625f, 1.1529071f, 0.1371508f, 2.8411951f, -0.8554673f, -0.1095216f, 1.2860730f, 0.4513414f, + 0.9408586f, 0.0923639f, 1.0380499f, -0.0617734f, 0.3752534f, 0.4164129f, -0.6928972f, 0.5165285f, + 0.2846950f, -0.4395047f, -0.4500486f, -1.5119061f, -0.1637943f, 0.3001703f, -0.1272881f, 0.6307207f, + -0.4045023f, 1.5478576f, 2.8443282f, 0.3571231f, -3.8504515f, -0.5279408f, 0.2419337f, 1.0267982f}, + {-0.4495021f, -0.6836431f, 0.6723049f, 0.7558293f, -0.3250372f, 0.1810641f, -0.5758181f, -0.3216294f, + -0.8515261f, 0.7419527f, -0.1002971f, -3.8079274f, 1.1104699f, -0.5206310f, -0.1571004f, -0.0966715f, + -0.5530408f, -0.2359556f, 1.0117108f, 0.5562274f, 0.8772307f, 0.0218807f, -1.3814380f, -0.2966548f, + -0.7360181f, 1.1440719f, -0.0740981f, 0.4694696f, -0.1318757f, 0.3080833f, -1.6074529f, -0.6576584f}, + {-1.1813462f, 0.8606730f, 0.5925826f, -0.4136417f, -0.1687684f, -1.2883703f, 1.0737853f, -0.4584215f, + -0.0107126f, -1.4510404f, -0.5694596f, -0.9614651f, -0.0733704f, -0.6900919f, -1.1785636f, 0.0102372f, + 0.7968284f, -1.2490059f, 1.3178346f, 1.0213394f, -1.3799534f, 1.1048131f, 1.0791637f, -0.7684139f, + -1.5358402f, 1.0583841f, 0.7784582f, -0.9112529f, 0.1112473f, -0.3522860f, -0.1625194f, 0.6646042f}, + {2.8097115f, 0.2189469f, 0.4759579f, -0.4399420f, -1.9096129f, 4.4731107f, -1.7415184f, 0.7458996f, + 2.6043866f, 0.0228842f, -0.9860933f, -1.5356710f, -1.1698126f, -0.9608816f, -4.6475010f, -0.2212112f, + 0.3191188f, 3.6182191f, -0.5279332f, 1.2250533f, -1.8226494f, 1.4215574f, 0.0107232f, -1.3500752f, + -2.1345067f, 4.0902228f, -0.1406621f, 0.1988346f, 0.1143996f, 0.1584920f, 1.9306198f, 0.2264732f}, + {-0.6330162f, -0.8606266f, -0.2506120f, 2.8644457f, -2.5139024f, -0.1396846f, 3.2136893f, -0.5183797f, + 1.0188060f, -0.1992519f, 4.1541386f, 0.0795280f, 2.1208901f, 0.5972226f, -0.1704281f, 1.1748037f, + 1.6950256f, -0.1650027f, -0.3023618f, -0.9703765f, -0.4939895f, 0.1733194f, -0.5587181f, -0.3252590f, + -0.6592528f, -0.6176721f, 2.8412099f, 1.9992446f, -5.7545681f, -1.3432568f, 0.3551563f, 4.1674385f}, + {0.0463279f, 0.4675750f, 0.9041724f, -0.5633961f, 0.3415673f, 0.4415232f, -0.1690769f, 0.7954109f, + -0.9843888f, 0.3741962f, -1.6147419f, -1.4149523f, 1.1648459f, -0.3204101f, -0.9185460f, -0.6581141f, + 0.7857524f, -0.3287453f, 1.6249634f, -0.0135078f, 0.1881986f, 0.7690734f, -1.9673315f, -0.0688100f, + -1.6302046f, -0.5908383f, -0.4823549f, 0.1704361f, -0.4471235f, -0.4368535f, -1.3240870f, -0.3216266f}, + {-1.4061178f, 0.5022576f, 1.0982580f, -0.6220022f, -0.9696901f, -1.9179952f, 1.7193460f, -0.2582918f, + -0.5588899f, -1.3507159f, -0.3256070f, -1.3323994f, 0.1045043f, -1.4346679f, 0.1656233f, 0.2692206f, + 1.4507416f, -1.7721831f, 2.1165068f, -0.1257402f, -0.3827015f, 2.1512969f, 1.3777891f, -1.3536407f, + -0.6973501f, -2.4181912f, -0.2530868f, -0.5596736f, -0.3524390f, -1.1098257f, 0.0365084f, 0.2368104f}, + {1.1295713f, 1.1852584f, -3.0161581f, -0.0101437f, 3.0580411f, -2.0414307f, 0.9559101f, 1.2531452f, + -0.9469447f, -1.5319313f, -1.2981234f, 1.0231872f, 3.5623341f, 7.2042856f, 1.8736403f, 0.0048688f, + -0.0679021f, -0.0448611f, 1.4677920f, 1.7590126f, 1.2858278f, -1.1959839f, 0.1288983f, 3.8290095f, + -1.9789371f, 0.7309756f, 0.2280468f, -1.1718543f, -0.7974834f, -1.4442098f, -1.0101110f, -0.6817204f}, + {-1.5343865f, -0.3796017f, -0.1856368f, 1.7139316f, -1.0014790f, 0.4724852f, 1.6746861f, -0.9341705f, + 1.9503918f, -0.1495848f, 1.9440095f, 0.3956429f, 2.0056448f, 0.3137310f, -0.0619077f, -0.1152982f, + 2.3105996f, 0.2760705f, 0.0417842f, -1.7413501f, -0.0536200f, -0.4784753f, -0.2405750f, -1.6337229f, + -0.0542544f, 0.2359948f, 1.3707143f, 4.4994383f, -2.4251237f, -2.7904398f, -0.5763192f, 8.6687193f}, + {0.1907782f, 0.1742647f, 0.1050308f, -1.5279845f, -0.0656458f, 0.0819947f, -0.0015410f, 0.5593292f, + -0.6139901f, 0.3406654f, -0.9734358f, -1.1476587f, 0.2998652f, -0.1892694f, 0.2782348f, -0.2697246f, + 0.5776731f, -0.1273671f, 1.2335502f, 0.3768652f, -0.0987652f, 0.3744551f, -1.6916909f, -0.0789046f, + -0.2746910f, -1.0240086f, -0.7310969f, 0.1137805f, -0.7809454f, -0.0526637f, -0.9586000f, 0.4703661f}, + {-1.3799059f, 0.5441812f, 1.3961957f, -1.9208598f, -1.4421672f, -0.8509293f, 0.8990977f, -0.4459707f, + 0.4297855f, -1.0108874f, -0.5225446f, -1.4302559f, -0.3395956f, -2.3660328f, 0.4259947f, 0.3851134f, + 0.8479792f, -1.1961648f, 1.9343091f, -0.5853942f, 0.0132326f, 0.8586328f, 1.1753848f, -1.2850294f, + -0.1286860f, -0.1348000f, -0.4805126f, -0.0016954f, -0.0379165f, -0.6723653f, 0.0858779f, 0.1319384f}, + {-0.9047911f, 0.8236033f, -2.6236243f, -1.5834204f, 3.8662889f, -0.8257350f, 1.3124079f, 2.4033010f, + -1.5704441f, -0.7072982f, -0.7994226f, -0.0691188f, 3.0421026f, 0.1919740f, 2.0499594f, 0.6489547f, + -0.8396980f, 0.1463669f, 0.8795691f, 1.3042110f, 0.8791811f, -0.4357574f, 0.0453697f, 1.2778367f, + -0.8345951f, 1.4902275f, 0.4830694f, -0.4929650f, -0.4718537f, -1.5530992f, -0.2699516f, -0.1341021f}, + {-2.0305204f, 0.0984210f, -0.0239505f, 0.1666152f, 0.6038550f, -0.1785676f, 0.0119116f, -1.8020983f, + 0.4221218f, 0.1879676f, 1.2715919f, -0.2330815f, 1.6620227f, 0.1919266f, 0.8790883f, -0.7307991f, + 1.8224788f, 0.3670009f, 0.2779024f, -2.6210845f, 0.4713250f, 0.2567338f, 0.0020450f, -1.1362463f, + 0.2114117f, -1.4463605f, 0.5499513f, 1.6433896f, -1.3871042f, -0.0372309f, -0.1722469f, 5.9508014f}, + {0.4799454f, 0.0895001f, 0.0813640f, -0.8274580f, -0.0076796f, 0.1678302f, -0.2162840f, 0.8216277f, + -0.2604735f, 0.3912535f, -0.6308332f, -0.6842828f, 0.8903456f, -0.2615999f, 0.8842036f, -0.1237010f, + 0.2321620f, 0.0538414f, 0.6234514f, 0.4964478f, -0.6074837f, 0.8388720f, -0.9905877f, -0.1521280f, + 0.0861136f, -1.0650748f, -0.0565484f, -0.1423324f, -0.5450467f, 0.2223674f, -0.6242210f, 0.0313438f}, + {-0.7937829f, 0.2845238f, 1.2092232f, -1.1336080f, -0.9974707f, -1.1016089f, -0.0631481f, -0.4682118f, + -0.1199169f, -0.7368876f, -0.0465959f, -0.9095205f, -0.2594349f, -1.3799951f, 0.3178478f, -0.0327526f, + 1.1278658f, -0.5821651f, 1.1199970f, -0.2503546f, 0.4231540f, 0.5824918f, 0.8323092f, -0.6453368f, + -0.5815063f, 0.2947850f, 0.2406827f, -0.6469781f, 0.3573758f, -0.5031040f, 0.1713905f, -0.0302581f}, + {-2.2269943f, 0.6610296f, -1.7370876f, 5.0489988f, 1.4102260f, -4.3013086f, -5.6990528f, -0.1390589f, + -6.4011965f, -0.6442785f, 2.5386147f, 2.1181786f, 1.3405606f, -0.6832275f, -7.0846601f, 0.4763132f, + -0.6197824f, -0.7640664f, -3.1181791f, -0.7982330f, 2.4704344f, 3.4750955f, -0.3471056f, -1.6380967f, + -3.9228339f, 11.7434921f, -0.2882336f, 3.3142335f, 0.1535466f, -0.9270810f, 0.3529454f, -2.4928286f}, + {4.4015613f, -5.9851208f, -1.9783058f, 1.6264094f, 1.7628051f, 2.7426465f, -0.5450913f, -6.3433137f, + -5.4693661f, -0.1209920f, -16.1616745f, 4.4307213f, 7.2333970f, 0.2126676f, 10.5992460f, 1.1452266f, + -3.8010271f, 0.6511117f, -8.6552525f, 1.5934747f, -7.1460495f, 15.8349514f, 2.6939518f, -0.8971478f, + -11.3297014f, -1.1788586f, -6.3313837f, 9.6355791f, -9.7328720f, 6.8267646f, 2.6127393f, -0.7299617f}, + {-0.6623970f, -4.0980029f, 1.2968158f, 1.0465623f, 2.1909347f, 0.0799154f, -1.3850753f, -8.0645733f, + -2.6519508f, 1.1716766f, -4.2621017f, -2.2514622f, -3.2109861f, 0.4872084f, -2.9294157f, -0.3134519f, + -2.2041106f, -1.0412875f, -3.0902727f, -4.6903996f, -3.8038359f, 0.4521285f, 1.0808827f, -3.5509176f, + -2.8755074f, -2.5900049f, -4.5624914f, 2.9023614f, -7.7391887f, 2.4571869f, 1.7540874f, -6.6134629f}, + {0.3097464f, -9.6223412f, 0.3082687f, 0.7898668f, 0.7815887f, 0.4838023f, 0.1623738f, -0.0818605f, + 0.3574537f, 0.3066830f, 0.5159593f, 0.6699249f, 0.2457049f, 0.2043623f, 0.6524037f, -0.1482845f, + -0.1602189f, 0.3730888f, -0.1839945f, -0.2401724f, -0.2355313f, -0.0997447f, 0.3465509f, 0.3330808f, + 0.4187172f, -0.9872412f, -0.2174625f, 0.3022898f, 0.0381315f, 1.0602703f, 0.6490645f, 0.1669758f}, + {0.0852926f, -0.3854031f, -0.3749264f, 0.0002517f, 0.3914049f, 0.3182451f, -0.0910236f, 0.3999062f, + 0.2172160f, 0.3263556f, 0.2230883f, 0.6801209f, 0.0475812f, 0.3868748f, -0.1011033f, -0.2097718f, + 0.2077924f, 0.4337954f, -0.3955855f, -0.0072284f, -0.0933287f, -1.2635084f, 0.1973505f, 0.3029268f, + 0.4028932f, -0.2411875f, 0.4648659f, 0.0376468f, 0.3943195f, 0.1931429f, 0.5153960f, 0.1185977f}, + {0.2859749f, 0.1709675f, -0.3392698f, 0.3881494f, 0.2809920f, 0.1887885f, 0.1355904f, 0.0287555f, + 0.4615551f, 0.3263117f, 0.1106815f, 0.6479899f, 0.1063091f, 0.3925818f, 0.3228856f, -0.0470499f, + -0.3389811f, 0.3753765f, -0.2780865f, 0.1694021f, -0.2127821f, -0.2860769f, 0.1801637f, 0.5115150f, + 0.3644554f, -0.0983620f, 0.2620682f, 0.3451013f, 0.0243843f, 0.5946212f, 0.5975426f, 0.1038395f}, + {-0.0843795f, 0.9882024f, 0.5935462f, 0.2965513f, 0.2589141f, 0.3455611f, 0.1083200f, -0.2048762f, + -0.0654019f, 0.0330168f, 0.1223004f, 0.0961272f, -0.0632822f, -0.0130484f, 0.1102193f, 0.0131898f, + 0.2154029f, -0.0936573f, -0.0239458f, -0.1067562f, -0.0749452f, 0.0408518f, 0.2206942f, -0.1217940f, + 0.1881429f, -1.3144898f, 0.0536983f, 0.0670688f, 0.0735033f, 0.2690658f, -0.1175179f, 0.0656617f}, + {-0.1368900f, -0.5260106f, -0.2468513f, -0.2262946f, -0.0182993f, -0.0015103f, -0.0237845f, 0.1924657f, + -0.1337850f, -0.0133332f, 0.0452632f, 0.0729232f, 0.0309925f, 0.0197245f, -0.3428172f, -0.0070602f, + 0.1913371f, 0.0050748f, 0.0171828f, -0.0170928f, 0.0061459f, 0.1604311f, 0.0312920f, -0.1243916f, + 0.0741778f, 0.7906619f, 0.0470147f, -0.1912991f, 0.1659433f, -0.2616988f, -0.0205733f, 0.0721926f}, + {0.0410583f, 0.2570575f, -0.2349126f, -0.1249535f, -0.1147267f, -0.0586542f, 0.0945731f, -0.1528569f, + 0.0223845f, -0.0114466f, 0.0076511f, 0.0425091f, 0.0635790f, 0.0743543f, 0.2056053f, 0.1009817f, + -0.1276455f, -0.0420704f, 0.0873579f, 0.1406774f, -0.0373695f, -0.1381779f, 0.0274649f, -0.0109214f, + 0.0446802f, -0.0897308f, -0.0049318f, 0.0483357f, -0.0019486f, 0.0062029f, -0.0166061f, 0.0277916f}, + }; + + HOST_DEVICE_CONSTANT float bias_fc2[32] = { + 0.2420192f, 0.1498822f, 0.3024662f, 0.3672144f, 0.0681908f, 0.2503948f, 0.3133035f, -0.1726400f, + 0.3422103f, 0.3013457f, 0.0799109f, 0.5581454f, 0.0360919f, -0.1259440f, 0.1672565f, 0.5968557f, + 0.3310452f, 0.3513657f, 0.0095852f, -0.5643460f, 0.3940795f, 0.1897698f, -0.0710970f, -0.6519080f, + 0.0576156f, 0.2428404f, -0.1078773f, 0.2108476f, 0.1875714f, 0.1078442f, -0.0107385f, -0.1956442f}; + + HOST_DEVICE_CONSTANT const float wgtT_fc2[32][32] = { + {0.9477844f, 0.0790645f, 0.2978441f, 0.2175170f, 0.5990626f, 0.4165306f, 0.0300093f, -0.0033081f, + 0.0664389f, -0.2740595f, -0.0570693f, 0.1170626f, -0.6052473f, -0.0285526f, -0.9750593f, -0.3751386f, + -0.3696023f, -0.0711362f, 0.1896876f, 0.5425194f, -0.3994021f, -0.3224111f, -0.0439428f, 1.2177781f, + 0.0406177f, 0.0248419f, -0.1460319f, 1.1979570f, -0.6026343f, -0.3181922f, -0.0349307f, 0.1294153f}, + {-0.4457576f, -0.4166358f, 0.1140768f, -0.0995491f, -0.9297115f, -0.8484927f, 0.3921157f, 0.1671217f, + 0.0391290f, 0.7723724f, -0.7536542f, -0.0683614f, 0.5181671f, -0.1488807f, 0.2528050f, -1.1527445f, + 0.0186907f, 0.4965201f, -0.2928216f, -0.2430153f, 0.8413167f, 0.3416253f, -0.3918425f, -0.1520794f, + -0.5800689f, -0.6464683f, 0.0246702f, 0.0182789f, -0.5166554f, 0.3883571f, -0.2517799f, -0.0094098f}, + {-0.6032159f, 0.6876090f, 0.2889559f, 0.1468648f, -0.5641968f, 0.3478630f, -1.1751226f, -0.1272719f, + -1.5550770f, -0.6672150f, 1.0173961f, 0.2250547f, 0.2266909f, 0.0112633f, -0.2033706f, 0.3649680f, + 0.2778299f, 0.1591411f, 0.5714924f, 0.3382102f, -0.3199378f, 0.1030864f, 0.3654917f, 1.0137405f, + 0.6059799f, -0.0892025f, -0.1926481f, 0.5751148f, -0.0483990f, -0.2362603f, 0.2127502f, 0.1076699f}, + {0.0864884f, -0.1346420f, -0.0590672f, 0.2709527f, 0.0059497f, 0.8278427f, -0.0376555f, -0.0993137f, + 0.1544702f, 1.5397516f, 1.3985173f, 0.1458596f, -0.1318251f, -0.1708164f, -0.2529704f, 0.1802474f, + -0.4465636f, -0.3608373f, -0.6186194f, 0.1104736f, -0.2197167f, 0.6114312f, 3.0708153f, -0.0367185f, + -0.6026717f, 0.0437186f, -0.0068691f, 0.7994439f, -0.4641058f, 0.6231949f, 0.2994401f, -0.1114754f}, + {0.4865573f, -0.2257494f, -0.0622113f, -0.2906855f, -0.4806692f, -0.1878923f, 0.2063936f, -0.0085900f, + -0.3972982f, 0.6918074f, -0.1789056f, 0.1042560f, 1.7135161f, 0.1607887f, -1.0253457f, 0.4387689f, + 0.2900070f, 0.8834500f, 0.1100190f, -0.3313121f, -0.1400318f, -0.2239047f, -0.4258100f, -0.5461789f, + 0.3623838f, -0.2245702f, 0.0109423f, 1.2249749f, 0.6720605f, -1.2524203f, -0.2595521f, -0.0136557f}, + {-0.8114674f, -0.0589685f, -0.4537889f, 0.1343803f, 0.6155490f, 0.4542705f, -0.1784246f, -0.0367607f, + 1.3722695f, -0.5036284f, 0.1591292f, 0.4921753f, 0.1966196f, -0.0245796f, -0.4362302f, 0.7561527f, + -0.9307599f, -0.4161506f, -0.0985663f, 1.0505419f, -0.4145910f, -0.2383539f, -0.3260167f, -0.2006534f, + 0.1461904f, -0.1774964f, 0.0748390f, 0.2687811f, -0.5755305f, -0.2619618f, 0.0031019f, 0.1053678f}, + {-0.1671602f, 0.5898983f, -0.3010138f, 0.1428170f, -0.4395862f, 0.6011736f, -0.6824208f, 0.0834212f, + -0.3083069f, -0.8161052f, 0.8446352f, -0.1289981f, 0.1454613f, -0.0669884f, -0.2147270f, -0.0693433f, + 0.4310409f, 0.3372035f, 0.4923474f, 0.0451390f, -0.2172501f, 1.1826969f, -0.0953328f, -0.1689639f, + 0.5121273f, 0.5773017f, -0.2540970f, 0.9814218f, 0.2213568f, 0.1745940f, 0.6629733f, -0.0703891f}, + {-0.0943655f, 0.0389990f, 0.3364168f, 0.2098130f, 0.1929279f, -0.0962308f, -0.0018474f, 0.0439214f, + -0.7385208f, -0.4517773f, -0.0386891f, 0.0602551f, 0.1148888f, -0.1283621f, 0.0058366f, -0.3934270f, + -0.1337466f, 0.0654528f, 0.4067565f, -0.4707848f, 0.1162578f, 0.5017020f, 0.3304436f, 0.0872209f, + 0.4889075f, 0.2807720f, -0.1973572f, -0.4155709f, 0.0309771f, -0.7092831f, -0.7794424f, -0.1459839f}, + {-0.5295035f, 0.7356530f, 0.3039915f, 0.0810916f, -0.2164448f, 0.1579250f, -0.3331033f, 0.0239585f, + 0.4926797f, 0.4662276f, 0.1003408f, 0.5102254f, 0.1000184f, -0.1730865f, 0.1500007f, 0.0569007f, + 0.0662431f, 0.4424641f, -0.2252309f, -0.0009742f, -0.0801667f, 1.1692612f, 0.2382815f, -0.4052627f, + 0.1667125f, 0.2946294f, -0.2483962f, -0.1908208f, 0.6336688f, 0.2673290f, 0.2469455f, 0.1539024f}, + {-0.7377842f, 0.1239449f, -0.2160517f, 0.0836856f, 0.0563133f, -0.1287455f, -2.4090533f, 0.0182498f, + -0.3940274f, 0.3978150f, -0.0008089f, 0.8301392f, 0.3864959f, 0.0828013f, 0.1775530f, -0.0267429f, + 0.3220538f, -0.1131186f, 0.0929232f, 0.7917365f, -0.2574012f, -0.3485697f, -0.3520234f, 0.0321406f, + 0.5416895f, -0.7747179f, 0.0263138f, 0.0156633f, -0.6029642f, -0.4099184f, 0.1297072f, -0.0763408f}, + {-0.9725084f, -0.6225982f, -0.0241479f, -0.8526779f, -1.8055981f, -0.0342978f, -0.0353824f, -0.0487756f, + -0.0194707f, 0.8823376f, 0.9235744f, 0.3005395f, 0.2835868f, -0.1148965f, 0.3521956f, -0.3969032f, + -0.1618436f, 0.5247192f, -1.2570199f, -1.2933259f, 0.2353207f, 0.0522201f, -0.3407558f, -0.7083238f, + -0.8502682f, 0.2354126f, -0.0983525f, -0.5225297f, -1.1363075f, 0.1191391f, 0.3688005f, -0.0721454f}, + {-0.4978539f, 0.0213132f, -0.9456733f, 0.4147929f, 0.4021548f, 0.4828983f, 1.7751889f, -0.0557035f, + 0.2536854f, -0.8965177f, 0.0013453f, -0.1397893f, -0.2014100f, -0.1129207f, 0.0604085f, 0.0149230f, + -0.0841563f, 0.5373021f, 0.8044986f, -0.0295436f, 0.2773425f, 0.8043463f, -0.1877888f, -1.1105905f, + 0.2900093f, 0.8607606f, -0.1415148f, -0.4507093f, 0.9467223f, -0.1084260f, 0.6052061f, -0.1686843f}, + {-0.2258019f, 0.1889428f, -0.2686882f, -0.3063822f, -0.3166457f, -0.2806566f, 0.1178042f, 0.0608205f, + -0.2645664f, -1.0405049f, -0.0519723f, 0.3019978f, 0.0006940f, -0.1020586f, -0.3942995f, 0.4342203f, + -0.3345312f, 0.4574130f, -0.4044704f, 0.6222502f, 0.2347430f, 0.0962147f, 0.4692436f, 1.0109904f, + -0.1394140f, -0.0479612f, 0.0143121f, 0.3230010f, -0.0837017f, 0.3180766f, 0.4171008f, 0.0107547f}, + {-2.1767504f, -0.5494305f, 1.7831416f, -0.1602608f, -0.7913717f, -0.5385063f, -1.3010976f, -0.0732973f, + -0.7383692f, -0.4942359f, 0.0797735f, 0.9569775f, 0.5248573f, -0.0532136f, 1.1371235f, 0.0740525f, + -0.3389917f, 0.0862791f, -0.3393867f, -1.7828649f, -0.2016756f, -0.3977666f, 0.7217023f, 0.4741161f, + -0.2263446f, 0.1031418f, -0.1255716f, 0.2873176f, -0.1175444f, 0.4997679f, -0.0171211f, -0.1910678f}, + {0.5997473f, 0.3704447f, -0.1027960f, 0.0615773f, 0.3142829f, 0.3180274f, 0.9900225f, -0.2466927f, + -0.1713584f, -0.6912794f, 0.4348271f, -0.2014036f, 0.1685447f, -0.1432491f, -0.2384894f, 0.4297218f, + 0.2628476f, 0.0755370f, -0.6512125f, 1.0776943f, -0.2526596f, -1.0413667f, 1.0825540f, 0.0121419f, + -0.4139650f, 0.1953526f, 0.0228532f, 0.7276669f, 0.2967961f, 0.3857630f, -0.0092882f, -0.0652729f}, + {0.3495303f, 0.0528409f, -0.1238677f, -0.1436307f, -0.3670696f, -0.5042573f, -0.7938571f, -0.1738083f, + 0.0205153f, 0.0897479f, -0.2325604f, -0.0440110f, -0.3223808f, 0.1715952f, 0.2273175f, 0.0355640f, + -0.3030194f, -0.0378800f, 0.1169375f, -0.8088371f, 0.3684180f, 0.1068725f, -0.5171835f, 0.1674343f, + 0.2052878f, 0.3094593f, -0.2305119f, 0.2525437f, 0.1789630f, -0.4817703f, -0.0030947f, -0.1891324f}, + {0.6293146f, 0.2584574f, 0.0100317f, -0.5799903f, 0.2948301f, -0.4371910f, -0.0477715f, -0.0218286f, + -0.1696342f, -0.4813184f, -0.8331993f, 0.3223454f, 0.0029136f, 0.1666087f, -0.3873546f, -0.2286834f, + 0.1122524f, -0.3860610f, -0.8188475f, -0.9623070f, 0.1606599f, -0.6897836f, -0.3358153f, -0.1685106f, + -0.2947677f, 0.2129448f, 0.0359219f, -0.1852056f, 0.1128887f, 0.0618916f, 0.2507945f, 0.0447627f}, + {0.0554332f, -0.0027592f, 0.3535706f, -0.4331247f, -0.2471175f, -0.3155170f, -1.5408354f, -0.2673851f, + -0.5063978f, -0.5054772f, -0.4510890f, 1.1381546f, 0.7692682f, -0.1762980f, -0.2943404f, 0.0445386f, + -0.2057083f, 0.2759189f, -0.3914460f, -0.6832695f, -0.1839541f, -0.3678920f, -0.2850055f, -0.5779636f, + 0.0224292f, -0.4669296f, -0.2568997f, 0.1900256f, -0.2664030f, 0.2227556f, 0.3770681f, -0.1686298f}, + {-0.8099023f, 0.6079454f, -1.0392671f, 0.1853553f, -0.0657482f, 0.0594661f, -2.7382996f, -0.2678560f, + -1.0898361f, -1.1456356f, -0.0590183f, 0.3825967f, -0.5998831f, -0.0217187f, -1.8030874f, -0.5415536f, + 0.0403031f, -0.4595840f, 0.2551507f, -0.5179180f, 0.0030503f, 0.6006228f, -0.2032869f, -0.3312562f, + 0.2309013f, 0.2453417f, -0.0373306f, -1.2156100f, -0.1305973f, -0.6529071f, -0.4165395f, 0.0850382f}, + {0.2420593f, 0.2877297f, 0.0347489f, 0.4107040f, 0.0560220f, 0.1383768f, -0.0290268f, 0.0368654f, + -0.3878137f, 0.2399966f, 0.2518795f, 0.2886151f, -0.1897193f, -0.1605257f, 0.0932711f, -0.2438373f, + 0.1869382f, -0.5400008f, 0.6079569f, 0.6714113f, -0.0769095f, 0.2528530f, 0.1480197f, 0.5479824f, + 0.4374030f, 0.3420986f, 0.0413617f, -1.0413530f, 0.2686166f, -0.5624301f, -0.4255804f, -0.0650254f}, + {-0.1250933f, -0.1136944f, 0.0993298f, 0.3014838f, -0.6356226f, -0.0490545f, 0.7753500f, -0.0809311f, + 0.5323648f, -0.0345059f, 0.1949496f, 0.0198230f, 0.5341202f, 0.0308399f, -0.2006068f, -0.2500929f, + -0.2550136f, 0.3400015f, 0.3697634f, -0.5224004f, -0.7527751f, 0.5704774f, -0.6227463f, -0.3936085f, + 0.2489994f, 0.0875356f, -0.2447212f, 0.6399952f, -0.4011181f, -0.0860382f, 0.0883997f, 0.0172180f}, + {0.5448795f, 0.8173789f, 0.0075663f, 1.1805303f, 1.7203569f, -0.6815717f, 0.3134039f, 0.0906886f, + 0.0756090f, -0.4353962f, -0.5386847f, -0.0507332f, 0.5440259f, 0.0605894f, 0.2524048f, 0.3851925f, + -0.4258735f, -0.6799555f, 0.3980977f, 0.7769310f, -0.5134005f, 0.5598153f, 0.4308333f, 0.3054441f, + -0.0727649f, 0.5660210f, -0.0176415f, 0.1353741f, -0.2483104f, 0.1738807f, 0.6208159f, -0.0776369f}, + {-0.5709571f, -0.7984408f, -0.8615161f, 0.7372646f, 0.9487120f, 0.7898567f, -0.1343847f, -0.0519288f, + 1.2782260f, 0.9464526f, 0.2376383f, -1.0223522f, -1.4201926f, -0.1367096f, 1.2966657f, 0.6358539f, + 1.0579402f, -0.1776328f, 0.4553668f, 1.6561530f, 1.7639430f, -0.0572736f, 0.1825964f, 0.6839079f, + -1.1312269f, 2.2394719f, -0.1153456f, 0.0832286f, 1.1678441f, 0.9995819f, -0.6752121f, -0.0294776f}, + {0.5853618f, 0.0476583f, 0.3115363f, 0.2302655f, 0.1206093f, 0.1423729f, -0.0688958f, -0.1274807f, + -0.7104061f, 0.6695569f, 0.3462166f, 0.1399361f, 0.0738895f, 0.1395106f, -0.0947572f, -0.4398190f, + 0.8046142f, 0.1796375f, 0.6236497f, -0.3355125f, 0.0665246f, 0.1648258f, 0.1719281f, -0.0215839f, + 0.2948838f, -0.0364384f, -0.0132194f, -0.3336160f, 0.1608825f, -0.3809827f, 0.0427708f, -0.1653370f}, + {-0.2396747f, 0.5994402f, 0.1901325f, 0.0756556f, -0.1019675f, 0.1934567f, 2.2492085f, 0.0405573f, + 0.7990069f, -0.0031116f, 0.1399053f, 0.2491723f, -0.4884324f, -0.0280764f, -0.2176450f, -0.3256943f, + 0.6038598f, -0.7596282f, 0.7370521f, -0.6102398f, 0.0417237f, 0.6308144f, 0.2804313f, -1.0541338f, + 0.4447262f, -0.1072341f, -0.1903439f, -0.4858476f, 0.7604120f, 0.1830743f, -0.3262461f, -0.0845358f}, + {-1.8205953f, 0.0579756f, 0.2186305f, -0.7704644f, -1.0015099f, -0.5109156f, 0.5111710f, 0.1077972f, + 0.5853909f, 1.1057258f, -0.5496864f, -0.0546181f, -0.1387448f, -0.0367158f, 0.0563303f, -0.9073950f, + 1.1649257f, 0.6930003f, -0.0609807f, -1.1429670f, -0.1540745f, -1.2014219f, -0.2904009f, 0.2807863f, + 0.1425838f, -0.2909705f, -0.0341960f, 2.6969550f, 0.1141804f, 0.7014298f, 0.1753227f, 0.0768410f}, + {-1.1060591f, 0.0567899f, -0.1571269f, -0.9480476f, -0.4812395f, -0.3905266f, -0.4127474f, -0.0700787f, + -0.1037446f, 0.6893422f, -0.4761419f, 0.0626154f, 0.1033659f, 0.1149158f, 0.3811806f, -0.0267461f, + 0.1825537f, 0.6764455f, -0.6284249f, -0.4999892f, 0.1400735f, -0.3666739f, -0.8226722f, -0.2742531f, + 0.0038938f, 0.1431945f, -0.2304713f, 0.1959182f, -0.0833413f, 0.1036758f, 0.5925360f, -0.1728666f}, + {0.8618100f, 0.1624423f, -0.0119217f, -0.3260103f, 1.2995098f, -0.6950228f, 0.2578443f, -0.0584942f, + -0.1956889f, -1.1657989f, -0.9274270f, 0.0248109f, 0.3926098f, -0.0011959f, 0.4083188f, 0.6157458f, + -0.1829408f, 0.0255032f, -0.9857827f, 0.9257624f, 0.1254213f, -0.7773420f, -0.8070686f, 1.0248510f, + -1.0815803f, -0.1019331f, -0.0273850f, -0.0287858f, -0.5333901f, 0.2750031f, 0.4854398f, 0.0430395f}, + {-2.2706361f, -0.0563411f, 0.0747649f, 0.0839579f, -0.7418628f, -0.5147710f, -0.4589594f, -0.1936616f, + 0.0085840f, 0.2041321f, 0.0634176f, -0.1194840f, -0.3277527f, -0.1171821f, -0.4370427f, -1.7333642f, + -1.0109788f, -2.2809637f, 0.5498678f, -1.5792087f, 0.3492494f, -0.2270884f, -0.0219570f, 0.2369912f, + 0.3975051f, 0.1427489f, 0.0350726f, -0.5830398f, -0.1225577f, -1.1089261f, -2.2723722f, -0.0715627f}, + {1.6286877f, 0.6170489f, 0.2090771f, 0.7154092f, 0.3796651f, 0.3692173f, 0.5580201f, -0.2510560f, + 0.2133680f, -0.1495305f, 0.4843171f, 0.1983987f, -0.3489809f, 0.0815524f, -0.4780030f, -0.2526886f, + -0.1224521f, -0.3420408f, 0.6007171f, 0.7295829f, -0.1047851f, 0.4106947f, 0.1101658f, -0.8703307f, + 0.2298607f, 0.3555209f, -0.2199591f, 0.3845321f, 0.0053869f, -0.3889537f, -0.3812927f, -0.1833587f}, + {1.1275142f, -0.0847157f, 0.7803201f, 0.6043309f, 0.0697254f, -0.1595450f, 0.8116972f, -0.2051597f, + 1.3941048f, -0.2311134f, 0.1249815f, -0.1849142f, -0.0676029f, -0.1570321f, -0.0248682f, 0.1011748f, + 0.2924128f, 0.2810532f, 0.5785351f, -0.2909298f, -0.0618236f, 0.3666790f, 0.1437915f, -0.1709863f, + -0.0455444f, 1.0872705f, -0.1216226f, -0.5141663f, 0.0893981f, 0.0563621f, 0.3713191f, 0.1215324f}, + {0.3138374f, -0.2366744f, 0.3531516f, -5.1496854f, -0.7201742f, -5.3525457f, 0.4425960f, 0.0024644f, + -0.0003756f, -1.9120497f, -3.6601391f, -0.4874162f, 0.3136120f, -0.0846221f, 0.1454570f, -0.0903244f, + -0.7935557f, -0.1082042f, -6.7450323f, 0.1083279f, -0.0658780f, -3.3311872f, -11.0901842f, 0.3452957f, + -0.4402857f, 0.1120452f, 0.0429914f, -0.4037071f, -0.1304435f, 0.3757658f, 0.5700281f, -0.0560347f}, + }; + + HOST_DEVICE_CONSTANT float bias_fc3[6] = {0.4638648f, 0.2592537f, -0.0224077f, -0.3610995f, 0.2049032f, -0.1270025f}; + + HOST_DEVICE_CONSTANT const float wgtT_fc3[32][6] = { + {-0.0825683f, 0.0410914f, 0.3665631f, 0.1153224f, 0.2717541f, 0.0572775f}, + {0.3823453f, 0.1005642f, -0.0687870f, -0.5702714f, -0.0982427f, -0.0720022f}, + {0.2767557f, 0.3633989f, 0.3004855f, -0.2707561f, 0.4023620f, -0.0316385f}, + {-0.6080245f, 0.5111613f, 0.0303876f, 0.1534717f, 0.6780844f, 0.1847766f}, + {0.1950710f, -0.0140113f, -0.0460127f, 0.4004743f, -0.0588760f, -0.1026509f}, + {-0.4413157f, -0.1262633f, 0.0999593f, -0.1316405f, 0.0456409f, 0.1524025f}, + {-0.2625964f, -0.2398003f, 0.0026281f, 0.2827081f, -0.1214944f, 0.0673692f}, + {-0.0405760f, -0.0274085f, -0.0738333f, -0.1128784f, -0.1568583f, -0.0800972f}, + {-0.3202673f, -0.3390695f, -0.1534856f, 0.3196714f, -0.2789583f, 0.0711831f}, + {-0.1860698f, -0.1582274f, 0.1985906f, 0.2078834f, 0.0358276f, 0.0675854f}, + {0.3786796f, 0.1351469f, -0.1311201f, 0.4751540f, -0.0107362f, -0.1871149f}, + {0.6353824f, 0.5677436f, 0.1590982f, -0.6899668f, 0.3740025f, -0.1411532f}, + {0.3073860f, 0.2839593f, 0.1694280f, -0.3355140f, 0.2433507f, -0.0488098f}, + {-0.0928499f, 0.0616765f, -0.0771306f, 0.1355574f, -0.1019612f, -0.1266196f}, + {-0.2041278f, -0.1548309f, 0.0368690f, 0.1600682f, -0.0518508f, 0.0607208f}, + {0.1211834f, -0.1294493f, 0.2249328f, 0.3190344f, 0.0067060f, -0.0251227f}, + {-0.0526831f, -0.0509629f, -0.3755513f, -0.1174352f, -0.2525741f, -0.0183803f}, + {0.0209530f, -0.1739729f, 0.2555005f, -0.2378753f, -0.0424013f, 0.0581072f}, + {-0.0075336f, -0.5307564f, 1.0589222f, 0.3346883f, 0.1339612f, 0.1346273f}, + {0.2160633f, 0.0964605f, -0.0941461f, 0.2930759f, 0.0173386f, -0.0748447f}, + {-0.6522665f, -0.5073403f, -0.2431537f, 0.4983193f, -0.3755145f, 0.1643617f}, + {0.1971257f, -0.0410421f, -0.5036770f, -0.2652275f, -0.4003507f, -0.1095356f}, + {-0.1139918f, -0.1514564f, 0.1970165f, -0.2130822f, -0.0206673f, 0.0784776f}, + {-0.0165255f, -0.0692864f, -0.2636001f, -0.0269720f, -0.2099786f, -0.0313033f}, + {0.1173475f, 0.6424626f, -0.0928475f, -0.1411267f, 0.4882753f, -0.0760400f}, + {-0.6952152f, -0.8492880f, -0.6860636f, 0.6728117f, -0.9144394f, 0.0992556f}, + {0.0875367f, 0.0357710f, -0.1389648f, 0.0625666f, 0.1185083f, -0.1085772f}, + {0.0125439f, 0.1258396f, 0.0932084f, 0.0433826f, 0.1670030f, -0.0043936f}, + {-0.2513180f, -0.2649883f, -0.3022399f, 0.2805146f, -0.3223124f, 0.0125926f}, + {-0.3392999f, -0.4831693f, 0.0285935f, 0.2977640f, -0.3052610f, 0.1079501f}, + {-0.1047532f, 0.2985990f, 0.5575675f, 0.3046419f, 0.6408112f, 0.0676042f}, + {0.0253204f, 0.0201008f, 0.0023553f, 0.0057190f, -0.0633111f, -0.1201030f}, + }; + +} // namespace ALPAKA_ACCELERATOR_NAMESPACE::lst::dnn::t5embdnn + +#endif diff --git a/RecoTracker/LSTCore/src/alpaka/TrackCandidate.h b/RecoTracker/LSTCore/src/alpaka/TrackCandidate.h index da8e6eb8a8982..f55c1405897c7 100644 --- a/RecoTracker/LSTCore/src/alpaka/TrackCandidate.h +++ b/RecoTracker/LSTCore/src/alpaka/TrackCandidate.h @@ -2,6 +2,7 @@ #define RecoTracker_LSTCore_src_alpaka_TrackCandidate_h #include "HeterogeneousCore/AlpakaInterface/interface/workdivision.h" +#include "FWCore/Utilities/interface/CMSUnrollLoop.h" #include "RecoTracker/LSTCore/interface/alpaka/Common.h" #include "RecoTracker/LSTCore/interface/ModulesSoA.h" @@ -15,6 +16,8 @@ #include "RecoTracker/LSTCore/interface/TrackCandidatesSoA.h" #include "RecoTracker/LSTCore/interface/TripletsSoA.h" +#include "NeuralNetwork.h" + namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { ALPAKA_FN_ACC ALPAKA_FN_INLINE void addpLSTrackCandidateToMemory(TrackCandidates& cands, unsigned int trackletIndex, @@ -150,40 +153,61 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { PixelQuintupletsConst pixelQuintuplets, PixelTripletsConst pixelTriplets, ObjectRangesConst ranges) const { - for (int innerInnerInnerLowerModuleArrayIndex : - cms::alpakatools::uniform_elements_z(acc, modules.nLowerModules())) { - if (ranges.quintupletModuleIndices()[innerInnerInnerLowerModuleArrayIndex] == -1) + for (int lowmod : cms::alpakatools::uniform_elements_z(acc, modules.nLowerModules())) { + if (ranges.quintupletModuleIndices()[lowmod] == -1) continue; - unsigned int nQuints = quintupletsOccupancy.nQuintuplets()[innerInnerInnerLowerModuleArrayIndex]; - for (unsigned int innerObjectArrayIndex : cms::alpakatools::uniform_elements_y(acc, nQuints)) { - unsigned int quintupletIndex = - ranges.quintupletModuleIndices()[innerInnerInnerLowerModuleArrayIndex] + innerObjectArrayIndex; + unsigned int nQuints = quintupletsOccupancy.nQuintuplets()[lowmod]; + for (unsigned int iOff : cms::alpakatools::uniform_elements_y(acc, nQuints)) { + unsigned int iT5 = ranges.quintupletModuleIndices()[lowmod] + iOff; - // Don't add duplicate T5s or T5s that are accounted in pT5s - if (quintuplets.isDup()[quintupletIndex] or quintuplets.partOfPT5()[quintupletIndex]) + // skip already-dup or already in pT5 + if (quintuplets.isDup()[iT5] || quintuplets.partOfPT5()[iT5]) continue; + unsigned int loop_bound = pixelQuintuplets.nPixelQuintuplets() + pixelTriplets.nPixelTriplets(); - // Cross cleaning step - float eta1 = __H2F(quintuplets.eta()[quintupletIndex]); - float phi1 = __H2F(quintuplets.phi()[quintupletIndex]); + float eta1 = __H2F(quintuplets.eta()[iT5]); + float phi1 = __H2F(quintuplets.phi()[iT5]); + + float iEmbedT5[Params_T5::kEmbed]; + CMS_UNROLL_LOOP for (unsigned k = 0; k < Params_T5::kEmbed; ++k) { + iEmbedT5[k] = quintuplets.t5Embed()[iT5][k]; + } + + // Cross-clean against both pT5s and pT3s for (unsigned int jx : cms::alpakatools::uniform_elements_x(acc, loop_bound)) { float eta2, phi2; if (jx < pixelQuintuplets.nPixelQuintuplets()) { eta2 = __H2F(pixelQuintuplets.eta()[jx]); phi2 = __H2F(pixelQuintuplets.phi()[jx]); } else { - eta2 = __H2F(pixelTriplets.eta()[jx - pixelQuintuplets.nPixelQuintuplets()]); - phi2 = __H2F(pixelTriplets.phi()[jx - pixelQuintuplets.nPixelQuintuplets()]); + unsigned int ptidx = jx - pixelQuintuplets.nPixelQuintuplets(); + eta2 = __H2F(pixelTriplets.eta()[ptidx]); + phi2 = __H2F(pixelTriplets.phi()[ptidx]); } float dEta = alpaka::math::abs(acc, eta1 - eta2); float dPhi = cms::alpakatools::deltaPhi(acc, phi1, phi2); - float dR2 = dEta * dEta + dPhi * dPhi; - if (dR2 < 1e-3f) - quintuplets.isDup()[quintupletIndex] = true; + + if (jx < pixelQuintuplets.nPixelQuintuplets()) { + unsigned int jT5 = pixelQuintuplets.quintupletIndices()[jx]; + float d2 = 0.f; + // Compute distance-squared between the two t5 embeddings. + CMS_UNROLL_LOOP for (unsigned k = 0; k < Params_T5::kEmbed; ++k) { + float df = iEmbedT5[k] - quintuplets.t5Embed()[jT5][k]; + d2 += df * df; + } + if ((dR2 < 0.02f && d2 < 0.1f) || (dR2 < 1e-3f && d2 < 1.0f)) { + quintuplets.isDup()[iT5] = true; + } + } else if (dR2 < 1e-3f) { + quintuplets.isDup()[iT5] = true; + } + + if (quintuplets.isDup()[iT5]) + break; } } } @@ -213,6 +237,17 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { float phi1 = pixelSeeds.phi()[pixelArrayIndex]; unsigned int prefix = ranges.segmentModuleIndices()[pixelModuleIndex]; + // Store the pLS embedding outside the TC comparison loop. + float plsEmbed[Params_pLS::kEmbed]; + CMS_UNROLL_LOOP for (unsigned k = 0; k < Params_pLS::kEmbed; ++k) { + plsEmbed[k] = pixelSegments.plsEmbed()[pixelArrayIndex][k]; + } + + // Get pLS embedding eta bin and cut value for that bin. + float absEta1 = alpaka::math::abs(acc, eta1); + uint8_t bin_idx = (absEta1 > 2.5f) ? (dnn::kEtaBins - 1) : static_cast(absEta1 / dnn::kEtaSize); + const float threshold = dnn::plsembdnn::kWP[bin_idx]; + unsigned int nTrackCandidates = cands.nTrackCandidates(); for (unsigned int trackCandidateIndex : cms::alpakatools::uniform_elements_x(acc, nTrackCandidates)) { short type = cands.trackCandidateType()[trackCandidateIndex]; @@ -223,10 +258,19 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { float phi2 = __H2F(quintuplets.phi()[quintupletIndex]); float dEta = alpaka::math::abs(acc, eta1 - eta2); float dPhi = cms::alpakatools::deltaPhi(acc, phi1, phi2); - float dR2 = dEta * dEta + dPhi * dPhi; - if (dR2 < 1e-3f) - pixelSegments.isDup()[pixelArrayIndex] = true; + // Cut on pLS-T5 embed distance. + if (dR2 < 0.02f) { + float d2 = 0.f; + CMS_UNROLL_LOOP for (unsigned k = 0; k < Params_pLS::kEmbed; ++k) { + const float diff = plsEmbed[k] - quintuplets.t5Embed()[quintupletIndex][k]; + d2 += diff * diff; + } + // Compare squared embedding distance to the cut value for the eta bin. + if (d2 < threshold * threshold) { + pixelSegments.isDup()[pixelArrayIndex] = true; + } + } } if (type == LSTObjType::pT3) { int pLSIndex = pixelTriplets.pixelSegmentIndices()[innerTrackletIdx]; diff --git a/RecoTracker/LSTCore/src/alpaka/Triplet.h b/RecoTracker/LSTCore/src/alpaka/Triplet.h index ac582d4272445..54a78eb185b02 100644 --- a/RecoTracker/LSTCore/src/alpaka/Triplet.h +++ b/RecoTracker/LSTCore/src/alpaka/Triplet.h @@ -32,7 +32,8 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { float circleRadius, float circleCenterX, float circleCenterY, - unsigned int tripletIndex) { + unsigned int tripletIndex, + float (&t3Scores)[dnn::t3dnn::kOutputFeatures]) { triplets.segmentIndices()[tripletIndex][0] = innerSegmentIndex; triplets.segmentIndices()[tripletIndex][1] = outerSegmentIndex; triplets.lowerModuleIndices()[tripletIndex][0] = innerInnerLowerModuleIndex; @@ -65,6 +66,10 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { triplets.rtOut()[tripletIndex] = rtOut; triplets.betaInCut()[tripletIndex] = betaInCut; #endif + + triplets.fakeScore()[tripletIndex] = t3Scores[0]; + triplets.promptScore()[tripletIndex] = t3Scores[1]; + triplets.displacedScore()[tripletIndex] = t3Scores[2]; } template @@ -647,7 +652,8 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { float& circleRadius, float& circleCenterX, float& circleCenterY, - const float ptCut) { + const float ptCut, + float (&t3Scores)[dnn::t3dnn::kOutputFeatures]) { unsigned int firstMDIndex = segments.mdIndices()[innerSegmentIndex][0]; unsigned int secondMDIndex = segments.mdIndices()[outerSegmentIndex][0]; unsigned int thirdMDIndex = segments.mdIndices()[outerSegmentIndex][1]; @@ -697,7 +703,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { return false; bool inference = - lst::t3dnn::runInference(acc, mds, firstMDIndex, secondMDIndex, thirdMDIndex, circleRadius, betaIn); + lst::t3dnn::runInference(acc, mds, firstMDIndex, secondMDIndex, thirdMDIndex, circleRadius, betaIn, t3Scores); if (!inference) // T3-building cut return false; @@ -745,6 +751,8 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { float zOut, rtOut, betaIn, betaInCut, circleRadius, circleCenterX, circleCenterY; + float t3Scores[dnn::t3dnn::kOutputFeatures] = {0.f}; + bool success = runTripletConstraintsAndAlgo(acc, modules, mds, @@ -761,7 +769,8 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { circleRadius, circleCenterX, circleCenterY, - ptCut); + ptCut, + t3Scores); if (success) { unsigned int totOccupancyTriplets = @@ -799,7 +808,8 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::lst { circleRadius, circleCenterX, circleCenterY, - tripletIndex); + tripletIndex, + t3Scores); } } } diff --git a/RecoTracker/LSTCore/src/alpaka/pLSEmbedNetworkWeights.h b/RecoTracker/LSTCore/src/alpaka/pLSEmbedNetworkWeights.h new file mode 100644 index 0000000000000..cec464b482bb7 --- /dev/null +++ b/RecoTracker/LSTCore/src/alpaka/pLSEmbedNetworkWeights.h @@ -0,0 +1,235 @@ +#ifndef RecoTracker_LSTCore_src_alpaka_pLSEmbedNetworkWeights_h +#define RecoTracker_LSTCore_src_alpaka_pLSEmbedNetworkWeights_h + +#include + +#include "FWCore/Utilities/interface/HostDeviceConstant.h" + +namespace ALPAKA_ACCELERATOR_NAMESPACE::lst::dnn::plsembdnn { + + HOST_DEVICE_CONSTANT float bias_fc1[32] = { + -0.1340593f, -0.9828863f, -0.5010322f, -0.2565299f, -0.9114241f, -0.2267123f, -0.3029281f, 0.1603906f, + -0.0855007f, -1.5674509f, -0.2862165f, -0.1820142f, -0.9209892f, 0.3407668f, 0.6446100f, -0.8276196f, + -0.2388848f, 0.5277666f, 0.4007535f, -0.8218219f, 0.1809824f, 0.1675569f, -0.3520412f, -0.7230482f, + -0.5384940f, -0.7348397f, -0.0768758f, -0.1644568f, 0.1545210f, -0.1948077f, -0.4455988f, 0.6596652f}; + + HOST_DEVICE_CONSTANT const float wgtT_fc1[10][32] = { + {2.5416601f, -0.0328223f, 2.2707686f, -1.0293980f, -0.0108615f, 0.0001905f, -0.0096710f, 0.0683880f, + -0.0074608f, 0.0071239f, -3.3549898f, 0.1356739f, 0.0113838f, -0.1957042f, -0.2505387f, 0.0056074f, + 0.0062737f, 0.0822115f, -0.3011822f, 0.0076654f, -0.0232170f, 0.0108539f, -0.0028272f, 1.7266624f, + -2.1167483f, -0.0016584f, -0.1289798f, 2.1894405f, -0.2520899f, -0.2965456f, -0.0410584f, -0.2922559f}, + {0.1457039f, -0.4586894f, -0.0268244f, 0.6341490f, -0.0096465f, 0.0986437f, -0.0534766f, -0.3335054f, + -0.0610394f, -0.0446348f, 0.0846870f, -0.1076022f, -0.0298957f, 0.0158191f, 0.1662600f, -0.0638973f, + 0.0049133f, 0.2975469f, 0.2025267f, 0.0538068f, -0.1046022f, -0.0169812f, 0.0198108f, 2.6794984f, + -0.0040652f, -0.0224352f, -0.3215843f, -0.0036256f, -0.3061447f, 0.1376955f, -0.0510164f, 0.1884841f}, + {-0.0030831f, -0.3372852f, -0.0166195f, 1.5336628f, 2.7060704f, -0.0437477f, 1.0132277f, -0.1852904f, + -1.2448947f, -1.5341446f, -0.0131641f, 0.2391158f, 0.0113307f, 0.1669618f, -0.2173352f, -0.5257770f, + 1.9480581f, 0.1010766f, 0.3557915f, 1.6881727f, 0.0354072f, -0.1884732f, -2.5510240f, 0.4739791f, + 0.0055504f, 1.1534007f, 0.0329746f, 0.0080900f, 0.2474189f, 0.2551234f, -0.9819525f, -0.1403632f}, + {-0.0036104f, 0.0356300f, -0.0059668f, -1.0046377f, 1.9088006f, 0.0076659f, -0.9931654f, -0.1988026f, + -0.3962959f, 0.6151165f, -0.0060982f, 0.1049091f, 1.4861504f, 0.1062762f, -0.0311854f, -1.9524248f, + -0.3105941f, -0.0259684f, -0.0618635f, 2.5692437f, 0.3061492f, -0.4483947f, 1.7864583f, -0.1686022f, + -0.0096641f, -1.9978869f, -0.3446169f, -0.0137990f, 0.1149078f, 0.0974244f, 2.3347342f, -0.0812400f}, + {-0.2462796f, -0.4396048f, -0.0494715f, -1.3303740f, -0.2699632f, -1.1073607f, -0.1299932f, -0.1140520f, + 0.0030989f, 0.1195869f, -0.2182885f, -0.2960219f, 0.0240108f, -0.8627685f, 0.5231963f, -0.0351020f, + -0.1169347f, 1.1842072f, -0.6560344f, -0.3228459f, 0.6108676f, 0.3261251f, -0.4187594f, -2.2404015f, + -0.0415614f, -0.2603707f, -0.1996082f, -0.1232701f, 0.0917548f, -0.2338118f, -0.2182314f, -0.3510370f}, + {-0.0714504f, 0.1694614f, -0.1212256f, 0.8605723f, -0.0601546f, 0.0809365f, 0.0608738f, 0.1864134f, + 0.0192681f, 0.0161601f, -0.1131914f, 0.2012984f, 0.0180652f, -0.1780414f, -0.1193754f, 0.0181790f, + -0.0114934f, -0.1083514f, -0.2870274f, -0.0809118f, -0.0054693f, -0.0340989f, -0.0014216f, 0.8288158f, + 0.0135911f, 0.0327867f, 0.1917122f, 0.0381925f, 0.1632099f, 0.1428811f, -0.0246241f, -0.1924587f}, + {-0.0036438f, 0.0256314f, -0.0300497f, -1.0106803f, 0.0035058f, -0.0060116f, 0.0083219f, -0.0707436f, + 0.0077562f, 0.0055091f, -0.0182911f, 0.1102780f, 0.0031401f, -0.0876552f, -0.0806563f, -0.0096622f, + 0.0043411f, -0.0197603f, -0.0258972f, 0.0088151f, -0.0350756f, -0.0262632f, -0.0316888f, 0.1284771f, + 0.0043740f, 0.0051480f, 0.0951583f, 0.0067314f, 0.0682082f, -0.1340998f, -0.0050629f, 0.0642558f}, + {-0.0054586f, 0.0009096f, -0.0030542f, 0.6611922f, -0.1600213f, -0.0148051f, 0.9854947f, 0.0288909f, + 1.1527209f, 1.0436976f, -0.0028568f, -0.0720929f, -1.0642092f, 0.0973633f, -0.1374519f, -0.9689922f, + 0.4894241f, 0.0242693f, -0.1340113f, -0.7291636f, 0.2409281f, 0.2435558f, 0.0865763f, 0.3773251f, + -0.0027488f, -0.4639902f, -0.2531397f, 0.0071339f, -0.1999463f, -0.1190471f, -0.6877595f, 0.0047258f}, + {-0.0120549f, -0.1758562f, 0.0011764f, 0.3682616f, -0.6805586f, -0.0043064f, -0.7592892f, -0.2557418f, + -0.9907975f, -0.8492736f, -0.0069985f, -0.1843629f, 1.2173564f, 0.2437091f, 0.0774442f, 0.5591520f, + -0.5105006f, 0.0027117f, 0.1045879f, 0.1031876f, 0.0953953f, -0.1073882f, -0.6009388f, -0.2570243f, + 0.0021526f, 0.3647284f, 0.0685335f, 0.0044424f, -0.2055883f, -0.2634717f, 0.6269304f, -0.3556093f}, + {-0.0079250f, 0.7729475f, 0.0849546f, -0.8746681f, 0.0320457f, 0.4836094f, -0.3186437f, -0.3189255f, + -0.4439107f, -0.1149620f, 0.0121082f, 0.0500634f, -0.1568543f, 0.5223573f, 0.1398361f, 0.1576022f, + -0.2577638f, -0.2778306f, -0.0510035f, -0.1373392f, -0.2826018f, -0.2499845f, -0.3446021f, -0.3572769f, + 0.0861826f, -0.2098824f, -0.2837019f, -0.0461243f, -0.1658643f, -0.1032380f, -0.4622661f, 0.5626078f}, + }; + + HOST_DEVICE_CONSTANT float bias_fc2[32] = { + 0.0105723f, -0.2707566f, -0.6415900f, 0.1445962f, -0.1994256f, -0.8090018f, -0.5117746f, -0.2069796f, + 0.1182040f, 0.9573752f, 0.3139997f, -0.3268543f, -0.1971201f, -0.1042343f, 1.0352775f, 0.9894913f, + -0.1150268f, -0.8350365f, 0.0436235f, -0.0624019f, -0.1608878f, 0.1185942f, -0.4287006f, 0.0142972f, + 0.3475012f, 0.2757536f, 0.1677805f, 0.2218136f, 0.6477259f, -0.0667593f, -0.3735817f, 0.3465582f}; + + HOST_DEVICE_CONSTANT const float wgtT_fc2[32][32] = { + {0.4324417f, -0.7673035f, -0.5471554f, 0.2779039f, -0.1687835f, -0.3419161f, -0.2172146f, -0.1137175f, + 0.1006160f, -1.4182508f, -0.0449841f, -0.0836498f, -0.2234416f, -0.6160108f, 0.2412257f, -0.8647211f, + 0.0417510f, 0.1623519f, 0.1340735f, 0.0025605f, 0.0115248f, 0.1154064f, 0.6384731f, 0.2058234f, + 0.0226727f, 0.2391510f, -0.1429649f, -0.9331749f, -0.6874904f, -0.1115381f, 0.5503330f, -0.3975948f}, + {0.4198115f, -0.9781777f, 1.1694254f, -0.2482220f, -0.2470811f, 0.5768772f, -0.5305969f, -0.0288219f, + -0.4659587f, 0.0642344f, 0.7057289f, 0.0720710f, -0.0783920f, -0.9876766f, 0.0783636f, -0.1893978f, + -0.0758926f, 0.2099811f, -0.1361028f, -0.4371021f, -0.1723918f, 0.0152078f, -0.9455445f, 0.1688402f, + -0.1537039f, 0.2397139f, -0.1715712f, 0.3233564f, -1.1558517f, -0.1481061f, 0.3871148f, -3.0129161f}, + {1.5506999f, -0.7427068f, -0.0985662f, -0.0608831f, -0.1102521f, -0.6252385f, -1.0874984f, -0.1439679f, + -0.1909697f, -0.8877065f, -0.7737633f, 0.1476054f, -0.1476790f, 0.1049815f, -1.0176442f, -0.7432327f, + -0.0277563f, -0.4307946f, -0.0810082f, -0.1258892f, -0.1043469f, -0.1274398f, 0.7762615f, 0.0970514f, + 0.0164470f, -0.1850846f, -0.1031034f, -0.8658178f, -0.5275577f, -0.0407144f, 1.1957259f, -0.3066156f}, + {1.0043048f, 0.9897588f, -0.0755118f, 0.8046477f, -0.0481381f, 0.2568143f, -2.4283130f, 0.1471182f, + -0.2527807f, -0.0399207f, -1.0368594f, 0.0640951f, -0.0008671f, 1.8275114f, 0.0725308f, 0.8923700f, + -0.1028159f, 0.2249785f, 0.0144401f, 0.2016954f, -0.0844297f, -4.5526829f, 0.3173841f, -0.2403957f, + 0.3779835f, -0.0756613f, 0.0244575f, 0.2806599f, 1.4048293f, -0.0901546f, 0.6152505f, 1.8816514f}, + {1.2572728f, -0.8402531f, 0.7099119f, -0.0828932f, 0.0951915f, 0.0335798f, 0.0707794f, -0.1213218f, + 2.4428368f, 0.0997803f, 0.2755027f, -0.2048883f, -0.0256399f, -0.5734878f, 1.4970483f, -0.0192147f, + -0.2558543f, 0.7279229f, 1.7061840f, 3.0295851f, -0.0714562f, -2.5080121f, -0.0624514f, -3.0032690f, + -1.2456235f, -2.2851458f, -0.0083880f, 0.2058039f, -0.4265900f, -0.0757150f, 0.2381934f, 0.2736590f}, + {0.1065874f, 0.2314566f, -2.2796247f, 0.2356272f, -0.1397772f, 0.2422709f, 0.0237261f, 0.0625369f, + -0.1142090f, -0.0289660f, -0.4121158f, 0.1791920f, -0.1329814f, 0.1336152f, 0.1904465f, 0.2791202f, + 0.0282886f, 0.7375806f, -0.1477007f, -0.0192417f, -0.1302946f, 0.5291457f, -0.1899594f, -0.4349242f, + -0.5118493f, -0.3964539f, -0.0120087f, 0.5831125f, 0.2160608f, -0.1652738f, 0.5743094f, -0.3556770f}, + {-0.7013212f, -0.1755788f, 0.2377748f, -0.0029153f, -0.1256457f, 0.0464455f, 0.0461463f, -0.0562263f, + -1.2902886f, -0.0348516f, -0.0040065f, 0.9912087f, -0.1560700f, 0.6114389f, 0.0784754f, -0.0253012f, + 0.0399759f, 0.2378236f, -1.2157595f, -1.7106811f, 0.0517821f, 0.5861024f, 0.0102360f, -1.9680523f, + 2.0222547f, -1.3292055f, 0.0593771f, 0.0107671f, 0.0280164f, -0.0309554f, -0.0805548f, -0.1452420f}, + {-0.0432347f, 0.0560752f, -0.1208499f, -0.0638094f, -0.1221812f, -0.1314433f, 0.0797006f, 0.1095768f, + 0.1978949f, -0.1274918f, -0.0633354f, 0.1514086f, -0.0588417f, -0.0213551f, 0.0453078f, 0.0805805f, + 0.0705929f, -0.0328658f, -0.0893497f, 0.0363103f, 0.0115460f, 0.0996364f, -0.0262905f, 0.0276413f, + 0.1146021f, -0.1201120f, 0.1511603f, 0.1474506f, -0.1392362f, 0.0996529f, 0.0846859f, -0.1433949f}, + {-0.0144876f, 0.9510946f, 0.6066840f, -0.0158065f, -0.1532562f, 0.4006624f, 0.1642794f, -0.1924054f, + 1.2457638f, 0.0806144f, 0.0457707f, 0.8251908f, 0.0542646f, -0.0357075f, -0.2907715f, 0.0294688f, + -0.0143071f, -1.0185090f, 1.2616084f, 2.0172362f, 0.0323089f, -0.4956438f, -0.0235321f, 1.4845730f, + -0.2411717f, 1.4490621f, -0.1344340f, 0.0051763f, -0.1433502f, -0.0149648f, 0.2097654f, 0.2438675f}, + {2.2308834f, 0.0572265f, 0.2028466f, -0.1269566f, 0.0567031f, -0.7891721f, -0.0454425f, 0.0718930f, + -0.6231729f, 0.0513892f, -0.1396189f, 1.0509667f, 0.0197597f, -3.7982774f, 0.1488162f, 0.0179314f, + 0.0265696f, 0.7038008f, -1.1987691f, -1.2845273f, -0.0189805f, 1.7856516f, -0.1089924f, -1.5082254f, + -0.0725589f, -3.6487772f, -0.0670966f, -0.2939831f, 0.2982934f, -0.0706767f, 0.2463991f, -0.4632871f}, + {1.2691945f, -1.6950474f, 0.9718248f, -1.2557473f, -0.0843802f, -0.8682168f, -0.0769571f, -0.1858943f, + -0.0081168f, -1.8139172f, -0.6833571f, -0.0535852f, 0.0067404f, -0.2991555f, -0.9731231f, -1.0928844f, + -0.2313154f, -0.8572839f, 0.0164396f, -0.0120993f, -0.1714177f, 0.0306930f, 1.0370599f, 0.0376184f, + 0.0336998f, 0.0127069f, -0.1393424f, -1.4432834f, -0.9254046f, 0.1010159f, 1.5789299f, -0.3814271f}, + {-0.0574547f, -0.0681054f, 0.1552017f, 0.0761608f, 0.0373731f, 0.0219471f, -0.0569846f, 0.0849170f, + 0.1166299f, -0.1738986f, -0.1584568f, -0.0492199f, -0.1243339f, 0.1141277f, -0.0858282f, -0.1317060f, + -0.0738105f, -0.1702452f, 0.0296549f, 0.0598173f, -0.1193228f, -0.0333553f, -0.0761291f, 0.1107883f, + -0.0568867f, -0.0525629f, 0.1529157f, 0.0498271f, 0.1178267f, 0.0795109f, 0.1675527f, -0.1520976f}, + {-1.6536322f, 0.6448058f, -0.0087195f, 0.0598767f, -0.1151469f, -0.0457370f, -0.1676109f, 0.0407258f, + -9.9194479f, 0.1196577f, 0.2541163f, -0.0141259f, -0.0078915f, -2.6990201f, 0.2910182f, 0.3034261f, + 0.1360894f, 0.4914473f, -0.3977694f, -7.2515898f, 0.1637411f, -13.7269659f, 0.0329545f, -0.0080273f, + -0.3791377f, 0.3196916f, 0.1767528f, -0.0027336f, 0.1099117f, -0.0302469f, 0.6338997f, -0.0870916f}, + {0.1707803f, 0.2295529f, -1.3998934f, 0.6977680f, 0.0054978f, 0.8450817f, 0.6746160f, -0.1336917f, + 0.1212842f, 0.4899071f, 0.9479164f, -0.3161806f, 0.0860273f, 0.5341747f, -0.0213259f, 0.1984338f, + -0.1988392f, 0.6882323f, -0.0482900f, 0.1955348f, -0.1427102f, -0.1824984f, -0.2451700f, -0.1075564f, + 0.0141908f, 0.0032365f, 0.0029449f, -0.3940665f, -0.0678450f, -0.0779321f, 0.0275283f, -0.3630400f}, + {-0.5806513f, -0.6154314f, -0.2262352f, -0.0713557f, -0.1936528f, -0.7763327f, 0.1930804f, 0.0099515f, + 0.0811277f, 0.3898111f, -0.1023425f, 0.3435638f, -0.1730143f, -0.1884138f, 0.4772736f, 0.2264327f, + -0.1591666f, -0.6873384f, 0.3482575f, -0.2166736f, 0.0310656f, 0.2354132f, 0.0155102f, 0.1464832f, + 0.3026945f, 0.2421199f, -0.1765095f, 0.4064289f, 0.4244477f, -0.0657526f, -0.0002334f, 0.2020380f}, + {-2.3500936f, 0.3051382f, 0.0742651f, -0.0630357f, 0.0632868f, 0.3862685f, 0.0748486f, 0.0506923f, + -2.4151185f, 0.0802129f, -0.1211919f, -1.9044075f, 0.0645995f, -0.4068294f, -0.4385396f, -0.1199773f, + -0.0219308f, -0.6580852f, 0.7465926f, -3.1614089f, -0.1574137f, -0.4429669f, 0.0698753f, -0.0604795f, + 1.5435756f, -2.2144003f, -0.0111754f, 0.1280562f, -0.0024847f, -0.1617478f, 0.0246055f, -0.0678383f}, + {0.2329811f, 0.7879948f, -3.3233993f, 0.1164390f, -0.1270224f, -0.5550243f, -0.0672430f, -0.0016068f, + -0.2102381f, -0.0552910f, -0.1676428f, -1.5530976f, 0.0654266f, 0.5756884f, -0.0021305f, 0.0488199f, + -0.0614975f, 0.2123013f, -1.3390820f, -1.1011786f, 0.0028438f, -1.8221409f, 0.1037516f, 0.1652413f, + 1.0206385f, 0.7670507f, -0.1004305f, -0.0437249f, 0.3590544f, -0.1849019f, -0.1284416f, -0.1975219f}, + {-0.5958156f, -0.8498669f, -0.0993299f, -0.7103062f, -0.1668082f, 0.1878954f, -0.8532909f, -0.0939539f, + -0.2151955f, 0.2173233f, -0.7155760f, -0.3415899f, -0.0404417f, -1.6671551f, -3.6663096f, 0.2828735f, + -0.1037000f, -1.1636399f, -0.0182679f, 0.0165802f, -0.1280557f, 0.1139740f, 0.1060428f, -0.1096078f, + -0.2083402f, 0.0569669f, -0.0949440f, 0.7387905f, 0.5553990f, -0.0876781f, 0.4042123f, 0.7967463f}, + {-0.7755491f, 1.0329288f, -0.4435873f, -0.1616621f, 0.0015863f, -0.2154487f, 0.2481335f, -0.1895383f, + -0.6515585f, 0.2643988f, 0.0165948f, -0.3663197f, -0.0378082f, 0.3794657f, 0.2348393f, -0.0952029f, + -0.1977327f, 0.0279894f, 0.0321040f, -0.5212879f, -0.1538097f, 0.3082405f, 0.0100385f, -0.0208207f, + -0.3540405f, 0.0978729f, -0.1378782f, 0.3500296f, 0.0489568f, -0.1101327f, 0.1888299f, -0.0786323f}, + {-0.3213858f, -0.6230492f, -2.5913410f, 0.0656858f, 0.0227841f, 0.2191865f, 0.0349099f, -0.1695805f, + -1.3844441f, -0.1035527f, -0.4150586f, 0.7789264f, -0.0936344f, -1.9199731f, -0.9188107f, -0.0188966f, + -0.0784041f, -0.0764103f, -2.2291248f, -2.6501858f, 0.1083791f, 0.9166861f, 0.0986617f, -1.8152469f, + 1.2902076f, -2.4815612f, -0.0582435f, -0.1825741f, 0.1351472f, 0.0469752f, -0.3347861f, 0.0561743f}, + {-1.1506671f, 0.0244561f, 0.6939688f, -0.1839749f, -0.1237261f, -0.4704360f, -0.1274202f, 0.0769576f, + 0.2063637f, 0.1067972f, -0.2297383f, -0.3197641f, -0.2756677f, 1.2856065f, -0.1331317f, 0.0524933f, + -0.1498061f, -1.2895508f, -0.2076671f, 0.1729939f, 0.1393973f, -0.3071945f, 0.1510896f, -0.3418963f, + 0.0207888f, -0.7296978f, -0.1016554f, 0.4193136f, 0.4209033f, -0.1884461f, 0.1778586f, 0.0882449f}, + {0.4260942f, -1.5393538f, 0.6496511f, -0.0233054f, -0.1154911f, -0.5248225f, -0.1159717f, 0.0961992f, + 0.5141736f, 0.0912039f, 0.0121801f, 1.0660315f, -0.0990365f, 0.4318093f, 0.1146076f, -0.0014916f, + -0.2176866f, -0.3261453f, -0.1865387f, 0.0657357f, -0.0412201f, 0.5913283f, -0.0169150f, 0.4873077f, + -0.8425939f, -0.4378911f, -0.0446746f, -0.0338331f, 0.2323655f, -0.1166838f, 0.1849742f, -0.0444494f}, + {-4.7958317f, -0.3887547f, 0.3943746f, 0.0266415f, -0.1849546f, -0.2362574f, -0.0759386f, -0.0406316f, + -2.6863902f, -0.0420164f, 0.0278654f, 1.0999503f, -0.1342072f, 0.2744266f, -0.8209524f, -0.0725991f, + -0.1575413f, 0.1468416f, 1.2511518f, -0.5824468f, -0.0420395f, 1.9468178f, 0.0576381f, 0.8301008f, + 0.6880937f, -2.0490625f, 0.0765251f, 0.0892806f, 0.0115464f, 0.1037114f, -0.1933933f, -0.0826425f}, + {-2.3926468f, 0.9652472f, 0.3846242f, -1.8219428f, 0.0496668f, 0.5097333f, 0.6558178f, -0.0933043f, + 0.1346592f, 0.2552424f, -0.5247180f, 0.0975937f, -0.0956505f, -1.1939684f, -1.6109539f, 0.0291610f, + 0.0250445f, -0.2117734f, -0.3671367f, -0.5285300f, -0.1611722f, 0.0041839f, -0.5533955f, -0.7813846f, + -0.0904857f, -0.8434240f, 0.0171278f, -1.0767213f, 0.0603934f, 0.0493840f, 0.9862781f, 0.5520182f}, + {1.2454330f, 0.5972028f, 0.7686826f, 0.2497237f, -0.0017843f, 0.9898069f, -0.6740548f, -0.1179278f, + -0.0231948f, -0.6596659f, -0.8000609f, -0.0699546f, -0.1336576f, -0.2269732f, -0.9051452f, -0.2375571f, + -0.1809363f, 1.0751063f, -0.0816682f, 0.0507760f, -0.1290978f, -0.1294877f, 0.2324601f, -0.0985209f, + -0.0773705f, 0.0194675f, -0.1334576f, 0.1490602f, -0.5308774f, -0.1515271f, 0.6451623f, 0.4562764f}, + {-2.5912027f, -1.0880963f, 0.4506941f, -0.0832320f, -0.0843302f, 0.6721463f, 0.0545895f, 0.0961543f, + 1.6990305f, 0.2865057f, 0.1326460f, -0.1172203f, 0.0603488f, -0.5354731f, -0.2468112f, -0.0330492f, + 0.1297820f, -1.3489295f, 2.0376251f, -1.7784770f, 0.0269008f, -11.7133312f, -0.0559333f, 0.7457867f, + -2.6041806f, -0.0074611f, -0.0230596f, 0.0895037f, -0.4107127f, 0.0811662f, 0.6025116f, 0.5589377f}, + {-0.0036496f, 0.0953889f, 0.0583121f, 0.1509429f, 0.1070117f, -0.0241024f, -0.0295597f, 0.0651249f, + 0.0219596f, -0.1901910f, -0.0578079f, -0.0827582f, 0.0612196f, 0.1677822f, -0.1403515f, 0.2001222f, + -0.1410438f, -0.0583785f, 0.0972384f, 0.1244574f, -0.1271764f, 0.0921396f, 0.0901482f, 0.1575983f, + -0.2287041f, 0.1462671f, -0.1644860f, 0.1111774f, -0.0805172f, 0.1350349f, -0.0304200f, -0.0757810f}, + {0.9101577f, -1.3877189f, -0.4038962f, -0.7405658f, -0.1486192f, 0.6282634f, -0.1020244f, -0.1434855f, + -0.0409669f, -0.4650875f, -0.5027285f, -0.1512777f, -0.1083134f, -0.2462458f, -1.2334225f, 0.0333704f, + -0.1389711f, -0.0595776f, 0.0769746f, 0.0092279f, 0.0156819f, 0.0397862f, 0.3602265f, -0.2466761f, + -0.1023989f, -0.0133800f, -0.0732056f, -0.1141649f, -0.5918769f, -0.2099056f, 1.2307832f, 0.5027910f}, + {0.0871296f, -0.1295669f, -0.0896348f, 0.1452128f, -0.0074592f, -0.0557586f, 0.0685396f, -0.2240884f, + -0.0698905f, 0.0113810f, -0.0523082f, -0.1892864f, 0.0904176f, -0.0987607f, -0.0371940f, 0.1888202f, + -0.1023782f, -0.1107638f, -0.3174691f, 0.1640519f, 0.1137626f, 0.0541831f, 0.1192290f, 0.0172333f, + -0.0766619f, -0.0557404f, 0.0514295f, -0.1727580f, 0.0018607f, -0.0966285f, -0.1801928f, 0.0916549f}, + {0.0203243f, 0.1540937f, 0.1249107f, -0.0625153f, -0.0568734f, 0.1500905f, 0.0521899f, 0.0298344f, + -0.1538603f, -0.0282811f, 0.0944993f, -0.0991179f, -0.1573601f, 0.1045044f, -0.0351922f, -0.1540347f, + 0.1740243f, 0.1529267f, 0.0141616f, -0.0580653f, 0.0217751f, -0.0410015f, -0.0343460f, -0.1464343f, + -0.0670722f, 0.0355232f, 0.1358264f, 0.1224003f, 0.0507292f, 0.1662261f, -0.0108287f, -0.0883858f}, + {0.2929641f, -0.8316358f, 0.9932570f, -0.0724017f, -0.0624820f, 0.5539349f, 0.1305689f, -0.0199843f, + -0.5265004f, 0.2388491f, -0.1920091f, -0.2762667f, 0.1056171f, -3.2570002f, -0.3361678f, -0.0135878f, + 0.1645315f, -0.2142355f, -0.8796312f, -7.7323594f, -0.1374875f, -0.4608127f, -0.0796791f, -0.5507361f, + -1.8336040f, 2.5669088f, -0.1433435f, -0.0408195f, -0.2189375f, -0.0146195f, 0.5396200f, 0.3951851f}, + {-1.8827964f, -0.4098588f, -0.6180743f, 0.4903710f, -0.1164847f, 0.2144586f, 0.5754681f, -0.1139816f, + 0.1691127f, 0.5704660f, 0.3751363f, 0.4575492f, -0.1647383f, -0.6087861f, 0.3280568f, 0.1446891f, + 0.0018978f, 0.1308372f, 0.2239647f, 0.1750600f, -0.0949092f, -0.2125228f, 0.0509538f, 0.5438231f, + -0.0231656f, -0.0102621f, -0.1143090f, 0.1692356f, 0.0145388f, 0.1456209f, -0.0454612f, 0.0101373f}, + }; + + HOST_DEVICE_CONSTANT float bias_fc3[6] = {-0.4601035f, -0.2295580f, -0.0389458f, 0.2728636f, 0.0650524f, 0.1829060f}; + + HOST_DEVICE_CONSTANT const float wgtT_fc3[32][6] = { + {-0.3411210f, -0.0397080f, 0.5651972f, 0.1536432f, 0.3772743f, 0.1471741f}, + {-0.0762910f, -0.3063827f, -0.2129947f, -0.1495240f, -0.4025716f, 0.0381839f}, + {-0.0219088f, 0.0004738f, 0.2221964f, 0.1870263f, 0.1499673f, 0.0290947f}, + {0.1921718f, 0.0920977f, -0.2728071f, -0.2693111f, -0.1457593f, -0.0825119f}, + {-0.1468817f, 0.0075058f, 0.0525970f, 0.0462784f, 0.1044439f, -0.0501118f}, + {0.0682404f, 0.3191431f, -0.2575107f, -0.1767330f, 0.1108677f, -0.0563356f}, + {0.2022640f, 0.0946275f, -0.2768224f, -0.2648008f, -0.1477039f, -0.0858348f}, + {0.2237751f, 0.0673614f, 0.0758461f, -0.0784104f, -0.0023624f, -0.0444682f}, + {-0.6424130f, 0.6359105f, -0.5453408f, 0.1293409f, 0.4565887f, 0.0721758f}, + {-1.9180968f, -2.0464785f, -1.0575339f, 1.8443462f, -1.7794129f, 0.3827156f}, + {0.1102831f, 0.0365143f, -0.2860785f, -0.1689088f, -0.1726920f, -0.0602505f}, + {-0.3096818f, 0.2978379f, -0.2525163f, 0.0643401f, 0.2176419f, 0.0323191f}, + {-0.1721586f, -0.0278779f, 0.0009259f, -0.0315924f, -0.0594473f, 0.1102493f}, + {0.1011149f, 0.2353841f, -0.4008681f, -0.2701374f, -0.0625554f, -0.0724697f}, + {0.0042279f, -0.1473476f, -0.3127778f, 0.0558405f, -0.3056587f, -0.0559929f}, + {-0.9212925f, -1.1549798f, -0.1323241f, 1.0125355f, -0.7895814f, 0.2322977f}, + {0.0436638f, 0.1259097f, 0.0325146f, -0.0898681f, -0.0401595f, -0.0767325f}, + {0.3320802f, 0.1589662f, 0.0919260f, -0.1462629f, 0.0988948f, -0.0727050f}, + {-0.4337279f, 0.4040831f, -0.3383405f, 0.1142050f, 0.3045402f, 0.0515237f}, + {0.8031816f, -0.8029570f, 0.7040247f, -0.1723298f, -0.5671331f, -0.0858645f}, + {0.1517031f, 0.0229139f, 0.1691006f, 0.0969766f, -0.1039258f, -0.1347231f}, + {0.3062419f, -0.3281854f, 0.2683749f, -0.0538388f, -0.2349393f, -0.0365046f}, + {0.3657214f, 0.3913901f, 0.0527000f, -0.4020816f, 0.2513908f, -0.0957916f}, + {0.3929159f, -0.3648293f, 0.2996375f, -0.1187399f, -0.2802985f, -0.0493542f}, + {0.2997055f, -0.3183403f, 0.2615302f, -0.0430490f, -0.2266634f, -0.0338770f}, + {-0.2654389f, 0.2434373f, -0.2290332f, 0.0705398f, 0.1711185f, 0.0307495f}, + {-0.1277946f, 0.0578584f, 0.0924456f, -0.1165068f, -0.0222394f, 0.1304205f}, + {-0.0692971f, -0.0007383f, 0.2981678f, 0.1123612f, 0.1953249f, 0.0530549f}, + {-0.1573147f, 0.1434165f, 0.1666125f, 0.2058718f, 0.2853577f, 0.0408852f}, + {-0.0342600f, 0.0242836f, 0.1001021f, -0.2229733f, -0.2102158f, -0.0860839f}, + {0.9001538f, 0.8010113f, 0.4412947f, -0.8558410f, 0.6589929f, -0.1841511f}, + {0.0723728f, 0.0476184f, 0.2816380f, 0.0934067f, 0.1914912f, 0.0079167f}, + }; + +} // namespace ALPAKA_ACCELERATOR_NAMESPACE::lst::dnn::plsembdnn + +#endif diff --git a/RecoTracker/LSTCore/standalone/analysis/DNN/embed_train.ipynb b/RecoTracker/LSTCore/standalone/analysis/DNN/embed_train.ipynb new file mode 100644 index 0000000000000..9c50228a53531 --- /dev/null +++ b/RecoTracker/LSTCore/standalone/analysis/DNN/embed_train.ipynb @@ -0,0 +1,1784 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import uproot\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.model_selection import train_test_split\n", + "import torch\n", + "import torch.nn as nn\n", + "import torch.optim as optim\n", + "from torch.utils.data import Dataset, DataLoader\n", + "import random\n", + "import awkward as ak # Using awkward array for easier handling of jagged data\n", + "import time # For timing steps\n", + "\n", + "def load_root_file(file_path, branches=None, print_branches=False):\n", + " all_branches = {}\n", + " with uproot.open(file_path) as file:\n", + " tree = file[\"tree\"]\n", + " # Load all ROOT branches into array if not specified\n", + " if branches is None:\n", + " branches = tree.keys()\n", + " # Option to print the branch names\n", + " if print_branches:\n", + " print(\"Branches:\", tree.keys())\n", + " # Each branch is added to the dictionary\n", + " for branch in branches:\n", + " try:\n", + " all_branches[branch] = (tree[branch].array(library=\"np\"))\n", + " except uproot.KeyInFileError as e:\n", + " print(f\"KeyInFileError: {e}\")\n", + " # Number of events in file\n", + " all_branches['event'] = tree.num_entries\n", + " return all_branches\n", + "\n", + "branches_list = [\n", + " 't5_innerRadius',\n", + " 't5_bridgeRadius',\n", + " 't5_outerRadius',\n", + " 't5_pt',\n", + " 't5_eta',\n", + " 't5_phi',\n", + " 't5_isFake',\n", + " 't5_t3_idx0',\n", + " 't5_t3_idx1',\n", + "\n", + " 't5_t3_fakeScore1',\n", + " 't5_t3_promptScore1',\n", + " 't5_t3_displacedScore1',\n", + " 't5_t3_fakeScore2',\n", + " 't5_t3_promptScore2',\n", + " 't5_t3_displacedScore2',\n", + "\n", + " 't5_pMatched',\n", + " 't5_sim_vxy',\n", + " 't5_sim_vz',\n", + " 't5_matched_simIdx'\n", + "]\n", + "\n", + "branches_list += [\n", + " 'pLS_eta',\n", + " 'pLS_etaErr',\n", + " 'pLS_phi',\n", + " 'pLS_matched_simIdx',\n", + " 'pLS_circleCenterX',\n", + " 'pLS_circleCenterY',\n", + " 'pLS_circleRadius',\n", + " 'pLS_ptIn',\n", + " 'pLS_ptErr',\n", + " 'pLS_px',\n", + " 'pLS_py',\n", + " 'pLS_pz',\n", + " 'pLS_isQuad',\n", + " 'pLS_isFake'\n", + "]\n", + "\n", + "# Hit-dependent branches\n", + "suffixes = ['r', 'z', 'eta', 'phi', 'layer']\n", + "branches_list += [f't5_t3_{i}_{suffix}' for i in [0, 2, 4] for suffix in suffixes]\n", + "\n", + "file_path = \"pls_t5_embed.root\"\n", + "branches = load_root_file(file_path, branches_list, print_branches=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Z max: 267.2349853515625, R max: 110.10993957519531, Eta max: 2.5\n" + ] + } + ], + "source": [ + "z_max = np.max([np.max(event) for event in branches[f't5_t3_4_z']])\n", + "r_max = np.max([np.max(event) for event in branches[f't5_t3_4_r']])\n", + "eta_max = 2.5\n", + "phi_max = np.pi\n", + "n_events = np.shape(branches['t5_pt'])[0]\n", + "\n", + "print(f'Z max: {z_max}, R max: {r_max}, Eta max: {eta_max}')\n", + "\n", + "def delta_phi(phi1, phi2):\n", + " delta = phi1 - phi2\n", + " # Adjust delta to be within the range [-pi, pi]\n", + " if delta > np.pi:\n", + " delta -= 2 * np.pi\n", + " elif delta < -np.pi:\n", + " delta += 2 * np.pi\n", + " return delta" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pMATCHED_THRESHOLD = 0. # keep if t5_pMatched ≥ this\n", + "print(f\"\\nBuilding T5 features (pMatched ≥ {pMATCHED_THRESHOLD}) …\")\n", + "\n", + "features_per_event = []\n", + "eta_per_event = []\n", + "displaced_per_event = []\n", + "sim_indices_per_event = []\n", + "\n", + "kept_tot, init_tot = 0, 0\n", + "for ev in range(n_events):\n", + "\n", + " n_t5 = len(branches['t5_t3_idx0'][ev])\n", + " init_tot += n_t5\n", + " if n_t5 == 0:\n", + " continue\n", + "\n", + " feat_evt = []\n", + " eta_evt = []\n", + " sim_evt = []\n", + " disp_evt = []\n", + "\n", + " for i in range(n_t5):\n", + " if branches['t5_pMatched'][ev][i] < pMATCHED_THRESHOLD:\n", + " continue\n", + "\n", + " idx0 = branches['t5_t3_idx0'][ev][i]\n", + " idx1 = branches['t5_t3_idx1'][ev][i]\n", + "\n", + " # hit-level quantities -------------------------------------------------\n", + " eta1 = (branches['t5_t3_0_eta'][ev][idx0])\n", + " eta2 = abs(branches['t5_t3_2_eta'][ev][idx0])\n", + " eta3 = abs(branches['t5_t3_4_eta'][ev][idx0])\n", + " eta4 = abs(branches['t5_t3_2_eta'][ev][idx1])\n", + " eta5 = abs(branches['t5_t3_4_eta'][ev][idx1])\n", + "\n", + " phi1 = branches['t5_t3_0_phi'][ev][idx0]\n", + " phi2 = branches['t5_t3_2_phi'][ev][idx0]\n", + " phi3 = branches['t5_t3_4_phi'][ev][idx0]\n", + " phi4 = branches['t5_t3_2_phi'][ev][idx1]\n", + " phi5 = branches['t5_t3_4_phi'][ev][idx1]\n", + "\n", + " z1 = abs(branches['t5_t3_0_z'][ev][idx0])\n", + " z2 = abs(branches['t5_t3_2_z'][ev][idx0])\n", + " z3 = abs(branches['t5_t3_4_z'][ev][idx0])\n", + " z4 = abs(branches['t5_t3_2_z'][ev][idx1])\n", + " z5 = abs(branches['t5_t3_4_z'][ev][idx1])\n", + "\n", + " r1 = branches['t5_t3_0_r'][ev][idx0]\n", + " r2 = branches['t5_t3_2_r'][ev][idx0]\n", + " r3 = branches['t5_t3_4_r'][ev][idx0]\n", + " r4 = branches['t5_t3_2_r'][ev][idx1]\n", + " r5 = branches['t5_t3_4_r'][ev][idx1]\n", + "\n", + " inR = branches['t5_innerRadius' ][ev][i]\n", + " brR = branches['t5_bridgeRadius'][ev][i]\n", + " outR = branches['t5_outerRadius' ][ev][i]\n", + "\n", + " s1_fake = branches['t5_t3_fakeScore1' ][ev][i]\n", + " s1_prompt = branches['t5_t3_promptScore1' ][ev][i]\n", + " s1_disp = branches['t5_t3_displacedScore1'][ev][i]\n", + " d_fake = branches['t5_t3_fakeScore2' ][ev][i] - s1_fake\n", + " d_prompt = branches['t5_t3_promptScore2' ][ev][i] - s1_prompt\n", + " d_disp = branches['t5_t3_displacedScore2'][ev][i] - s1_disp\n", + "\n", + " f = [\n", + " eta1 / eta_max,\n", + " np.cos(phi1),\n", + " np.sin(phi1),\n", + " z1 / z_max,\n", + " r1 / r_max,\n", + "\n", + " eta2 - abs(eta1),\n", + " delta_phi(phi2, phi1),\n", + " (z2 - z1) / z_max,\n", + " (r2 - r1) / r_max,\n", + "\n", + " eta3 - eta2,\n", + " delta_phi(phi3, phi2),\n", + " (z3 - z2) / z_max,\n", + " (r3 - r2) / r_max,\n", + "\n", + " eta4 - eta3,\n", + " delta_phi(phi4, phi3),\n", + " (z4 - z3) / z_max,\n", + " (r4 - r3) / r_max,\n", + "\n", + " eta5 - eta4,\n", + " delta_phi(phi5, phi4),\n", + " (z5 - z4) / z_max,\n", + " (r5 - r4) / r_max,\n", + "\n", + " 1.0 / inR,\n", + " 1.0 / brR,\n", + " 1.0 / outR,\n", + "\n", + " s1_fake, s1_prompt, s1_disp,\n", + " d_fake, d_prompt, d_disp\n", + " ]\n", + " feat_evt.append(f)\n", + " eta_evt.append(eta1)\n", + " disp_evt.append(branches['t5_sim_vxy'][ev][i])\n", + "\n", + " # first (or only) matched sim-index, -1 if none -----------------------\n", + " simIdx_list = branches['t5_matched_simIdx'][ev][i]\n", + " sim_evt.append(simIdx_list[0] if len(simIdx_list) else -1)\n", + "\n", + " # push to global containers ----------------------------------------------\n", + " if feat_evt: # skip events with no survivors\n", + " features_per_event.append(np.asarray(feat_evt, dtype=np.float32))\n", + " eta_per_event.append(np.asarray(eta_evt, dtype=np.float32))\n", + " displaced_per_event.append(np.asarray(disp_evt, dtype=np.float32))\n", + " sim_indices_per_event.append(np.asarray(sim_evt, dtype=np.int64))\n", + " kept_tot += len(feat_evt)\n", + "\n", + "print(f\"\\nKept {kept_tot} / {init_tot} T5s \"\n", + " f\"({kept_tot/init_tot*100:.2f} %) that passed the pMatched cut.\")\n", + "print(f\"Total events with ≥1 kept T5: {len(features_per_event)}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "KEEP_FRAC_PLS = 0.40\n", + "print(f\"\\nBuilding pLS features …\")\n", + "\n", + "pLS_features_per_event = []\n", + "pLS_eta_per_event = []\n", + "pLS_sim_indices_per_event = []\n", + "\n", + "kept_tot_pls, init_tot_pls = 0, 0\n", + "for ev in range(n_events):\n", + " n_pls = len(branches['pLS_eta'][ev])\n", + " init_tot_pls += n_pls\n", + " if n_pls == 0:\n", + " continue\n", + "\n", + " feat_evt, eta_evt, sim_evt = [], [], []\n", + "\n", + " for i in range(n_pls):\n", + " if branches['pLS_isFake'][ev][i]:\n", + " continue\n", + " if np.random.random() > KEEP_FRAC_PLS:\n", + " continue\n", + "\n", + " # ――― hit‑level quantities -------------------------------------------\n", + " eta = branches['pLS_eta'][ev][i]\n", + " etaErr = branches['pLS_etaErr'][ev][i]\n", + " phi = branches['pLS_phi'][ev][i]\n", + " circleCenterX = np.abs(branches['pLS_circleCenterX'][ev][i])\n", + " circleCenterY = np.abs(branches['pLS_circleCenterY'][ev][i])\n", + " circleRadius = branches['pLS_circleRadius'][ev][i]\n", + " ptIn = branches['pLS_ptIn'][ev][i]\n", + " ptErr = branches['pLS_ptErr'][ev][i]\n", + " isQuad = branches['pLS_isQuad'][ev][i]\n", + "\n", + " # ――― build feature vector -------------------------------------------\n", + " f = [\n", + " eta/4.0,\n", + " etaErr/.00139,\n", + " np.cos(phi),\n", + " np.sin(phi),\n", + " 1.0 / ptIn,\n", + " np.log10(ptErr),\n", + " isQuad,\n", + " np.log10(circleCenterX),\n", + " np.log10(circleCenterY),\n", + " np.log10(circleRadius),\n", + " ]\n", + "\n", + " feat_evt.append(f)\n", + " eta_evt.append(eta)\n", + "\n", + " sim_list = branches['pLS_matched_simIdx'][ev][i]\n", + " sim_evt.append(sim_list[0] if len(sim_list) else -1)\n", + "\n", + " # ――― store per‑event containers -----------------------------------------\n", + " if feat_evt: # skip events with no survivors\n", + " pLS_features_per_event .append(np.asarray(feat_evt, dtype=np.float32))\n", + " pLS_eta_per_event .append(np.asarray(eta_evt, dtype=np.float32))\n", + " pLS_sim_indices_per_event.append(np.asarray(sim_evt, dtype=np.int64))\n", + " kept_tot_pls += len(feat_evt)\n", + "\n", + "print(f\"\\nKept {kept_tot_pls} / {init_tot_pls} pLSs \"\n", + " f\"({kept_tot_pls/init_tot_pls*100:.2f} %) that passed the selections.\")\n", + "print(f\"Total events with ≥1 kept pLS: {len(pLS_features_per_event)}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import time, random, math, numpy as np\n", + "from concurrent.futures import ProcessPoolExecutor, as_completed\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "DELTA_R2_CUT = 0.02\n", + "\n", + "# ---------------------------------------------------------------------------\n", + "def _delta_phi(phi1, phi2):\n", + " \"\"\"same helper you already defined, but inline for the worker\"\"\"\n", + " d = phi1 - phi2\n", + " if d > math.pi:\n", + " d -= 2 * math.pi\n", + " elif d < -math.pi:\n", + " d += 2 * math.pi\n", + " return d\n", + "# ---------------------------------------------------------------------------\n", + "def _pairs_single_event(evt_idx,\n", + " F, S, D,\n", + " max_sim, max_dis,\n", + " invalid_sim):\n", + " \"\"\"\n", + " Worker run in a separate process.\n", + " Returns two Python lists with the selected (i,j) indices per event.\n", + " \"\"\"\n", + " n = F.shape[0]\n", + " if n < 2:\n", + " return evt_idx, [], []\n", + "\n", + " eta1 = F[:, 0] * eta_max\n", + " phi1 = np.arctan2(F[:, 2], F[:, 1])\n", + "\n", + " sim_pairs, dis_pairs = [], []\n", + "\n", + " # similar pairs (same sim-index)\n", + " buckets = {}\n", + " for idx, s in enumerate(S):\n", + " if s != invalid_sim:\n", + " buckets.setdefault(s, []).append(idx)\n", + "\n", + " for lst in buckets.values():\n", + " if len(lst) < 2:\n", + " continue\n", + " for a in range(len(lst) - 1):\n", + " i = lst[a]\n", + " for b in range(a + 1, len(lst)):\n", + " j = lst[b]\n", + " dphi = _delta_phi(phi1[i], phi1[j])\n", + " dr2 = (eta1[i] - eta1[j])**2 + dphi**2\n", + " if dr2 < DELTA_R2_CUT:\n", + " sim_pairs.append((i, j))\n", + "\n", + " # dissimilar pairs (different sim)\n", + " for i in range(n - 1):\n", + " si, ei, pi = S[i], eta1[i], phi1[i]\n", + " for j in range(i + 1, n):\n", + " # skip fake-fake pairs\n", + " if si == invalid_sim and S[j] == invalid_sim:\n", + " continue\n", + " if (si == S[j]) and si != invalid_sim:\n", + " continue\n", + " dphi = _delta_phi(pi, phi1[j])\n", + " dr2 = (ei - eta1[j])**2 + dphi**2\n", + " if dr2 < DELTA_R2_CUT:\n", + " dis_pairs.append((i, j))\n", + "\n", + " # down-sample\n", + " if len(sim_pairs) > max_sim:\n", + " sim_pairs = random.sample(sim_pairs, max_sim)\n", + " if len(dis_pairs) > max_dis:\n", + " dis_pairs = random.sample(dis_pairs, max_dis)\n", + "\n", + " print(f\"[evt {evt_idx:4d}] T5s={n:5d} sim={len(sim_pairs):3d} dis={len(dis_pairs):3d}\")\n", + " return evt_idx, sim_pairs, dis_pairs\n", + "\n", + "# ---------------------------------------------------------------------------\n", + "def create_t5_pairs_balanced_parallel(features_per_event,\n", + " sim_indices_per_event,\n", + " displaced_per_event,\n", + " *,\n", + " max_similar_pairs_per_event=100,\n", + " max_dissimilar_pairs_per_event=450,\n", + " invalid_sim_idx=-1,\n", + " n_workers=None):\n", + " t0 = time.time()\n", + " print(\"\\n>>> Pair generation (ΔR² < 0.02) – parallel mode\")\n", + "\n", + " work_args = [\n", + " (evt_idx,\n", + " features_per_event[evt_idx],\n", + " sim_indices_per_event[evt_idx],\n", + " displaced_per_event[evt_idx],\n", + " max_similar_pairs_per_event,\n", + " max_dissimilar_pairs_per_event,\n", + " invalid_sim_idx)\n", + " for evt_idx in range(len(features_per_event))\n", + " ]\n", + "\n", + " sim_L, sim_R, sim_disp = [], [], []\n", + " dis_L, dis_R, dis_disp = [], [], []\n", + "\n", + " with ProcessPoolExecutor(max_workers=n_workers) as pool:\n", + " futures = [pool.submit(_pairs_single_event, *args) for args in work_args]\n", + " for fut in as_completed(futures):\n", + " evt_idx, sim_pairs_evt, dis_pairs_evt = fut.result()\n", + " F = features_per_event[evt_idx]\n", + " D = displaced_per_event[evt_idx]\n", + "\n", + " for i, j in sim_pairs_evt:\n", + " sim_L.append(F[i])\n", + " sim_R.append(F[j])\n", + " sim_disp.append(D[i] > 0.1 or D[j] > 0.1)\n", + "\n", + " for i, j in dis_pairs_evt:\n", + " dis_L.append(F[i])\n", + " dis_R.append(F[j])\n", + " dis_disp.append(D[i] > 0.1 or D[j] > 0.1)\n", + "\n", + " X_left = np.concatenate([np.asarray(sim_L, dtype=np.float32),\n", + " np.asarray(dis_L, dtype=np.float32)], axis=0)\n", + " X_right = np.concatenate([np.asarray(sim_R, dtype=np.float32),\n", + " np.asarray(dis_R, dtype=np.float32)], axis=0)\n", + " y = np.concatenate([np.zeros(len(sim_L), dtype=np.int32),\n", + " np.ones (len(dis_L), dtype=np.int32)])\n", + "\n", + " disp_L = np.concatenate([np.asarray(sim_disp, dtype=bool),\n", + " np.asarray(dis_disp, dtype=bool)], axis=0)\n", + " disp_R = disp_L.copy()\n", + "\n", + " print(f\"<<< done in {time.time() - t0:.1f}s | sim {len(sim_L)} dis {len(dis_L)} total {len(y)}\")\n", + " return X_left, X_right, y, disp_L, disp_R\n", + "\n", + "# invoke\n", + "X_left, X_right, y, disp_L, disp_R = create_t5_pairs_balanced_parallel(\n", + " features_per_event,\n", + " sim_indices_per_event,\n", + " displaced_per_event,\n", + " max_similar_pairs_per_event = 1000,\n", + " max_dissimilar_pairs_per_event = 1000,\n", + " invalid_sim_idx = -1,\n", + " n_workers = None\n", + ")\n", + "\n", + "if len(y) == 0:\n", + " raise ValueError(\"No pairs generated. Check filters/data.\")\n", + "\n", + "mask = (np.isfinite(X_left).all(axis=1) &\n", + " np.isfinite(X_right).all(axis=1))\n", + "if not mask.all():\n", + " print(f\"Filtering {np.sum(~mask)} pairs with NaN/Inf\")\n", + " X_left, X_right, y, disp_L, disp_R = X_left[mask], X_right[mask], y[mask], disp_L[mask], disp_R[mask]\n", + "\n", + "weights_t5 = np.where(disp_L | disp_R, 5.0, 1.0).astype(np.float32)\n", + "\n", + "X_left_train, X_left_test, \\\n", + "X_right_train, X_right_test, \\\n", + "y_t5_train, y_t5_test, \\\n", + "w_t5_train, w_t5_test = train_test_split(\n", + " X_left, X_right, y, weights_t5,\n", + " test_size=0.20, random_state=42,\n", + " stratify=y, shuffle=True\n", + ")\n", + "\n", + "# compute displaced fraction\n", + "pct_disp = np.mean(disp_L | disp_R) * 100\n", + "print(f\"{pct_disp:.2f}% of all pairs involve a displaced T5\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import random\n", + "from concurrent.futures import ProcessPoolExecutor, as_completed\n", + "import time\n", + "\n", + "# pairing hyper-parameters\n", + "DELTA_R2_CUT_PLS_T5 = 0.02\n", + "DISP_VXY_CUT = 0.1\n", + "INVALID_SIM_IDX = -1\n", + "MAX_SIM = 1000\n", + "MAX_DIS = 1000\n", + "\n", + "def _pairs_pLS_T5_single(evt_idx,\n", + " F_pLS, S_pLS,\n", + " F_T5, S_T5, D_T5,\n", + " max_sim, max_dis,\n", + " invalid_sim):\n", + " \"\"\"\n", + " Build similar / dissimilar pLS-T5 pairs for a single event,\n", + " printing per-event summary.\n", + " \"\"\"\n", + " n_p, n_t = F_pLS.shape[0], F_T5.shape[0]\n", + " sim_pairs, dis_pairs = [], []\n", + "\n", + " # if either collection is empty, report zeros and bail\n", + " if n_p == 0 or n_t == 0:\n", + " print(f\"[evt {evt_idx:4d}] pLSs={n_p:5d} T5s={n_t:5d} sim={0:4d} dis={0:4d}\")\n", + " return evt_idx, []\n", + "\n", + " # un-normalize eta and compute phi angles\n", + " eta_p = F_pLS[:,0] * 4.0\n", + " phi_p = np.arctan2(F_pLS[:,3], F_pLS[:,2])\n", + " eta_t = F_T5[:,0] * eta_max\n", + " phi_t = np.arctan2(F_T5[:,2], F_T5[:,1])\n", + "\n", + " # bucket T5 by sim-idx for similar\n", + " buckets = {}\n", + " for j,s in enumerate(S_T5):\n", + " if s != invalid_sim:\n", + " buckets.setdefault(s, []).append(j)\n", + " for i,s in enumerate(S_pLS):\n", + " if s == invalid_sim:\n", + " continue\n", + " for j in buckets.get(s, []):\n", + " dphi = (phi_p[i] - phi_t[j] + np.pi) % (2*np.pi) - np.pi\n", + " dr2 = (eta_p[i] - eta_t[j])**2 + dphi**2\n", + " if dr2 < DELTA_R2_CUT_PLS_T5:\n", + " sim_pairs.append((i,j))\n", + "\n", + " # find dissimilar (different sim-idx) pairs\n", + " for i in range(n_p):\n", + " for j in range(n_t):\n", + " if S_pLS[i] == S_T5[j] and S_pLS[i] != invalid_sim:\n", + " continue\n", + " dphi = (phi_p[i] - phi_t[j] + np.pi) % (2*np.pi) - np.pi\n", + " dr2 = (eta_p[i] - eta_t[j])**2 + dphi**2\n", + " if dr2 < DELTA_R2_CUT_PLS_T5:\n", + " dis_pairs.append((i,j))\n", + "\n", + " # down-sample to limits\n", + " if len(sim_pairs) > max_sim:\n", + " sim_pairs = random.sample(sim_pairs, max_sim)\n", + " if len(dis_pairs) > max_dis:\n", + " dis_pairs = random.sample(dis_pairs, max_dis)\n", + "\n", + " # print per-event summary\n", + " print(f\"[evt {evt_idx:4d}] pLSs={n_p:5d} T5s={n_t:5d} \"\n", + " f\"sim={len(sim_pairs):4d} dis={len(dis_pairs):4d}\")\n", + "\n", + " # pack into (feature, feature, label, displaced_flag)\n", + " packed = []\n", + " for i,j in sim_pairs:\n", + " packed.append((F_pLS[i], F_T5[j], 0, D_T5[j] > DISP_VXY_CUT))\n", + " for i,j in dis_pairs:\n", + " packed.append((F_pLS[i], F_T5[j], 1, D_T5[j] > DISP_VXY_CUT))\n", + "\n", + " return evt_idx, packed\n", + "\n", + "# now drive over all events in parallel, with a global timer & totals\n", + "print(f\"\\n>>> Building pLS-T5 pairs (ΔR² < {DELTA_R2_CUT_PLS_T5}) …\")\n", + "t0 = time.time()\n", + "all_packed = []\n", + "sim_total = 0\n", + "dis_total = 0\n", + "\n", + "with ProcessPoolExecutor() as pool:\n", + " futures = [\n", + " pool.submit(\n", + " _pairs_pLS_T5_single, ev,\n", + " pLS_features_per_event[ev],\n", + " pLS_sim_indices_per_event[ev],\n", + " features_per_event[ev],\n", + " sim_indices_per_event[ev],\n", + " displaced_per_event[ev],\n", + " MAX_SIM, MAX_DIS, INVALID_SIM_IDX\n", + " )\n", + " for ev in range(len(features_per_event))\n", + " ]\n", + " for fut in as_completed(futures):\n", + " _, packed = fut.result()\n", + " # accumulate\n", + " sim_evt = sum(1 for _,_,lbl,_ in packed if lbl == 0)\n", + " dis_evt = sum(1 for _,_,lbl,_ in packed if lbl == 1)\n", + " sim_total += sim_evt\n", + " dis_total += dis_evt\n", + " all_packed.extend(packed)\n", + "\n", + "print(f\"<<< done in {time.time() - t0:.1f}s \"\n", + " f\"| sim {sim_total:5d} dis {dis_total:5d} total {len(all_packed):,d}\")\n", + "\n", + "# unpack into numpy arrays\n", + "pls_feats = np.array([p[0] for p in all_packed], dtype=np.float32)\n", + "t5_feats = np.array([p[1] for p in all_packed], dtype=np.float32)\n", + "y_pls = np.array([p[2] for p in all_packed], dtype=np.int32)\n", + "disp_flag = np.array([p[3] for p in all_packed], dtype=bool)\n", + "w_pls = np.array([5.0 if p[3] else 1.0 for p in all_packed], dtype=np.float32)\n", + "\n", + "# train/test split\n", + "X_pls_train, X_pls_test, \\\n", + "X_t5raw_train, X_t5raw_test, \\\n", + "y_pls_train, y_pls_test, \\\n", + "w_pls_train, w_pls_test = train_test_split(\n", + " pls_feats, t5_feats, y_pls, w_pls,\n", + " test_size=0.20, random_state=42,\n", + " stratify=y_pls, shuffle=True\n", + ")\n", + "\n", + "pct_disp_pls = disp_flag.mean() * 100.0\n", + "print(f\"pLS-T5 pairs → train {len(y_pls_train)} test {len(y_pls_test)}\")\n", + "print(f\"{pct_disp_pls:.2f}% of pLS-T5 pairs involve a displaced T5\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "from torch.utils.data import Dataset, DataLoader\n", + "\n", + "class SiameseDataset(Dataset):\n", + " def __init__(self, X_left, X_right, y, w):\n", + " if not isinstance(X_left, np.ndarray): X_left = np.array(X_left)\n", + " if not isinstance(X_right, np.ndarray): X_right = np.array(X_right)\n", + " if not isinstance(y, np.ndarray): y = np.array(y)\n", + " if not isinstance(w, np.ndarray): w = np.array(w)\n", + " self.X_left = torch.from_numpy(X_left .astype(np.float32))\n", + " self.X_right = torch.from_numpy(X_right.astype(np.float32))\n", + " self.y = torch.from_numpy(y .astype(np.float32)).view(-1,1)\n", + " self.w = torch.from_numpy(w .astype(np.float32)).view(-1,1)\n", + " def __len__(self): \n", + " return len(self.y)\n", + " def __getitem__(self, idx):\n", + " return self.X_left[idx], self.X_right[idx], self.y[idx], self.w[idx]\n", + "\n", + "train_t5_ds = SiameseDataset(X_left_train, X_right_train, y_t5_train, w_t5_train)\n", + "test_t5_ds = SiameseDataset(X_left_test, X_right_test, y_t5_test, w_t5_test)\n", + "\n", + "# new Dataset for pLS-T5 raw‐feature pairs\n", + "class PLST5Dataset(Dataset):\n", + " def __init__(self, pls, t5, y, w):\n", + " self.pls = torch.from_numpy(pls)\n", + " self.t5 = torch.from_numpy(t5)\n", + " self.y = torch.from_numpy(y.reshape(-1,1).astype(np.float32))\n", + " self.w = torch.from_numpy(w.reshape(-1,1).astype(np.float32))\n", + " def __len__(self): return len(self.y)\n", + " def __getitem__(self, i):\n", + " return self.pls[i], self.t5[i], self.y[i], self.w[i]\n", + "\n", + "train_pls_ds = PLST5Dataset(X_pls_train, X_t5raw_train, y_pls_train, w_pls_train)\n", + "test_pls_ds = PLST5Dataset(X_pls_test, X_t5raw_test, y_pls_test, w_pls_test)\n", + "\n", + "batch_size = 1024\n", + "num_workers = min(os.cpu_count() or 4, 8)\n", + "\n", + "train_t5_loader = DataLoader(train_t5_ds, batch_size, shuffle=True,\n", + " num_workers=num_workers, pin_memory=True)\n", + "test_t5_loader = DataLoader(test_t5_ds, batch_size, shuffle=False,\n", + " num_workers=num_workers, pin_memory=True)\n", + "train_pls_loader = DataLoader(train_pls_ds, batch_size, shuffle=True,\n", + " num_workers=num_workers, pin_memory=True)\n", + "test_pls_loader = DataLoader(test_pls_ds, batch_size, shuffle=False,\n", + " num_workers=num_workers, pin_memory=True)\n", + "\n", + "print(\"Loaders ready:\",\n", + " f\"T5 train {len(train_t5_ds)}, pLS-T5 train {len(train_pls_ds)}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "import torch.nn as nn\n", + "import torch.optim as optim\n", + "\n", + "# T5 embedding net (same as before)\n", + "class EmbeddingNetT5(nn.Module):\n", + " def __init__(self, input_dim=30, emb_dim=6):\n", + " super().__init__()\n", + " self.fc1 = nn.Linear(input_dim, 32); self.relu1 = nn.ReLU()\n", + " self.fc2 = nn.Linear(32, 32); self.relu2 = nn.ReLU()\n", + " self.fc3 = nn.Linear(32, emb_dim)\n", + " def forward(self, x):\n", + " x = self.relu1(self.fc1(x))\n", + " x = self.relu2(self.fc2(x))\n", + " return self.fc3(x)\n", + "\n", + "# pLS embedding net\n", + "class EmbeddingNetpLS(nn.Module):\n", + " def __init__(self, input_dim=10, emb_dim=6):\n", + " super().__init__()\n", + " self.fc1 = nn.Linear(input_dim, 32); self.relu1 = nn.ReLU()\n", + " self.fc2 = nn.Linear(32, 32); self.relu2 = nn.ReLU()\n", + " self.fc3 = nn.Linear(32, emb_dim)\n", + " def forward(self, x):\n", + " x = self.relu1(self.fc1(x))\n", + " x = self.relu2(self.fc2(x))\n", + " return self.fc3(x)\n", + " \n", + "class ContrastiveLoss(nn.Module):\n", + " def __init__(self, margin=1.0):\n", + " super(ContrastiveLoss, self).__init__()\n", + " self.margin = margin\n", + " def forward(self, d, label, weight=None):\n", + " # d: [B,1], label: [B,1], weight: [B,1] or None\n", + " l_sim = (1 - label) * d.pow(2)\n", + " l_dis = label * (self.margin - d).clamp(min=0.0).pow(2)\n", + " loss = l_sim + l_dis\n", + " if weight is not None:\n", + " loss = loss * weight\n", + " return loss.mean()\n", + "\n", + "# contrastive loss (reuse)\n", + "criterion = ContrastiveLoss(margin=1.0)\n", + "\n", + "# instantiate and send to GPU/CPU\n", + "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n", + "embed_t5 = EmbeddingNetT5().to(device)\n", + "embed_pls = EmbeddingNetpLS().to(device)\n", + "\n", + "# joint optimizer over both nets\n", + "optimizer = optim.Adam(\n", + " list(embed_t5.parameters()) + list(embed_pls.parameters()),\n", + " lr=0.0025\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/200: JointLoss=0.4559 T5=0.2255 pLS=0.2304\n", + "Epoch 2/200: JointLoss=0.3017 T5=0.1444 pLS=0.1573\n", + "Epoch 3/200: JointLoss=0.2703 T5=0.1329 pLS=0.1373\n", + "Epoch 4/200: JointLoss=0.2568 T5=0.1285 pLS=0.1283\n", + "Epoch 5/200: JointLoss=0.2502 T5=0.1262 pLS=0.1239\n", + "Epoch 6/200: JointLoss=0.2466 T5=0.1248 pLS=0.1219\n", + "Epoch 7/200: JointLoss=0.2432 T5=0.1234 pLS=0.1197\n", + "Epoch 8/200: JointLoss=0.2409 T5=0.1226 pLS=0.1184\n", + "Epoch 9/200: JointLoss=0.2394 T5=0.1216 pLS=0.1178\n", + "Epoch 10/200: JointLoss=0.2374 T5=0.1210 pLS=0.1164\n", + "Epoch 11/200: JointLoss=0.2355 T5=0.1201 pLS=0.1154\n", + "Epoch 12/200: JointLoss=0.2341 T5=0.1195 pLS=0.1146\n", + "Epoch 13/200: JointLoss=0.2335 T5=0.1191 pLS=0.1144\n", + "Epoch 14/200: JointLoss=0.2322 T5=0.1186 pLS=0.1136\n", + "Epoch 15/200: JointLoss=0.2314 T5=0.1181 pLS=0.1132\n", + "Epoch 16/200: JointLoss=0.2310 T5=0.1178 pLS=0.1131\n", + "Epoch 17/200: JointLoss=0.2302 T5=0.1174 pLS=0.1128\n", + "Epoch 18/200: JointLoss=0.2296 T5=0.1170 pLS=0.1126\n", + "Epoch 19/200: JointLoss=0.2287 T5=0.1166 pLS=0.1120\n", + "Epoch 20/200: JointLoss=0.2285 T5=0.1164 pLS=0.1121\n", + "Epoch 21/200: JointLoss=0.2274 T5=0.1159 pLS=0.1115\n", + "Epoch 22/200: JointLoss=0.2270 T5=0.1157 pLS=0.1113\n", + "Epoch 23/200: JointLoss=0.2263 T5=0.1153 pLS=0.1110\n", + "Epoch 24/200: JointLoss=0.2257 T5=0.1151 pLS=0.1107\n", + "Epoch 25/200: JointLoss=0.2252 T5=0.1147 pLS=0.1105\n", + "Epoch 26/200: JointLoss=0.2245 T5=0.1145 pLS=0.1100\n", + "Epoch 27/200: JointLoss=0.2239 T5=0.1141 pLS=0.1097\n", + "Epoch 28/200: JointLoss=0.2233 T5=0.1140 pLS=0.1093\n", + "Epoch 29/200: JointLoss=0.2223 T5=0.1136 pLS=0.1087\n", + "Epoch 30/200: JointLoss=0.2218 T5=0.1133 pLS=0.1085\n", + "Epoch 31/200: JointLoss=0.2204 T5=0.1129 pLS=0.1075\n", + "Epoch 32/200: JointLoss=0.2192 T5=0.1126 pLS=0.1066\n", + "Epoch 33/200: JointLoss=0.2177 T5=0.1121 pLS=0.1057\n", + "Epoch 34/200: JointLoss=0.2152 T5=0.1117 pLS=0.1035\n", + "Epoch 35/200: JointLoss=0.2114 T5=0.1110 pLS=0.1004\n", + "Epoch 36/200: JointLoss=0.2072 T5=0.1101 pLS=0.0972\n", + "Epoch 37/200: JointLoss=0.2023 T5=0.1092 pLS=0.0932\n", + "Epoch 38/200: JointLoss=0.1985 T5=0.1082 pLS=0.0904\n", + "Epoch 39/200: JointLoss=0.1949 T5=0.1072 pLS=0.0877\n", + "Epoch 40/200: JointLoss=0.1909 T5=0.1064 pLS=0.0844\n", + "Epoch 41/200: JointLoss=0.1887 T5=0.1056 pLS=0.0831\n", + "Epoch 42/200: JointLoss=0.1860 T5=0.1049 pLS=0.0812\n", + "Epoch 43/200: JointLoss=0.1846 T5=0.1044 pLS=0.0803\n", + "Epoch 44/200: JointLoss=0.1826 T5=0.1037 pLS=0.0789\n", + "Epoch 45/200: JointLoss=0.1814 T5=0.1034 pLS=0.0781\n", + "Epoch 46/200: JointLoss=0.1805 T5=0.1029 pLS=0.0776\n", + "Epoch 47/200: JointLoss=0.1793 T5=0.1026 pLS=0.0767\n", + "Epoch 48/200: JointLoss=0.1784 T5=0.1023 pLS=0.0761\n", + "Epoch 49/200: JointLoss=0.1774 T5=0.1020 pLS=0.0755\n", + "Epoch 50/200: JointLoss=0.1769 T5=0.1018 pLS=0.0751\n", + "Epoch 51/200: JointLoss=0.1765 T5=0.1016 pLS=0.0749\n", + "Epoch 52/200: JointLoss=0.1750 T5=0.1012 pLS=0.0738\n", + "Epoch 53/200: JointLoss=0.1754 T5=0.1010 pLS=0.0744\n", + "Epoch 54/200: JointLoss=0.1746 T5=0.1007 pLS=0.0739\n", + "Epoch 55/200: JointLoss=0.1745 T5=0.1007 pLS=0.0738\n", + "Epoch 56/200: JointLoss=0.1740 T5=0.1005 pLS=0.0735\n", + "Epoch 57/200: JointLoss=0.1731 T5=0.1003 pLS=0.0728\n", + "Epoch 58/200: JointLoss=0.1726 T5=0.1000 pLS=0.0726\n", + "Epoch 59/200: JointLoss=0.1725 T5=0.0999 pLS=0.0726\n", + "Epoch 60/200: JointLoss=0.1727 T5=0.0998 pLS=0.0729\n", + "Epoch 61/200: JointLoss=0.1724 T5=0.0998 pLS=0.0727\n", + "Epoch 62/200: JointLoss=0.1725 T5=0.0996 pLS=0.0728\n", + "Epoch 63/200: JointLoss=0.1716 T5=0.0995 pLS=0.0721\n", + "Epoch 64/200: JointLoss=0.1710 T5=0.0993 pLS=0.0717\n", + "Epoch 65/200: JointLoss=0.1709 T5=0.0992 pLS=0.0717\n", + "Epoch 66/200: JointLoss=0.1711 T5=0.0991 pLS=0.0719\n", + "Epoch 67/200: JointLoss=0.1711 T5=0.0990 pLS=0.0721\n", + "Epoch 68/200: JointLoss=0.1697 T5=0.0988 pLS=0.0709\n", + "Epoch 69/200: JointLoss=0.1704 T5=0.0988 pLS=0.0716\n", + "Epoch 70/200: JointLoss=0.1700 T5=0.0986 pLS=0.0714\n", + "Epoch 71/200: JointLoss=0.1695 T5=0.0985 pLS=0.0710\n", + "Epoch 72/200: JointLoss=0.1696 T5=0.0986 pLS=0.0710\n", + "Epoch 73/200: JointLoss=0.1693 T5=0.0984 pLS=0.0709\n", + "Epoch 74/200: JointLoss=0.1691 T5=0.0983 pLS=0.0708\n", + "Epoch 75/200: JointLoss=0.1687 T5=0.0983 pLS=0.0705\n", + "Epoch 76/200: JointLoss=0.1688 T5=0.0982 pLS=0.0706\n", + "Epoch 77/200: JointLoss=0.1685 T5=0.0982 pLS=0.0702\n", + "Epoch 78/200: JointLoss=0.1693 T5=0.0981 pLS=0.0711\n", + "Epoch 79/200: JointLoss=0.1683 T5=0.0981 pLS=0.0702\n", + "Epoch 80/200: JointLoss=0.1686 T5=0.0979 pLS=0.0707\n", + "Epoch 81/200: JointLoss=0.1678 T5=0.0979 pLS=0.0699\n", + "Epoch 82/200: JointLoss=0.1678 T5=0.0978 pLS=0.0700\n", + "Epoch 83/200: JointLoss=0.1680 T5=0.0978 pLS=0.0703\n", + "Epoch 84/200: JointLoss=0.1686 T5=0.0976 pLS=0.0710\n", + "Epoch 85/200: JointLoss=0.1674 T5=0.0977 pLS=0.0698\n", + "Epoch 86/200: JointLoss=0.1674 T5=0.0975 pLS=0.0699\n", + "Epoch 87/200: JointLoss=0.1668 T5=0.0974 pLS=0.0693\n", + "Epoch 88/200: JointLoss=0.1680 T5=0.0974 pLS=0.0705\n", + "Epoch 89/200: JointLoss=0.1671 T5=0.0974 pLS=0.0697\n", + "Epoch 90/200: JointLoss=0.1681 T5=0.0973 pLS=0.0707\n", + "Epoch 91/200: JointLoss=0.1675 T5=0.0973 pLS=0.0702\n", + "Epoch 92/200: JointLoss=0.1669 T5=0.0972 pLS=0.0697\n", + "Epoch 93/200: JointLoss=0.1671 T5=0.0973 pLS=0.0698\n", + "Epoch 94/200: JointLoss=0.1667 T5=0.0971 pLS=0.0696\n", + "Epoch 95/200: JointLoss=0.1666 T5=0.0971 pLS=0.0695\n", + "Epoch 96/200: JointLoss=0.1679 T5=0.0971 pLS=0.0708\n", + "Epoch 97/200: JointLoss=0.1664 T5=0.0970 pLS=0.0694\n", + "Epoch 98/200: JointLoss=0.1663 T5=0.0970 pLS=0.0692\n", + "Epoch 99/200: JointLoss=0.1664 T5=0.0970 pLS=0.0694\n", + "Epoch 100/200: JointLoss=0.1662 T5=0.0969 pLS=0.0694\n", + "Epoch 101/200: JointLoss=0.1669 T5=0.0970 pLS=0.0700\n", + "Epoch 102/200: JointLoss=0.1662 T5=0.0969 pLS=0.0693\n", + "Epoch 103/200: JointLoss=0.1662 T5=0.0967 pLS=0.0695\n", + "Epoch 104/200: JointLoss=0.1657 T5=0.0967 pLS=0.0690\n", + "Epoch 105/200: JointLoss=0.1659 T5=0.0967 pLS=0.0692\n", + "Epoch 106/200: JointLoss=0.1662 T5=0.0966 pLS=0.0696\n", + "Epoch 107/200: JointLoss=0.1658 T5=0.0966 pLS=0.0691\n", + "Epoch 108/200: JointLoss=0.1662 T5=0.0965 pLS=0.0697\n", + "Epoch 109/200: JointLoss=0.1656 T5=0.0965 pLS=0.0691\n", + "Epoch 110/200: JointLoss=0.1655 T5=0.0965 pLS=0.0690\n", + "Epoch 111/200: JointLoss=0.1653 T5=0.0965 pLS=0.0688\n", + "Epoch 112/200: JointLoss=0.1653 T5=0.0965 pLS=0.0688\n", + "Epoch 113/200: JointLoss=0.1659 T5=0.0963 pLS=0.0696\n", + "Epoch 114/200: JointLoss=0.1650 T5=0.0964 pLS=0.0686\n", + "Epoch 115/200: JointLoss=0.1657 T5=0.0963 pLS=0.0694\n", + "Epoch 116/200: JointLoss=0.1651 T5=0.0961 pLS=0.0690\n", + "Epoch 117/200: JointLoss=0.1652 T5=0.0962 pLS=0.0690\n", + "Epoch 118/200: JointLoss=0.1650 T5=0.0962 pLS=0.0688\n", + "Epoch 119/200: JointLoss=0.1651 T5=0.0962 pLS=0.0689\n", + "Epoch 120/200: JointLoss=0.1658 T5=0.0961 pLS=0.0697\n", + "Epoch 121/200: JointLoss=0.1647 T5=0.0961 pLS=0.0686\n", + "Epoch 122/200: JointLoss=0.1642 T5=0.0961 pLS=0.0681\n", + "Epoch 123/200: JointLoss=0.1652 T5=0.0961 pLS=0.0691\n", + "Epoch 124/200: JointLoss=0.1651 T5=0.0960 pLS=0.0691\n", + "Epoch 125/200: JointLoss=0.1644 T5=0.0960 pLS=0.0684\n", + "Epoch 126/200: JointLoss=0.1649 T5=0.0960 pLS=0.0688\n", + "Epoch 127/200: JointLoss=0.1647 T5=0.0960 pLS=0.0687\n", + "Epoch 128/200: JointLoss=0.1646 T5=0.0960 pLS=0.0687\n", + "Epoch 129/200: JointLoss=0.1652 T5=0.0959 pLS=0.0693\n", + "Epoch 130/200: JointLoss=0.1644 T5=0.0959 pLS=0.0684\n", + "Epoch 131/200: JointLoss=0.1651 T5=0.0959 pLS=0.0692\n", + "Epoch 132/200: JointLoss=0.1646 T5=0.0959 pLS=0.0687\n", + "Epoch 133/200: JointLoss=0.1639 T5=0.0958 pLS=0.0682\n", + "Epoch 134/200: JointLoss=0.1639 T5=0.0958 pLS=0.0681\n", + "Epoch 135/200: JointLoss=0.1644 T5=0.0957 pLS=0.0687\n", + "Epoch 136/200: JointLoss=0.1639 T5=0.0957 pLS=0.0682\n", + "Epoch 137/200: JointLoss=0.1645 T5=0.0957 pLS=0.0687\n", + "Epoch 138/200: JointLoss=0.1639 T5=0.0957 pLS=0.0682\n", + "Epoch 139/200: JointLoss=0.1640 T5=0.0956 pLS=0.0684\n", + "Epoch 140/200: JointLoss=0.1643 T5=0.0957 pLS=0.0685\n", + "Epoch 141/200: JointLoss=0.1643 T5=0.0957 pLS=0.0687\n", + "Epoch 142/200: JointLoss=0.1639 T5=0.0958 pLS=0.0682\n", + "Epoch 143/200: JointLoss=0.1641 T5=0.0956 pLS=0.0685\n", + "Epoch 144/200: JointLoss=0.1635 T5=0.0956 pLS=0.0680\n", + "Epoch 145/200: JointLoss=0.1637 T5=0.0955 pLS=0.0682\n", + "Epoch 146/200: JointLoss=0.1640 T5=0.0955 pLS=0.0685\n", + "Epoch 147/200: JointLoss=0.1642 T5=0.0955 pLS=0.0687\n", + "Epoch 148/200: JointLoss=0.1634 T5=0.0955 pLS=0.0679\n", + "Epoch 149/200: JointLoss=0.1637 T5=0.0954 pLS=0.0683\n", + "Epoch 150/200: JointLoss=0.1637 T5=0.0956 pLS=0.0681\n", + "Epoch 151/200: JointLoss=0.1638 T5=0.0954 pLS=0.0684\n", + "Epoch 152/200: JointLoss=0.1632 T5=0.0954 pLS=0.0678\n", + "Epoch 153/200: JointLoss=0.1641 T5=0.0954 pLS=0.0687\n", + "Epoch 154/200: JointLoss=0.1630 T5=0.0954 pLS=0.0677\n", + "Epoch 155/200: JointLoss=0.1632 T5=0.0954 pLS=0.0679\n", + "Epoch 156/200: JointLoss=0.1632 T5=0.0953 pLS=0.0679\n", + "Epoch 157/200: JointLoss=0.1638 T5=0.0954 pLS=0.0683\n", + "Epoch 158/200: JointLoss=0.1634 T5=0.0954 pLS=0.0681\n", + "Epoch 159/200: JointLoss=0.1635 T5=0.0953 pLS=0.0682\n", + "Epoch 160/200: JointLoss=0.1636 T5=0.0953 pLS=0.0683\n", + "Epoch 161/200: JointLoss=0.1629 T5=0.0953 pLS=0.0676\n", + "Epoch 162/200: JointLoss=0.1632 T5=0.0953 pLS=0.0679\n", + "Epoch 163/200: JointLoss=0.1637 T5=0.0952 pLS=0.0685\n", + "Epoch 164/200: JointLoss=0.1623 T5=0.0952 pLS=0.0671\n", + "Epoch 165/200: JointLoss=0.1630 T5=0.0952 pLS=0.0678\n", + "Epoch 166/200: JointLoss=0.1630 T5=0.0952 pLS=0.0678\n", + "Epoch 167/200: JointLoss=0.1628 T5=0.0952 pLS=0.0676\n", + "Epoch 168/200: JointLoss=0.1628 T5=0.0951 pLS=0.0677\n", + "Epoch 169/200: JointLoss=0.1629 T5=0.0951 pLS=0.0678\n", + "Epoch 170/200: JointLoss=0.1633 T5=0.0951 pLS=0.0682\n", + "Epoch 171/200: JointLoss=0.1628 T5=0.0951 pLS=0.0676\n", + "Epoch 172/200: JointLoss=0.1624 T5=0.0950 pLS=0.0674\n", + "Epoch 173/200: JointLoss=0.1625 T5=0.0950 pLS=0.0675\n", + "Epoch 174/200: JointLoss=0.1626 T5=0.0950 pLS=0.0676\n", + "Epoch 175/200: JointLoss=0.1627 T5=0.0950 pLS=0.0677\n", + "Epoch 176/200: JointLoss=0.1624 T5=0.0950 pLS=0.0675\n", + "Epoch 177/200: JointLoss=0.1623 T5=0.0949 pLS=0.0674\n", + "Epoch 178/200: JointLoss=0.1629 T5=0.0949 pLS=0.0680\n", + "Epoch 179/200: JointLoss=0.1627 T5=0.0950 pLS=0.0677\n", + "Epoch 180/200: JointLoss=0.1625 T5=0.0950 pLS=0.0675\n", + "Epoch 181/200: JointLoss=0.1622 T5=0.0950 pLS=0.0673\n", + "Epoch 182/200: JointLoss=0.1629 T5=0.0950 pLS=0.0678\n", + "Epoch 183/200: JointLoss=0.1626 T5=0.0950 pLS=0.0676\n", + "Epoch 184/200: JointLoss=0.1623 T5=0.0948 pLS=0.0674\n", + "Epoch 185/200: JointLoss=0.1624 T5=0.0949 pLS=0.0675\n", + "Epoch 186/200: JointLoss=0.1628 T5=0.0948 pLS=0.0680\n", + "Epoch 187/200: JointLoss=0.1620 T5=0.0949 pLS=0.0671\n", + "Epoch 188/200: JointLoss=0.1620 T5=0.0948 pLS=0.0672\n", + "Epoch 189/200: JointLoss=0.1620 T5=0.0948 pLS=0.0672\n", + "Epoch 190/200: JointLoss=0.1619 T5=0.0948 pLS=0.0671\n", + "Epoch 191/200: JointLoss=0.1623 T5=0.0948 pLS=0.0675\n", + "Epoch 192/200: JointLoss=0.1628 T5=0.0948 pLS=0.0680\n", + "Epoch 193/200: JointLoss=0.1621 T5=0.0948 pLS=0.0673\n", + "Epoch 194/200: JointLoss=0.1618 T5=0.0948 pLS=0.0671\n", + "Epoch 195/200: JointLoss=0.1620 T5=0.0947 pLS=0.0673\n", + "Epoch 196/200: JointLoss=0.1615 T5=0.0947 pLS=0.0668\n", + "Epoch 197/200: JointLoss=0.1627 T5=0.0947 pLS=0.0680\n", + "Epoch 198/200: JointLoss=0.1621 T5=0.0947 pLS=0.0674\n", + "Epoch 199/200: JointLoss=0.1617 T5=0.0947 pLS=0.0669\n", + "Epoch 200/200: JointLoss=0.1619 T5=0.0946 pLS=0.0673\n" + ] + } + ], + "source": [ + "num_epochs = 200\n", + "\n", + "for epoch in range(1, num_epochs+1):\n", + " embed_t5.train(); embed_pls.train()\n", + " total_loss = 0.0\n", + " total_t5 = 0.0\n", + " total_pls = 0.0\n", + "\n", + " # zip will stop at the shorter loader; you can also use itertools.cycle if needed\n", + " for (l, r, y0, w0), (p5, t5f, y1, w1) in zip(train_t5_loader, train_pls_loader):\n", + " # to device\n", + " l = l.to(device); r = r.to(device)\n", + " y0_ = y0.to(device); w0_ = w0.to(device)\n", + " p5 = p5.to(device); t5f_ = t5f.to(device)\n", + " y1_ = y1.to(device); w1_ = w1.to(device)\n", + "\n", + " # --- T5–T5 forward & loss ---\n", + " e_l = embed_t5(l); e_r = embed_t5(r)\n", + " d0 = torch.sqrt(((e_l-e_r)**2).sum(1,keepdim=True) + 1e-6)\n", + " loss0 = criterion(d0, y0_, w0_)\n", + "\n", + " # --- pLS-T5 forward & loss ---\n", + " e_p5 = embed_pls(p5)\n", + " e_t5 = embed_t5(t5f_)\n", + " d1 = torch.sqrt(((e_p5-e_t5)**2).sum(1,keepdim=True) + 1e-6)\n", + " loss1 = criterion(d1, y1_, w1_)\n", + "\n", + " loss = loss0 + loss1\n", + " optimizer.zero_grad()\n", + " loss.backward()\n", + " optimizer.step()\n", + "\n", + " total_loss += loss.item()\n", + " total_t5 += loss0.item()\n", + " total_pls += loss1.item()\n", + "\n", + " avg_loss = total_loss / len(train_pls_loader)\n", + " avg_t5 = total_t5 / len(train_t5_loader)\n", + " avg_pls = total_pls / len(train_pls_loader)\n", + " print(f\"Epoch {epoch}/{num_epochs}: JointLoss={avg_loss:.4f} \"\n", + " f\"T5={avg_t5:.4f} pLS={avg_pls:.4f}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "T5-T5 pairs: 200000 distances\n", + " Range: min=0.0010, max=9.3701\n", + " Labels: similar=100000, dissimilar=100000\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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TVdZRyRiN5fHFI7c4chI/Hf/AP8AQRwU9/p6WtqqaWNsbi9kMh3O5iRy861URAURcU9I9atRFxT0j1oLREQEREBERAREQEREBQO/O6I96tQO/O6I96C0REBERAREQEREBERAUS8UdIdatRLxR0h1oLREQEREBERAREQEREBERBEXFPSPWrURcU9I9atAREQEREBERAREQEREEDvzuiPerUDvzuiPerQFhVf18tXm2s/MplurCq/r5avNtZ+ZTIN1ERAREQEREBERAWFpB9M6Necn/pZ1urC0g+mdGvOT/wBLOg3UREES8QdIda8ho9UTUuhVu7HfqST1JYCADwvd8F6usdqUr3cwyvOaKvpm6P2WlnhMkkhkkiIG5hDnHP4rmL/56oibXmI9TC/9FMzF7RM+j1SIi6CIiAuCsrIKCmfU1MgZGwZJPV96VlZBQUr6mpkDI2DeT1Dyro0zGX2khqa+g2YZIZIWPdnI5CR7kCCOK/UtPVV1C6MRyF8Ub3ZyOQke4rVREBERAURcU9I9atRFxT0j1oLREQEREBERAREQEREBQO/O6I96tQO/O6I96C0REBERAREQEREBERAUS8UdIdatRLxR0h1oLREQEREBERAREQEREBERBEXFPSPWrURcU9I9atAREQEREBERAREQEREEDvzuiPerUDvzuiPerQFhVf18tXm2s/MplurCq/r5avNtZ+ZTIN1ERAREQEREBERAWFpB9M6Necn/AKWdbqwtIPpnRrzk/wDSzoN1ERB1Lo7UtlQ7mjJWHopRF9stVXtG6sNO5upy5LjvWxfTq2Kudu3QPO/7liaFRP2G1cxwa2mhawkcORk4/uuYtuzpiYveqOkTLuHftJmJ2Uz1mIeqREXXBcFZWQUFK+pqZAyNg3nn8g8qVtbT2+lfU1MgZGwbzz+QeVdKiDrzSNnuVAxjRLtIGP3uA5CRzoFI0XukjqLjQNjDZdpAx5ycchI9y1ERAREQEREBRFxT0j1q1EXFPSPWgtERAREQEREBERAREQFA787oj3q1A787oj3oLREQEREBERAREQEREBRLxR0h1q1EvFHSHWgtERAREQEREBERAREQEREERcU9I9atRFxT0j1q0BERAREQEREBERAREQQO/O6I96tQO/O6I96tAWFV/Xy1ebaz8ymW6sKr+vlq821n5lMg3UREBERAREQE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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "T5-T5 AUC (embedding) = 0.9628\n", + "T5-T5 AUC (ΔR²) = 0.8506\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.metrics import roc_curve, auc\n", + "import torch\n", + "\n", + "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n", + "embed_t5.eval()\n", + "\n", + "# 1) collect distances and labels\n", + "dist_t5_all = []\n", + "lbl_t5_all = []\n", + "\n", + "with torch.no_grad():\n", + " for x_left, x_right, y, _ in test_t5_loader:\n", + " x_left = x_left.to(device)\n", + " x_right = x_right.to(device)\n", + "\n", + " e_l = embed_t5(x_left)\n", + " e_r = embed_t5(x_right)\n", + " d = torch.sqrt(((e_l - e_r) ** 2).sum(dim=1, keepdim=True) + 1e-6)\n", + "\n", + " dist_t5_all.append(d.cpu().numpy().flatten())\n", + " lbl_t5_all .append(y.numpy().flatten())\n", + "\n", + "dist_t5_all = np.concatenate(dist_t5_all)\n", + "lbl_t5_all = np.concatenate(lbl_t5_all)\n", + "\n", + "print(f\"T5-T5 pairs: {len(dist_t5_all)} distances\")\n", + "print(f\" Range: min={dist_t5_all.min():.4f}, max={dist_t5_all.max():.4f}\")\n", + "print(f\" Labels: similar={(lbl_t5_all==0).sum()}, dissimilar={(lbl_t5_all==1).sum()}\")\n", + "\n", + "# 2) histogram of distances\n", + "plt.figure(figsize=(10,6))\n", + "bins = np.linspace(0, 7.5, 100)\n", + "plt.hist(dist_t5_all[lbl_t5_all==0], bins=bins, density=True, alpha=0.6, label='Duplicates (0)')\n", + "plt.hist(dist_t5_all[lbl_t5_all==1], bins=bins, density=True, alpha=0.6, label='Non-Duplicates (1)')\n", + "plt.yscale('log')\n", + "plt.xlabel(\"Euclidean Distance\")\n", + "plt.ylabel(\"Density\")\n", + "plt.title(\"T5-T5 Embedding Distance Distribution (Test Set)\")\n", + "plt.legend()\n", + "plt.grid(alpha=0.3)\n", + "plt.xlim(0,7.5)\n", + "plt.show()\n", + "\n", + "# ------------------------------------------------------------------\n", + "# ΔR² baseline for the same test split\n", + "# ------------------------------------------------------------------\n", + "phi_left = np.arctan2(X_left_test[:, 2], X_left_test[:, 1])\n", + "phi_right = np.arctan2(X_right_test[:, 2], X_right_test[:, 1])\n", + "eta_left = X_left_test[:, 0] * eta_max # undo η‑normalisation\n", + "eta_right = X_right_test[:, 0] * eta_max\n", + "\n", + "dphi = (phi_left - phi_right + np.pi) % (2*np.pi) - np.pi\n", + "deta = eta_left - eta_right\n", + "dRsq = dphi**2 + deta**2\n", + "\n", + "# 3) ROC curves: embedding vs ΔR² baseline\n", + "fpr_t5, tpr_t5, _ = roc_curve(lbl_t5_all, -dist_t5_all, pos_label=0)\n", + "fpr_dr, tpr_dr, _ = roc_curve(lbl_t5_all, -dRsq, pos_label=0)\n", + "\n", + "auc_t5 = auc(fpr_t5, tpr_t5)\n", + "auc_dr = auc(fpr_dr, tpr_dr)\n", + "\n", + "plt.figure(figsize=(7,7))\n", + "plt.plot(fpr_t5, tpr_t5, label=f\"Embedding distance (AUC={auc_t5:.3f})\")\n", + "plt.plot(fpr_dr, tpr_dr, '--', label=f\"ΔR² baseline (AUC={auc_dr:.3f})\")\n", + "plt.plot([0,1],[0,1], '--', color='grey')\n", + "plt.xlabel(\"False Positive Rate\")\n", + "plt.ylabel(\"True Positive Rate\")\n", + "plt.title(\"T5-T5 Duplicate Discrimination\")\n", + "plt.legend()\n", + "plt.grid(alpha=0.3)\n", + "plt.show()\n", + "\n", + "print(f\"T5-T5 AUC (embedding) = {auc_t5:.4f}\")\n", + "print(f\"T5-T5 AUC (ΔR²) = {auc_dr :.4f}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "pLS-T5 pairs: 200000 distances\n", + " Range: min=0.0088, max=8.3679\n", + " Labels: similar=100000, dissimilar=100000\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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jpDrWDonvkvbue6TDqVafkq7Eq/np7XoURFJUREQF0aiOlrbhDE+VxmpTtdmODfuBK7yz7fRyw1lbVVAGvPJ3GDnuANyjczM004zEzr2e+FbeIias4mI0/eDQREVkhERAURcU9I9atRFxT0j1oLREQEREBERAREQEREBQO/O6I96tQO/O6I96C0REBERAREQF84F9WLSVdddrlt4damt1O4t7puHVDuA7jwAf48gKKurbtcdvT5gtsJLcub3VQ7g5eAD/Hk2QABgAAeROBfUBRLxR0h1q1EvFHSHWgtERAREQEREBERAREQEREERcU9I9atRFxT0j1q0BERAREQEREBERAREQQO/O6I96tQO/O6I96tAWFV/Xy1ebaz8ymW6sKr+vlq821n5lMg3UREBeZ0kq5ZWUwab9DAXysljttNl79VwAJdglrTvILcZBzlemXh9IblWUmkVNco9J7BQ0TY6inhbWNcSXB0YkBxIA4hzCM7tXgwc5Aa+isdrjbVfw6zV1A8lhmlroXtknO/GXvJc/G/hO7PlXoV5nROrjuNbcK86Q2+7VD2QxvbQN1Y4WtLy3druOSXO355BzL0yAiIgLC0g+mdGvOT/ANLOt1YWkH0zo15yf+lnQbqIiCJeKOkOtYOiG+K7O8K6Tn/lW9LxR0h1rB0N30Fc7wrhMfxCrT8lXYlVzlPa9CiIpKiIiDoXqpNJaaiRpOuW6rccOTu967FHC6nooYXuLnMYA4k5JPKuCqrXxXKko42tdt9YyZ/stA4V3lCnFV2qqJ3aefnC1WabcU436+XqIiK6IiIgKIuKeketWoi4p6R60FoiICIiAiIgIiICIiAoHfndEe9WoHfndEe9BaIiAiIgIixYZLhdLrtRtaOgpXkAEYdO4bjkeD/j7gU1RX3W6baPaUlvpnkAObh07huOQeBv+Pu2kRAREQFEvFHSHWrUS8UdIdaC0REBERAREQEREBERAREQRFxT0j1q1EXFPSPWrQEREBERAREQEREBERBA787oj3q1A787oj3q0BYVX9fLV5trPzKZbqwqv6+WrzbWfmUyDdREQF5zSe9vsVTSyvhMlK+CoJDYS8vnAaY49wOC7L/vIXo15jS6vdS1VugqbpLabZOZOyayLDSHgN1GF5BDA7Ljn/Vxneg5NF5brHW1tvutSyqkhhp5TK2Fseo94frR9zuI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u8g5lrgAAADAHAAgAaAAAAOABfUBQO/O6I96tQO/O6I96C0REBERAREQEREBERAUS8UdIdatRLxR0h1oLREQEREBERAREQEREBERBEXFPSPWrURcU9I9atAREQEREBERAREQEREEDvzuiPerUDvzuiPerQFhVf18tXm2s/MplurCq/r5avNtZ+ZTIN1ERAREQEREBERAWFpB9M6Necn/AKWdbqwtIPpnRrzk/wDSzoN1ERBl6SnGjVx/9u/qXJYBjR22j/8AEi/5AuHSg40YuH/oOXYsn0Db/wD2sf8AyhV/z7Uv9ex3l1bnP2NbKmYHBbG7B8uN34rtLpXOtdRxwCNjXvnmbEGu4N6812YpomZnD02oma4iIyq1xujtdM17i5+zaXFxyckZXbXxfVqinZpinqZqq2qpq6xERaZEREBERAURcU9I9atRFxT0j1oLREQEREBcc88VNC+aeRscbBlznHcEnqIqWB888gjjYMuc7gCzKq2G8VkM89Q2W3NaHxwt4JHc7ucf4+8FXbH3euilqJ2SW1jQ+OFn/iO53c4/x9+sAAAAMAcACAAAADAHIvqAiIgKB353RHvVqB353RHvQWiIgIiICIiAiIgIiICiXijpDrVqJeKOkOtBaIiAiIgIiICIiAiIgIiIIi4p6R61aiLinpHrVoCIiAiIgIiICIiAiIggd+d0R71agd+d0R71aAsKr+vlq821n5lMt1YVX9fLV5trPzKZBuoiICIiAiIgIiICwtIPpnRrzk/9LOt1YWkH0zo15yf+lnQbqIiDI0rONF7h/wCiV27Rus1Dux/V493/AMQulpccaK1//pe8Lv2vdaqPdj+gZu/+IVf8+1L/AFng7S6VVHS1Fwpo5ZXCeEmVjBwHkydy7qz46SY36askaNmIBHGc8O/JXlu5mIjGcz7vVaxEzOcYhoIiKqQiIgIiICIiAoi4p6R61aiLinpHrQWiIgLiqKiGlgfPPII42DLnHkSoqIaSnfPPII42DLnHkWdPb473PTVclQZKBrA9lPq4D3chdzjHIg+VNtbeqqnqZagS29rA9kAGA93O7nGORawAAwBgBAABgDAC+oCIiAiIgKB353RHvVqB353RHvQWiIgIiICIiAiIgIiICiXijpDrVqJeKOkOtBaIiAiIgIiICIiAiIgIiIIi4p6R61aiLinpHrVoCIiAiIgI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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "pLS-T5 AUC (embedding) = 0.9841\n", + "pLS-T5 AUC (ΔR²) = 0.8449\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.metrics import roc_curve, auc\n", + "import torch\n", + "\n", + "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n", + "embed_pls.eval(); embed_t5.eval()\n", + "\n", + "# 1) collect distances and labels ------------------------------------\n", + "dist_pls_all = []\n", + "lbl_pls_all = []\n", + "\n", + "with torch.no_grad():\n", + " for pls_feats, t5_feats, y, _ in test_pls_loader:\n", + " pls_feats = pls_feats.to(device)\n", + " t5_feats = t5_feats.to(device)\n", + "\n", + " e_p = embed_pls(pls_feats)\n", + " e_t = embed_t5(t5_feats)\n", + " d = torch.sqrt(((e_p - e_t) ** 2).sum(dim=1, keepdim=True) + 1e-6)\n", + "\n", + " dist_pls_all.append(d.cpu().numpy().flatten())\n", + " lbl_pls_all .append(y.numpy().flatten())\n", + "\n", + "dist_pls_all = np.concatenate(dist_pls_all)\n", + "lbl_pls_all = np.concatenate(lbl_pls_all)\n", + "\n", + "print(f\"pLS-T5 pairs: {len(dist_pls_all)} distances\")\n", + "print(f\" Range: min={dist_pls_all.min():.4f}, max={dist_pls_all.max():.4f}\")\n", + "print(f\" Labels: similar={(lbl_pls_all==0).sum()}, dissimilar={(lbl_pls_all==1).sum()}\")\n", + "\n", + "# 2) histogram of distances ------------------------------------------\n", + "plt.figure(figsize=(10,6))\n", + "bins = np.linspace(0, dist_pls_all.max(), 100)\n", + "plt.hist(dist_pls_all[lbl_pls_all==0], bins=bins, density=True, alpha=0.6, label='Duplicates (0)')\n", + "plt.hist(dist_pls_all[lbl_pls_all==1], bins=bins, density=True, alpha=0.6, label='Non-Duplicates (1)')\n", + "plt.yscale('log')\n", + "plt.xlabel(\"Euclidean Distance\")\n", + "plt.ylabel(\"Density\")\n", + "plt.title(\"pLS-T5 Embedding Distance Distribution (Test Set)\")\n", + "plt.legend()\n", + "plt.grid(alpha=0.3)\n", + "plt.xlim(left=0)\n", + "plt.show()\n", + "\n", + "# --------------------------------------------------------------------\n", + "# ΔR² baseline for the same pLS-T5 pairs\n", + "# --------------------------------------------------------------------\n", + "# — recover φ and η for the raw feature arrays used in the split\n", + "phi_left = np.arctan2(X_pls_test[:, 3], X_pls_test[:, 2]) # pLS: sinφ, cosφ\n", + "phi_right = np.arctan2(X_t5raw_test[:, 2], X_t5raw_test[:, 1]) # T5 : sinφ, cosφ\n", + "eta_left = X_pls_test[:, 0] * 4.0 # pLS stored η/4\n", + "eta_right = X_t5raw_test[:, 0] * eta_max # T5 stored η/η_max\n", + "\n", + "dphi = (phi_left - phi_right + np.pi) % (2*np.pi) - np.pi\n", + "deta = eta_left - eta_right\n", + "dRsq = dphi**2 + deta**2\n", + "\n", + "# 3) ROC curves: embedding vs ΔR² baseline ---------------------------\n", + "fpr_pls, tpr_pls, _ = roc_curve(lbl_pls_all, -dist_pls_all, pos_label=0)\n", + "fpr_dr, tpr_dr, _ = roc_curve(lbl_pls_all, -dRsq, pos_label=0)\n", + "\n", + "auc_pls = auc(fpr_pls, tpr_pls)\n", + "auc_dr = auc(fpr_dr, tpr_dr)\n", + "\n", + "plt.figure(figsize=(7,7))\n", + "plt.plot(fpr_pls, tpr_pls, label=f\"Embedding distance (AUC={auc_pls:.3f})\")\n", + "plt.plot(fpr_dr, tpr_dr, '--', label=f\"ΔR² baseline (AUC={auc_dr:.3f})\")\n", + "plt.plot([0,1],[0,1], '--', color='grey')\n", + "plt.xlabel(\"False Positive Rate\")\n", + "plt.ylabel(\"True Positive Rate\")\n", + "plt.title(\"pLS-T5 Duplicate Discrimination\")\n", + "plt.legend()\n", + "plt.grid(alpha=0.3)\n", + "plt.show()\n", + "\n", + "print(f\"pLS-T5 AUC (embedding) = {auc_pls:.4f}\")\n", + "print(f\"pLS-T5 AUC (ΔR²) = {auc_dr :.4f}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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iAIiIAiIgCIiAIiIAiIgKK3+Q1H9k75lzWjmFzzQaK4q10YgpsE1L2knMXPbCRbZa3YG+3curIBFiLgrxjGxsaxjQ1rRZrQLADcgOCw7uOGf/wDVVnz1K6fSmgnr8DeKRmeqppYqqBl7Z3xPa8N+HLb4VtnRseWl7GuLDmbcXseK46SpIDUQ4bO7Sp+NXa2CXD46cMdcSBwe5xuLWtZw7/HdanBtE62g9hhUTQFtDh9RSzatziS6RzCC24FxZpve3eXWogNNotQ4lhWB02F4gyltRQsgilp5XO1rWttmcC0ZTsGwE+Vamv0YxeWPFsLo56NuF4xM6SaSQu10AeAJWtaBZ17Egki2bvrr0QGkdQTVGmFPVGIspMOonxxOPE+SVzb2962MfH5lu0RAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAf/9k=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "80%-cut: { 0.7500, 0.7157, 0.8290, 0.7859, 0.5760, 0.7363, 0.8485, 0.7521, 0.8651, 0.7823 }\n", + " 80%-dupRej: { 99.72, 99.91, 99.99, 100.00, 99.32, 99.79, 99.98, 99.98, 100.00, 99.96 }\n", + "\n", + "85%-cut: { 0.4784, 0.4244, 0.4582, 0.4780, 0.3489, 0.4531, 0.6046, 0.5467, 0.7308, 0.6212 }\n", + " 85%-dupRej: { 97.70, 97.73, 98.93, 99.37, 94.70, 98.38, 99.78, 99.85, 99.99, 99.94 }\n", + "\n", + "90%-cut: { 0.2828, 0.2564, 0.2455, 0.2436, 0.2165, 0.2341, 0.3319, 0.3083, 0.5202, 0.3934 }\n", + " 90%-dupRej: { 86.86, 86.76, 88.39, 88.78, 80.79, 86.81, 96.93, 97.47, 99.98, 99.75 }\n", + "\n", + "93%-cut: { 0.2099, 0.1888, 0.1812, 0.1762, 0.1545, 0.1689, 0.1928, 0.1924, 0.3598, 0.2653 }\n", + " 93%-dupRej: { 74.86, 73.33, 75.25, 74.98, 65.50, 74.41, 86.06, 88.83, 99.51, 99.15 }\n", + "\n", + "95%-cut: { 0.1606, 0.1497, 0.1458, 0.1352, 0.1203, 0.1276, 0.1388, 0.1420, 0.2438, 0.1531 }\n", + " 95%-dupRej: { 61.36, 61.87, 63.02, 61.07, 53.07, 60.37, 73.90, 78.00, 97.45, 94.13 }\n", + "\n", + "98%-cut: { 0.0707, 0.0668, 0.0780, 0.0626, 0.0576, 0.0611, 0.0709, 0.0693, 0.0902, 0.0780 }\n", + " 98%-dupRej: { 29.90, 29.93, 34.55, 28.60, 22.59, 28.33, 41.12, 43.23, 78.52, 75.67 }\n", + "\n", + "99%-cut: { 0.0295, 0.0361, 0.0456, 0.0385, 0.0311, 0.0358, 0.0398, 0.0428, 0.0487, 0.0475 }\n", + " 99%-dupRej: { 12.00, 16.02, 18.15, 17.00, 10.03, 14.39, 20.70, 24.96, 51.34, 54.98 }\n", + "\n", + "dR2-eff (%): { 82.59, 81.36, 83.79, 84.30, 81.07, 82.90, 86.46, 86.12, 88.86, 86.92 }\n", + "dR2-dupRej (%): { 60.04, 61.89, 60.02, 67.76, 66.91, 72.09, 64.35, 57.53, 79.67, 100.00 }\n" + ] + } + ], + "source": [ + "import numpy as np, torch, matplotlib.pyplot as plt\n", + "from matplotlib.colors import LogNorm\n", + "\n", + "percentiles = [80, 85, 90, 93, 95, 98, 99] # keep this % of non‑duplicates\n", + "eta_edges = np.arange(0.0, 2.75, 0.25) # |η| binning\n", + "dr2_threshold = 1.0e-3 # ΔR² cut\n", + "\n", + "eta_L = X_left_test[:, 0] * eta_max\n", + "phi_L = np.arctan2(X_left_test[:, 2], X_left_test[:, 1])\n", + "eta_R = X_right_test[:, 0] * eta_max\n", + "phi_R = np.arctan2(X_right_test[:, 2], X_right_test[:, 1])\n", + "\n", + "abs_eta = np.abs(eta_L)\n", + "\n", + "deta = eta_L - eta_R\n", + "dphi = (phi_R - phi_L + np.pi) % (2*np.pi) - np.pi\n", + "dR2 = deta**2 + dphi**2 # ΔR² baseline\n", + "\n", + "embed_t5.eval()\n", + "with torch.no_grad():\n", + " L = torch.from_numpy(X_left_test.astype(np.float32)).to(device)\n", + " R = torch.from_numpy(X_right_test.astype(np.float32)).to(device)\n", + " dist = torch.sqrt(((embed_t5(L) - embed_t5(R))**2).sum(dim=1) + 1e-6) \\\n", + " .cpu().numpy()\n", + "\n", + "y_test = y_t5_test # shorthand\n", + "\n", + "cut_vals = {p: [] for p in percentiles}\n", + "dup_rej = {p: [] for p in percentiles}\n", + "dr2_eff = []\n", + "dr2_rejdup = []\n", + "\n", + "for lo, hi in zip(eta_edges[:-1], eta_edges[1:]):\n", + " nnd = (abs_eta >= lo) & (abs_eta < hi) & (y_test == 1) # non‑dups\n", + " dup = (abs_eta >= lo) & (abs_eta < hi) & (y_test == 0) # dups\n", + "\n", + " # ΔR² metrics\n", + " dr2_eff .append(np.mean(dR2[nnd] >= dr2_threshold)*100 if np.any(nnd) else np.nan)\n", + " dr2_rejdup.append(np.mean(dR2[dup] < dr2_threshold)*100 if np.any(dup) else np.nan)\n", + "\n", + " # embedding‑distance cuts\n", + " for p in percentiles:\n", + " cut = np.percentile(dist[nnd], 100-p) if np.any(nnd) else np.nan\n", + " cut_vals[p].append(cut)\n", + " dup_rej[p].append(np.mean(dist[dup] < cut)*100 if (np.any(dup) and not np.isnan(cut)) else np.nan)\n", + "\n", + "fig, ax = plt.subplots(figsize=(10,6))\n", + "h = ax.hist2d(abs_eta[y_test==1], dist[y_test==1],\n", + " bins=[eta_edges, 50], norm=LogNorm())\n", + "fig.colorbar(h[3], ax=ax, label='Counts')\n", + "ax.set_xlabel('|η| (hit 0)')\n", + "ax.set_ylabel('Embedding distance')\n", + "ax.set_title('T5-T5 • Embedding distance vs |η| (test non‑duplicates)')\n", + "\n", + "mid_eta = eta_edges[:-1] + 0.5*np.diff(eta_edges)\n", + "for p, clr in zip(percentiles, plt.cm.rainbow(np.linspace(0,1,len(percentiles)))):\n", + " ax.plot(mid_eta, cut_vals[p], '-o', color=clr, label=f'{p}% retention')\n", + "ax.legend(); ax.grid(alpha=0.3); plt.show()\n", + "\n", + "for p in percentiles:\n", + " cuts = \", \".join(f\"{v:.4f}\" if not np.isnan(v) else \"nan\" for v in cut_vals[p])\n", + " rejs = \", \".join(f\"{v:.2f}\" if not np.isnan(v) else \"nan\" for v in dup_rej[p])\n", + " print(f\"{p}%-cut: {{ {cuts} }}\")\n", + " print(f\" {p}%-dupRej: {{ {rejs} }}\")\n", + " print()\n", + "eff = \", \".join(f\"{v:.2f}\" if not np.isnan(v) else \"nan\" for v in dr2_eff)\n", + "rej = \", \".join(f\"{v:.2f}\" if not np.isnan(v) else \"nan\" for v in dr2_rejdup)\n", + "print(f\"dR2-eff (%): {{ {eff} }}\")\n", + "print(f\"dR2-dupRej (%): {{ {rej} }}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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tiSLZm7HAHaNinotW1GJaLYbW1cmsqJ6Zj5H5QMziNpsNiA2yLmItKBSYLimkOIOlfQRVroII4YwXNY2QQ37xN3hx4+K1hvsqdLQMPxYsoamjr6ChfVxwVsYGsaGmzhlcbi4sRcEd+yA6NFqMRxmag0SkxltNr5o6UTaptwCbA85sOPv7AqMBr6/FGvkdjGEV1M6PZJhrTmjeeLje4HZfjtxcSA3yLU6M4jPiWCsfVkOq4JZKaoIFg6SN5Y42718t/jW2QBYOIYJhOLOY7E8Lo60xghhqadkmW/HbMDbiWciAxIMJw2ma1tPh9LE1sRhaI4WtAjJuWCw7m+23Eo0GD4XhZecOw2kozJ3Zp4Gx5vHYC6zUQBERAEREAREQBERAEREAREQFFZRUuIUr6WtpoaqnktnimjD2Osbi4Ow7QD8SxqPR/BcObK2hwigpRO3JKIKZjNY3c6w2jmK2CIDDqcIwytpYqWrw6kqKeG2rilga5jLCwsCLCwWUxjY2NYxoa1osGgWACkiAIiIAiIgCIiAIiIAiIgCIiA1dZozgGIVT6qtwPDqqoktnlmpI3vdYWFyRc7AB8SzTQ0Zk1hpYS/VanNqxfV8i/J5uJXogMKgwfC8LLzh2G0lGZO7NPA2PN47AXWaiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAuQxPDpsXxLS3DadzGzVeFU8LHSEhoc4TgXsCbbdy69REbA90gY0PcAHOA2kDi+coDnKthj06wBhtduHVYNvfQLI0I9hGDf9pH8y3qiyNkTGxxsaxjRYNaLABAcHjtBVYdoNjGGZTE1mJMfSzEXa5ktSyQHnyue5pH5POtlVaPYzizsUqcRdQxVE+Fy4fSxwPe5gz7S97i0EXIbsANgDtK6xEBz9A3SuCiZTS0mDx6mAMjkbVyyXcAALt1bdh29/ZzrHocDxBukjcdraXD6J0NNJE6PD3Oe6pLi03e4tbe2XYLHaTtXUIgNNotQT0GCA1bNXVVU0tXOy/cOleX5fiDgPiW5REAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREB//2Q==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "80%-cut: { 1.2148, 1.2650, 1.2205, 1.2616, 1.1129, 1.0813, 1.0149, 0.9455, 0.9041, 0.8713 }\n", + " 80%-dupRej: { 99.66, 99.53, 99.57, 99.65, 99.56, 99.34, 99.32, 99.30, 99.10, 98.83 }\n", + "\n", + "85%-cut: { 1.0926, 1.0790, 1.0945, 1.1082, 0.9875, 0.9557, 0.9144, 0.8474, 0.8093, 0.7884 }\n", + " 85%-dupRej: { 99.52, 99.47, 99.46, 99.60, 99.41, 99.23, 99.11, 99.08, 98.79, 98.54 }\n", + "\n", + "90%-cut: { 0.9235, 0.8974, 0.9061, 0.9431, 0.8262, 0.7998, 0.7714, 0.7017, 0.6749, 0.6624 }\n", + " 90%-dupRej: { 99.11, 99.41, 99.03, 99.45, 98.94, 98.76, 98.76, 98.37, 98.30, 97.80 }\n", + "\n", + "93%-cut: { 0.7818, 0.7592, 0.7619, 0.7966, 0.6664, 0.6611, 0.6185, 0.5782, 0.5612, 0.5447 }\n", + " 93%-dupRej: { 97.87, 98.64, 97.87, 99.10, 97.72, 98.07, 97.66, 97.24, 97.33, 96.75 }\n", + "\n", + "95%-cut: { 0.6895, 0.6259, 0.6505, 0.6696, 0.5185, 0.5541, 0.5027, 0.4781, 0.4756, 0.4521 }\n", + " 95%-dupRej: { 96.49, 96.98, 96.94, 98.05, 94.25, 96.28, 95.87, 95.32, 95.91, 94.72 }\n", + "\n", + "98%-cut: { 0.4357, 0.3546, 0.3739, 0.3725, 0.2935, 0.3055, 0.2850, 0.2730, 0.2905, 0.2745 }\n", + " 98%-dupRej: { 85.77, 81.32, 86.12, 87.86, 72.88, 79.37, 78.92, 78.19, 83.43, 79.32 }\n", + "\n", + "99%-cut: { 0.3393, 0.2935, 0.2546, 0.2589, 0.2065, 0.1938, 0.1934, 0.1916, 0.2027, 0.2033 }\n", + " 99%-dupRej: { 73.81, 70.23, 62.97, 68.47, 48.77, 50.49, 54.41, 55.25, 63.36, 61.83 }\n", + "\n", + "dR2-eff (%): { 94.52, 95.01, 94.72, 94.36, 93.99, 94.94, 94.12, 94.06, 94.33, 94.78 }\n", + "dR2-dupRej (%): { 10.31, 10.74, 13.45, 17.64, 14.03, 25.99, 24.42, 22.89, 39.78, 47.25 }\n" + ] + } + ], + "source": [ + "import numpy as np, torch, matplotlib.pyplot as plt\n", + "from matplotlib.colors import LogNorm\n", + "\n", + "percentiles = [80, 85, 90, 93, 95, 98, 99]\n", + "eta_edges = np.arange(0.0, 2.75, 0.25)\n", + "dr2_threshold = 1.0e-3\n", + "\n", + "eta_L = X_pls_test[:, 0] * 4.0 # pLS η was stored as η/4\n", + "phi_L = np.arctan2(X_pls_test[:, 3], X_pls_test[:, 2])\n", + "eta_R = X_t5raw_test[:, 0] * eta_max\n", + "phi_R = np.arctan2(X_t5raw_test[:, 2], X_t5raw_test[:, 1])\n", + "\n", + "abs_eta = np.abs(eta_L)\n", + "\n", + "deta = eta_L - eta_R\n", + "dphi = (phi_R - phi_L + np.pi) % (2*np.pi) - np.pi\n", + "dR2 = deta**2 + dphi**2\n", + "\n", + "embed_pls.eval(); embed_t5.eval()\n", + "with torch.no_grad():\n", + " L = torch.from_numpy(X_pls_test.astype(np.float32)).to(device)\n", + " R = torch.from_numpy(X_t5raw_test.astype(np.float32)).to(device)\n", + " dist = torch.sqrt(((embed_pls(L) - embed_t5(R))**2).sum(dim=1) + 1e-6) \\\n", + " .cpu().numpy()\n", + "\n", + "y_test = y_pls_test\n", + "\n", + "cut_vals = {p: [] for p in percentiles}\n", + "dup_rej = {p: [] for p in percentiles}\n", + "dr2_eff = []\n", + "dr2_rejdup = []\n", + "\n", + "for lo, hi in zip(eta_edges[:-1], eta_edges[1:]):\n", + " nnd = (abs_eta >= lo) & (abs_eta < hi) & (y_test == 1)\n", + " dup = (abs_eta >= lo) & (abs_eta < hi) & (y_test == 0)\n", + "\n", + " dr2_eff .append(np.mean(dR2[nnd] >= dr2_threshold)*100 if np.any(nnd) else np.nan)\n", + " dr2_rejdup.append(np.mean(dR2[dup] < dr2_threshold)*100 if np.any(dup) else np.nan)\n", + "\n", + " for p in percentiles:\n", + " cut = np.percentile(dist[nnd], 100-p) if np.any(nnd) else np.nan\n", + " cut_vals[p].append(cut)\n", + " dup_rej[p].append(np.mean(dist[dup] < cut)*100 if (np.any(dup) and not np.isnan(cut)) else np.nan)\n", + "\n", + "fig, ax = plt.subplots(figsize=(10,6))\n", + "h = ax.hist2d(abs_eta[y_test==1], dist[y_test==1],\n", + " bins=[eta_edges, 50], norm=LogNorm())\n", + "fig.colorbar(h[3], ax=ax, label='Counts')\n", + "ax.set_xlabel('|η| (pLS)')\n", + "ax.set_ylabel('Embedding distance')\n", + "ax.set_title('pLS-T5 • Embedding distance vs |η| (test non-duplicates)')\n", + "\n", + "mid_eta = eta_edges[:-1] + 0.5*np.diff(eta_edges)\n", + "for p, clr in zip(percentiles, plt.cm.rainbow(np.linspace(0,1,len(percentiles)))):\n", + " ax.plot(mid_eta, cut_vals[p], '-o', color=clr, label=f'{p}% retention')\n", + "ax.legend(); ax.grid(alpha=0.3); plt.show()\n", + "\n", + "for p in percentiles:\n", + " cuts = \", \".join(f\"{v:.4f}\" if not np.isnan(v) else \"nan\" for v in cut_vals[p])\n", + " rejs = \", \".join(f\"{v:.2f}\" if not np.isnan(v) else \"nan\" for v in dup_rej[p])\n", + " print(f\"{p}%-cut: {{ {cuts} }}\")\n", + " print(f\" {p}%-dupRej: {{ {rejs} }}\")\n", + " print()\n", + "eff = \", \".join(f\"{v:.2f}\" if not np.isnan(v) else \"nan\" for v in dr2_eff)\n", + "rej = \", \".join(f\"{v:.2f}\" if not np.isnan(v) else \"nan\" for v in dr2_rejdup)\n", + "print(f\"dR2-eff (%): {{ {eff} }}\")\n", + "print(f\"dR2-dupRej (%): {{ {rej} }}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "def print_formatted_weights_biases(weights, biases, layer_name):\n", + " # Print biases\n", + " print(f\"HOST_DEVICE_CONSTANT float bias_{layer_name}[{len(biases)}] = {{\")\n", + " print(\", \".join(f\"{b:.7f}f\" for b in biases) + \" };\")\n", + " print()\n", + "\n", + " # Print weights\n", + " print(f\"HOST_DEVICE_CONSTANT const float wgtT_{layer_name}[{len(weights[0])}][{len(weights)}] = {{\")\n", + " for row in weights.T:\n", + " formatted_row = \", \".join(f\"{w:.7f}f\" for w in row)\n", + " print(f\"{{ {formatted_row} }},\")\n", + " print(\"};\")\n", + " print()\n", + "\n", + "def print_model_weights_biases(model):\n", + " # Make sure the model is in evaluation mode\n", + " model.eval()\n", + "\n", + " # Iterate through all named modules in the model\n", + " for name, module in model.named_modules():\n", + " # Check if the module is a linear layer\n", + " if isinstance(module, nn.Linear):\n", + " # Get weights and biases\n", + " weights = module.weight.data.cpu().numpy()\n", + " biases = module.bias.data.cpu().numpy()\n", + "\n", + " # Print formatted weights and biases\n", + " print_formatted_weights_biases(weights, biases, name.replace('.', '_'))" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "HOST_DEVICE_CONSTANT float bias_fc1[32] = {\n", + "-0.1340593f, -0.9828863f, -0.5010322f, -0.2565299f, -0.9114241f, -0.2267123f, -0.3029281f, 0.1603906f, -0.0855007f, -1.5674509f, -0.2862165f, -0.1820142f, -0.9209892f, 0.3407668f, 0.6446100f, -0.8276196f, -0.2388848f, 0.5277666f, 0.4007535f, -0.8218219f, 0.1809824f, 0.1675569f, -0.3520412f, -0.7230482f, -0.5384940f, -0.7348397f, -0.0768758f, -0.1644568f, 0.1545210f, -0.1948077f, -0.4455988f, 0.6596652f };\n", + "\n", + "HOST_DEVICE_CONSTANT const float wgtT_fc1[10][32] = {\n", + "{ 2.5416601f, -0.0328223f, 2.2707686f, -1.0293980f, -0.0108615f, 0.0001905f, -0.0096710f, 0.0683880f, -0.0074608f, 0.0071239f, -3.3549898f, 0.1356739f, 0.0113838f, -0.1957042f, -0.2505387f, 0.0056074f, 0.0062737f, 0.0822115f, -0.3011822f, 0.0076654f, -0.0232170f, 0.0108539f, -0.0028272f, 1.7266624f, -2.1167483f, -0.0016584f, -0.1289798f, 2.1894405f, -0.2520899f, -0.2965456f, -0.0410584f, -0.2922559f },\n", + "{ 0.1457039f, -0.4586894f, -0.0268244f, 0.6341490f, -0.0096465f, 0.0986437f, -0.0534766f, -0.3335054f, -0.0610394f, -0.0446348f, 0.0846870f, -0.1076022f, -0.0298957f, 0.0158191f, 0.1662600f, -0.0638973f, 0.0049133f, 0.2975469f, 0.2025267f, 0.0538068f, -0.1046022f, -0.0169812f, 0.0198108f, 2.6794984f, -0.0040652f, -0.0224352f, -0.3215843f, -0.0036256f, -0.3061447f, 0.1376955f, -0.0510164f, 0.1884841f },\n", + "{ -0.0030831f, -0.3372852f, -0.0166195f, 1.5336628f, 2.7060704f, -0.0437477f, 1.0132277f, -0.1852904f, -1.2448947f, -1.5341446f, -0.0131641f, 0.2391158f, 0.0113307f, 0.1669618f, -0.2173352f, -0.5257770f, 1.9480581f, 0.1010766f, 0.3557915f, 1.6881727f, 0.0354072f, -0.1884732f, -2.5510240f, 0.4739791f, 0.0055504f, 1.1534007f, 0.0329746f, 0.0080900f, 0.2474189f, 0.2551234f, -0.9819525f, -0.1403632f },\n", + "{ -0.0036104f, 0.0356300f, -0.0059668f, -1.0046377f, 1.9088006f, 0.0076659f, -0.9931654f, -0.1988026f, -0.3962959f, 0.6151165f, -0.0060982f, 0.1049091f, 1.4861504f, 0.1062762f, -0.0311854f, -1.9524248f, -0.3105941f, -0.0259684f, -0.0618635f, 2.5692437f, 0.3061492f, -0.4483947f, 1.7864583f, -0.1686022f, -0.0096641f, -1.9978869f, -0.3446169f, -0.0137990f, 0.1149078f, 0.0974244f, 2.3347342f, -0.0812400f },\n", + "{ -0.2462796f, -0.4396048f, -0.0494715f, -1.3303740f, -0.2699632f, -1.1073607f, -0.1299932f, -0.1140520f, 0.0030989f, 0.1195869f, -0.2182885f, -0.2960219f, 0.0240108f, -0.8627685f, 0.5231963f, -0.0351020f, -0.1169347f, 1.1842072f, -0.6560344f, -0.3228459f, 0.6108676f, 0.3261251f, -0.4187594f, -2.2404015f, -0.0415614f, -0.2603707f, -0.1996082f, -0.1232701f, 0.0917548f, -0.2338118f, -0.2182314f, -0.3510370f },\n", + "{ -0.0714504f, 0.1694614f, -0.1212256f, 0.8605723f, -0.0601546f, 0.0809365f, 0.0608738f, 0.1864134f, 0.0192681f, 0.0161601f, -0.1131914f, 0.2012984f, 0.0180652f, -0.1780414f, -0.1193754f, 0.0181790f, -0.0114934f, -0.1083514f, -0.2870274f, -0.0809118f, -0.0054693f, -0.0340989f, -0.0014216f, 0.8288158f, 0.0135911f, 0.0327867f, 0.1917122f, 0.0381925f, 0.1632099f, 0.1428811f, -0.0246241f, -0.1924587f },\n", + "{ -0.0036438f, 0.0256314f, -0.0300497f, -1.0106803f, 0.0035058f, -0.0060116f, 0.0083219f, -0.0707436f, 0.0077562f, 0.0055091f, -0.0182911f, 0.1102780f, 0.0031401f, -0.0876552f, -0.0806563f, -0.0096622f, 0.0043411f, -0.0197603f, -0.0258972f, 0.0088151f, -0.0350756f, -0.0262632f, -0.0316888f, 0.1284771f, 0.0043740f, 0.0051480f, 0.0951583f, 0.0067314f, 0.0682082f, -0.1340998f, -0.0050629f, 0.0642558f },\n", + "{ -0.0054586f, 0.0009096f, -0.0030542f, 0.6611922f, -0.1600213f, -0.0148051f, 0.9854947f, 0.0288909f, 1.1527209f, 1.0436976f, -0.0028568f, -0.0720929f, -1.0642092f, 0.0973633f, -0.1374519f, -0.9689922f, 0.4894241f, 0.0242693f, -0.1340113f, -0.7291636f, 0.2409281f, 0.2435558f, 0.0865763f, 0.3773251f, -0.0027488f, -0.4639902f, -0.2531397f, 0.0071339f, -0.1999463f, -0.1190471f, -0.6877595f, 0.0047258f },\n", + "{ -0.0120549f, -0.1758562f, 0.0011764f, 0.3682616f, -0.6805586f, -0.0043064f, -0.7592892f, -0.2557418f, -0.9907975f, -0.8492736f, -0.0069985f, -0.1843629f, 1.2173564f, 0.2437091f, 0.0774442f, 0.5591520f, -0.5105006f, 0.0027117f, 0.1045879f, 0.1031876f, 0.0953953f, -0.1073882f, -0.6009388f, -0.2570243f, 0.0021526f, 0.3647284f, 0.0685335f, 0.0044424f, -0.2055883f, -0.2634717f, 0.6269304f, -0.3556093f },\n", + "{ -0.0079250f, 0.7729475f, 0.0849546f, -0.8746681f, 0.0320457f, 0.4836094f, -0.3186437f, -0.3189255f, -0.4439107f, -0.1149620f, 0.0121082f, 0.0500634f, -0.1568543f, 0.5223573f, 0.1398361f, 0.1576022f, -0.2577638f, -0.2778306f, -0.0510035f, -0.1373392f, -0.2826018f, -0.2499845f, -0.3446021f, -0.3572769f, 0.0861826f, -0.2098824f, -0.2837019f, -0.0461243f, -0.1658643f, -0.1032380f, -0.4622661f, 0.5626078f },\n", + "};\n", + "\n", + "HOST_DEVICE_CONSTANT float bias_fc2[32] = {\n", + "0.0105723f, -0.2707566f, -0.6415900f, 0.1445962f, -0.1994256f, -0.8090018f, -0.5117746f, -0.2069796f, 0.1182040f, 0.9573752f, 0.3139997f, -0.3268543f, -0.1971201f, -0.1042343f, 1.0352775f, 0.9894913f, -0.1150268f, -0.8350365f, 0.0436235f, -0.0624019f, -0.1608878f, 0.1185942f, -0.4287006f, 0.0142972f, 0.3475012f, 0.2757536f, 0.1677805f, 0.2218136f, 0.6477259f, -0.0667593f, -0.3735817f, 0.3465582f };\n", + "\n", + "HOST_DEVICE_CONSTANT const float wgtT_fc2[32][32] = {\n", + "{ 0.4324417f, -0.7673035f, -0.5471554f, 0.2779039f, -0.1687835f, -0.3419161f, -0.2172146f, -0.1137175f, 0.1006160f, -1.4182508f, -0.0449841f, -0.0836498f, -0.2234416f, -0.6160108f, 0.2412257f, -0.8647211f, 0.0417510f, 0.1623519f, 0.1340735f, 0.0025605f, 0.0115248f, 0.1154064f, 0.6384731f, 0.2058234f, 0.0226727f, 0.2391510f, -0.1429649f, -0.9331749f, -0.6874904f, -0.1115381f, 0.5503330f, -0.3975948f },\n", + "{ 0.4198115f, -0.9781777f, 1.1694254f, -0.2482220f, -0.2470811f, 0.5768772f, -0.5305969f, -0.0288219f, -0.4659587f, 0.0642344f, 0.7057289f, 0.0720710f, -0.0783920f, -0.9876766f, 0.0783636f, -0.1893978f, -0.0758926f, 0.2099811f, -0.1361028f, -0.4371021f, -0.1723918f, 0.0152078f, -0.9455445f, 0.1688402f, -0.1537039f, 0.2397139f, -0.1715712f, 0.3233564f, -1.1558517f, -0.1481061f, 0.3871148f, -3.0129161f },\n", + "{ 1.5506999f, -0.7427068f, -0.0985662f, -0.0608831f, -0.1102521f, -0.6252385f, -1.0874984f, -0.1439679f, -0.1909697f, -0.8877065f, -0.7737633f, 0.1476054f, -0.1476790f, 0.1049815f, -1.0176442f, -0.7432327f, -0.0277563f, -0.4307946f, -0.0810082f, -0.1258892f, -0.1043469f, -0.1274398f, 0.7762615f, 0.0970514f, 0.0164470f, -0.1850846f, -0.1031034f, -0.8658178f, -0.5275577f, -0.0407144f, 1.1957259f, -0.3066156f },\n", + "{ 1.0043048f, 0.9897588f, -0.0755118f, 0.8046477f, -0.0481381f, 0.2568143f, -2.4283130f, 0.1471182f, -0.2527807f, -0.0399207f, -1.0368594f, 0.0640951f, -0.0008671f, 1.8275114f, 0.0725308f, 0.8923700f, -0.1028159f, 0.2249785f, 0.0144401f, 0.2016954f, -0.0844297f, -4.5526829f, 0.3173841f, -0.2403957f, 0.3779835f, -0.0756613f, 0.0244575f, 0.2806599f, 1.4048293f, -0.0901546f, 0.6152505f, 1.8816514f },\n", + "{ 1.2572728f, -0.8402531f, 0.7099119f, -0.0828932f, 0.0951915f, 0.0335798f, 0.0707794f, -0.1213218f, 2.4428368f, 0.0997803f, 0.2755027f, -0.2048883f, -0.0256399f, -0.5734878f, 1.4970483f, -0.0192147f, -0.2558543f, 0.7279229f, 1.7061840f, 3.0295851f, -0.0714562f, -2.5080121f, -0.0624514f, -3.0032690f, -1.2456235f, -2.2851458f, -0.0083880f, 0.2058039f, -0.4265900f, -0.0757150f, 0.2381934f, 0.2736590f },\n", + "{ 0.1065874f, 0.2314566f, -2.2796247f, 0.2356272f, -0.1397772f, 0.2422709f, 0.0237261f, 0.0625369f, -0.1142090f, -0.0289660f, -0.4121158f, 0.1791920f, -0.1329814f, 0.1336152f, 0.1904465f, 0.2791202f, 0.0282886f, 0.7375806f, -0.1477007f, -0.0192417f, -0.1302946f, 0.5291457f, -0.1899594f, -0.4349242f, -0.5118493f, -0.3964539f, -0.0120087f, 0.5831125f, 0.2160608f, -0.1652738f, 0.5743094f, -0.3556770f },\n", + "{ -0.7013212f, -0.1755788f, 0.2377748f, -0.0029153f, -0.1256457f, 0.0464455f, 0.0461463f, -0.0562263f, -1.2902886f, -0.0348516f, -0.0040065f, 0.9912087f, -0.1560700f, 0.6114389f, 0.0784754f, -0.0253012f, 0.0399759f, 0.2378236f, -1.2157595f, -1.7106811f, 0.0517821f, 0.5861024f, 0.0102360f, -1.9680523f, 2.0222547f, -1.3292055f, 0.0593771f, 0.0107671f, 0.0280164f, -0.0309554f, -0.0805548f, -0.1452420f },\n", + "{ -0.0432347f, 0.0560752f, -0.1208499f, -0.0638094f, -0.1221812f, -0.1314433f, 0.0797006f, 0.1095768f, 0.1978949f, -0.1274918f, -0.0633354f, 0.1514086f, -0.0588417f, -0.0213551f, 0.0453078f, 0.0805805f, 0.0705929f, -0.0328658f, -0.0893497f, 0.0363103f, 0.0115460f, 0.0996364f, -0.0262905f, 0.0276413f, 0.1146021f, -0.1201120f, 0.1511603f, 0.1474506f, -0.1392362f, 0.0996529f, 0.0846859f, -0.1433949f },\n", + "{ -0.0144876f, 0.9510946f, 0.6066840f, -0.0158065f, -0.1532562f, 0.4006624f, 0.1642794f, -0.1924054f, 1.2457638f, 0.0806144f, 0.0457707f, 0.8251908f, 0.0542646f, -0.0357075f, -0.2907715f, 0.0294688f, -0.0143071f, -1.0185090f, 1.2616084f, 2.0172362f, 0.0323089f, -0.4956438f, -0.0235321f, 1.4845730f, -0.2411717f, 1.4490621f, -0.1344340f, 0.0051763f, -0.1433502f, -0.0149648f, 0.2097654f, 0.2438675f },\n", + "{ 2.2308834f, 0.0572265f, 0.2028466f, -0.1269566f, 0.0567031f, -0.7891721f, -0.0454425f, 0.0718930f, -0.6231729f, 0.0513892f, -0.1396189f, 1.0509667f, 0.0197597f, -3.7982774f, 0.1488162f, 0.0179314f, 0.0265696f, 0.7038008f, -1.1987691f, -1.2845273f, -0.0189805f, 1.7856516f, -0.1089924f, -1.5082254f, -0.0725589f, -3.6487772f, -0.0670966f, -0.2939831f, 0.2982934f, -0.0706767f, 0.2463991f, -0.4632871f },\n", + "{ 1.2691945f, -1.6950474f, 0.9718248f, -1.2557473f, -0.0843802f, -0.8682168f, -0.0769571f, -0.1858943f, -0.0081168f, -1.8139172f, -0.6833571f, -0.0535852f, 0.0067404f, -0.2991555f, -0.9731231f, -1.0928844f, -0.2313154f, -0.8572839f, 0.0164396f, -0.0120993f, -0.1714177f, 0.0306930f, 1.0370599f, 0.0376184f, 0.0336998f, 0.0127069f, -0.1393424f, -1.4432834f, -0.9254046f, 0.1010159f, 1.5789299f, -0.3814271f },\n", + "{ -0.0574547f, -0.0681054f, 0.1552017f, 0.0761608f, 0.0373731f, 0.0219471f, -0.0569846f, 0.0849170f, 0.1166299f, -0.1738986f, -0.1584568f, -0.0492199f, -0.1243339f, 0.1141277f, -0.0858282f, -0.1317060f, -0.0738105f, -0.1702452f, 0.0296549f, 0.0598173f, -0.1193228f, -0.0333553f, -0.0761291f, 0.1107883f, -0.0568867f, -0.0525629f, 0.1529157f, 0.0498271f, 0.1178267f, 0.0795109f, 0.1675527f, -0.1520976f },\n", + "{ -1.6536322f, 0.6448058f, -0.0087195f, 0.0598767f, -0.1151469f, -0.0457370f, -0.1676109f, 0.0407258f, -9.9194479f, 0.1196577f, 0.2541163f, -0.0141259f, -0.0078915f, -2.6990201f, 0.2910182f, 0.3034261f, 0.1360894f, 0.4914473f, -0.3977694f, -7.2515898f, 0.1637411f, -13.7269659f, 0.0329545f, -0.0080273f, -0.3791377f, 0.3196916f, 0.1767528f, -0.0027336f, 0.1099117f, -0.0302469f, 0.6338997f, -0.0870916f },\n", + "{ 0.1707803f, 0.2295529f, -1.3998934f, 0.6977680f, 0.0054978f, 0.8450817f, 0.6746160f, -0.1336917f, 0.1212842f, 0.4899071f, 0.9479164f, -0.3161806f, 0.0860273f, 0.5341747f, -0.0213259f, 0.1984338f, -0.1988392f, 0.6882323f, -0.0482900f, 0.1955348f, -0.1427102f, -0.1824984f, -0.2451700f, -0.1075564f, 0.0141908f, 0.0032365f, 0.0029449f, -0.3940665f, -0.0678450f, -0.0779321f, 0.0275283f, -0.3630400f },\n", + "{ -0.5806513f, -0.6154314f, -0.2262352f, -0.0713557f, -0.1936528f, -0.7763327f, 0.1930804f, 0.0099515f, 0.0811277f, 0.3898111f, -0.1023425f, 0.3435638f, -0.1730143f, -0.1884138f, 0.4772736f, 0.2264327f, -0.1591666f, -0.6873384f, 0.3482575f, -0.2166736f, 0.0310656f, 0.2354132f, 0.0155102f, 0.1464832f, 0.3026945f, 0.2421199f, -0.1765095f, 0.4064289f, 0.4244477f, -0.0657526f, -0.0002334f, 0.2020380f },\n", + "{ -2.3500936f, 0.3051382f, 0.0742651f, -0.0630357f, 0.0632868f, 0.3862685f, 0.0748486f, 0.0506923f, -2.4151185f, 0.0802129f, -0.1211919f, -1.9044075f, 0.0645995f, -0.4068294f, -0.4385396f, -0.1199773f, -0.0219308f, -0.6580852f, 0.7465926f, -3.1614089f, -0.1574137f, -0.4429669f, 0.0698753f, -0.0604795f, 1.5435756f, -2.2144003f, -0.0111754f, 0.1280562f, -0.0024847f, -0.1617478f, 0.0246055f, -0.0678383f },\n", + "{ 0.2329811f, 0.7879948f, -3.3233993f, 0.1164390f, -0.1270224f, -0.5550243f, -0.0672430f, -0.0016068f, -0.2102381f, -0.0552910f, -0.1676428f, -1.5530976f, 0.0654266f, 0.5756884f, -0.0021305f, 0.0488199f, -0.0614975f, 0.2123013f, -1.3390820f, -1.1011786f, 0.0028438f, -1.8221409f, 0.1037516f, 0.1652413f, 1.0206385f, 0.7670507f, -0.1004305f, -0.0437249f, 0.3590544f, -0.1849019f, -0.1284416f, -0.1975219f },\n", + "{ -0.5958156f, -0.8498669f, -0.0993299f, -0.7103062f, -0.1668082f, 0.1878954f, -0.8532909f, -0.0939539f, -0.2151955f, 0.2173233f, -0.7155760f, -0.3415899f, -0.0404417f, -1.6671551f, -3.6663096f, 0.2828735f, -0.1037000f, -1.1636399f, -0.0182679f, 0.0165802f, -0.1280557f, 0.1139740f, 0.1060428f, -0.1096078f, -0.2083402f, 0.0569669f, -0.0949440f, 0.7387905f, 0.5553990f, -0.0876781f, 0.4042123f, 0.7967463f },\n", + "{ -0.7755491f, 1.0329288f, -0.4435873f, -0.1616621f, 0.0015863f, -0.2154487f, 0.2481335f, -0.1895383f, -0.6515585f, 0.2643988f, 0.0165948f, -0.3663197f, -0.0378082f, 0.3794657f, 0.2348393f, -0.0952029f, -0.1977327f, 0.0279894f, 0.0321040f, -0.5212879f, -0.1538097f, 0.3082405f, 0.0100385f, -0.0208207f, -0.3540405f, 0.0978729f, -0.1378782f, 0.3500296f, 0.0489568f, -0.1101327f, 0.1888299f, -0.0786323f },\n", + "{ -0.3213858f, -0.6230492f, -2.5913410f, 0.0656858f, 0.0227841f, 0.2191865f, 0.0349099f, -0.1695805f, -1.3844441f, -0.1035527f, -0.4150586f, 0.7789264f, -0.0936344f, -1.9199731f, -0.9188107f, -0.0188966f, -0.0784041f, -0.0764103f, -2.2291248f, -2.6501858f, 0.1083791f, 0.9166861f, 0.0986617f, -1.8152469f, 1.2902076f, -2.4815612f, -0.0582435f, -0.1825741f, 0.1351472f, 0.0469752f, -0.3347861f, 0.0561743f },\n", + "{ -1.1506671f, 0.0244561f, 0.6939688f, -0.1839749f, -0.1237261f, -0.4704360f, -0.1274202f, 0.0769576f, 0.2063637f, 0.1067972f, -0.2297383f, -0.3197641f, -0.2756677f, 1.2856065f, -0.1331317f, 0.0524933f, -0.1498061f, -1.2895508f, -0.2076671f, 0.1729939f, 0.1393973f, -0.3071945f, 0.1510896f, -0.3418963f, 0.0207888f, -0.7296978f, -0.1016554f, 0.4193136f, 0.4209033f, -0.1884461f, 0.1778586f, 0.0882449f },\n", + "{ 0.4260942f, -1.5393538f, 0.6496511f, -0.0233054f, -0.1154911f, -0.5248225f, -0.1159717f, 0.0961992f, 0.5141736f, 0.0912039f, 0.0121801f, 1.0660315f, -0.0990365f, 0.4318093f, 0.1146076f, -0.0014916f, -0.2176866f, -0.3261453f, -0.1865387f, 0.0657357f, -0.0412201f, 0.5913283f, -0.0169150f, 0.4873077f, -0.8425939f, -0.4378911f, -0.0446746f, -0.0338331f, 0.2323655f, -0.1166838f, 0.1849742f, -0.0444494f },\n", + "{ -4.7958317f, -0.3887547f, 0.3943746f, 0.0266415f, -0.1849546f, -0.2362574f, -0.0759386f, -0.0406316f, -2.6863902f, -0.0420164f, 0.0278654f, 1.0999503f, -0.1342072f, 0.2744266f, -0.8209524f, -0.0725991f, -0.1575413f, 0.1468416f, 1.2511518f, -0.5824468f, -0.0420395f, 1.9468178f, 0.0576381f, 0.8301008f, 0.6880937f, -2.0490625f, 0.0765251f, 0.0892806f, 0.0115464f, 0.1037114f, -0.1933933f, -0.0826425f },\n", + "{ -2.3926468f, 0.9652472f, 0.3846242f, -1.8219428f, 0.0496668f, 0.5097333f, 0.6558178f, -0.0933043f, 0.1346592f, 0.2552424f, -0.5247180f, 0.0975937f, -0.0956505f, -1.1939684f, -1.6109539f, 0.0291610f, 0.0250445f, -0.2117734f, -0.3671367f, -0.5285300f, -0.1611722f, 0.0041839f, -0.5533955f, -0.7813846f, -0.0904857f, -0.8434240f, 0.0171278f, -1.0767213f, 0.0603934f, 0.0493840f, 0.9862781f, 0.5520182f },\n", + "{ 1.2454330f, 0.5972028f, 0.7686826f, 0.2497237f, -0.0017843f, 0.9898069f, -0.6740548f, -0.1179278f, -0.0231948f, -0.6596659f, -0.8000609f, -0.0699546f, -0.1336576f, -0.2269732f, -0.9051452f, -0.2375571f, -0.1809363f, 1.0751063f, -0.0816682f, 0.0507760f, -0.1290978f, -0.1294877f, 0.2324601f, -0.0985209f, -0.0773705f, 0.0194675f, -0.1334576f, 0.1490602f, -0.5308774f, -0.1515271f, 0.6451623f, 0.4562764f },\n", + "{ -2.5912027f, -1.0880963f, 0.4506941f, -0.0832320f, -0.0843302f, 0.6721463f, 0.0545895f, 0.0961543f, 1.6990305f, 0.2865057f, 0.1326460f, -0.1172203f, 0.0603488f, -0.5354731f, -0.2468112f, -0.0330492f, 0.1297820f, -1.3489295f, 2.0376251f, -1.7784770f, 0.0269008f, -11.7133312f, -0.0559333f, 0.7457867f, -2.6041806f, -0.0074611f, -0.0230596f, 0.0895037f, -0.4107127f, 0.0811662f, 0.6025116f, 0.5589377f },\n", + "{ -0.0036496f, 0.0953889f, 0.0583121f, 0.1509429f, 0.1070117f, -0.0241024f, -0.0295597f, 0.0651249f, 0.0219596f, -0.1901910f, -0.0578079f, -0.0827582f, 0.0612196f, 0.1677822f, -0.1403515f, 0.2001222f, -0.1410438f, -0.0583785f, 0.0972384f, 0.1244574f, -0.1271764f, 0.0921396f, 0.0901482f, 0.1575983f, -0.2287041f, 0.1462671f, -0.1644860f, 0.1111774f, -0.0805172f, 0.1350349f, -0.0304200f, -0.0757810f },\n", + "{ 0.9101577f, -1.3877189f, -0.4038962f, -0.7405658f, -0.1486192f, 0.6282634f, -0.1020244f, -0.1434855f, -0.0409669f, -0.4650875f, -0.5027285f, -0.1512777f, -0.1083134f, -0.2462458f, -1.2334225f, 0.0333704f, -0.1389711f, -0.0595776f, 0.0769746f, 0.0092279f, 0.0156819f, 0.0397862f, 0.3602265f, -0.2466761f, -0.1023989f, -0.0133800f, -0.0732056f, -0.1141649f, -0.5918769f, -0.2099056f, 1.2307832f, 0.5027910f },\n", + "{ 0.0871296f, -0.1295669f, -0.0896348f, 0.1452128f, -0.0074592f, -0.0557586f, 0.0685396f, -0.2240884f, -0.0698905f, 0.0113810f, -0.0523082f, -0.1892864f, 0.0904176f, -0.0987607f, -0.0371940f, 0.1888202f, -0.1023782f, -0.1107638f, -0.3174691f, 0.1640519f, 0.1137626f, 0.0541831f, 0.1192290f, 0.0172333f, -0.0766619f, -0.0557404f, 0.0514295f, -0.1727580f, 0.0018607f, -0.0966285f, -0.1801928f, 0.0916549f },\n", + "{ 0.0203243f, 0.1540937f, 0.1249107f, -0.0625153f, -0.0568734f, 0.1500905f, 0.0521899f, 0.0298344f, -0.1538603f, -0.0282811f, 0.0944993f, -0.0991179f, -0.1573601f, 0.1045044f, -0.0351922f, -0.1540347f, 0.1740243f, 0.1529267f, 0.0141616f, -0.0580653f, 0.0217751f, -0.0410015f, -0.0343460f, -0.1464343f, -0.0670722f, 0.0355232f, 0.1358264f, 0.1224003f, 0.0507292f, 0.1662261f, -0.0108287f, -0.0883858f },\n", + "{ 0.2929641f, -0.8316358f, 0.9932570f, -0.0724017f, -0.0624820f, 0.5539349f, 0.1305689f, -0.0199843f, -0.5265004f, 0.2388491f, -0.1920091f, -0.2762667f, 0.1056171f, -3.2570002f, -0.3361678f, -0.0135878f, 0.1645315f, -0.2142355f, -0.8796312f, -7.7323594f, -0.1374875f, -0.4608127f, -0.0796791f, -0.5507361f, -1.8336040f, 2.5669088f, -0.1433435f, -0.0408195f, -0.2189375f, -0.0146195f, 0.5396200f, 0.3951851f },\n", + "{ -1.8827964f, -0.4098588f, -0.6180743f, 0.4903710f, -0.1164847f, 0.2144586f, 0.5754681f, -0.1139816f, 0.1691127f, 0.5704660f, 0.3751363f, 0.4575492f, -0.1647383f, -0.6087861f, 0.3280568f, 0.1446891f, 0.0018978f, 0.1308372f, 0.2239647f, 0.1750600f, -0.0949092f, -0.2125228f, 0.0509538f, 0.5438231f, -0.0231656f, -0.0102621f, -0.1143090f, 0.1692356f, 0.0145388f, 0.1456209f, -0.0454612f, 0.0101373f },\n", + "};\n", + "\n", + "HOST_DEVICE_CONSTANT float bias_fc3[6] = {\n", + "-0.4601035f, -0.2295580f, -0.0389458f, 0.2728636f, 0.0650524f, 0.1829060f };\n", + "\n", + "HOST_DEVICE_CONSTANT const float wgtT_fc3[32][6] = {\n", + "{ -0.3411210f, -0.0397080f, 0.5651972f, 0.1536432f, 0.3772743f, 0.1471741f },\n", + "{ -0.0762910f, -0.3063827f, -0.2129947f, -0.1495240f, -0.4025716f, 0.0381839f },\n", + "{ -0.0219088f, 0.0004738f, 0.2221964f, 0.1870263f, 0.1499673f, 0.0290947f },\n", + "{ 0.1921718f, 0.0920977f, -0.2728071f, -0.2693111f, -0.1457593f, -0.0825119f },\n", + "{ -0.1468817f, 0.0075058f, 0.0525970f, 0.0462784f, 0.1044439f, -0.0501118f },\n", + "{ 0.0682404f, 0.3191431f, -0.2575107f, -0.1767330f, 0.1108677f, -0.0563356f },\n", + "{ 0.2022640f, 0.0946275f, -0.2768224f, -0.2648008f, -0.1477039f, -0.0858348f },\n", + "{ 0.2237751f, 0.0673614f, 0.0758461f, -0.0784104f, -0.0023624f, -0.0444682f },\n", + "{ -0.6424130f, 0.6359105f, -0.5453408f, 0.1293409f, 0.4565887f, 0.0721758f },\n", + "{ -1.9180968f, -2.0464785f, -1.0575339f, 1.8443462f, -1.7794129f, 0.3827156f },\n", + "{ 0.1102831f, 0.0365143f, -0.2860785f, -0.1689088f, -0.1726920f, -0.0602505f },\n", + "{ -0.3096818f, 0.2978379f, -0.2525163f, 0.0643401f, 0.2176419f, 0.0323191f },\n", + "{ -0.1721586f, -0.0278779f, 0.0009259f, -0.0315924f, -0.0594473f, 0.1102493f },\n", + "{ 0.1011149f, 0.2353841f, -0.4008681f, -0.2701374f, -0.0625554f, -0.0724697f },\n", + "{ 0.0042279f, -0.1473476f, -0.3127778f, 0.0558405f, -0.3056587f, -0.0559929f },\n", + "{ -0.9212925f, -1.1549798f, -0.1323241f, 1.0125355f, -0.7895814f, 0.2322977f },\n", + "{ 0.0436638f, 0.1259097f, 0.0325146f, -0.0898681f, -0.0401595f, -0.0767325f },\n", + "{ 0.3320802f, 0.1589662f, 0.0919260f, -0.1462629f, 0.0988948f, -0.0727050f },\n", + "{ -0.4337279f, 0.4040831f, -0.3383405f, 0.1142050f, 0.3045402f, 0.0515237f },\n", + "{ 0.8031816f, -0.8029570f, 0.7040247f, -0.1723298f, -0.5671331f, -0.0858645f },\n", + "{ 0.1517031f, 0.0229139f, 0.1691006f, 0.0969766f, -0.1039258f, -0.1347231f },\n", + "{ 0.3062419f, -0.3281854f, 0.2683749f, -0.0538388f, -0.2349393f, -0.0365046f },\n", + "{ 0.3657214f, 0.3913901f, 0.0527000f, -0.4020816f, 0.2513908f, -0.0957916f },\n", + "{ 0.3929159f, -0.3648293f, 0.2996375f, -0.1187399f, -0.2802985f, -0.0493542f },\n", + "{ 0.2997055f, -0.3183403f, 0.2615302f, -0.0430490f, -0.2266634f, -0.0338770f },\n", + "{ -0.2654389f, 0.2434373f, -0.2290332f, 0.0705398f, 0.1711185f, 0.0307495f },\n", + "{ -0.1277946f, 0.0578584f, 0.0924456f, -0.1165068f, -0.0222394f, 0.1304205f },\n", + "{ -0.0692971f, -0.0007383f, 0.2981678f, 0.1123612f, 0.1953249f, 0.0530549f },\n", + "{ -0.1573147f, 0.1434165f, 0.1666125f, 0.2058718f, 0.2853577f, 0.0408852f },\n", + "{ -0.0342600f, 0.0242836f, 0.1001021f, -0.2229733f, -0.2102158f, -0.0860839f },\n", + "{ 0.9001538f, 0.8010113f, 0.4412947f, -0.8558410f, 0.6589929f, -0.1841511f },\n", + "{ 0.0723728f, 0.0476184f, 0.2816380f, 0.0934067f, 0.1914912f, 0.0079167f },\n", + "};\n", + "\n" + ] + } + ], + "source": [ + "print_model_weights_biases(embed_pls)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "HOST_DEVICE_CONSTANT float bias_fc1[32] = {\n", + "0.4077676f, -0.2279155f, -0.2884339f, 0.3470485f, 0.2260163f, 0.3343305f, 0.2159934f, 0.3737450f, 0.5172617f, 0.4149252f, 0.4305608f, 0.8852963f, -0.0304266f, 0.4297696f, 0.3520102f, 0.1646055f, 0.2715247f, 0.5041977f, -0.3354747f, 0.1381416f, -0.2057779f, -0.6174472f, 0.3763988f, 0.2417004f, 0.6029384f, -0.5503362f, 0.1589353f, 0.0196475f, 0.1615662f, 0.4879072f, 0.7081229f, 0.0848025f };\n", + "\n", + "HOST_DEVICE_CONSTANT const float wgtT_fc1[30][32] = {\n", + "{ 0.0024744f, -0.0393794f, 0.0012607f, -0.0463855f, -0.0008486f, -0.0039237f, 0.0104747f, 0.0094048f, -0.0152672f, 0.0009938f, 0.0101450f, -0.0166616f, 0.0049875f, -0.0070639f, -0.0500429f, -0.0172534f, 0.0688348f, 0.0009360f, -0.0225526f, 0.0062404f, 0.0079217f, -0.0171006f, -0.0016421f, -0.0123498f, -0.0035078f, 0.0132192f, 0.0036508f, -0.0103952f, 0.0018321f, 0.0288714f, 0.0098612f, -0.0000296f },\n", + "{ -0.0058784f, -0.0120812f, 0.0049086f, 0.0155617f, 0.0009917f, -0.0040435f, 0.0133419f, -0.0072605f, 0.0024925f, 0.0068197f, -0.0006385f, 0.0031977f, -0.0114677f, -0.0033108f, 0.0209282f, 0.0015631f, 0.0125927f, -0.0031000f, -0.0068791f, -0.0123153f, -0.0049826f, -0.0070589f, 0.0026653f, 0.0113343f, 0.0100663f, -0.0192249f, -0.0090349f, 0.0177071f, -0.0093298f, 0.0316960f, -0.0035137f, 0.0034051f },\n", + "{ -0.0012076f, -0.0271521f, 0.0020420f, -0.0111024f, 0.0028394f, 0.0007962f, -0.0022592f, -0.0033232f, 0.0035402f, -0.0087297f, -0.0111310f, -0.0055134f, -0.0189009f, 0.0056956f, 0.0075314f, -0.0220869f, -0.0052434f, 0.0041410f, 0.0126735f, 0.0046679f, -0.0063149f, -0.0643957f, 0.0093661f, -0.0139448f, -0.0077514f, 0.0037926f, 0.0074050f, 0.0076167f, -0.0104248f, 0.0317166f, -0.0028450f, 0.0173832f },\n", + "{ 0.1251217f, 0.1800787f, -0.1867869f, 0.1595200f, 0.1434205f, 0.1503779f, -0.4537136f, -0.5901821f, 0.0563463f, 0.7319781f, -0.1496763f, -1.5963429f, 0.2045313f, 0.3836967f, -0.9270357f, -0.0226355f, -0.2698695f, 0.3014301f, 0.1243785f, 0.1064028f, -0.1828626f, -0.0126028f, -0.6539689f, 0.4266773f, 0.1370417f, -0.1538948f, -0.3513461f, 0.1182490f, -0.0221514f, -0.1990412f, -1.7690033f, -0.2758574f },\n", + "{ -0.5385936f, -0.0012131f, 1.0062443f, -0.0004652f, -1.5250168f, -0.6941552f, 0.4669687f, -0.3101588f, -0.1252819f, -0.5553900f, 0.4493555f, -1.0237653f, 0.0137464f, -0.9620051f, -1.1179942f, 0.8291886f, -0.4238032f, -0.9437180f, 0.4450281f, 0.4106119f, 2.0104270f, 1.1056167f, 1.1838503f, -0.2184737f, -0.6447318f, 1.0383023f, 0.2861722f, 0.4638089f, 0.0827050f, -0.7214339f, -0.8271918f, 0.0903803f },\n", + "{ 0.0925784f, -2.2875428f, 0.4228307f, 0.7384776f, -0.6291643f, -0.5331570f, 0.6747525f, -1.1195320f, -0.4872814f, 1.1755321f, -0.2841410f, 0.7739045f, -0.5575562f, -0.8809059f, -0.2960616f, -8.8249207f, 0.7914539f, -1.7136964f, 0.6188551f, -1.4344710f, 5.3693213f, -1.2444569f, -0.4813018f, -0.8091519f, 0.8857184f, -2.0941384f, -0.2130339f, -0.5814816f, 0.3258826f, -0.2931088f, 1.4789020f, 0.4618642f },\n", + "{ 0.6531625f, 1.1529071f, 0.1371508f, 2.8411951f, -0.8554673f, -0.1095216f, 1.2860730f, 0.4513414f, 0.9408586f, 0.0923639f, 1.0380499f, -0.0617734f, 0.3752534f, 0.4164129f, -0.6928972f, 0.5165285f, 0.2846950f, -0.4395047f, -0.4500486f, -1.5119061f, -0.1637943f, 0.3001703f, -0.1272881f, 0.6307207f, -0.4045023f, 1.5478576f, 2.8443282f, 0.3571231f, -3.8504515f, -0.5279408f, 0.2419337f, 1.0267982f },\n", + "{ -0.4495021f, -0.6836431f, 0.6723049f, 0.7558293f, -0.3250372f, 0.1810641f, -0.5758181f, -0.3216294f, -0.8515261f, 0.7419527f, -0.1002971f, -3.8079274f, 1.1104699f, -0.5206310f, -0.1571004f, -0.0966715f, -0.5530408f, -0.2359556f, 1.0117108f, 0.5562274f, 0.8772307f, 0.0218807f, -1.3814380f, -0.2966548f, -0.7360181f, 1.1440719f, -0.0740981f, 0.4694696f, -0.1318757f, 0.3080833f, -1.6074529f, -0.6576584f },\n", + "{ -1.1813462f, 0.8606730f, 0.5925826f, -0.4136417f, -0.1687684f, -1.2883703f, 1.0737853f, -0.4584215f, -0.0107126f, -1.4510404f, -0.5694596f, -0.9614651f, -0.0733704f, -0.6900919f, -1.1785636f, 0.0102372f, 0.7968284f, -1.2490059f, 1.3178346f, 1.0213394f, -1.3799534f, 1.1048131f, 1.0791637f, -0.7684139f, -1.5358402f, 1.0583841f, 0.7784582f, -0.9112529f, 0.1112473f, -0.3522860f, -0.1625194f, 0.6646042f },\n", + "{ 2.8097115f, 0.2189469f, 0.4759579f, -0.4399420f, -1.9096129f, 4.4731107f, -1.7415184f, 0.7458996f, 2.6043866f, 0.0228842f, -0.9860933f, -1.5356710f, -1.1698126f, -0.9608816f, -4.6475010f, -0.2212112f, 0.3191188f, 3.6182191f, -0.5279332f, 1.2250533f, -1.8226494f, 1.4215574f, 0.0107232f, -1.3500752f, -2.1345067f, 4.0902228f, -0.1406621f, 0.1988346f, 0.1143996f, 0.1584920f, 1.9306198f, 0.2264732f },\n", + "{ -0.6330162f, -0.8606266f, -0.2506120f, 2.8644457f, -2.5139024f, -0.1396846f, 3.2136893f, -0.5183797f, 1.0188060f, -0.1992519f, 4.1541386f, 0.0795280f, 2.1208901f, 0.5972226f, -0.1704281f, 1.1748037f, 1.6950256f, -0.1650027f, -0.3023618f, -0.9703765f, -0.4939895f, 0.1733194f, -0.5587181f, -0.3252590f, -0.6592528f, -0.6176721f, 2.8412099f, 1.9992446f, -5.7545681f, -1.3432568f, 0.3551563f, 4.1674385f },\n", + "{ 0.0463279f, 0.4675750f, 0.9041724f, -0.5633961f, 0.3415673f, 0.4415232f, -0.1690769f, 0.7954109f, -0.9843888f, 0.3741962f, -1.6147419f, -1.4149523f, 1.1648459f, -0.3204101f, -0.9185460f, -0.6581141f, 0.7857524f, -0.3287453f, 1.6249634f, -0.0135078f, 0.1881986f, 0.7690734f, -1.9673315f, -0.0688100f, -1.6302046f, -0.5908383f, -0.4823549f, 0.1704361f, -0.4471235f, -0.4368535f, -1.3240870f, -0.3216266f },\n", + "{ -1.4061178f, 0.5022576f, 1.0982580f, -0.6220022f, -0.9696901f, -1.9179952f, 1.7193460f, -0.2582918f, -0.5588899f, -1.3507159f, -0.3256070f, -1.3323994f, 0.1045043f, -1.4346679f, 0.1656233f, 0.2692206f, 1.4507416f, -1.7721831f, 2.1165068f, -0.1257402f, -0.3827015f, 2.1512969f, 1.3777891f, -1.3536407f, -0.6973501f, -2.4181912f, -0.2530868f, -0.5596736f, -0.3524390f, -1.1098257f, 0.0365084f, 0.2368104f },\n", + "{ 1.1295713f, 1.1852584f, -3.0161581f, -0.0101437f, 3.0580411f, -2.0414307f, 0.9559101f, 1.2531452f, -0.9469447f, -1.5319313f, -1.2981234f, 1.0231872f, 3.5623341f, 7.2042856f, 1.8736403f, 0.0048688f, -0.0679021f, -0.0448611f, 1.4677920f, 1.7590126f, 1.2858278f, -1.1959839f, 0.1288983f, 3.8290095f, -1.9789371f, 0.7309756f, 0.2280468f, -1.1718543f, -0.7974834f, -1.4442098f, -1.0101110f, -0.6817204f },\n", + "{ -1.5343865f, -0.3796017f, -0.1856368f, 1.7139316f, -1.0014790f, 0.4724852f, 1.6746861f, -0.9341705f, 1.9503918f, -0.1495848f, 1.9440095f, 0.3956429f, 2.0056448f, 0.3137310f, -0.0619077f, -0.1152982f, 2.3105996f, 0.2760705f, 0.0417842f, -1.7413501f, -0.0536200f, -0.4784753f, -0.2405750f, -1.6337229f, -0.0542544f, 0.2359948f, 1.3707143f, 4.4994383f, -2.4251237f, -2.7904398f, -0.5763192f, 8.6687193f },\n", + "{ 0.1907782f, 0.1742647f, 0.1050308f, -1.5279845f, -0.0656458f, 0.0819947f, -0.0015410f, 0.5593292f, -0.6139901f, 0.3406654f, -0.9734358f, -1.1476587f, 0.2998652f, -0.1892694f, 0.2782348f, -0.2697246f, 0.5776731f, -0.1273671f, 1.2335502f, 0.3768652f, -0.0987652f, 0.3744551f, -1.6916909f, -0.0789046f, -0.2746910f, -1.0240086f, -0.7310969f, 0.1137805f, -0.7809454f, -0.0526637f, -0.9586000f, 0.4703661f },\n", + "{ -1.3799059f, 0.5441812f, 1.3961957f, -1.9208598f, -1.4421672f, -0.8509293f, 0.8990977f, -0.4459707f, 0.4297855f, -1.0108874f, -0.5225446f, -1.4302559f, -0.3395956f, -2.3660328f, 0.4259947f, 0.3851134f, 0.8479792f, -1.1961648f, 1.9343091f, -0.5853942f, 0.0132326f, 0.8586328f, 1.1753848f, -1.2850294f, -0.1286860f, -0.1348000f, -0.4805126f, -0.0016954f, -0.0379165f, -0.6723653f, 0.0858779f, 0.1319384f },\n", + "{ -0.9047911f, 0.8236033f, -2.6236243f, -1.5834204f, 3.8662889f, -0.8257350f, 1.3124079f, 2.4033010f, -1.5704441f, -0.7072982f, -0.7994226f, -0.0691188f, 3.0421026f, 0.1919740f, 2.0499594f, 0.6489547f, -0.8396980f, 0.1463669f, 0.8795691f, 1.3042110f, 0.8791811f, -0.4357574f, 0.0453697f, 1.2778367f, -0.8345951f, 1.4902275f, 0.4830694f, -0.4929650f, -0.4718537f, -1.5530992f, -0.2699516f, -0.1341021f },\n", + "{ -2.0305204f, 0.0984210f, -0.0239505f, 0.1666152f, 0.6038550f, -0.1785676f, 0.0119116f, -1.8020983f, 0.4221218f, 0.1879676f, 1.2715919f, -0.2330815f, 1.6620227f, 0.1919266f, 0.8790883f, -0.7307991f, 1.8224788f, 0.3670009f, 0.2779024f, -2.6210845f, 0.4713250f, 0.2567338f, 0.0020450f, -1.1362463f, 0.2114117f, -1.4463605f, 0.5499513f, 1.6433896f, -1.3871042f, -0.0372309f, -0.1722469f, 5.9508014f },\n", + "{ 0.4799454f, 0.0895001f, 0.0813640f, -0.8274580f, -0.0076796f, 0.1678302f, -0.2162840f, 0.8216277f, -0.2604735f, 0.3912535f, -0.6308332f, -0.6842828f, 0.8903456f, -0.2615999f, 0.8842036f, -0.1237010f, 0.2321620f, 0.0538414f, 0.6234514f, 0.4964478f, -0.6074837f, 0.8388720f, -0.9905877f, -0.1521280f, 0.0861136f, -1.0650748f, -0.0565484f, -0.1423324f, -0.5450467f, 0.2223674f, -0.6242210f, 0.0313438f },\n", + "{ -0.7937829f, 0.2845238f, 1.2092232f, -1.1336080f, -0.9974707f, -1.1016089f, -0.0631481f, -0.4682118f, -0.1199169f, -0.7368876f, -0.0465959f, -0.9095205f, -0.2594349f, -1.3799951f, 0.3178478f, -0.0327526f, 1.1278658f, -0.5821651f, 1.1199970f, -0.2503546f, 0.4231540f, 0.5824918f, 0.8323092f, -0.6453368f, -0.5815063f, 0.2947850f, 0.2406827f, -0.6469781f, 0.3573758f, -0.5031040f, 0.1713905f, -0.0302581f },\n", + "{ -2.2269943f, 0.6610296f, -1.7370876f, 5.0489988f, 1.4102260f, -4.3013086f, -5.6990528f, -0.1390589f, -6.4011965f, -0.6442785f, 2.5386147f, 2.1181786f, 1.3405606f, -0.6832275f, -7.0846601f, 0.4763132f, -0.6197824f, -0.7640664f, -3.1181791f, -0.7982330f, 2.4704344f, 3.4750955f, -0.3471056f, -1.6380967f, -3.9228339f, 11.7434921f, -0.2882336f, 3.3142335f, 0.1535466f, -0.9270810f, 0.3529454f, -2.4928286f },\n", + "{ 4.4015613f, -5.9851208f, -1.9783058f, 1.6264094f, 1.7628051f, 2.7426465f, -0.5450913f, -6.3433137f, -5.4693661f, -0.1209920f, -16.1616745f, 4.4307213f, 7.2333970f, 0.2126676f, 10.5992460f, 1.1452266f, -3.8010271f, 0.6511117f, -8.6552525f, 1.5934747f, -7.1460495f, 15.8349514f, 2.6939518f, -0.8971478f, -11.3297014f, -1.1788586f, -6.3313837f, 9.6355791f, -9.7328720f, 6.8267646f, 2.6127393f, -0.7299617f },\n", + "{ -0.6623970f, -4.0980029f, 1.2968158f, 1.0465623f, 2.1909347f, 0.0799154f, -1.3850753f, -8.0645733f, -2.6519508f, 1.1716766f, -4.2621017f, -2.2514622f, -3.2109861f, 0.4872084f, -2.9294157f, -0.3134519f, -2.2041106f, -1.0412875f, -3.0902727f, -4.6903996f, -3.8038359f, 0.4521285f, 1.0808827f, -3.5509176f, -2.8755074f, -2.5900049f, -4.5624914f, 2.9023614f, -7.7391887f, 2.4571869f, 1.7540874f, -6.6134629f },\n", + "{ 0.3097464f, -9.6223412f, 0.3082687f, 0.7898668f, 0.7815887f, 0.4838023f, 0.1623738f, -0.0818605f, 0.3574537f, 0.3066830f, 0.5159593f, 0.6699249f, 0.2457049f, 0.2043623f, 0.6524037f, -0.1482845f, -0.1602189f, 0.3730888f, -0.1839945f, -0.2401724f, -0.2355313f, -0.0997447f, 0.3465509f, 0.3330808f, 0.4187172f, -0.9872412f, -0.2174625f, 0.3022898f, 0.0381315f, 1.0602703f, 0.6490645f, 0.1669758f },\n", + "{ 0.0852926f, -0.3854031f, -0.3749264f, 0.0002517f, 0.3914049f, 0.3182451f, -0.0910236f, 0.3999062f, 0.2172160f, 0.3263556f, 0.2230883f, 0.6801209f, 0.0475812f, 0.3868748f, -0.1011033f, -0.2097718f, 0.2077924f, 0.4337954f, -0.3955855f, -0.0072284f, -0.0933287f, -1.2635084f, 0.1973505f, 0.3029268f, 0.4028932f, -0.2411875f, 0.4648659f, 0.0376468f, 0.3943195f, 0.1931429f, 0.5153960f, 0.1185977f },\n", + "{ 0.2859749f, 0.1709675f, -0.3392698f, 0.3881494f, 0.2809920f, 0.1887885f, 0.1355904f, 0.0287555f, 0.4615551f, 0.3263117f, 0.1106815f, 0.6479899f, 0.1063091f, 0.3925818f, 0.3228856f, -0.0470499f, -0.3389811f, 0.3753765f, -0.2780865f, 0.1694021f, -0.2127821f, -0.2860769f, 0.1801637f, 0.5115150f, 0.3644554f, -0.0983620f, 0.2620682f, 0.3451013f, 0.0243843f, 0.5946212f, 0.5975426f, 0.1038395f },\n", + "{ -0.0843795f, 0.9882024f, 0.5935462f, 0.2965513f, 0.2589141f, 0.3455611f, 0.1083200f, -0.2048762f, -0.0654019f, 0.0330168f, 0.1223004f, 0.0961272f, -0.0632822f, -0.0130484f, 0.1102193f, 0.0131898f, 0.2154029f, -0.0936573f, -0.0239458f, -0.1067562f, -0.0749452f, 0.0408518f, 0.2206942f, -0.1217940f, 0.1881429f, -1.3144898f, 0.0536983f, 0.0670688f, 0.0735033f, 0.2690658f, -0.1175179f, 0.0656617f },\n", + "{ -0.1368900f, -0.5260106f, -0.2468513f, -0.2262946f, -0.0182993f, -0.0015103f, -0.0237845f, 0.1924657f, -0.1337850f, -0.0133332f, 0.0452632f, 0.0729232f, 0.0309925f, 0.0197245f, -0.3428172f, -0.0070602f, 0.1913371f, 0.0050748f, 0.0171828f, -0.0170928f, 0.0061459f, 0.1604311f, 0.0312920f, -0.1243916f, 0.0741778f, 0.7906619f, 0.0470147f, -0.1912991f, 0.1659433f, -0.2616988f, -0.0205733f, 0.0721926f },\n", + "{ 0.0410583f, 0.2570575f, -0.2349126f, -0.1249535f, -0.1147267f, -0.0586542f, 0.0945731f, -0.1528569f, 0.0223845f, -0.0114466f, 0.0076511f, 0.0425091f, 0.0635790f, 0.0743543f, 0.2056053f, 0.1009817f, -0.1276455f, -0.0420704f, 0.0873579f, 0.1406774f, -0.0373695f, -0.1381779f, 0.0274649f, -0.0109214f, 0.0446802f, -0.0897308f, -0.0049318f, 0.0483357f, -0.0019486f, 0.0062029f, -0.0166061f, 0.0277916f },\n", + "};\n", + "\n", + "HOST_DEVICE_CONSTANT float bias_fc2[32] = {\n", + "0.2420192f, 0.1498822f, 0.3024662f, 0.3672144f, 0.0681908f, 0.2503948f, 0.3133035f, -0.1726400f, 0.3422103f, 0.3013457f, 0.0799109f, 0.5581454f, 0.0360919f, -0.1259440f, 0.1672565f, 0.5968557f, 0.3310452f, 0.3513657f, 0.0095852f, -0.5643460f, 0.3940795f, 0.1897698f, -0.0710970f, -0.6519080f, 0.0576156f, 0.2428404f, -0.1078773f, 0.2108476f, 0.1875714f, 0.1078442f, -0.0107385f, -0.1956442f };\n", + "\n", + "HOST_DEVICE_CONSTANT const float wgtT_fc2[32][32] = {\n", + "{ 0.9477844f, 0.0790645f, 0.2978441f, 0.2175170f, 0.5990626f, 0.4165306f, 0.0300093f, -0.0033081f, 0.0664389f, -0.2740595f, -0.0570693f, 0.1170626f, -0.6052473f, -0.0285526f, -0.9750593f, -0.3751386f, -0.3696023f, -0.0711362f, 0.1896876f, 0.5425194f, -0.3994021f, -0.3224111f, -0.0439428f, 1.2177781f, 0.0406177f, 0.0248419f, -0.1460319f, 1.1979570f, -0.6026343f, -0.3181922f, -0.0349307f, 0.1294153f },\n", + "{ -0.4457576f, -0.4166358f, 0.1140768f, -0.0995491f, -0.9297115f, -0.8484927f, 0.3921157f, 0.1671217f, 0.0391290f, 0.7723724f, -0.7536542f, -0.0683614f, 0.5181671f, -0.1488807f, 0.2528050f, -1.1527445f, 0.0186907f, 0.4965201f, -0.2928216f, -0.2430153f, 0.8413167f, 0.3416253f, -0.3918425f, -0.1520794f, -0.5800689f, -0.6464683f, 0.0246702f, 0.0182789f, -0.5166554f, 0.3883571f, -0.2517799f, -0.0094098f },\n", + "{ -0.6032159f, 0.6876090f, 0.2889559f, 0.1468648f, -0.5641968f, 0.3478630f, -1.1751226f, -0.1272719f, -1.5550770f, -0.6672150f, 1.0173961f, 0.2250547f, 0.2266909f, 0.0112633f, -0.2033706f, 0.3649680f, 0.2778299f, 0.1591411f, 0.5714924f, 0.3382102f, -0.3199378f, 0.1030864f, 0.3654917f, 1.0137405f, 0.6059799f, -0.0892025f, -0.1926481f, 0.5751148f, -0.0483990f, -0.2362603f, 0.2127502f, 0.1076699f },\n", + "{ 0.0864884f, -0.1346420f, -0.0590672f, 0.2709527f, 0.0059497f, 0.8278427f, -0.0376555f, -0.0993137f, 0.1544702f, 1.5397516f, 1.3985173f, 0.1458596f, -0.1318251f, -0.1708164f, -0.2529704f, 0.1802474f, -0.4465636f, -0.3608373f, -0.6186194f, 0.1104736f, -0.2197167f, 0.6114312f, 3.0708153f, -0.0367185f, -0.6026717f, 0.0437186f, -0.0068691f, 0.7994439f, -0.4641058f, 0.6231949f, 0.2994401f, -0.1114754f },\n", + "{ 0.4865573f, -0.2257494f, -0.0622113f, -0.2906855f, -0.4806692f, -0.1878923f, 0.2063936f, -0.0085900f, -0.3972982f, 0.6918074f, -0.1789056f, 0.1042560f, 1.7135161f, 0.1607887f, -1.0253457f, 0.4387689f, 0.2900070f, 0.8834500f, 0.1100190f, -0.3313121f, -0.1400318f, -0.2239047f, -0.4258100f, -0.5461789f, 0.3623838f, -0.2245702f, 0.0109423f, 1.2249749f, 0.6720605f, -1.2524203f, -0.2595521f, -0.0136557f },\n", + "{ -0.8114674f, -0.0589685f, -0.4537889f, 0.1343803f, 0.6155490f, 0.4542705f, -0.1784246f, -0.0367607f, 1.3722695f, -0.5036284f, 0.1591292f, 0.4921753f, 0.1966196f, -0.0245796f, -0.4362302f, 0.7561527f, -0.9307599f, -0.4161506f, -0.0985663f, 1.0505419f, -0.4145910f, -0.2383539f, -0.3260167f, -0.2006534f, 0.1461904f, -0.1774964f, 0.0748390f, 0.2687811f, -0.5755305f, -0.2619618f, 0.0031019f, 0.1053678f },\n", + "{ -0.1671602f, 0.5898983f, -0.3010138f, 0.1428170f, -0.4395862f, 0.6011736f, -0.6824208f, 0.0834212f, -0.3083069f, -0.8161052f, 0.8446352f, -0.1289981f, 0.1454613f, -0.0669884f, -0.2147270f, -0.0693433f, 0.4310409f, 0.3372035f, 0.4923474f, 0.0451390f, -0.2172501f, 1.1826969f, -0.0953328f, -0.1689639f, 0.5121273f, 0.5773017f, -0.2540970f, 0.9814218f, 0.2213568f, 0.1745940f, 0.6629733f, -0.0703891f },\n", + "{ -0.0943655f, 0.0389990f, 0.3364168f, 0.2098130f, 0.1929279f, -0.0962308f, -0.0018474f, 0.0439214f, -0.7385208f, -0.4517773f, -0.0386891f, 0.0602551f, 0.1148888f, -0.1283621f, 0.0058366f, -0.3934270f, -0.1337466f, 0.0654528f, 0.4067565f, -0.4707848f, 0.1162578f, 0.5017020f, 0.3304436f, 0.0872209f, 0.4889075f, 0.2807720f, -0.1973572f, -0.4155709f, 0.0309771f, -0.7092831f, -0.7794424f, -0.1459839f },\n", + "{ -0.5295035f, 0.7356530f, 0.3039915f, 0.0810916f, -0.2164448f, 0.1579250f, -0.3331033f, 0.0239585f, 0.4926797f, 0.4662276f, 0.1003408f, 0.5102254f, 0.1000184f, -0.1730865f, 0.1500007f, 0.0569007f, 0.0662431f, 0.4424641f, -0.2252309f, -0.0009742f, -0.0801667f, 1.1692612f, 0.2382815f, -0.4052627f, 0.1667125f, 0.2946294f, -0.2483962f, -0.1908208f, 0.6336688f, 0.2673290f, 0.2469455f, 0.1539024f },\n", + "{ -0.7377842f, 0.1239449f, -0.2160517f, 0.0836856f, 0.0563133f, -0.1287455f, -2.4090533f, 0.0182498f, -0.3940274f, 0.3978150f, -0.0008089f, 0.8301392f, 0.3864959f, 0.0828013f, 0.1775530f, -0.0267429f, 0.3220538f, -0.1131186f, 0.0929232f, 0.7917365f, -0.2574012f, -0.3485697f, -0.3520234f, 0.0321406f, 0.5416895f, -0.7747179f, 0.0263138f, 0.0156633f, -0.6029642f, -0.4099184f, 0.1297072f, -0.0763408f },\n", + "{ -0.9725084f, -0.6225982f, -0.0241479f, -0.8526779f, -1.8055981f, -0.0342978f, -0.0353824f, -0.0487756f, -0.0194707f, 0.8823376f, 0.9235744f, 0.3005395f, 0.2835868f, -0.1148965f, 0.3521956f, -0.3969032f, -0.1618436f, 0.5247192f, -1.2570199f, -1.2933259f, 0.2353207f, 0.0522201f, -0.3407558f, -0.7083238f, -0.8502682f, 0.2354126f, -0.0983525f, -0.5225297f, -1.1363075f, 0.1191391f, 0.3688005f, -0.0721454f },\n", + "{ -0.4978539f, 0.0213132f, -0.9456733f, 0.4147929f, 0.4021548f, 0.4828983f, 1.7751889f, -0.0557035f, 0.2536854f, -0.8965177f, 0.0013453f, -0.1397893f, -0.2014100f, -0.1129207f, 0.0604085f, 0.0149230f, -0.0841563f, 0.5373021f, 0.8044986f, -0.0295436f, 0.2773425f, 0.8043463f, -0.1877888f, -1.1105905f, 0.2900093f, 0.8607606f, -0.1415148f, -0.4507093f, 0.9467223f, -0.1084260f, 0.6052061f, -0.1686843f },\n", + "{ -0.2258019f, 0.1889428f, -0.2686882f, -0.3063822f, -0.3166457f, -0.2806566f, 0.1178042f, 0.0608205f, -0.2645664f, -1.0405049f, -0.0519723f, 0.3019978f, 0.0006940f, -0.1020586f, -0.3942995f, 0.4342203f, -0.3345312f, 0.4574130f, -0.4044704f, 0.6222502f, 0.2347430f, 0.0962147f, 0.4692436f, 1.0109904f, -0.1394140f, -0.0479612f, 0.0143121f, 0.3230010f, -0.0837017f, 0.3180766f, 0.4171008f, 0.0107547f },\n", + "{ -2.1767504f, -0.5494305f, 1.7831416f, -0.1602608f, -0.7913717f, -0.5385063f, -1.3010976f, -0.0732973f, -0.7383692f, -0.4942359f, 0.0797735f, 0.9569775f, 0.5248573f, -0.0532136f, 1.1371235f, 0.0740525f, -0.3389917f, 0.0862791f, -0.3393867f, -1.7828649f, -0.2016756f, -0.3977666f, 0.7217023f, 0.4741161f, -0.2263446f, 0.1031418f, -0.1255716f, 0.2873176f, -0.1175444f, 0.4997679f, -0.0171211f, -0.1910678f },\n", + "{ 0.5997473f, 0.3704447f, -0.1027960f, 0.0615773f, 0.3142829f, 0.3180274f, 0.9900225f, -0.2466927f, -0.1713584f, -0.6912794f, 0.4348271f, -0.2014036f, 0.1685447f, -0.1432491f, -0.2384894f, 0.4297218f, 0.2628476f, 0.0755370f, -0.6512125f, 1.0776943f, -0.2526596f, -1.0413667f, 1.0825540f, 0.0121419f, -0.4139650f, 0.1953526f, 0.0228532f, 0.7276669f, 0.2967961f, 0.3857630f, -0.0092882f, -0.0652729f },\n", + "{ 0.3495303f, 0.0528409f, -0.1238677f, -0.1436307f, -0.3670696f, -0.5042573f, -0.7938571f, -0.1738083f, 0.0205153f, 0.0897479f, -0.2325604f, -0.0440110f, -0.3223808f, 0.1715952f, 0.2273175f, 0.0355640f, -0.3030194f, -0.0378800f, 0.1169375f, -0.8088371f, 0.3684180f, 0.1068725f, -0.5171835f, 0.1674343f, 0.2052878f, 0.3094593f, -0.2305119f, 0.2525437f, 0.1789630f, -0.4817703f, -0.0030947f, -0.1891324f },\n", + "{ 0.6293146f, 0.2584574f, 0.0100317f, -0.5799903f, 0.2948301f, -0.4371910f, -0.0477715f, -0.0218286f, -0.1696342f, -0.4813184f, -0.8331993f, 0.3223454f, 0.0029136f, 0.1666087f, -0.3873546f, -0.2286834f, 0.1122524f, -0.3860610f, -0.8188475f, -0.9623070f, 0.1606599f, -0.6897836f, -0.3358153f, -0.1685106f, -0.2947677f, 0.2129448f, 0.0359219f, -0.1852056f, 0.1128887f, 0.0618916f, 0.2507945f, 0.0447627f },\n", + "{ 0.0554332f, -0.0027592f, 0.3535706f, -0.4331247f, -0.2471175f, -0.3155170f, -1.5408354f, -0.2673851f, -0.5063978f, -0.5054772f, -0.4510890f, 1.1381546f, 0.7692682f, -0.1762980f, -0.2943404f, 0.0445386f, -0.2057083f, 0.2759189f, -0.3914460f, -0.6832695f, -0.1839541f, -0.3678920f, -0.2850055f, -0.5779636f, 0.0224292f, -0.4669296f, -0.2568997f, 0.1900256f, -0.2664030f, 0.2227556f, 0.3770681f, -0.1686298f },\n", + "{ -0.8099023f, 0.6079454f, -1.0392671f, 0.1853553f, -0.0657482f, 0.0594661f, -2.7382996f, -0.2678560f, -1.0898361f, -1.1456356f, -0.0590183f, 0.3825967f, -0.5998831f, -0.0217187f, -1.8030874f, -0.5415536f, 0.0403031f, -0.4595840f, 0.2551507f, -0.5179180f, 0.0030503f, 0.6006228f, -0.2032869f, -0.3312562f, 0.2309013f, 0.2453417f, -0.0373306f, -1.2156100f, -0.1305973f, -0.6529071f, -0.4165395f, 0.0850382f },\n", + "{ 0.2420593f, 0.2877297f, 0.0347489f, 0.4107040f, 0.0560220f, 0.1383768f, -0.0290268f, 0.0368654f, -0.3878137f, 0.2399966f, 0.2518795f, 0.2886151f, -0.1897193f, -0.1605257f, 0.0932711f, -0.2438373f, 0.1869382f, -0.5400008f, 0.6079569f, 0.6714113f, -0.0769095f, 0.2528530f, 0.1480197f, 0.5479824f, 0.4374030f, 0.3420986f, 0.0413617f, -1.0413530f, 0.2686166f, -0.5624301f, -0.4255804f, -0.0650254f },\n", + "{ -0.1250933f, -0.1136944f, 0.0993298f, 0.3014838f, -0.6356226f, -0.0490545f, 0.7753500f, -0.0809311f, 0.5323648f, -0.0345059f, 0.1949496f, 0.0198230f, 0.5341202f, 0.0308399f, -0.2006068f, -0.2500929f, -0.2550136f, 0.3400015f, 0.3697634f, -0.5224004f, -0.7527751f, 0.5704774f, -0.6227463f, -0.3936085f, 0.2489994f, 0.0875356f, -0.2447212f, 0.6399952f, -0.4011181f, -0.0860382f, 0.0883997f, 0.0172180f },\n", + "{ 0.5448795f, 0.8173789f, 0.0075663f, 1.1805303f, 1.7203569f, -0.6815717f, 0.3134039f, 0.0906886f, 0.0756090f, -0.4353962f, -0.5386847f, -0.0507332f, 0.5440259f, 0.0605894f, 0.2524048f, 0.3851925f, -0.4258735f, -0.6799555f, 0.3980977f, 0.7769310f, -0.5134005f, 0.5598153f, 0.4308333f, 0.3054441f, -0.0727649f, 0.5660210f, -0.0176415f, 0.1353741f, -0.2483104f, 0.1738807f, 0.6208159f, -0.0776369f },\n", + "{ -0.5709571f, -0.7984408f, -0.8615161f, 0.7372646f, 0.9487120f, 0.7898567f, -0.1343847f, -0.0519288f, 1.2782260f, 0.9464526f, 0.2376383f, -1.0223522f, -1.4201926f, -0.1367096f, 1.2966657f, 0.6358539f, 1.0579402f, -0.1776328f, 0.4553668f, 1.6561530f, 1.7639430f, -0.0572736f, 0.1825964f, 0.6839079f, -1.1312269f, 2.2394719f, -0.1153456f, 0.0832286f, 1.1678441f, 0.9995819f, -0.6752121f, -0.0294776f },\n", + "{ 0.5853618f, 0.0476583f, 0.3115363f, 0.2302655f, 0.1206093f, 0.1423729f, -0.0688958f, -0.1274807f, -0.7104061f, 0.6695569f, 0.3462166f, 0.1399361f, 0.0738895f, 0.1395106f, -0.0947572f, -0.4398190f, 0.8046142f, 0.1796375f, 0.6236497f, -0.3355125f, 0.0665246f, 0.1648258f, 0.1719281f, -0.0215839f, 0.2948838f, -0.0364384f, -0.0132194f, -0.3336160f, 0.1608825f, -0.3809827f, 0.0427708f, -0.1653370f },\n", + "{ -0.2396747f, 0.5994402f, 0.1901325f, 0.0756556f, -0.1019675f, 0.1934567f, 2.2492085f, 0.0405573f, 0.7990069f, -0.0031116f, 0.1399053f, 0.2491723f, -0.4884324f, -0.0280764f, -0.2176450f, -0.3256943f, 0.6038598f, -0.7596282f, 0.7370521f, -0.6102398f, 0.0417237f, 0.6308144f, 0.2804313f, -1.0541338f, 0.4447262f, -0.1072341f, -0.1903439f, -0.4858476f, 0.7604120f, 0.1830743f, -0.3262461f, -0.0845358f },\n", + "{ -1.8205953f, 0.0579756f, 0.2186305f, -0.7704644f, -1.0015099f, -0.5109156f, 0.5111710f, 0.1077972f, 0.5853909f, 1.1057258f, -0.5496864f, -0.0546181f, -0.1387448f, -0.0367158f, 0.0563303f, -0.9073950f, 1.1649257f, 0.6930003f, -0.0609807f, -1.1429670f, -0.1540745f, -1.2014219f, -0.2904009f, 0.2807863f, 0.1425838f, -0.2909705f, -0.0341960f, 2.6969550f, 0.1141804f, 0.7014298f, 0.1753227f, 0.0768410f },\n", + "{ -1.1060591f, 0.0567899f, -0.1571269f, -0.9480476f, -0.4812395f, -0.3905266f, -0.4127474f, -0.0700787f, -0.1037446f, 0.6893422f, -0.4761419f, 0.0626154f, 0.1033659f, 0.1149158f, 0.3811806f, -0.0267461f, 0.1825537f, 0.6764455f, -0.6284249f, -0.4999892f, 0.1400735f, -0.3666739f, -0.8226722f, -0.2742531f, 0.0038938f, 0.1431945f, -0.2304713f, 0.1959182f, -0.0833413f, 0.1036758f, 0.5925360f, -0.1728666f },\n", + "{ 0.8618100f, 0.1624423f, -0.0119217f, -0.3260103f, 1.2995098f, -0.6950228f, 0.2578443f, -0.0584942f, -0.1956889f, -1.1657989f, -0.9274270f, 0.0248109f, 0.3926098f, -0.0011959f, 0.4083188f, 0.6157458f, -0.1829408f, 0.0255032f, -0.9857827f, 0.9257624f, 0.1254213f, -0.7773420f, -0.8070686f, 1.0248510f, -1.0815803f, -0.1019331f, -0.0273850f, -0.0287858f, -0.5333901f, 0.2750031f, 0.4854398f, 0.0430395f },\n", + "{ -2.2706361f, -0.0563411f, 0.0747649f, 0.0839579f, -0.7418628f, -0.5147710f, -0.4589594f, -0.1936616f, 0.0085840f, 0.2041321f, 0.0634176f, -0.1194840f, -0.3277527f, -0.1171821f, -0.4370427f, -1.7333642f, -1.0109788f, -2.2809637f, 0.5498678f, -1.5792087f, 0.3492494f, -0.2270884f, -0.0219570f, 0.2369912f, 0.3975051f, 0.1427489f, 0.0350726f, -0.5830398f, -0.1225577f, -1.1089261f, -2.2723722f, -0.0715627f },\n", + "{ 1.6286877f, 0.6170489f, 0.2090771f, 0.7154092f, 0.3796651f, 0.3692173f, 0.5580201f, -0.2510560f, 0.2133680f, -0.1495305f, 0.4843171f, 0.1983987f, -0.3489809f, 0.0815524f, -0.4780030f, -0.2526886f, -0.1224521f, -0.3420408f, 0.6007171f, 0.7295829f, -0.1047851f, 0.4106947f, 0.1101658f, -0.8703307f, 0.2298607f, 0.3555209f, -0.2199591f, 0.3845321f, 0.0053869f, -0.3889537f, -0.3812927f, -0.1833587f },\n", + "{ 1.1275142f, -0.0847157f, 0.7803201f, 0.6043309f, 0.0697254f, -0.1595450f, 0.8116972f, -0.2051597f, 1.3941048f, -0.2311134f, 0.1249815f, -0.1849142f, -0.0676029f, -0.1570321f, -0.0248682f, 0.1011748f, 0.2924128f, 0.2810532f, 0.5785351f, -0.2909298f, -0.0618236f, 0.3666790f, 0.1437915f, -0.1709863f, -0.0455444f, 1.0872705f, -0.1216226f, -0.5141663f, 0.0893981f, 0.0563621f, 0.3713191f, 0.1215324f },\n", + "{ 0.3138374f, -0.2366744f, 0.3531516f, -5.1496854f, -0.7201742f, -5.3525457f, 0.4425960f, 0.0024644f, -0.0003756f, -1.9120497f, -3.6601391f, -0.4874162f, 0.3136120f, -0.0846221f, 0.1454570f, -0.0903244f, -0.7935557f, -0.1082042f, -6.7450323f, 0.1083279f, -0.0658780f, -3.3311872f, -11.0901842f, 0.3452957f, -0.4402857f, 0.1120452f, 0.0429914f, -0.4037071f, -0.1304435f, 0.3757658f, 0.5700281f, -0.0560347f },\n", + "};\n", + "\n", + "HOST_DEVICE_CONSTANT float bias_fc3[6] = {\n", + "0.4638648f, 0.2592537f, -0.0224077f, -0.3610995f, 0.2049032f, -0.1270025f };\n", + "\n", + "HOST_DEVICE_CONSTANT const float wgtT_fc3[32][6] = {\n", + "{ -0.0825683f, 0.0410914f, 0.3665631f, 0.1153224f, 0.2717541f, 0.0572775f },\n", + "{ 0.3823453f, 0.1005642f, -0.0687870f, -0.5702714f, -0.0982427f, -0.0720022f },\n", + "{ 0.2767557f, 0.3633989f, 0.3004855f, -0.2707561f, 0.4023620f, -0.0316385f },\n", + "{ -0.6080245f, 0.5111613f, 0.0303876f, 0.1534717f, 0.6780844f, 0.1847766f },\n", + "{ 0.1950710f, -0.0140113f, -0.0460127f, 0.4004743f, -0.0588760f, -0.1026509f },\n", + "{ -0.4413157f, -0.1262633f, 0.0999593f, -0.1316405f, 0.0456409f, 0.1524025f },\n", + "{ -0.2625964f, -0.2398003f, 0.0026281f, 0.2827081f, -0.1214944f, 0.0673692f },\n", + "{ -0.0405760f, -0.0274085f, -0.0738333f, -0.1128784f, -0.1568583f, -0.0800972f },\n", + "{ -0.3202673f, -0.3390695f, -0.1534856f, 0.3196714f, -0.2789583f, 0.0711831f },\n", + "{ -0.1860698f, -0.1582274f, 0.1985906f, 0.2078834f, 0.0358276f, 0.0675854f },\n", + "{ 0.3786796f, 0.1351469f, -0.1311201f, 0.4751540f, -0.0107362f, -0.1871149f },\n", + "{ 0.6353824f, 0.5677436f, 0.1590982f, -0.6899668f, 0.3740025f, -0.1411532f },\n", + "{ 0.3073860f, 0.2839593f, 0.1694280f, -0.3355140f, 0.2433507f, -0.0488098f },\n", + "{ -0.0928499f, 0.0616765f, -0.0771306f, 0.1355574f, -0.1019612f, -0.1266196f },\n", + "{ -0.2041278f, -0.1548309f, 0.0368690f, 0.1600682f, -0.0518508f, 0.0607208f },\n", + "{ 0.1211834f, -0.1294493f, 0.2249328f, 0.3190344f, 0.0067060f, -0.0251227f },\n", + "{ -0.0526831f, -0.0509629f, -0.3755513f, -0.1174352f, -0.2525741f, -0.0183803f },\n", + "{ 0.0209530f, -0.1739729f, 0.2555005f, -0.2378753f, -0.0424013f, 0.0581072f },\n", + "{ -0.0075336f, -0.5307564f, 1.0589222f, 0.3346883f, 0.1339612f, 0.1346273f },\n", + "{ 0.2160633f, 0.0964605f, -0.0941461f, 0.2930759f, 0.0173386f, -0.0748447f },\n", + "{ -0.6522665f, -0.5073403f, -0.2431537f, 0.4983193f, -0.3755145f, 0.1643617f },\n", + "{ 0.1971257f, -0.0410421f, -0.5036770f, -0.2652275f, -0.4003507f, -0.1095356f },\n", + "{ -0.1139918f, -0.1514564f, 0.1970165f, -0.2130822f, -0.0206673f, 0.0784776f },\n", + "{ -0.0165255f, -0.0692864f, -0.2636001f, -0.0269720f, -0.2099786f, -0.0313033f },\n", + "{ 0.1173475f, 0.6424626f, -0.0928475f, -0.1411267f, 0.4882753f, -0.0760400f },\n", + "{ -0.6952152f, -0.8492880f, -0.6860636f, 0.6728117f, -0.9144394f, 0.0992556f },\n", + "{ 0.0875367f, 0.0357710f, -0.1389648f, 0.0625666f, 0.1185083f, -0.1085772f },\n", + "{ 0.0125439f, 0.1258396f, 0.0932084f, 0.0433826f, 0.1670030f, -0.0043936f },\n", + "{ -0.2513180f, -0.2649883f, -0.3022399f, 0.2805146f, -0.3223124f, 0.0125926f },\n", + "{ -0.3392999f, -0.4831693f, 0.0285935f, 0.2977640f, -0.3052610f, 0.1079501f },\n", + "{ -0.1047532f, 0.2985990f, 0.5575675f, 0.3046419f, 0.6408112f, 0.0676042f },\n", + "{ 0.0253204f, 0.0201008f, 0.0023553f, 0.0057190f, -0.0633111f, -0.1201030f },\n", + "};\n", + "\n" + ] + } + ], + "source": [ + "print_model_weights_biases(embed_t5)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "analysisenv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/RecoTracker/LSTCore/standalone/code/core/write_lst_ntuple.cc b/RecoTracker/LSTCore/standalone/code/core/write_lst_ntuple.cc index 1d95687364ca7..6111500d35e9a 100644 --- a/RecoTracker/LSTCore/standalone/code/core/write_lst_ntuple.cc +++ b/RecoTracker/LSTCore/standalone/code/core/write_lst_ntuple.cc @@ -109,13 +109,22 @@ void createOptionalOutputBranches() { // pLS branches ana.tx->createBranch>("sim_pLS_matched"); - ana.tx->createBranch>>("sim_pLS_types"); + ana.tx->createBranch>>("pLS_matched_simIdx"); ana.tx->createBranch>("pLS_isFake"); ana.tx->createBranch>("pLS_isDuplicate"); - ana.tx->createBranch>("pLS_pt"); + ana.tx->createBranch>("pLS_ptIn"); + ana.tx->createBranch>("pLS_ptErr"); + ana.tx->createBranch>("pLS_px"); + ana.tx->createBranch>("pLS_py"); + ana.tx->createBranch>("pLS_pz"); ana.tx->createBranch>("pLS_eta"); + ana.tx->createBranch>("pLS_isQuad"); + ana.tx->createBranch>("pLS_etaErr"); ana.tx->createBranch>("pLS_phi"); ana.tx->createBranch>("pLS_score"); + ana.tx->createBranch>("pLS_circleCenterX"); + ana.tx->createBranch>("pLS_circleCenterY"); + ana.tx->createBranch>("pLS_circleRadius"); // T5 branches ana.tx->createBranch>("sim_T5_matched"); @@ -137,6 +146,7 @@ void createOptionalOutputBranches() { ana.tx->createBranch>("t5_bridgeRadius"); ana.tx->createBranch>("t5_chiSquared"); ana.tx->createBranch>("t5_rzChiSquared"); + ana.tx->createBranch>("t5_isDupAlgoFlag"); ana.tx->createBranch>("t5_nonAnchorChiSquared"); ana.tx->createBranch>("t5_dBeta1"); ana.tx->createBranch>("t5_dBeta2"); @@ -175,6 +185,12 @@ void createT5DNNBranches() { ana.tx->createBranch>("t5_t3_pt"); ana.tx->createBranch>("t5_t3_eta"); ana.tx->createBranch>("t5_t3_phi"); + ana.tx->createBranch>("t5_t3_fakeScore1"); + ana.tx->createBranch>("t5_t3_promptScore1"); + ana.tx->createBranch>("t5_t3_displacedScore1"); + ana.tx->createBranch>("t5_t3_fakeScore2"); + ana.tx->createBranch>("t5_t3_promptScore2"); + ana.tx->createBranch>("t5_t3_displacedScore2"); // Hit-specific branches std::vector hitIndices = {"0", "1", "2", "3", "4", "5"}; @@ -377,6 +393,7 @@ void setOptionalOutputBranches(LSTEvent* event) { setT3DNNBranches(event); setT5DNNBranches(event); setpT3DNNBranches(event); + setpLSOutputBranches(event); #endif } @@ -560,6 +577,7 @@ void setQuintupletOutputBranches(LSTEvent* event) { ana.tx->pushbackToBranch("t5_innerRadius", __H2F(quintuplets.innerRadius()[quintupletIndex])); ana.tx->pushbackToBranch("t5_bridgeRadius", __H2F(quintuplets.bridgeRadius()[quintupletIndex])); ana.tx->pushbackToBranch("t5_outerRadius", __H2F(quintuplets.outerRadius()[quintupletIndex])); + ana.tx->pushbackToBranch("t5_isDupAlgoFlag", quintuplets.isDup()[quintupletIndex]); ana.tx->pushbackToBranch("t5_chiSquared", quintuplets.chiSquared()[quintupletIndex]); ana.tx->pushbackToBranch("t5_rzChiSquared", quintuplets.rzChiSquared()[quintupletIndex]); ana.tx->pushbackToBranch("t5_nonAnchorChiSquared", quintuplets.nonAnchorChiSquared()[quintupletIndex]); @@ -864,7 +882,8 @@ void setT3DNNBranches(LSTEvent* event) { //________________________________________________________________________________________________________________________________ void setT5DNNBranches(LSTEvent* event) { - auto triplets = event->getTriplets(); + auto tripletsOcc = event->getTriplets(); + auto tripletsSoA = event->getTriplets(); auto modules = event->getModules(); auto ranges = event->getRanges(); auto const quintuplets = event->getQuintuplets(); @@ -874,7 +893,7 @@ void setT5DNNBranches(LSTEvent* event) { std::unordered_map t3_index_map; for (unsigned int idx = 0; idx < modules.nLowerModules(); ++idx) { - for (unsigned int jdx = 0; jdx < triplets.nTriplets()[idx]; ++jdx) { + for (unsigned int jdx = 0; jdx < tripletsOcc.nTriplets()[idx]; ++jdx) { unsigned int t3Idx = ranges.tripletModuleIndices()[idx] + jdx; if (allT3s.insert(t3Idx).second) { t3_index_map[t3Idx] = allT3s.size() - 1; @@ -902,6 +921,13 @@ void setT5DNNBranches(LSTEvent* event) { ana.tx->pushbackToBranch("t5_t3_idx0", t3_index_map[t3sIdx[0]]); ana.tx->pushbackToBranch("t5_t3_idx1", t3_index_map[t3sIdx[1]]); + ana.tx->pushbackToBranch("t5_t3_fakeScore1", tripletsSoA.fakeScore()[t3sIdx[0]]); + ana.tx->pushbackToBranch("t5_t3_promptScore1", tripletsSoA.promptScore()[t3sIdx[0]]); + ana.tx->pushbackToBranch("t5_t3_displacedScore1", tripletsSoA.displacedScore()[t3sIdx[0]]); + ana.tx->pushbackToBranch("t5_t3_fakeScore2", tripletsSoA.fakeScore()[t3sIdx[1]]); + ana.tx->pushbackToBranch("t5_t3_promptScore2", tripletsSoA.promptScore()[t3sIdx[1]]); + ana.tx->pushbackToBranch("t5_t3_displacedScore2", tripletsSoA.displacedScore()[t3sIdx[1]]); + if (t5s_used_in_tc.find(t5Idx) != t5s_used_in_tc.end()) { ana.tx->pushbackToBranch("t5_partOfTC", 1); ana.tx->pushbackToBranch("t5_tc_idx", t5_tc_index_map[t5Idx]); @@ -1355,6 +1381,79 @@ std::tuple, std::vectorgetPixelSegments(); + auto const& pixelSeeds = event->getInput(); + int n_accepted_simtrk = ana.tx->getBranch>("sim_TC_matched").size(); + + unsigned int n_pLS = pixelSegments.metadata().size(); + std::vector sim_pLS_matched(n_accepted_simtrk, 0); + std::vector> pLS_matched_simIdx; + + for (unsigned int i_pLS = 0; i_pLS < n_pLS; ++i_pLS) { + // Get pLS properties + float pt = pixelSeeds.ptIn()[i_pLS]; + float px = pixelSeeds.px()[i_pLS]; + float py = pixelSeeds.py()[i_pLS]; + float pz = pixelSeeds.pz()[i_pLS]; + bool isQuad = static_cast(pixelSeeds.isQuad()[i_pLS]); + float ptErr = pixelSeeds.ptErr()[i_pLS]; + float eta = pixelSeeds.eta()[i_pLS]; + float etaErr = pixelSeeds.etaErr()[i_pLS]; + float phi = pixelSeeds.phi()[i_pLS]; + float score = pixelSegments.score()[i_pLS]; + float centerX = pixelSegments.circleCenterX()[i_pLS]; + float centerY = pixelSegments.circleCenterY()[i_pLS]; + float radius = pixelSegments.circleRadius()[i_pLS]; + + // Get hits from pLS + std::vector hit_idx = getPixelHitIdxsFrompLS(event, i_pLS); + std::vector hit_type = getPixelHitTypesFrompLS(event, i_pLS); + + // Match to sim tracks + std::vector simidx = matchedSimTrkIdxs(hit_idx, hit_type); + bool isFake = simidx.empty(); + + // Fill branches + ana.tx->pushbackToBranch("pLS_ptIn", pt); + ana.tx->pushbackToBranch("pLS_ptErr", ptErr); + ana.tx->pushbackToBranch("pLS_px", px); + ana.tx->pushbackToBranch("pLS_py", py); + ana.tx->pushbackToBranch("pLS_pz", pz); + ana.tx->pushbackToBranch("pLS_eta", eta); + ana.tx->pushbackToBranch("pLS_etaErr", etaErr); + ana.tx->pushbackToBranch("pLS_phi", phi); + ana.tx->pushbackToBranch("pLS_score", score); + ana.tx->pushbackToBranch("pLS_circleCenterX", centerX); + ana.tx->pushbackToBranch("pLS_circleCenterY", centerY); + ana.tx->pushbackToBranch("pLS_circleRadius", radius); + ana.tx->pushbackToBranch("pLS_isQuad", isQuad); + ana.tx->pushbackToBranch("pLS_isFake", isFake); + pLS_matched_simIdx.push_back(simidx); + + // Count matches + for (auto& idx : simidx) { + if (idx < n_accepted_simtrk) { + sim_pLS_matched[idx]++; + } + } + } + + std::vector pLS_isDuplicate(pLS_matched_simIdx.size(), 0); + for (size_t i = 0; i < pLS_matched_simIdx.size(); ++i) { + for (int simidx : pLS_matched_simIdx[i]) { + if (simidx < n_accepted_simtrk && sim_pLS_matched[simidx] > 1) { + pLS_isDuplicate[i] = 1; + break; + } + } + } + + ana.tx->setBranch>("sim_pLS_matched", sim_pLS_matched); + ana.tx->setBranch>>("pLS_matched_simIdx", pLS_matched_simIdx); + ana.tx->setBranch>("pLS_isDuplicate", pLS_isDuplicate); +} + //________________________________________________________________________________________________________________________________ void printHitMultiplicities(LSTEvent* event) { auto modules = event->getModules(); diff --git a/RecoTracker/LSTCore/standalone/code/core/write_lst_ntuple.h b/RecoTracker/LSTCore/standalone/code/core/write_lst_ntuple.h index 544f435bbb030..d584e72498320 100644 --- a/RecoTracker/LSTCore/standalone/code/core/write_lst_ntuple.h +++ b/RecoTracker/LSTCore/standalone/code/core/write_lst_ntuple.h @@ -37,6 +37,7 @@ void fillpT3DNNBranches(LSTEvent* event, unsigned int iPT3); void setT5DNNBranches(LSTEvent* event); void setT3DNNBranches(LSTEvent* event); void setpT3DNNBranches(LSTEvent* event); +void setpLSOutputBranches(LSTEvent* event); std::tuple> parseTrackCandidate(LSTEvent* event, unsigned int); std::tuple, std::vector> parsepT5(LSTEvent* event,