├── LICENSE ├── README.md ├── examples ├── bubble_sort │ ├── README.md │ ├── bubble_sort.cpp │ └── go_hls.tcl ├── conv2D │ ├── README.md │ ├── conv2D.cpp │ └── go_hls.tcl ├── fir │ ├── README.md │ ├── fir.cpp │ └── go_hls.tcl ├── gcn │ ├── Readme.md │ ├── defs.h │ ├── gcn.h │ ├── gcn_tb.cpp │ ├── go_hls.tcl │ ├── helper.h │ ├── matrices │ │ ├── citeseer_adj.txt │ │ ├── citeseer_feat.txt │ │ ├── citeseer_weights.txt │ │ ├── citeseer_weights2.txt │ │ ├── cora_adj.txt │ │ ├── cora_feat.txt │ │ ├── cora_weights.txt │ │ ├── cora_weights2.txt │ │ ├── pubmed_adj.txt │ │ ├── pubmed_feat.txt │ │ ├── pubmed_weights.txt │ │ └── pubmed_weights2.txt │ └── matrix.h └── matrix_mul │ ├── README.md │ ├── go_hls.tcl │ ├── matrix_mul_basic.cpp │ ├── matrix_mul_dot.cpp │ └── matrix_mul_fma.cpp ├── fast_float.h └── set_libs.sh /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Integrated Circuits Lab @ DUTH 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Fast-Float4HLS 2 | Fast-Float4HLS is a C++ header only library for floating point arithmetic operations developed to be used for High Level Synthesis implemetations. 3 | 4 | Inside the header file is described a templated datatype 'fast_float' together with a set of operations. The datatype supports different floating point representations depending on the definitions of the mantissa M and exponent E widths through the template. 5 | For example: 6 | * fast_float<23,8> is used for the single precision representation. 7 | * fast_float<52,11> is used for the double precision representation. 8 | * fast_float<7,8> is used for the representation of Brain Floating Point, bfloat16, developed by Google Brain. 9 | 10 | Fast-Float4HLS depends only on ac_fixed library that is available in [HLSLibs](https://github.com/hlslibs/ac_types). 11 | 12 | Also the post-synthesis RTL co-simultion of the given examples require the sc_verify flow of Catapult HLS. The necessary header 13 | (mc_scverify) is publicly available in [ac_simutils](https://github.com/hlslibs/ac_simutils/tree/master/include). 14 | 15 | Downloading the needed header-only libraries can be done by running the provided script ```set_libs.sh``` 16 | 17 | # Supported Operators 18 | 19 | * Addition (A+B) 20 | * Multiplication (A*B) 21 | * Multiply-Add (A*B + C) 22 | * Vector Dot Product (A[0]*B[0]+A[1]*B[1]+...+A[N-1]*B[N-1]) 23 | 24 | Addition and multiplication are overloaded also to + and * operators. The same holds for comparisons and assignment operators 25 | 26 | ## Denormals 27 | The operations of addition, multiplication and MAC support denormalized values through a template parameter ''DENORMALS''. By default, the operators do not support denormalized values, while converting them into zero values. 28 | 29 | Currently the overloaded operators +, -, *, +=, -=, *= compute the corresponding operation without support for denormalized values. 30 | 31 | # Pending Features 32 | 33 | * Allow for possible increase the output precision of dot product. 34 | * Implement Division 35 | 36 | # Reference 37 | 38 | The architecture and performance of the fused vector dot product unit, implemented as part of the FastFloat4HLS library, was published in the Journal of Low Power Electronics and Applications on Oct. 2022. You can find the paper [here](https://www.mdpi.com/2079-9268/12/4/56/pdf). To cite this work, please use: 39 | 40 | ``` 41 | @article{fused-fp-dot, 42 | author = {Filippas, Dionysios and Nicopoulos, Chrysostomos and Dimitrakopoulos, Giorgos}, 43 | title = {Templatized Fused Vector Floating-Point Dot Product for High-Level Synthesis}, 44 | journal = {Journal of Low Power Electronics and Applications}, 45 | volume = {12}, 46 | year = {2022}, 47 | number = {4}, 48 | article-number = {56}, 49 | ``` 50 | 51 | # Contributors 52 | 53 | Currently active: [Dionysios Filippas](https://github.com/dionisisfil), [Christodoulos Peltekis](https://github.com/chrispelt) 54 | and [Giorgos Dimitrakopoulos](https://github.com/gdimitrak) 55 | 56 | Past: Nikolaos Altanis 57 | 58 | # License 59 | Fast-Float4HLS is licensed with the MIT License. You are completely free to re-distribute your work derived from Fast-Float4HLS 60 | 61 | -------------------------------------------------------------------------------- /examples/bubble_sort/README.md: -------------------------------------------------------------------------------- 1 | # Bubble Sort implementation 2 | 3 | This is an example implementation of a Bubble Sorting algorithm using the Fast-Float4HLS library. The implementation can be found in the bubble_sort.cpp file together with the testbench main function. The bubbleSort function is a templatized C++ function implemented for HLS using the Catapult HLS tool. The size of the input array to be sorted can be selected through the template parameter ''N''. 4 | 5 | To synthesize the design on Catapult HLS use the *go_hls.tcl* script. The given example synthesizes a bubble sort algorithm that sorts the 10 elements of an array. When changing the size of the array through the template parameter 6 | 7 | ```c++ 8 | const int NSIZE = 10; 9 | bubbleSort(inA); 10 | ``` 11 | 12 | you should also change the value of the variable ''ARRAY_SIZE'' at the top of the *go_hls.tcl* TCL script. 13 | 14 | ```tcl 15 | set ARRAY_SIZE 10 16 | ``` 17 | 18 | To synthesize the design launch catapult in the directory of the example. 19 | 20 | ```bash 21 | catapult -f go_hls.tcl 22 | ``` 23 | 24 | -------------------------------------------------------------------------------- /examples/bubble_sort/bubble_sort.cpp: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Democritus University of Thrace 2 | // Integrated Circuits Lab 3 | // 4 | // Example using Fast-Float4HLS to build a Bubble Sort sorting algorithm 5 | #include 6 | #include 7 | #include "fast_float.h" 8 | #include "mc_scverify.h" 9 | 10 | typedef ffp32 T; 11 | 12 | #pragma hls_design 13 | template 14 | void CCS_BLOCK(bubbleSort)(T inA[N]) { 15 | 16 | for (int i=0; i inA[j+1]) { 19 | T temp = inA[j]; 20 | inA[j] = inA[j+1]; 21 | inA[j+1] = temp; 22 | } 23 | } 24 | } 25 | }; 26 | 27 | float random_float() { 28 | float HI = rand(); 29 | float LO = -rand(); 30 | return LO + static_cast (rand()) /( static_cast (RAND_MAX/(HI-LO))); 31 | }; 32 | 33 | CCS_MAIN(int, char**) { 34 | 35 | const int NSIZE = 10; 36 | T inA[NSIZE]; 37 | 38 | srand(time(NULL)); 39 | 40 | for (int i=0; i(inA); 47 | 48 | for (int i=0; i" 8 | 9 | # Definition path to top (tb) cpp file 10 | set FPATH "./bubble_sort.cpp" 11 | 12 | # Definition project name 13 | set PROJECT "bubble_sort_example" 14 | 15 | # GO_HLS 16 | 17 | project new -name $PROJECT 18 | solution new -state initial 19 | solution options defaults 20 | solution options set /ComponentLibs/SearchPath . -append 21 | solution options set /Interface/DefaultClockPeriod 2 22 | solution options set /Input/CppStandard c++11 23 | solution options set /Input/CompilerFlags { -DHLS_CATAPULT=1 } 24 | solution options set /Input/SearchPath { ../../ } 25 | solution options set /Flows/QuestaSIM/SCCOM_OPTS {-O3 -x c++ -Wall -Wno-unused-label -Wno-unknown-pragmas} 26 | solution options set /Flows/SCVerify/USE_CCS_BLOCK true 27 | flow package require /SCVerify 28 | flow package require /QuestaSIM 29 | solution file add $FPATH -type C++ 30 | directive set -DESIGN_GOAL latency 31 | go new 32 | solution design set $TOP -top 33 | go analyze 34 | directive set -CLOCKS {clk {-CLOCK_PERIOD 2.0 -CLOCK_UNCERTAINTY 0.0 -CLOCK_HIGH_TIME 1.0}} 35 | solution library add nangate-45nm_beh -- -rtlsyntool OasysRTL -vendor Nangate -technology 045nm 36 | solution library add ccs_sample_mem 37 | go libraries 38 | go assembly 39 | go architect 40 | go allocate 41 | go extract 42 | 43 | #COSIM 44 | flow run /SCVerify/launch_make ./scverify/Verify_concat_sim_rtl_v_msim.mk {} SIMTOOL=msim sim 45 | 46 | -------------------------------------------------------------------------------- /examples/conv2D/README.md: -------------------------------------------------------------------------------- 1 | # 2D Convolution Engine implementation 2 | 3 | This is an example implementation of a 2D convolution engine using the Fast-Float4HLS library. The outputs are being calculated using the dot product function of the Fast-Float4HLS library. The implementation can be found in the conv2D.cpp file together with the testbench main function. The conv2D is a templatized C++ function implemented for HLS using the Catapult HLS tool. The template parameters define the size of the input features map (''H'' and ''W'') as well as the size of the kernel (''K''). 4 | 5 | To synthesize the design on Catapult HLS use the *go_hls.tcl* script. The given example synthesizes a 2D convolution engine that convolves a 5x5 kernel with a 14x14 input. When changing the template parameters in the source code, that define the design 6 | 7 | ```c++ 8 | const int H = 14; 9 | const int W = 14; 10 | const int K = 5; 11 | conv2D(img,flt,out); 12 | ``` 13 | 14 | you should also change the corresponding variables at the top of the *go_hls.tcl* TCL script. 15 | 16 | ```tcl 17 | set IF_HEIGHT 14 18 | set IF_WIDTH 14 19 | set KERNEL_S 5 20 | ``` 21 | 22 | Apart from the input features and kernel sizes, the tcl scripts uses the sizes of the floating point representation fields to help with the architecture definition of the line buffers. 23 | 24 | ```tcl 25 | set MANW 7 26 | set EXPW 8 27 | ``` 28 | 29 | To synthesize the design launch catapult in the directory of the example. 30 | 31 | ```bash 32 | catapult -f go_hls.tcl 33 | ``` 34 | 35 | -------------------------------------------------------------------------------- /examples/conv2D/conv2D.cpp: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Democritus University of Thrace 2 | // Integrated Circuits Lab 3 | // 4 | // Example using Fast-Float4HLS to build an 2D Convolution 5 | #include 6 | #include 7 | #include "fast_float.h" 8 | #include "ac_channel.h" 9 | 10 | #include "mc_scverify.h" 11 | 12 | typedef ffp16b T; 13 | typedef ac_channel chT; 14 | 15 | #pragma hls_design 16 | template 17 | void CCS_BLOCK(conv2D) (chT &inp, T filter[KERNEL][KERNEL], chT &out) { 18 | 19 | static T lb[KERNEL-1][IF_WIDTH]; 20 | static T window[KERNEL][KERNEL]; 21 | 22 | #pragma hls_pipeline_init_interval 1 23 | for (int i=0; i0) 37 | lb[m-1][j] = tmp; 38 | } 39 | 40 | // Output Pixel Calculation 41 | if (i>=KERNEL-1 && j>=KERNEL-1) { 42 | T o_pxl = 0.0; 43 | #pragma hls_unroll 44 | for (int m=0; m(window[m], filter[m]); 47 | o_pxl += tmp_pxl; 48 | } 49 | out.write(o_pxl); 50 | } 51 | } 52 | } 53 | } 54 | 55 | float rand_num(float HI, float LO) { 56 | return LO + static_cast (rand()) /( static_cast (RAND_MAX/(HI-LO))); 57 | } 58 | 59 | CCS_MAIN(int, char**) { 60 | 61 | const int H = 14; 62 | const int W = 14; 63 | const int K = 5; 64 | 65 | chT img, out; 66 | T flt[K][K]; 67 | 68 | float HI; 69 | float LO; 70 | 71 | srand(time(NULL)); 72 | 73 | for (int i=0; i(img,flt,out); 88 | 89 | 90 | for (int i=0; i" 17 | set TOP_HIER "conv2D<${IF_HEIGHT},${IF_HEIGHT},${KERNEL_S}>" 18 | 19 | # Define path to top (tb) cpp file 20 | set FPATH "./conv2D.cpp" 21 | 22 | # Define project name 23 | set PROJECT "conv2D_example" 24 | 25 | # GO_HLS 26 | 27 | project new -name $PROJECT 28 | solution new -state initial 29 | solution options defaults 30 | solution options set /ComponentLibs/SearchPath . -append 31 | solution options set /Interface/DefaultClockPeriod 2 32 | solution options set /Input/CppStandard c++11 33 | solution options set /Input/CompilerFlags { -DHLS_CATAPULT=1 } 34 | solution options set /Input/SearchPath { ../../ } 35 | solution options set /Flows/QuestaSIM/SCCOM_OPTS {-O3 -x c++ -Wall -Wno-unused-label -Wno-unknown-pragmas} 36 | solution options set /Flows/SCVerify/USE_CCS_BLOCK true 37 | flow package require /SCVerify 38 | flow package require /QuestaSIM 39 | solution file add $FPATH -type C++ 40 | directive set -DESIGN_GOAL latency 41 | go new 42 | solution design set $TOP -top 43 | go analyze 44 | directive set -CLOCKS {clk {-CLOCK_PERIOD 8.0 -CLOCK_UNCERTAINTY 0.0 -CLOCK_HIGH_TIME 4.0}} 45 | solution library add nangate-45nm_beh -- -rtlsyntool OasysRTL -vendor Nangate -technology 045nm 46 | solution library add ccs_sample_mem 47 | go libraries 48 | go assembly 49 | directive set "/${TOP_HIER}/core/lb.mantissa:rsc" -PACKING_MODE compact 50 | directive set "/${TOP_HIER}/core/lb.exponent" -RESOURCE lb.mantissa:rsc 51 | directive set "/${TOP_HIER}/core/lb.exponent" -BASE_BIT $MANW 52 | directive set "/${TOP_HIER}/core/lb.exponent:rsc" -MAP_TO_MODULE {} 53 | directive set "/${TOP_HIER}/core/lb.sign" -RESOURCE lb.mantissa:rsc 54 | directive set "/${TOP_HIER}/core/lb.sign" -BASE_BIT [expr $MANW+$EXPW] 55 | directive set "/${TOP_HIER}/core/lb.sign:rsc" -MAP_TO_MODULE {} 56 | directive set "/${TOP_HIER}/core/lb.mantissa:rsc" -BLOCK_SIZE $IF_WIDTH 57 | go architect 58 | ignore_memory_precedences -from *write_mem(lb* -to *read_mem(lb* 59 | go allocate 60 | go extract 61 | 62 | #COSIM 63 | flow run /SCVerify/launch_make ./scverify/Verify_concat_sim_rtl_v_msim.mk {} SIMTOOL=msim sim 64 | 65 | -------------------------------------------------------------------------------- /examples/fir/README.md: -------------------------------------------------------------------------------- 1 | # FIR Filter implementation 2 | 3 | This is an example implementation of a Finite Impulse Response filter using the Fast-Float4HLS library. The filter is implemented using the fma function of the Fast-Float4HLS library and can be found in the fir.cpp file together with the testbench main function. The fir function is a templatized C++ function implemented for HLS using the Catapult HLS tool. The order of the filter can be selected through the template parameter ''N''. 4 | 5 | To synthesize the design on Catapult HLS use the *go_hls.tcl* script. The given example synthesizes a 5-order FIR filter. When changing the order of the filter through the template parameter 6 | 7 | ```c++ 8 | const int TAPS = 5; 9 | fir(In,Coeff,Out); 10 | ``` 11 | 12 | you should also change the value of the variable ''TAPS'' at the top of the *go_hls.tcl* TCL script. 13 | 14 | ```tcl 15 | set TAPS 5 16 | ``` 17 | 18 | To synthesize the design launch catapult in the directory of the example. 19 | 20 | ```bash 21 | catapult -f go_hls.tcl 22 | ``` 23 | 24 | -------------------------------------------------------------------------------- /examples/fir/fir.cpp: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Democritus University of Thrace 2 | // Integrated Circuits Lab 3 | // 4 | // Example using Fast-Float4HLS to build an FIR filter 5 | #include 6 | #include 7 | #include "fast_float.h" 8 | #include "mc_scverify.h" 9 | 10 | typedef ffp32 T; 11 | 12 | // Implementation of an FIR filter using the fast-float library 13 | #pragma hls_design 14 | #pragma hls_pipeline_init_interval 1 15 | template 16 | void CCS_BLOCK(fir)(T inp, T coeff[N], T &out) { 17 | 18 | static T x[N], sum; 19 | 20 | #pragma hls_unroll 21 | for (int i=N-1; i>0; i--) { 22 | x[i] = x[i-1]; 23 | } 24 | x[0] = inp; 25 | 26 | sum = 0.0; 27 | #pragma hls_unroll 28 | for (int i=0; i 36 | void refFir(float inp, float coeff[N], float &out) { 37 | 38 | static float x[N]; 39 | float sum; 40 | 41 | for (int i=N-1; i>0; i--) { 42 | x[i] = x[i-1]; 43 | } 44 | x[0] = inp; 45 | 46 | sum = 0; 47 | for (int i=0; i (rand()) /( static_cast (RAND_MAX/(HI-LO))); 57 | }; 58 | 59 | CCS_MAIN(int argc, char * argv[]) { 60 | 61 | const int TAPS = 5; 62 | const int ITER = 10; 63 | 64 | float refIn, refCoeff[TAPS], refOut; 65 | T In, Coeff[TAPS], Out; 66 | 67 | srand(time(NULL)); 68 | 69 | for (int i=0; i(In,Coeff,Out); 79 | refFir(refIn,refCoeff,refOut); 80 | 81 | std::cout << "OUT: " << Out.to_float() << std::endl; 82 | std::cout << "REF: " << refOut << "\n" << std::endl; 83 | } 84 | 85 | CCS_RETURN(0); 86 | } 87 | -------------------------------------------------------------------------------- /examples/fir/go_hls.tcl: -------------------------------------------------------------------------------- 1 | # Define template parameters for top level 2 | # TAPS : fir filter taps 3 | set TAPS 5 4 | 5 | # Definition of top level module 6 | set TOP "fir<${TAPS}>" 7 | 8 | # Definition path to top (tb) cpp file 9 | set FPATH "./fir.cpp" 10 | 11 | # Definition project name 12 | set PROJECT "fir_example" 13 | 14 | # GO_HLS 15 | 16 | project new -name $PROJECT 17 | solution new -state initial 18 | solution options defaults 19 | solution options set /ComponentLibs/SearchPath . -append 20 | solution options set /Interface/DefaultClockPeriod 2 21 | solution options set /Input/CppStandard c++11 22 | solution options set /Input/CompilerFlags { -DHLS_CATAPULT=1 } 23 | solution options set /Input/SearchPath { ../../ } 24 | solution options set /Flows/QuestaSIM/SCCOM_OPTS {-O3 -x c++ -Wall -Wno-unused-label -Wno-unknown-pragmas} 25 | solution options set /Flows/SCVerify/USE_CCS_BLOCK true 26 | flow package require /SCVerify 27 | flow package require /QuestaSIM 28 | solution file add $FPATH -type C++ 29 | directive set -DESIGN_GOAL latency 30 | go new 31 | solution design set $TOP -top 32 | go analyze 33 | directive set -CLOCKS {clk {-CLOCK_PERIOD 2.0 -CLOCK_UNCERTAINTY 0.0 -CLOCK_HIGH_TIME 1.0}} 34 | solution library add nangate-45nm_beh -- -rtlsyntool OasysRTL -vendor Nangate -technology 045nm 35 | solution library add ccs_sample_mem 36 | go libraries 37 | go assembly 38 | go architect 39 | go allocate 40 | go extract 41 | 42 | #COSIM 43 | flow run /SCVerify/launch_make ./scverify/Verify_concat_sim_rtl_v_msim.mk {} SIMTOOL=msim sim 44 | 45 | -------------------------------------------------------------------------------- /examples/gcn/Readme.md: -------------------------------------------------------------------------------- 1 | ### Graph Convolutional Network 2 | GCN example refers to the inference of a Graph Convolutional Network for node classification, using the Cora, Citeseer or Pubmed dataset as provided by Thomas Kipf [here](https://github.com/tkipf/gcn/tree/master/gcn/data). 3 | 4 | Currently the code is set to execute inference on Citeseer dataset. To change the dataset you can comment out the appropriate lines in "defs.h" and "gcn_tb.cpp. The part of the code that corresponds to each application is clearly defined in the code. 5 | 6 | -------------------------------------------------------------------------------- /examples/gcn/defs.h: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Democritus University of Thrace 2 | // Integrated Circuits Lab 3 | // 4 | // Example using Fast-Float4HLS to build a Graph Convolutional Network 5 | #ifndef _DEFS_H 6 | #define _DEFS_H 7 | 8 | #include "fast_float.h" 9 | #include "ac_int.h" 10 | #include "matrix.h" 11 | 12 | typedef ffp16b btype; 13 | 14 | 15 | /*****Sizes for Citeseer *****/ 16 | // size of the problem (matrix dimensions) 17 | static const int N = 3327; 18 | static const int I_F = 3703; 19 | static const int O_F1 = 21; 20 | static const int O_F2 = 6; 21 | 22 | // number of non-zero elements of the sparse matrix 23 | static const int nZ = 12431; 24 | 25 | // number of non-zero elements of the feature matrix 26 | static const int feat_nZ = 105165; 27 | 28 | /*****Sizes for Cora *****/ 29 | /*// size of the problem (matrix dimensions) 30 | static const int N = 2708; 31 | static const int I_F = 1433; 32 | static const int O_F1 = 64; 33 | static const int O_F2 = 7; 34 | 35 | // number of non-zero elements of the sparse matrix 36 | static const int nZ = 13264; 37 | 38 | // number of non-zero elements of the feature matrix 39 | static const int feat_nZ = 49216;*/ 40 | 41 | /*****Sizes for Pubmed *****/ 42 | /*// size of the problem (matrix dimensions) 43 | static const int N = 19717; 44 | static const int I_F = 500; 45 | static const int O_F1 = 18; 46 | static const int O_F2 = 3; 47 | 48 | // number of non-zero elements of the sparse matrix 49 | static const int nZ = 108365; 50 | 51 | // number of non-zero elements of the feature matrix 52 | static const int feat_nZ = 988031;*/ 53 | 54 | #endif 55 | -------------------------------------------------------------------------------- /examples/gcn/gcn.h: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Democritus University of Thrace 2 | // Integrated Circuits Lab 3 | // 4 | // Example using Fast-Float4HLS to build a Graph Convolutional Network 5 | #ifndef _GCN_H 6 | #define _GCN_H 7 | 8 | #include "defs.h" 9 | #include "mc_scverify.h" 10 | 11 | #pragma hls_design 12 | template< typename T, int N, int I_F, int O_F1, int O_F2, int nZ > 13 | class gcn{ 14 | private: 15 | 16 | // ReLU activation function 17 | void relu (T a[O_F1], T b[O_F1]) { 18 | COL: for (int j = 0; j < O_F1; j++) { 19 | b[j] = (a[j] > 0) ? a[j] : 0; 20 | } 21 | } 22 | 23 | // In the future will be replaced by softmax 24 | // Currently implement only hard decision of the most popular class 25 | void argmax (T in[O_F2], T out[O_F2]) { 26 | T maxVal = -65535.0; 27 | T curVal; 28 | MAX_ITER: for (int j=0; j < O_F2; j++) { 29 | curVal = in[j]; 30 | if (curVal > maxVal) { 31 | maxVal = curVal; 32 | } 33 | } 34 | 35 | COL: for (int j=0; j < O_F2; j++) { 36 | out[j] = (in[j]==maxVal) ? (T)1.0 : (T)0.0; 37 | } 38 | } 39 | 40 | void run (Array< ac_int<32,false> > a_row, 41 | Array< ac_int<32,false> > a_col, 42 | Array a_val, 43 | Matrix h_i, 44 | Matrix w1, 45 | Matrix w2, 46 | Matrix h_o) { 47 | 48 | #ifndef __SYNTHESIS__ 49 | T* inter_buf = new T[N*O_F1]; 50 | Matrix inter(N, O_F1, inter_buf); 51 | #else 52 | static T inter_buf[N*O_F1]; 53 | Matrix inter(N, O_F1, inter_buf); 54 | #endif 55 | 56 | // first GCN layer 57 | ac_int<32,false> cur_row = a_row[0][0]; 58 | ac_int<32,false> next_row; 59 | 60 | static T out_buf1[O_F1]; 61 | 62 | A_ROW: for (int i=0; i < N; i++) { 63 | 64 | // initialize output buffer 65 | for (int j=0; j < O_F1; j++) { 66 | out_buf1[j] = 0.0; 67 | } 68 | 69 | next_row = a_row[0][i+1]; 70 | ROW_NZ: for (int j=cur_row; j < next_row; j++) { 71 | INP_FEAT: for (int p=0; p < I_F; p++) { 72 | OUT_FEAT: for (int q=0; q < O_F1; q++) { 73 | out_buf1[q] += (a_val[0][j] * h_i[a_col[0][j]][p]) * w1[p][q]; 74 | } 75 | } 76 | } 77 | 78 | 79 | relu(out_buf1, out_buf1); 80 | WR_OUT:for (int j=0; j < O_F1; j++) { 81 | // write the output 82 | inter[i][j] = out_buf1[j]; 83 | } 84 | 85 | cur_row = next_row; 86 | 87 | } 88 | 89 | // second GCN layer 90 | 91 | cur_row = a_row[0][0]; 92 | 93 | static T out_buf2[O_F2]; 94 | 95 | A_ROW_2: for (int i=0; i < N; i++) { 96 | 97 | // initialize output buffer 98 | for (int j=0; j < O_F1; j++) { 99 | out_buf2[j] = 0.0; 100 | } 101 | 102 | next_row = a_row[0][i+1]; 103 | ROW_NZ_2: for (int j=cur_row; j < next_row; j++) { 104 | INP_FEAT_2: for (int p=0; p < O_F1; p++) { 105 | OUT_FEAT_2: for (int q=0; q < O_F2; q++) { 106 | out_buf2[q] += (a_val[0][j] * inter[a_col[0][j]][p]) * w2[p][q]; 107 | } 108 | } 109 | } 110 | 111 | 112 | argmax(out_buf2, out_buf2); 113 | WR_OUT_2:for (int j=0; j < O_F1; j++) { 114 | // write the output 115 | h_o[i][j] = out_buf2[j]; 116 | } 117 | 118 | cur_row = next_row; 119 | } 120 | 121 | } 122 | 123 | public: 124 | gcn(){} 125 | 126 | #pragma hls_design interface 127 | void CCS_BLOCK(run_wrap) (ac_int<32, false> a_row[N+1], 128 | ac_int<32, false> a_col[nZ], 129 | T a_val[nZ], 130 | T h_i[N*I_F], 131 | T w1[I_F*O_F1], 132 | T w2[I_F*O_F2], 133 | T h_o[N*O_F2]){ 134 | 135 | Array< ac_int<32, false> > a_row_(N+1, a_row); 136 | Array< ac_int<32, false> > a_col_(nZ, a_col); 137 | Array< T > a_val_(nZ, a_val); 138 | Matrix< T > h_i_(N, I_F, h_i); 139 | Matrix< T > h_o_(N, O_F2, h_o); 140 | Matrix< T > w1_(I_F, O_F1, w1); 141 | Matrix< T > w2_(O_F1, O_F2, w2); 142 | 143 | run(a_row_, a_col_, a_val_, h_i_, w1_, w2_, h_o_); 144 | } 145 | 146 | 147 | }; 148 | 149 | #endif 150 | -------------------------------------------------------------------------------- /examples/gcn/gcn_tb.cpp: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Democritus University of Thrace 2 | // Integrated Circuits Lab 3 | // 4 | // Example using Fast-Float4HLS to build a Graph Convolutional Network 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | 13 | #include "defs.h" 14 | #include "helper.h" 15 | #include "gcn.h" 16 | #include "mc_scverify.h" 17 | 18 | 19 | CCS_MAIN(int argc, char** argv) { 20 | 21 | gcn< btype, N, I_F, O_F1, O_F2, nZ > GCN; 22 | 23 | btype* h_o = new btype[N*O_F2]; 24 | btype* h = new btype[N*I_F]; 25 | 26 | btype* w1 = new btype[I_F*O_F1]; 27 | btype* w2 = new btype[O_F1*O_F2]; 28 | 29 | ac_int<32, false>* a_row = new ac_int<32, false>[N+1]; 30 | ac_int<32, false>* a_col = new ac_int<32, false>[nZ]; 31 | btype* a_val = new btype[nZ]; 32 | 33 | int* A_row = new int[N+1]; 34 | int* A_col = new int[nZ]; 35 | float* A_val = new float[nZ]; 36 | 37 | int* H_row = new int[N+1]; 38 | int* H_col = new int[feat_nZ]; 39 | float* H_val = new float[feat_nZ]; 40 | 41 | float* W1 = new float[I_F*O_F1]; 42 | float* W2 = new float[O_F1*O_F2]; 43 | 44 | float* H = new float[N*I_F]; 45 | 46 | 47 | // read input matrices from txt files 48 | read_csr(A_row, A_col, A_val, "./matrices/citeseer_adj.txt"); 49 | read_csr(H_row, H_col, H_val, "./matrices/citeseer_feat.txt"); 50 | read_data(W1, "./matrices/citeseer_weights.txt"); 51 | read_data(W2, "./matrices/citeseer_weights2.txt"); 52 | 53 | to_array(H_row, H_col, H_val, H); 54 | 55 | for (int i=0; i < N+1; i++) { 56 | a_row[i] = A_row[i]; 57 | } 58 | 59 | for (int i=0; i < nZ; i++) { 60 | a_col[i] = A_col[i]; 61 | a_val[i] = A_val[i]; 62 | } 63 | 64 | for (int i=0; i < N*I_F; i++) { 65 | h[i] = H[i]; 66 | } 67 | 68 | for (int i=0; i < I_F*O_F1; i++) { 69 | w1[i] = W1[i]; 70 | } 71 | 72 | for (int i=0; i < O_F1*O_F2; i++) { 73 | w2[i] = W2[i]; 74 | } 75 | 76 | //initialize output 77 | for (int i=0; i < N; i++) { 78 | for (int j=0; j < O_F2; j++) { 79 | h_o[i*O_F2 + j] = 0.0; 80 | } 81 | } 82 | 83 | GCN.run_wrap(a_row, a_col, a_val, h, w1, w2, h_o); 84 | 85 | std::cout << "DONE!!!" << std::endl; 86 | 87 | CCS_RETURN(0); 88 | } 89 | -------------------------------------------------------------------------------- /examples/gcn/go_hls.tcl: -------------------------------------------------------------------------------- 1 | # Define template parameters for top level 2 | # DAT_TYPE : The name of the defined datatype in the source code 3 | # NODEs : The number of the graph's nodes 4 | # INP_FEAT : The size of the input featured vector 5 | # OUT_F_L1 : The size of the output features vector of the first layer 6 | # OUT_F_L2 : The size of the output features vector of the second layer 7 | # NON_ZERO : The number of non-zero values in the adjacency matrix 8 | 9 | set DAT_TYPE btype 10 | 11 | set NODES 3327 12 | set INP_FEAT 3703 13 | set OUT_F_L1 21 14 | set OUT_F_L2 6 15 | set NON_ZERO 12431 16 | 17 | # Define top level module 18 | set TOP "gcn<${DAT_TYPE}, ${NODES}, ${INP_FEAT}, ${OUT_F_L1}, ${OUT_F_L2}, ${NON_ZERO}>" 19 | 20 | # Define path to top (tb) cpp file 21 | set FPATH "./gcn_tb.cpp" 22 | 23 | # Define project name 24 | set PROJECT "gcn_example" 25 | 26 | # GO_HLS 27 | 28 | project new -name $PROJECT 29 | solution new -state initial 30 | solution file add ./fast_float.h 31 | solution file add ./gcn.h 32 | solution file add ./gcn_tb.cpp 33 | solution file add ./helper.h 34 | solution file add ./defs.h 35 | solution file add ./matrix.h 36 | solution options defaults 37 | solution options set /ComponentLibs/SearchPath . -append 38 | solution options set /Interface/DefaultClockPeriod 2 39 | solution options set /Input/CppStandard c++11 40 | solution options set /Input/CompilerFlags { -DHLS_CATAPULT=1 } 41 | solution options set /Input/SearchPath { ../../ } 42 | solution options set /Flows/QuestaSIM/SCCOM_OPTS {-O3 -x c++ -Wall -Wno-unused-label -Wno-unknown-pragmas} 43 | solution options set /Flows/SCVerify/USE_CCS_BLOCK true 44 | 45 | flow package require /SCVerify 46 | flow package require /QuestaSIM 47 | solution file add $FPATH -type C++ 48 | directive set -DESIGN_GOAL latency 49 | go new 50 | solution design set $TOP -top 51 | go analyze 52 | directive set -CLOCKS {clk {-CLOCK_PERIOD 10.0 -CLOCK_UNCERTAINTY 0.0 -CLOCK_HIGH_TIME 5.0}} 53 | solution library add nangate-45nm_beh -- -rtlsyntool OasysRTL -vendor Nangate -technology 045nm 54 | solution library add ccs_sample_mem 55 | go libraries 56 | go assembly 57 | go architect 58 | go allocate 59 | go extract 60 | 61 | #COSIM 62 | #flow run /SCVerify/launch_make ./scverify/Verify_concat_sim_rtl_v_msim.mk {} SIMTOOL=msim sim 63 | 64 | 65 | -------------------------------------------------------------------------------- /examples/gcn/helper.h: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Democritus University of Thrace 2 | // Integrated Circuits Lab 3 | // 4 | // Example using Fast-Float4HLS to build a Graph Convolutional Network 5 | #include 6 | #include "defs.h" 7 | 8 | template 9 | void print1d (Array &a) { 10 | for (int i=0; i < N; i++) { 11 | std::cout << a[0][i] << "\t"; 12 | } 13 | std::cout << std::endl; 14 | } 15 | 16 | 17 | template 18 | void print1d (btype a[N]) { 19 | for (int i=0; i < N; i++) { 20 | std::cout << a[i].to_float() << "\t"; 21 | } 22 | std::cout << std::endl; 23 | } 24 | 25 | 26 | template 27 | void print2d (Matrix &a) { 28 | for (int i=0; i < N; i++) { 29 | for (int j=0; j < L; j++) { 30 | std::cout << a[i][j] << "\t"; 31 | } 32 | std::cout << std::endl; 33 | } 34 | } 35 | 36 | template 37 | void print2d (Matrix &a) { 38 | for (int i=0; i < N; i++) { 39 | for (int j=0; j < L; j++) { 40 | std::cout << a[i][j].to_float() << "\t"; 41 | } 42 | std::cout << std::endl; 43 | } 44 | } 45 | 46 | 47 | template 48 | void read_data(Type img[N*L], std::string filename) { 49 | std::ifstream myFile(filename); 50 | if(myFile.is_open()) { //throw std::runtime_error("Could not open file"); // Make sure the file is open 51 | 52 | std::string line; 53 | Type val; 54 | int rowIdx = 0; 55 | 56 | // Read data, line by line 57 | while(std::getline(myFile, line)) { 58 | std::stringstream ss(line); // Create a stringstream of the current line 59 | int colIdx = 0; // Keep track of the current column index 60 | 61 | // Extract each integer 62 | while(ss >> val){ 63 | img[rowIdx*L + colIdx] = val; // Write current input value 64 | if(ss.peek() == ',') ss.ignore(); // If the next token is a comma, ignore it and move on 65 | 66 | colIdx++; // Increment the Column index 67 | if (colIdx == L) break; 68 | } 69 | rowIdx++; // Increment the Row index 70 | if (rowIdx == N) break; 71 | } 72 | myFile.close(); // Close file 73 | } else { 74 | std::cout << "WRONG!!!!" << std::endl; 75 | } 76 | } 77 | 78 | 79 | template 80 | void read_csr(int a_row[N+1], int a_col[nZ], Type a_val[nZ], std::string filename) { 81 | std::ifstream myFile(filename); 82 | if(myFile.is_open()) { //throw std::runtime_error("Could not open file"); // Make sure the file is open 83 | 84 | std::string line; 85 | int int_val; 86 | Type def_val; 87 | int rowIdx = 0; 88 | 89 | // Read the first line -- row_ind for CSR 90 | std::getline(myFile, line); 91 | std::stringstream ss1(line); // Create a stringstream of the current line 92 | int colIdx = 0; // Keep track of the current column index 93 | 94 | // Extract each integer 95 | while(ss1 >> int_val){ 96 | a_row[colIdx] = int_val; 97 | if(ss1.peek() == ',') ss1.ignore(); // If the next token is a comma, ignore it and move on 98 | colIdx++; // Increment the Column index 99 | } 100 | 101 | // Read the second line -- col_ind for CSR 102 | std::getline(myFile, line); 103 | std::stringstream ss2(line); // Create a stringstream of the current line 104 | colIdx = 0; // Keep track of the current column index 105 | 106 | // Extract each integer 107 | while(ss2 >> int_val){ 108 | a_col[colIdx] = int_val; 109 | if(ss2.peek() == ',') ss2.ignore(); // If the next token is a comma, ignore it and move on 110 | colIdx++; // Increment the Column index 111 | } 112 | 113 | // Read the third line -- value for CSR 114 | std::getline(myFile, line); 115 | std::stringstream ss3(line); // Create a stringstream of the current line 116 | colIdx = 0; // Keep track of the current column index 117 | 118 | // Extract each integer 119 | while(ss3 >> def_val){ 120 | a_val[colIdx] = def_val; 121 | if(ss3.peek() == ',') ss3.ignore(); // If the next token is a comma, ignore it and move on 122 | colIdx++; // Increment the Column index 123 | } 124 | 125 | myFile.close(); // Close file 126 | } else { 127 | std::cout << "WRONG!!!!" << std::endl; 128 | } 129 | } 130 | 131 | template< typename T, int N, int M, int nZ > 132 | void to_array(int row[N+1], int col[nZ], T val[nZ], T mat[N*M]) { 133 | int cur_row = row[0]; 134 | int next_row; 135 | 136 | for (int i=0; i < N; i++) { 137 | next_row = row[i+1]; 138 | 139 | // zero-initialize the current row of output matrix 140 | for (int j=0; j < M; j++) { 141 | mat[i*M + j] = (T) 0; 142 | } 143 | 144 | for (int j=cur_row; j < next_row; j++) { 145 | int cur_col = col[j]; 146 | T cur_val = val[j]; 147 | 148 | mat[i*M + cur_col] = cur_val; 149 | } 150 | 151 | cur_row = next_row; 152 | 153 | } 154 | } 155 | -------------------------------------------------------------------------------- /examples/gcn/matrices/citeseer_weights2.txt: -------------------------------------------------------------------------------- 1 | -0.5831083, 0.7484385, -0.42685214, -0.42443317, 0.68655723, -0.7986753 2 | -0.3887445, -0.35747263, -0.5580533, 0.62701225, -0.50491655, 0.7408778 3 | 0.7784341, 0.74869764, -0.8313478, 0.5993246, -0.65551126, -0.61060244 4 | -0.740222, 0.8227303, 0.5342512, -0.45903754, -0.25281546, 0.5914925 5 | -0.6120384, 0.8174478, 0.5475604, -0.62080884, -0.31659606, 0.47036737 6 | -0.6547028, -0.36826783, -0.7818411, 0.6029341, -0.8023204, 0.81823415 7 | -0.38706985, -0.34457284, 0.4975315, 0.60919374, 0.61322343, -0.81332314 8 | 0.43581733, -0.7382717, 0.49718612, -0.6144859, 0.8091133, 0.3666699 9 | 0.6058493, 0.57341945, 0.5941404, -0.2604549, -0.34105885, -0.41740334 10 | 0.72211736, -0.6484412, 0.26381183, 0.5811415, -0.67216206, -0.7567395 11 | 0.79870504, -0.32470065, -0.60977787, -0.240367, 0.6850278, -0.37446424 12 | 0.7263039, -0.24184416, -0.66705763, -0.08603401, 0.67252207, 0.7344993 13 | -0.6953927, 0.8782144, 0.5305085, 0.7061283, -0.3064116, -0.56130815 14 | 0.575826, 0.72375345, 0.6221326, -0.4865886, -0.69042206, -0.5531044 15 | 0.6757756, 0.6676626, -0.38353354, -0.49890715, 0.74361193, -0.5658743 16 | -0.8080315, -0.5993205, 0.8064928, -0.7600328, -0.43571523, 0.64441556 17 | 0.28819177, 0.45330834, -0.7842768, -0.46617013, -0.7985305, 0.6781162 18 | 0.69274944, -0.5940323, 0.7066768, -0.40392402, -0.39712918, 0.50160795 19 | -0.4903096, -0.5312948, -0.8772115, 0.75006235, -0.5658113, 0.6744483 20 | -0.7646809, -0.02920378, -0.62365675, 0.7275815, 0.72425216, -0.44271633 21 | -0.45200795, -0.62754744, 0.4589704, 0.4211136, 0.46428618, -0.7936066 22 | -------------------------------------------------------------------------------- /examples/gcn/matrices/cora_weights2.txt: -------------------------------------------------------------------------------- 1 | 0.2960569, 0.191743, 0.4069547, -0.40999702, 0.17341153, -0.2354344, -0.09218237 2 | 0.34474945, -0.02777437, -0.025303692, 0.3277524, -0.13114008, 0.29530215, 0.34634674 3 | 0.295645, -0.38362485, 0.19617312, -0.22858359, 0.29226637, -0.101729244, 0.33944967 4 | -0.20860763, -0.20561032, 0.3245896, -0.28532937, 0.15327822, -0.2539745, 0.31021902 5 | -0.17726478, -0.22481316, -0.10329705, -0.36666262, 0.23994672, -0.2805324, 0.318678 6 | 0.28802258, -0.2505326, -0.10907339, 0.23606427, 0.24163115, 0.312685, -0.3579674 7 | 0.017281186, -0.14459404, 0.39572796, 0.30731693, 0.39999393, 0.36564964, -0.21676482 8 | 0.05282896, 0.33757865, 0.39901945, 0.05307917, 0.017942388, 0.3411323, 0.0030180276 9 | 0.3310591, 0.0077723837, 0.36699408, -0.037276376, 0.29825914, -0.16575174, -0.15504804 10 | 0.15400228, -0.33415386, 0.15248024, 0.23147066, 0.15377444, -0.25165147, -0.39421836 11 | -0.3203176, -0.3634309, 0.4012261, 0.3631559, 0.08249854, -0.08553857, 0.0859035 12 | -0.13422838, -0.34886312, 0.2463377, 0.042872623, 0.1712142, -0.18980442, 0.27719608 13 | -0.120136306, -0.28345832, 0.33077487, -0.22450882, -0.35534218, 0.18446405, -0.13281016 14 | -0.23735698, 0.35081828, 0.3465097, 0.13894837, -0.33888984, 0.017062092, -0.35915935 15 | -0.35404482, -0.18992619, -0.17940344, 0.08732022, -0.35654953, 0.31213662, 0.31826907 16 | -0.22293085, 0.2587542, -0.21847942, -0.09594979, 0.24430639, 0.25875705, -0.16280775 17 | -0.36137316, -0.350944, -0.2197154, 0.15337081, 0.10569563, 0.3153529, -0.24824043 18 | 0.21119632, -0.21009184, -0.10218527, 0.3710017, -0.23629759, -0.057221506, 0.22858083 19 | 0.3075969, -0.07904966, 0.4086784, -0.16735302, 0.2281928, 0.2588602, -0.30295408 20 | -0.33082575, 0.31994635, 0.07839507, 0.37202662, -0.30011174, -0.3789205, -0.22737879 21 | -0.22949253, -0.17058782, -0.18487352, 0.10058703, -0.25456402, 0.16963193, 0.19001544 22 | 0.17239983, 0.17842333, -0.1662195, 0.26249525, 0.26790535, -0.29692623, 0.24972607 23 | 0.13916196, -0.24846905, -0.25347862, 0.04405154, 0.192629, -0.4054385, 0.025023026 24 | 0.40784964, 0.067357235, -0.3431229, -0.33934262, 0.25691408, -0.31669044, 0.09732441 25 | -0.26306126, 0.15679592, -0.2472198, 0.15409887, 0.2808166, -0.24795842, 0.29469484 26 | -0.20881127, -0.28957304, 0.17803279, 0.17945048, -0.11281478, 0.39952397, -0.090559825 27 | -0.10266809, 0.24629171, 0.2010217, 0.117170736, -0.3710379, -0.19852947, -0.36122826 28 | -0.4090387, -0.34027785, 0.04187833, -0.27498543, 0.30730048, 0.1402236, 0.1556283 29 | 0.21439599, 0.08522677, 0.16670509, -0.24968679, -0.34381956, -0.28842872, -0.20079345 30 | 0.06463874, 0.3238182, -0.14193933, 0.23577033, 0.34979603, -0.36709937, -0.38046703 31 | 0.23028536, 0.10921009, -0.37613973, -0.13296707, -0.28648615, 0.34895095, 0.25053707 32 | -0.14380802, -0.3359448, 0.17984553, 0.09347984, -0.25835222, -0.15422258, 0.35084087 33 | 0.41747725, -0.06693186, 0.3064812, 0.35645097, -0.38277745, 0.36734596, -0.07593657 34 | 0.36204565, -0.30260825, -0.18644339, -0.38729382, -0.40767774, -0.05258065, 0.35709062 35 | -0.31915995, 0.23033549, -0.26392713, -0.3217345, 0.22833899, 0.21036117, -0.29802 36 | 0.26809505, 0.06271832, -0.34397927, -0.22457422, 0.10583717, -0.2807593, -0.28646445 37 | 0.195183, -0.22538874, -0.28558666, 0.166573, 0.20436047, 0.17896456, -0.37253255 38 | -0.2505514, -0.24573186, -0.14490773, -0.054496616, 0.19138822, 0.3750649, 0.36978215 39 | -0.19049221, 0.24494125, -0.25901762, 0.25757045, 0.18772583, 0.24715793, -0.32740575 40 | -0.31937382, 0.27687445, -0.3927649, 0.09210179, 0.13725244, -0.15653268, -0.29365018 41 | -0.23844956, 0.121709, -0.38640887, -0.32674032, -0.31657302, 0.17530915, 0.13422924 42 | 0.28627604, -0.16794078, 0.3061469, -0.15882568, -0.32939687, 0.11734187, -0.113823876 43 | 0.18937235, 0.23281139, -0.37530223, -0.3168925, 0.22230282, 0.15082496, -0.26490653 44 | 0.3568627, -0.13696945, 0.3580966, -0.23803705, -0.4067409, -0.35281435, 0.1711901 45 | 0.20374972, -0.33449194, -0.17962489, -0.060774542, 0.22474135, 0.29554704, 0.37542212 46 | -0.13157336, -0.19216211, -0.13335367, 0.104069695, 0.39100504, -0.36661607, 0.32798797 47 | 0.22590579, -0.31997147, 0.28048444, 0.24872321, -0.35537028, -0.10780696, -0.19166327 48 | -0.2741216, 0.09722522, 0.16206948, -0.23593473, 0.2752628, -0.22515842, 0.18636163 49 | 0.3387716, -0.30998322, -0.21783152, 0.077540845, -0.17260627, -0.19149327, 0.39205024 50 | -0.13759309, 0.28020176, 0.22882482, 0.35863623, -0.13569984, -0.363509, -0.39088693 51 | -0.36210445, -0.10744697, -0.11680064, 0.36066842, 0.25312647, 0.35419822, -0.22422847 52 | 0.36170715, 0.17568937, -0.11097745, -0.27258408, 0.3162221, -0.38527983, 0.23987278 53 | 0.12086063, 0.28657797, -0.24985425, -0.2852557, 0.16155672, -0.23983222, -0.26475072 54 | -0.26300156, 0.08028503, 0.18006818, -0.3696861, -0.3684286, 0.006667185, 0.060151637 55 | 0.35666004, -0.3582764, 0.13431202, 0.11651614, -0.22664107, -0.3509912, 0.08352614 56 | 0.32831475, -0.3920235, -0.23970115, -0.22139162, -0.23288082, 0.011335217, -0.3139834 57 | -0.38104233, 0.26183173, -0.31377047, 0.3735263, -0.3518004, -0.3356716, 0.3602611 58 | 0.36663476, 0.31015947, -0.061494485, 0.32147956, -0.3888144, 0.17277807, -0.35463062 59 | -0.08026763, 0.2316078, 0.16315079, -0.23213726, -0.21310236, -0.17790484, 0.3693201 60 | -0.120249525, -0.3268601, -0.23495793, 0.3473638, -0.10496733, 0.4023368, 0.12467392 61 | -0.11839042, -0.15850623, 0.30773193, -0.22567654, -0.16602865, 0.36535484, -0.0770384 62 | -0.19532034, -0.2714583, 0.2376957, 0.3250565, -0.31827596, 0.26770443, 0.16242741 63 | -0.0899163, 0.3779985, 0.2763928, -0.27671987, -0.060790244, 0.2702958, 0.30773127 64 | 0.31274757, -0.37198314, -0.11986669, -0.31666943, 0.22980823, 0.12833814, 0.12381607 65 | -------------------------------------------------------------------------------- /examples/gcn/matrices/pubmed_weights.txt: -------------------------------------------------------------------------------- 1 | 0.28029028, 0.30553314, -0.45223355, -0.43981495, -0.26655686, 0.40415657, 0.43267325, 0.3985141, 0.292266, 0.30980447, 0.3176032, 0.22787648, 0.34185687, 0.43469188, -0.49576822, 0.2269177, -0.33415958, 0.31407392 2 | 0.39201257, 0.34495062, 0.3340492, 0.40695587, 0.4165171, -0.06754292, -0.06684437, -0.12710164, -0.39322534, -0.12744433, -0.05923226, -0.2884256, 0.32588682, -0.04067005, 0.30304363, 0.12649974, 0.452034, -0.071935534 3 | -0.376159, -0.32904518, 0.53404915, 0.556535, -0.25727454, 0.015798159, 0.150483, 0.10927993, 0.40687406, 0.2988401, 0.15869722, 0.55549717, -0.3119902, 0.17636605, -0.42107758, 0.060105268, -0.2751104, 0.065690525 4 | 0.08585095, 0.015191748, 0.51447713, 0.3518191, 0.046080925, 0.004945792, 0.07489854, 0.058003932, 0.35289755, 0.22120929, 0.15985359, 0.37816253, 0.07145304, -0.012442905, 0.23414372, -0.10087741, 0.19218612, 0.008767668 5 | 0.22464016, 0.12483385, 0.19542563, 0.024301816, -0.13340135, 0.25621906, 0.14840154, 0.16092138, 0.4080052, 0.23115538, 0.235953, 0.29272637, 0.054791942, 0.24492995, -0.105620496, 0.16420287, -0.20086956, 0.15110022 6 | -0.43773317, -0.36890772, 0.4628251, 0.42614666, -0.37721992, -0.24957949, -0.19100223, -0.27036923, 0.47052854, 0.28099757, -0.31469545, 0.5006996, -0.45186707, -0.18085656, -0.41541067, -0.21262491, -0.46861488, -0.31760368 7 | 0.29993305, 0.41460532, -0.45024073, -0.3883227, -0.081505984, 0.14880069, 0.31102282, 0.50851107, 0.4286829, 0.36352238, 0.51592255, 0.41768527, 0.109308854, 0.45443332, -0.10917463, 0.4891705, -0.24654526, 0.38003576 8 | 0.15147991, 0.01402718, 0.35493428, 0.522586, 0.0096069565, 0.15748109, 0.09656753, 0.08929498, 0.4651787, 0.24462155, 0.19120823, 0.3576976, -0.014775446, 0.21720576, 0.04583458, 0.08158478, 0.11949693, 0.04334505 9 | 0.16000861, 0.3129652, -0.38687268, -0.3305331, 0.10066972, 0.25427723, 0.31700236, 0.4110261, 0.40308943, 0.3120875, 0.39457616, 0.25819343, 0.32285723, 0.37612563, -0.15495816, 0.28556415, -0.20506021, 0.27596524 10 | 0.11197223, 0.088551216, 0.39926168, 0.34052742, 0.19470924, 0.040899616, 0.030813528, 0.13674898, 0.3567266, 0.2950052, 0.0954678, 0.35662082, 0.20104216, 0.13308796, 0.2754139, 0.048622157, 0.16230522, 0.094907925 11 | 0.40376782, 0.4432453, 0.31611374, 0.24836881, 0.44453967, 0.106946744, -0.018904904, -0.22598045, -0.3853266, -0.29025748, -0.07070414, -0.18906786, 0.42353985, -0.04905018, 0.34808227, 0.040857468, 0.37939292, -0.19035155 12 | 0.20573677, 0.3176877, 0.46644232, 0.3967005, 0.2991392, -0.09296493, -0.02683882, -0.1461893, -0.08134323, -0.123611644, -0.21609074, -0.15229167, 0.29468182, -0.035465065, 0.32011387, -0.05720865, 0.39574137, -0.18389386 13 | 0.26212087, 0.09922454, 0.220849, 0.26768324, -0.009175058, 0.29911688, 0.17036507, 0.15783237, 0.43464512, 0.18084769, 0.32115144, 0.43690866, 0.08707363, 0.33570972, -0.1452632, 0.29259115, -0.13138428, 0.21101137 14 | 0.21766117, 0.23718031, 0.43561018, 0.32581788, 0.43697047, 0.08089359, 0.08091033, 0.16116036, 0.23670441, 0.13825463, 0.25804517, 0.27129588, 0.37450352, 0.034473762, 0.3151726, 0.069812596, 0.30125314, 0.17634927 15 | 0.116238356, 0.20504418, 0.19770902, -0.19233492, -0.10765386, 0.2674413, 0.37848562, 0.29373464, 0.30712262, 0.24990368, 0.29753703, 0.45445466, 0.13527589, 0.33084303, -0.29759946, 0.36271414, -0.34058812, 0.4399058 16 | 0.21153823, 0.34598804, 0.24541508, -0.061540056, -0.05887928, 0.33483052, 0.39188275, 0.34393927, 0.35353804, 0.40815985, 0.2595381, 0.42415452, 0.19039196, 0.3591762, -0.14271772, 0.39710832, -0.12005428, 0.4621757 17 | 0.2885478, 0.41971254, 0.5167596, 0.46324307, 0.36270434, 0.028198794, -0.0276233, -0.26519156, -0.40417665, -0.20543799, -0.01797728, -0.24816029, 0.45002025, -0.07720269, 0.3102108, 0.1538209, 0.49046427, -0.13460843 18 | -0.25246197, -0.33243272, 0.4113991, 0.50625426, -0.15337597, -0.21685879, -0.19359164, -0.22886796, 0.33007088, 0.1720199, -0.16238178, 0.3382011, -0.36000574, -0.25114653, -0.20716971, -0.20183796, -0.26700854, -0.26839015 19 | -0.021168472, -0.012901184, 0.5260681, 0.33544716, -0.07504711, 0.23029552, 0.08175289, 0.10893862, 0.38343802, 0.33070454, 0.11808093, 0.48749816, -0.20274265, 0.17646155, -0.21118245, 0.09225815, -0.17694928, 0.12357669 20 | 0.09955606, 0.112438485, 0.1678363, 0.080482334, 0.14137588, 0.22883046, 0.12718543, 0.17098403, 0.30118954, 0.30740008, 0.119550206, 0.30720448, 0.056739215, 0.20800094, 0.14511807, 0.235452, -0.033240806, 0.14246784 21 | -0.32583156, -0.20862882, 0.5168017, 0.38591227, -0.06871826, -0.24735664, -0.20344023, -0.08727149, 0.26890945, 0.034325216, -0.0649471, 0.28357112, -0.30749992, -0.18419847, 0.011846613, -0.23744339, 0.15352365, -0.22710693 22 | 0.2369373, 0.17898557, -0.16491538, -0.33197218, -0.12249653, 0.27895766, 0.28235394, 0.20937629, 0.34599984, 0.3135448, 0.31167576, 0.2600503, -0.03170949, 0.24849525, -0.2729426, 0.2963761, -0.188701, 0.3590321 23 | 0.15145195, 0.13624907, 0.37247804, 0.30338144, -0.08894911, 0.19581728, 0.31660417, 0.16264978, 0.29704556, 0.27602047, 0.17901698, 0.3301493, 0.027354458, 0.12697768, 0.002156206, 0.16040087, -0.1640432, 0.27268612 24 | -0.10757907, -0.20782647, 0.26332703, 0.0132016465, -0.38375336, 0.18651035, 0.16672966, 0.15054023, 0.34269696, 0.3529546, 0.29613814, 0.42925695, -0.29121375, 0.14581357, -0.34008688, 0.1937637, -0.29086772, 0.29922423 25 | 0.24619801, 0.18477774, -0.2908861, -0.24903618, -0.10210578, 0.40041265, 0.4264456, 0.26135966, 0.29535854, 0.21104376, 0.38036442, 0.2271568, 0.1778997, 0.344592, -0.12255523, 0.28282487, -0.24935707, 0.31122848 26 | 0.32290453, 0.37710178, -0.41396213, -0.44046965, 0.108816534, 0.31749076, 0.37286952, 0.35346097, 0.31403503, 0.22309723, 0.25057742, 0.365778, 0.2919053, 0.46336097, -0.100100055, 0.42493692, -0.35137486, 0.293787 27 | 0.30167958, 0.41750023, 0.03802042, 0.11055765, 0.42735067, 0.15455781, 0.28053057, 0.21189232, -0.26872408, -0.06880758, 0.33466625, -0.3531478, 0.42100593, 0.1693993, 0.35011947, 0.25927243, 0.4116211, 0.26499802 28 | -0.2588903, -0.38383853, 0.3984906, 0.2582444, -0.36617133, 0.1114011, 0.12066032, 0.24344943, 0.49456623, 0.3050942, 0.07425613, 0.42730066, -0.4426373, 0.05123656, -0.40306628, 0.10125415, -0.32864732, 0.075332195 29 | 0.2261324, 0.3342166, 0.19625108, 0.35099882, 0.35788503, 0.0062958514, -0.23930164, -0.27406752, -0.34422576, -0.36094183, -0.09167878, -0.24068128, 0.4480026, -0.17981805, 0.4651917, 0.062338367, 0.41673645, -0.18136366 30 | 0.19219625, 0.28627768, 0.30621704, 0.36377904, 0.28767112, 0.2820561, 0.3707452, 0.3853626, 0.22978948, 0.32929868, 0.18843816, 0.35635388, 0.40206262, 0.24322112, 0.23664649, 0.16122755, 0.41749528, 0.40997773 31 | 0.2820087, 0.23906766, -0.0847942, -0.25355148, -0.012051963, 0.3361169, 0.309333, 0.37495923, 0.31525913, 0.40996203, 0.3338277, 0.48709938, 0.32765818, 0.33655557, -0.18200801, 0.37163514, -0.32525057, 0.44289017 32 | 0.22197981, 0.33167982, -0.481518, -0.4130471, 0.11049469, 0.39586967, 0.4138621, 0.48731983, 0.39109826, 0.4025896, 0.458408, 0.29562813, 0.3250636, 0.3439612, -0.23074292, 0.32085073, -0.3308284, 0.48625576 33 | 0.2393899, 0.34521738, -0.3387608, -0.21522929, -0.065243185, 0.35786355, 0.33277747, 0.390578, 0.37956855, 0.3656643, 0.29430744, 0.2758784, 0.2674729, 0.47936204, -0.35384735, 0.26191112, -0.30027005, 0.43236884 34 | 0.106002696, 0.26173106, 0.261461, 0.06349406, 0.029448275, 0.3611618, 0.33577108, 0.17603713, 0.31414208, 0.2904897, 0.3336688, 0.30078974, 0.07346586, 0.19213378, -0.11272067, 0.24665089, -0.267052, 0.26111075 35 | 0.19759685, 0.2796122, -0.22346403, -0.099640116, 0.22651775, 0.21494061, 0.12159661, 0.07095928, 0.14490971, 0.02712742, 0.24182631, 0.08340618, 0.26647496, 0.16747345, 0.2320068, 0.15934132, 0.09360183, 0.14157753 36 | 0.22543079, 0.3205862, 0.24585226, 0.26546192, 0.33854362, 0.24620222, 0.27197328, 0.3097088, 0.09495561, 0.07611744, 0.2379643, 0.18042684, 0.45989865, 0.17683806, 0.36212897, 0.15753822, 0.41539404, 0.19501865 37 | 0.20144622, 0.21795984, 0.40008456, 0.37348676, 0.07930721, 0.043168437, 0.09167403, 0.10389606, 0.33050063, 0.24523553, 0.17617588, 0.42555535, 0.17271048, 0.21525577, 0.16934322, 0.22916262, 0.22539017, 0.099864885 38 | 0.14198881, 0.09577441, 0.4972382, 0.40334898, 0.28057688, 0.17585105, 0.016553642, 0.12416715, 0.38439265, 0.27129513, 0.07334797, 0.26436138, 0.05727133, 0.054792713, 0.3048694, 0.10285324, 0.196578, 0.17685136 39 | 0.25958157, 0.35544664, -0.21330027, -0.32179496, 0.20187569, 0.3941387, 0.3993772, 0.2973854, 0.35979226, 0.20563199, 0.2503116, 0.31860265, 0.37426054, 0.37548944, 0.14880323, 0.26600754, 0.11463135, 0.2938711 40 | -0.40925252, -0.4476065, 0.65981936, 0.56891394, -0.31958845, -0.25027245, -0.40657917, -0.3027584, 0.5449306, 0.32368907, -0.29767504, 0.6587268, -0.41958752, -0.38984084, -0.43630823, -0.27881935, -0.53054273, -0.38766402 41 | 0.3828161, 0.25353488, -0.33884093, -0.31038216, 0.034799848, 0.2903009, 0.33618012, 0.34969804, 0.22199805, 0.35277387, 0.3603247, 0.4060782, 0.22776881, 0.32019207, -0.22149897, 0.2413944, -0.41369158, 0.32132098 42 | 0.021358468, -0.009824643, 0.53765386, 0.47137222, -0.24735881, 0.06403386, 0.14613602, 0.04666888, 0.38941747, 0.29583108, 0.13800454, 0.34826836, -0.22931477, 0.14410615, -0.24842457, 0.16203275, -0.15650499, 0.019450704 43 | 0.34441262, 0.26504147, 0.114437945, 0.23074771, 0.3706671, 0.22142759, 0.36784673, 0.38917196, 0.21715209, 0.18169782, 0.23645857, 0.18174815, 0.27848876, 0.3394847, 0.36770916, 0.32040787, 0.37910774, 0.36105782 44 | 0.14100435, 0.07842121, 0.4663018, 0.27485436, -0.025582964, 0.2564671, 0.35130602, 0.35246575, 0.35811192, 0.24684656, 0.3292415, 0.26300687, 0.07827305, 0.14792548, -0.12065728, 0.1976094, -0.14742178, 0.22253339 45 | -0.01729401, -0.07601619, 0.30222133, 0.30001038, 0.16640767, -0.07914897, -0.018249733, -0.110719934, 0.15017901, 0.058642153, -0.1942323, -0.031928144, -0.007306614, -0.12735242, 0.28373063, -0.23887648, 0.25251237, -0.049331833 46 | -0.2137197, -0.09675444, 0.2570996, 0.3692916, -0.24072279, 0.16565603, -0.11456723, 0.012406381, 0.31210172, 0.29427406, -0.10645877, 0.4193448, -0.20584697, -0.10838739, -0.18849635, 0.013026028, -0.19607078, -0.123258725 47 | 0.28553918, 0.20589995, 0.40878975, 0.43074206, 0.26031354, -0.046888527, -0.1954915, -0.27570203, 0.30346048, 0.085326925, -0.21161522, 0.36712545, 0.24801321, -0.27805308, 0.21646068, -0.21453163, 0.39423767, -0.0823785 48 | 0.08395563, -0.042461265, 0.2638629, 0.1046232, -0.084486246, 0.2952938, 0.20672102, 0.11182058, 0.3546207, 0.38024402, 0.22463845, 0.3377382, -0.1553405, 0.21316239, -0.22766669, 0.13767362, -0.23049247, 0.08871285 49 | 0.11828181, 0.08792305, 0.3619574, 0.34254757, -0.14252159, 0.352086, 0.36838573, 0.3562146, 0.3066886, 0.21177113, 0.3322645, 0.37604874, 0.0046599093, 0.20325424, -0.193941, 0.20656976, -0.26988032, 0.34894487 50 | 0.082438774, 0.10199115, 0.35924044, 0.33087754, 0.28571817, 0.24719116, 0.13770422, 0.12331168, 0.19390598, 0.17541292, 0.13786179, 0.27742624, 0.1354629, 0.1799598, 0.14329095, 0.19574603, 0.26002398, 0.07273303 51 | 0.42047438, 0.2988496, -0.24673367, -0.27580452, 0.34698302, 0.17672013, 0.25383922, 0.114668116, -0.13548401, 0.0004712127, 0.2445543, -0.09867447, 0.28491962, 0.20900634, 0.26795822, 0.31466722, 0.33722445, 0.2814177 52 | -0.1831015, -0.2392663, 0.44190258, 0.47650373, -0.1459428, -0.3269953, -0.3330904, -0.21834771, -0.07482761, -0.13615745, -0.31197655, 0.0059209703, -0.14798473, -0.35179952, -0.043250673, -0.34130564, 0.21151838, -0.16589746 53 | 0.35391378, 0.26300067, -0.2671272, -0.18552276, 0.37377176, 0.2835558, 0.23191227, 0.24886365, 0.05718765, 0.20195922, 0.2669729, -0.053757392, 0.2867729, 0.34346312, 0.41339928, 0.29569495, 0.35134912, 0.25522065 54 | 0.11554466, 0.19480817, 0.517977, 0.3664404, 0.09035812, 0.38112506, 0.42135933, 0.38934076, 0.37009797, 0.29027647, 0.25316697, 0.41659117, 0.10977631, 0.38266796, 0.120481946, 0.3519921, 0.10629309, 0.24516988 55 | 0.088853545, 0.1872833, 0.41406682, 0.14899293, -0.10233949, 0.3413136, 0.3497769, 0.37974057, 0.46002215, 0.39889392, 0.26421767, 0.38902435, 0.027237583, 0.3507255, -0.23772001, 0.3664757, -0.20820892, 0.36444712 56 | 0.18773323, 0.09758778, 0.41868496, 0.47874725, -0.0830379, 0.14249791, 0.18976963, 0.32153228, 0.37687826, 0.2299091, 0.18460514, 0.47663698, 0.1938471, 0.17553595, -0.13374382, 0.21528184, -0.07724212, 0.16326712 57 | 0.25092512, 0.23402359, 0.32440123, 0.3855517, 0.25987864, 0.073917456, -0.030498153, -0.016147988, 0.0006296645, -0.05314293, 0.021114144, -0.06805764, 0.20726901, 0.09641426, 0.1827073, 0.021293562, 0.38919362, 0.043090995 58 | 0.2738437, 0.19759041, 0.50403637, 0.3792823, 0.21878058, 0.114121966, -0.057244398, -0.010908044, -0.17071415, 0.02777204, 0.0814298, -0.1581624, 0.19368087, -0.024592152, 0.38641733, -0.002879557, 0.31286716, 0.13778692 59 | 0.39248905, 0.28586838, 0.33929485, 0.31139207, 0.40760323, -0.01123467, -0.23743273, -0.16703653, -0.3717619, -0.20665944, -0.13535172, -0.24524896, 0.2754389, -0.21748117, 0.3659477, -0.06775912, 0.3382471, -0.08412486 60 | -0.2629014, -0.23179726, 0.52404475, 0.49940655, -0.21464652, -0.050071757, 0.13728485, 0.16743931, 0.44027358, 0.24820688, 0.15575007, 0.33246607, -0.2586445, 0.17160062, -0.21046966, 0.07745711, -0.2796551, 0.11444476 61 | 0.18247662, 0.30021545, -0.2658194, -0.2612391, 0.2506535, 0.30885753, 0.3058223, 0.34930182, 0.32449177, 0.16698498, 0.24163423, 0.21719734, 0.34632865, 0.27735755, 0.07723144, 0.27436906, 0.14850402, 0.33327556 62 | 0.13882689, 0.01754395, 0.37987417, 0.45795667, 0.04987211, 0.15981482, 0.11780404, 0.029283568, 0.41859975, 0.33363727, 0.16852428, 0.3223038, 0.010374171, 0.013548534, -0.06836147, 0.11263576, 0.04851501, 0.025864663 63 | 0.12521115, 0.18063332, 0.310482, 0.2524803, 0.27275962, 0.19081752, 0.34149924, 0.25641695, 0.30287716, 0.25287443, 0.15399434, 0.1995684, 0.15244058, 0.18679394, 0.30539626, 0.1759263, 0.2493897, 0.22887775 64 | 0.27605045, 0.28259787, 0.13935088, 0.07153191, 0.02012155, 0.16657212, 0.2442457, 0.32183313, 0.37982655, 0.22745954, 0.10463513, 0.40114257, 0.16445048, 0.18314838, -0.13042593, 0.16703536, -0.1434993, 0.26834735 65 | 0.24245936, 0.0616184, 0.36530364, 0.44459727, 0.119512014, 0.19815138, 0.21451704, 0.2646214, 0.21195436, 0.3011761, 0.25632733, 0.29333097, -0.0069163046, 0.12840675, 0.31244045, 0.18755695, 0.1481017, 0.13440858 66 | 0.29076326, 0.41450915, 0.24187179, 0.100687675, 0.2990858, 0.4296695, 0.28553542, 0.27390936, 0.26460484, 0.28286225, 0.44702595, 0.19353563, 0.2731525, 0.3101163, 0.1733485, 0.23158519, 0.12470791, 0.2885569 67 | 0.18409681, 0.26281905, -0.25737855, -0.15279126, 0.18507461, 0.31725228, 0.27380306, 0.1561564, 0.17678805, 0.31498533, 0.34232786, 0.18168397, 0.14394341, 0.23269343, 0.23722994, 0.21256219, 0.071415015, 0.27922487 68 | 0.21615152, 0.1534955, 0.37566695, 0.46850857, 0.07878003, 0.2799354, 0.3205057, 0.3701721, 0.29009464, 0.33162197, 0.20583585, 0.273392, 0.06754586, 0.35496157, 0.049279206, 0.29143918, 0.016619084, 0.27594426 69 | 0.2094362, 0.26206395, 0.29873273, 0.33452198, 0.40106586, 0.17568834, 0.20702213, 0.14820114, 0.06881029, 0.102854714, 0.11163661, 0.10291348, 0.1930055, 0.13901109, 0.2650674, 0.18650308, 0.3141514, 0.14150028 70 | 0.10506172, 0.17590371, 0.44509625, 0.32731965, 0.24843597, -0.02941625, -0.11392234, -0.041957673, -0.020832876, -0.054934416, 0.0025450683, -0.1366089, 0.18620695, 0.035352286, 0.15462345, 0.021486364, 0.2122677, -0.042528495 71 | -0.04243878, 0.09086609, 0.4468579, 0.47713214, 0.3035334, -0.25989893, -0.28826714, -0.25653195, 0.013874724, -0.22249395, -0.32941395, -0.06885284, 0.14073077, -0.36794764, 0.41092885, -0.24205083, 0.30996534, -0.22171122 72 | 0.19035102, 0.33556584, 0.35553002, 0.48014697, 0.2852209, 0.20683949, 0.28888386, 0.3435578, 0.06389134, 0.21176592, 0.19118337, 0.22137463, 0.4284119, 0.23058058, 0.43383065, 0.33514994, 0.2849325, 0.31259137 73 | 0.10430911, 0.038542036, 0.5628362, 0.46054906, 0.076709524, 0.18936414, 0.18337186, 0.11843607, 0.35867444, 0.28486964, 0.12384786, 0.42666975, -0.03213642, 0.15652063, 0.19758697, 0.15974371, 0.09217708, 0.27318126 74 | 0.15513735, 0.16113399, 0.3227697, 0.45723537, 0.41251057, 0.11977021, 0.045098074, 0.17699184, 0.15787812, 0.121348836, 0.095900394, 0.06070146, 0.14919285, 0.21822739, 0.2540653, 0.18606362, 0.32692775, 0.07855221 75 | 0.26319796, 0.3027376, 0.3420499, 0.12482011, 0.28011048, 0.1749512, 0.20538321, 0.2637589, 0.36333653, 0.3735031, 0.1743102, 0.3261989, 0.19219534, 0.17749146, 0.10038644, 0.21769209, 0.18892339, 0.33485502 76 | 0.31520882, 0.22075789, 0.31534514, 0.31887183, 0.35511073, -0.03382782, 0.013049131, 0.10461116, -0.18419915, -0.20246689, 0.11213424, -0.23990013, 0.3172569, 0.09354895, 0.30317295, 0.12398487, 0.4947377, 0.07995797 77 | 0.13764802, 0.2996471, 0.29901662, 0.34438798, 0.29822433, 0.121106565, 0.20647024, 0.23061386, 0.30250588, 0.22025654, 0.25268474, 0.30051032, 0.30497125, 0.10286707, 0.05666481, 0.148067, 0.119736634, 0.087113716 78 | 0.12692069, 0.08560241, 0.035639837, 0.0012647756, -0.10967902, 0.33589756, 0.2902532, 0.16225883, 0.2605527, 0.32875767, 0.20159814, 0.4190005, 0.10756411, 0.33555502, -0.21702887, 0.15159884, -0.21512581, 0.2086469 79 | 0.3336172, 0.3496723, 0.24817573, 0.22144026, 0.22866297, 0.25076252, 0.31450072, 0.20984745, 0.35766724, 0.29535308, 0.2625019, 0.28429985, 0.19337246, 0.2137178, 0.32919645, 0.29737148, 0.29208037, 0.29588056 80 | 0.32083482, 0.39382714, -0.15392077, 0.029632488, 0.3594948, 0.11292798, 0.06374934, 0.18617345, -0.29582796, -0.17597325, 0.15856262, -0.19636141, 0.27731547, 0.15040325, 0.31321025, 0.20315433, 0.4418863, 0.067658626 81 | 0.02983743, 0.09214695, 0.31465757, 0.30041894, 0.13787186, -0.15284471, -0.040102527, 0.060709346, 0.21091609, 0.025351096, 0.09215803, 0.21588969, 0.07212732, 0.022943728, 0.27388614, 0.18940355, 0.30716294, 0.08904475 82 | 0.10070756, 0.060417727, 0.38886622, 0.32523277, -0.13696265, 0.15540935, 0.2732878, 0.17011498, 0.3731112, 0.32934955, 0.18248683, 0.32372138, -0.06423813, 0.1311635, -0.16752392, 0.28598967, -0.19914779, 0.19530432 83 | 0.20193054, 0.13372123, 0.39114526, 0.4128631, 0.06392869, 0.28365675, 0.3220431, 0.29010805, 0.31283587, 0.3032198, 0.32191026, 0.4197925, 0.06946899, 0.32042062, 0.023796383, 0.18867987, 0.06741123, 0.37284705 84 | 0.3340908, 0.25522822, 0.41029668, 0.480311, 0.25430816, 0.23005529, 0.22163674, 0.24867736, 0.33237013, 0.27054116, 0.17144397, 0.24458209, 0.17763618, 0.1296715, 0.25348163, 0.2779355, 0.24575388, 0.08481271 85 | 0.15371548, 0.112110674, 0.39493638, 0.2195833, 0.22041346, 0.2113433, 0.22388276, 0.19370286, 0.12645139, 0.14939535, 0.27157933, 0.16661884, 0.118816756, 0.08312718, 0.39159918, 0.17280024, 0.22234271, 0.1731745 86 | 0.4524754, 0.41807842, 0.25657195, 0.2796732, 0.4811724, -0.18701546, -0.20798936, -0.2835589, -0.47966278, -0.4116497, -0.11834632, -0.43300644, 0.39589554, -0.15760972, 0.39679122, -0.12827046, 0.40019557, -0.22323991 87 | 0.18948938, 0.23461185, 0.28885126, 0.36918256, 0.44114724, -0.062317856, -0.16679588, -0.11648608, -0.37751803, -0.34384885, -0.047478404, -0.25465783, 0.2560579, -0.16740194, 0.2952005, -0.0033784604, 0.4456576, 0.004375946 88 | 0.13218567, 0.14159289, 0.35351506, 0.27640572, 0.23662063, -0.14038017, 0.053319644, -0.052632205, -0.0436749, -0.17089464, -0.031480335, -0.10619997, 0.13768312, 0.02242055, 0.2997758, 0.021530109, 0.38119653, -0.11444426 89 | 0.18161055, 0.19339392, 0.21044338, 0.27782372, 0.20614918, -0.14533518, -0.18266656, -0.24535988, -0.25393444, -0.27950194, -0.05392217, -0.1469859, 0.073616326, -0.17638603, 0.22767083, -0.10529679, 0.24440517, -0.19613683 90 | -0.27034858, -0.4290701, 0.440907, 0.4563548, 0.054713618, -0.44347966, -0.49544346, -0.4246329, 0.14010404, -0.32363218, -0.26925325, 0.10745347, -0.3355489, -0.47862756, 0.2503253, -0.2508857, 0.28753778, -0.270476 91 | -0.42151052, -0.22496977, 0.57508546, 0.5331678, -0.32991308, -0.14429142, -0.2454127, -0.06973924, 0.31828392, 0.13608725, -0.13881779, 0.41704473, -0.40312403, -0.16791666, -0.21419378, -0.07227276, -0.10449438, -0.068335176 92 | -0.094274305, -0.039251734, 0.3636642, 0.47312817, 0.07790845, -0.046803802, -0.12811704, -0.11586568, 0.30884716, 0.37119353, -0.010090858, 0.36320344, 0.18441503, -0.08304759, 0.119926475, 0.040366907, 0.12963383, 0.01589261 93 | 0.22223128, 0.34131822, -0.24777064, -0.32831073, 0.24387297, 0.25173134, 0.35084844, 0.19823498, 0.0037460034, 0.17298597, 0.27197367, 0.120783, 0.37275514, 0.21011527, 0.29073, 0.30024552, 0.04162251, 0.34682974 94 | 0.1975369, 0.15154646, -0.24534649, -0.33786643, -0.13475268, 0.38619468, 0.31144583, 0.27817476, 0.31182265, 0.17407224, 0.29646105, 0.2701279, 0.25407603, 0.34472087, -0.16708963, 0.18966627, -0.23144597, 0.3421631 95 | 0.30322057, 0.17506787, 0.5059403, 0.57327276, 0.22111444, 0.19171861, 0.19680047, 0.17823923, 0.3832485, 0.35366377, 0.31357086, 0.52545404, 0.039909594, 0.2360585, 0.14307876, 0.2182731, 0.14125341, 0.22503117 96 | 0.25092578, 0.26599193, 0.35511827, 0.31585807, 0.3031678, 0.2629359, 0.19124015, 0.12959678, 0.2871269, 0.30920616, 0.17217833, 0.31506136, 0.37762237, 0.2535825, 0.40492278, 0.077763595, 0.4394218, 0.10785375 97 | 0.21740404, 0.3352847, 0.24519628, 0.31759313, 0.33023092, 0.086647026, 0.11315676, -0.00018037597, -0.13934824, 0.067107454, 0.08396296, -0.13737848, 0.17695698, -0.03399668, 0.4383776, 0.17695427, 0.43488276, 0.16802469 98 | 0.3463574, 0.20759343, 0.27652782, 0.38113236, 0.20799834, 0.18372717, 0.055869073, 0.14320302, 0.055322267, 0.07820169, 0.27558494, 0.19537744, 0.22656646, 0.12957646, 0.25558499, 0.2572106, 0.35997933, 0.25769854 99 | -0.15092391, -0.14240949, 0.47138172, 0.48260757, -0.20943923, 0.2239516, 0.13359094, 0.2571576, 0.35051492, 0.34021682, 0.07639541, 0.34284437, -0.16113977, 0.019096116, -0.22423099, 0.21578337, -0.39136997, 0.11488588 100 | 0.19157036, 0.29113677, 0.03592004, -0.0107032955, 0.23380183, 0.27876088, 0.2304543, 0.20358476, 0.2268, 0.15689792, 0.1382585, 0.12455707, 0.2243335, 0.099332325, 0.03774163, 0.227759, 0.008044021, 0.2090647 101 | -0.037109878, -0.050420437, 0.539903, 0.3947543, -0.1807676, 0.11035768, 0.15818866, 0.053546976, 0.4010284, 0.3301669, 0.18114695, 0.43861482, -0.20401804, 0.07531088, -0.3307132, 0.16912404, -0.14387631, 0.0029740212 102 | 0.42631602, 0.26430893, -0.031137116, 0.2519986, 0.3426184, 0.20745309, 0.2200635, 0.3002981, -0.2953148, 0.17644855, 0.31922767, -0.2619645, 0.4233054, 0.19514942, 0.3868985, 0.34626237, 0.27289146, 0.27915925 103 | 0.474001, 0.5055684, 0.40567318, 0.40931275, 0.42964315, -0.10380348, -0.04305916, -0.17383881, -0.424357, -0.3908651, -0.02798578, -0.51475555, 0.44140637, -0.11466508, 0.47098964, -0.056680966, 0.47260165, -0.10374872 104 | 0.31429407, 0.3178876, 0.33631867, 0.4159015, 0.3267003, -0.12248461, -0.26051906, -0.3650654, -0.35653886, -0.2946982, -0.22066772, -0.37070525, 0.4384287, -0.17131501, 0.44192144, -0.12424551, 0.3409651, -0.23641925 105 | -0.254946, -0.33178273, 0.45941946, 0.40540323, -0.31083062, -0.18582916, -0.12673485, -0.14167914, 0.4982119, 0.27146745, -0.11494968, 0.44182053, -0.22139637, -0.1568366, -0.38877305, -0.09113752, -0.39468697, -0.106648706 106 | 0.10728964, 0.2256506, 0.42447615, 0.45296884, 0.14838646, 0.14241037, 0.20631063, 0.12412757, 0.3334722, 0.20114711, 0.12939182, 0.28249204, 0.26802918, 0.15117036, 0.15989137, 0.13975373, 0.33827588, 0.09693934 107 | -0.0275216, -0.082046114, 0.52436376, 0.40624738, 0.095690675, -0.048886426, -0.15221262, -0.045912586, 0.13622913, 0.0660932, -0.036639974, 0.23672992, -0.06712888, -0.16492516, 0.22029549, 0.055032235, 0.21297143, -0.13316023 108 | 0.30301303, 0.22931479, -0.19160192, -0.22875108, 0.18681078, 0.34892547, 0.30063567, 0.32134008, 0.2145786, 0.2925697, 0.3201344, 0.16111612, 0.34893408, 0.26100296, 0.20998108, 0.25304607, 0.15297091, 0.2662717 109 | -0.31435755, -0.40030247, 0.49536625, 0.31974006, -0.27109718, -0.09951794, -0.13490912, -0.15747088, 0.27439737, 0.14999183, -0.20836973, 0.29601118, -0.24080698, -0.17273748, -0.28742793, -0.22853479, -0.3539368, -0.13402401 110 | -0.07257123, -0.168668, 0.402547, 0.47227454, -0.20125714, 0.17555696, 0.1322577, 0.105995774, 0.3975575, 0.15596735, 0.1470229, 0.282887, -0.22539999, 0.12180785, -0.18114932, 0.2048723, -0.022025764, 0.051726833 111 | 0.13710633, 0.30360946, -0.09553991, -0.3562741, -0.14035402, 0.32991013, 0.3970615, 0.341851, 0.29143992, 0.37720674, 0.42993563, 0.2609294, 0.2235701, 0.3853041, -0.3381869, 0.22176972, -0.22334497, 0.38885197 112 | -0.47908524, -0.27643773, 0.49722886, 0.35317683, -0.5155934, 0.26764977, 0.36071244, 0.29828143, 0.5587417, 0.32901987, 0.24326442, 0.60700524, -0.4370428, 0.2175608, -0.39839357, 0.21958245, -0.29635975, 0.23930408 113 | 0.10241656, 0.178114, 0.24383534, 0.3455108, 0.26495096, -0.0839521, 0.069697276, -0.04345303, -0.09057267, 0.0468447, 0.06767578, -0.14927761, 0.27956396, -0.029106999, 0.42053655, 0.090424635, 0.3052027, -0.07593011 114 | 0.04053182, 0.16220857, 0.016016966, -0.033932664, -0.06799038, 0.17936419, 0.29645917, 0.3427617, 0.41995922, 0.22791341, 0.16211371, 0.23579167, -0.027537026, 0.1653456, -0.19982691, 0.1939733, -0.25528172, 0.33737513 115 | -0.11483256, -0.1401169, 0.54982877, 0.4084579, -0.19875488, -0.08112543, 0.029532127, 0.026291233, 0.38689166, 0.192359, -0.11046994, 0.42425045, -0.11021243, -0.025767783, -0.06865126, -0.110113055, -0.11790568, -0.07882359 116 | -0.16858688, -0.23576401, 0.42586043, 0.45315006, -0.28787944, -0.1670257, -0.08575164, -0.21872704, 0.33141625, 0.13529171, -0.15081988, 0.2241327, -0.2324244, -0.16353485, -0.2762758, -0.08712186, -0.19482416, -0.13530184 117 | 0.22520262, 0.26206845, 0.3654336, 0.3225572, 0.30037302, 0.017722724, -0.15428796, -0.0640464, -0.12985727, -0.12859383, -0.111967854, -0.21425228, 0.13375638, -0.16269547, 0.3100707, 0.0072929, 0.34520847, -0.2219048 118 | 0.3514247, 0.29881725, 0.32873276, 0.22711168, 0.38810262, 0.019455416, -0.028725201, -0.043860115, -0.03371292, -0.025726086, 0.0739693, -0.08309318, 0.39055672, 0.063079454, 0.39175272, 0.17582756, 0.22289163, 0.022652524 119 | 0.15118943, 0.10375094, 0.27455404, 0.35477397, 0.17447902, 0.026891807, -0.1298088, -0.14964385, -0.1988368, -0.118496984, -0.14073393, -0.20634823, 0.07623883, -0.16257077, 0.22796378, 0.024388207, 0.20537946, -0.071009696 120 | 0.31388435, 0.46495736, -0.17314032, -0.123128034, 0.37874058, 0.39185804, 0.308146, 0.2511306, 0.07857626, 0.29676038, 0.3185745, 0.11443499, 0.38484216, 0.22886278, 0.37110132, 0.2465405, 0.5537693, 0.35167724 121 | -0.023562383, 0.0048112045, 0.34824455, 0.2759867, 0.29060686, -0.007997814, -0.17311274, -0.19178261, -0.2091092, -0.08203762, -0.0092582675, -0.15332223, 0.031748947, -0.18319039, 0.2766703, -0.15041183, 0.3276279, -0.19846685 122 | -0.15975893, -0.20434639, 0.50591147, 0.4268668, -0.13227187, -0.35456738, -0.20607765, -0.1932716, 0.19679083, 0.061033238, -0.15056841, 0.24748985, -0.1672232, -0.23406044, -0.1422366, -0.22094755, -0.014096839, -0.26252684 123 | 0.39079294, 0.332456, 0.5500905, 0.5288638, 0.28281832, -0.08044411, -0.052892473, -0.044166636, 0.20871562, 0.0950251, -0.12934913, 0.12846747, 0.3184451, -0.0030885737, 0.34310183, -0.10433907, 0.2791985, -0.03542263 124 | 0.3634701, 0.31538764, 0.36383915, 0.46552593, 0.41601205, 0.0022338692, -0.12777779, -0.21076576, -0.46857107, -0.33890772, 0.043417826, -0.5102852, 0.41350862, -0.07199132, 0.53005755, 0.008067845, 0.35837284, -0.1399625 125 | 0.09926554, 0.0017449199, 0.42919856, 0.41855088, 0.16411848, -0.072407186, -0.20126356, -0.17197466, -0.07577524, -0.2598233, -0.078024626, -0.021503376, 0.043353755, -0.23515375, 0.1752255, -0.15065373, 0.27115923, -0.088295266 126 | -0.39078012, -0.37415615, 0.30726737, 0.36916664, -0.1257707, 0.013232634, 0.07133498, 0.14907798, 0.12814057, 0.20749281, 0.08971501, 0.21316978, -0.28712508, 0.13117586, -0.042344954, 0.02750526, 0.09297861, 0.07112316 127 | -0.3823911, -0.33256423, 0.3265574, 0.26037726, -0.15527211, 0.002148578, 0.016496127, 0.053995907, 0.006162836, -0.037650395, -0.06682514, 0.05811919, -0.25519437, 0.062576935, -0.1104695, -0.08305652, 0.0396777, 0.061076514 128 | -0.3276538, -0.3358747, 0.34442276, 0.33649305, -0.35020304, -0.23802887, -0.22209959, -0.23717305, 0.12536941, 0.15948549, -0.21759306, 0.14659435, -0.33227402, -0.11356122, -0.24628936, -0.18725385, -0.27465984, -0.20486689 129 | 0.03995978, 0.2449874, 0.49712634, 0.5146268, 0.43317166, -0.25352246, -0.13387975, -0.18470213, -0.16576168, -0.22196552, -0.20179331, -0.08056701, 0.27190155, -0.19749394, 0.301505, -0.26501143, 0.30933398, -0.2156743 130 | 0.3612238, 0.17839912, 0.24309012, 0.36703664, 0.3241695, 0.016666414, -0.11624025, 0.011581395, -0.11839834, -0.20702618, -0.018793065, -0.2604198, 0.3053408, 0.027797952, 0.32668746, -0.09799035, 0.24871182, -0.021730758 131 | 0.06638579, 0.0064154826, 0.49762475, 0.30570787, 0.26387012, 0.015737679, 0.013025455, -0.20675053, -0.0070602726, 0.029961227, -0.1956085, 0.08963681, -0.020997766, -0.16503383, 0.2941615, -0.20880961, 0.2843542, -0.12827343 132 | 0.105542496, 0.10978042, 0.40361172, 0.5290393, 0.40289927, -0.12992106, -0.23494661, -0.1264254, -0.056412887, -0.257434, -0.25074235, -0.04852663, 0.11528556, -0.2825129, 0.27933797, -0.10673518, 0.3356764, -0.19508238 133 | -0.21525225, -0.22066471, 0.3515764, 0.32440305, -0.21501571, 0.20485899, 0.15864114, 0.21522398, 0.3755397, 0.40317047, 0.2987651, 0.32296404, -0.15860857, 0.26818576, -0.17434345, 0.16548695, -0.25199905, 0.24762483 134 | -0.14206897, -0.19015686, 0.2830199, 0.23876914, -0.20738064, -0.043290094, 0.16646431, 0.018567882, 0.14225172, 0.16572577, 0.065763, 0.14507297, -0.11329506, -0.01640907, 0.070717275, -0.05779811, 0.027120067, 0.06963184 135 | -0.22819193, -0.093203306, 0.4397662, 0.3693878, -0.17965017, -0.1349197, -0.1032657, -0.13722444, 0.05436337, -0.0022398646, -0.17927526, 0.13464792, -0.17729491, -0.086114384, 0.08203802, -0.15935047, 0.08188418, -0.07905943 136 | 0.24608025, 0.24301213, 0.35745177, 0.38313156, 0.2744412, -0.09187148, -0.14198846, -0.15513062, -0.25752115, -0.19721782, -0.257134, -0.3492914, 0.2751031, -0.24764425, 0.42697352, -0.017161818, 0.28668156, -0.13914679 137 | -0.24358806, -0.3398584, 0.39152652, 0.48492652, -0.24927355, -0.18082176, -0.09018142, -0.04030635, 0.35573533, 0.15762308, -0.117321774, 0.4145555, -0.24806432, -0.1601419, -0.16284373, -0.24472696, -0.18481077, -0.2234078 138 | 0.12063275, 0.3208363, 0.25755692, 0.266721, 0.3491226, -0.13590568, -0.16547312, -0.23465161, -0.28328744, -0.23293346, -0.061716117, -0.24891785, 0.22780271, -0.15998419, 0.39493826, -0.20222734, 0.26850903, -0.15441346 139 | -0.33157885, -0.24510199, 0.36528212, 0.48420927, -0.3216272, -0.017939497, 0.003028337, -0.012128674, 0.34425837, 0.33180097, 0.04394299, 0.3446169, -0.3172616, -0.09569071, -0.15366106, -0.048468824, -0.028681658, -0.05444429 140 | -0.28252625, -0.3903756, 0.4574872, 0.46030426, -0.34636736, 0.26374152, 0.11080713, 0.19196843, 0.56732136, 0.47919708, 0.21532561, 0.5970474, -0.44727302, 0.21554968, -0.32645464, 0.2063797, -0.49339402, 0.16678885 141 | -0.031176688, -0.21312007, 0.3413696, 0.23278531, -0.3463406, 0.2433641, 0.16219474, 0.12127899, 0.24406344, 0.18757752, 0.19828324, 0.3244888, -0.1396441, 0.20999345, -0.18910992, 0.12060269, -0.25260618, 0.15179841 142 | -0.3457382, -0.34739855, 0.3725757, 0.3677859, -0.39756253, -0.10448081, 0.026176414, 0.01854738, 0.39004079, 0.27412888, -0.05465124, 0.5139848, -0.35195634, -0.022837406, -0.3899179, -0.20563069, -0.2476541, -0.00534167 143 | 0.30264342, 0.3789512, -0.2503599, -0.11218802, 0.35223454, 0.3012499, 0.11962093, 0.16896152, -0.15005176, 0.03926469, 0.29880613, -0.11979631, 0.35037404, 0.29733288, 0.4871581, 0.25962254, 0.3671481, 0.29931185 144 | -0.25239533, -0.20397247, 0.30903846, 0.2962046, -0.14743868, -0.018046148, -0.10739738, -0.03725273, 0.15252748, 0.009014889, -0.12606093, 0.22403997, -0.22960377, -0.025909223, 0.008595189, -0.14442341, 0.039921023, -0.14653352 145 | -0.08572015, 0.044371825, 0.327782, 0.3974081, 0.35487962, -0.28861454, -0.15560696, -0.13577756, -0.074040994, -0.16706559, -0.328837, -0.11227213, 0.16882503, -0.31138194, 0.38684115, -0.31228963, 0.2430127, -0.20855688 146 | -0.27601314, -0.20938511, 0.3931263, 0.2943333, -0.052305013, -0.03143088, -0.13692985, -0.15525384, 0.21626326, -0.07185237, -0.11492421, 0.1322009, -0.2155554, -0.19173579, 0.0249958, -0.1416747, -0.04793392, -0.18604562 147 | 0.28288838, 0.18209723, 0.26340836, 0.3493075, 0.1915695, 0.37581044, 0.40781564, 0.34696648, 0.32402557, 0.31194755, 0.18225116, 0.17189573, 0.3933388, 0.30385956, 0.35858032, 0.3108575, 0.300764, 0.2506 148 | -0.382817, -0.18374428, 0.38255742, 0.45282742, -0.20796408, -0.0025186557, 0.08198544, 0.04727379, 0.41523337, 0.19696954, -0.0015031374, 0.29462555, -0.23056726, 0.123387165, -0.25888672, -0.059206795, -0.3061199, 0.110931575 149 | 0.21443708, 0.1869751, 0.41765693, 0.30410537, 0.4151222, -0.09234296, 0.07859708, 0.06450448, -0.11916922, 0.047718924, 0.044317167, -0.23081993, 0.17819552, 0.11728594, 0.341295, -0.06633468, 0.30064964, 0.15941162 150 | -0.03479978, -0.010921467, 0.50059754, 0.3741403, 0.1348892, 0.09275698, 0.20421727, 0.14200616, 0.29818055, 0.32638425, 0.17946592, 0.32211998, -0.007857371, 0.19102107, 0.11841282, 0.12658343, 0.19959268, 0.18648092 151 | 0.21765059, 0.01178824, 0.36069888, 0.35320824, 0.035400204, 0.21007244, 0.19968726, 0.26077956, 0.23665696, 0.29204193, 0.19175883, 0.30361548, 0.09878777, 0.30651003, 0.08114192, 0.2886404, 0.17110696, 0.21004215 152 | 0.3473561, 0.2557757, 0.38856345, 0.3902424, 0.2611889, -0.11002171, -0.09728151, 0.10500458, -0.3323849, -0.09368825, -0.018197594, -0.29412138, 0.30410486, -0.09045794, 0.3949691, -0.08486939, 0.40639305, -0.106681205 153 | -0.26066127, -0.25638652, 0.41127884, 0.26371327, -0.2791853, -0.14529906, -0.14340115, -0.0038261146, 0.11339081, 0.06846785, -0.0744312, 0.10822085, -0.17267747, -0.08914958, -0.13615468, -0.026279371, 0.05881749, -0.10339567 154 | 0.21547532, 0.228529, 0.17094868, 0.24857265, -0.10339684, 0.16663148, 0.24936825, 0.21914817, 0.2145864, 0.2602292, 0.19480035, 0.18686162, -0.020331256, 0.18141179, -0.27026135, 0.2833358, -0.14505988, 0.24549332 155 | 0.20711242, 0.10994803, 0.43733883, 0.33456922, -0.19285719, 0.24403574, 0.20732133, 0.1259116, 0.3956008, 0.3970526, 0.24266522, 0.3604809, -0.14737028, 0.07959356, 0.071348995, 0.11987728, -0.122589506, 0.14606102 156 | 0.15462193, 0.21762748, 0.43933287, 0.4373754, 0.33527282, 0.025526289, -0.071076386, -0.13811627, 0.34921652, 0.047230795, -0.13465236, 0.38997132, 0.15731357, -0.101007536, 0.3724703, -0.041916605, 0.25712264, -0.18253975 157 | 0.15073936, 0.23198025, 0.2709794, -0.058769085, -0.17309809, 0.25686562, 0.2001911, 0.2834695, 0.4080314, 0.21326107, 0.26453128, 0.22259046, -0.014799479, 0.35694963, -0.230547, 0.1628615, -0.23502539, 0.31569332 158 | 0.29095855, 0.19869766, 0.15287025, 0.3301932, 0.35499576, 0.14596812, 0.24309003, 0.09198208, 0.19785535, 0.19187868, 0.11717942, 0.130113, 0.3173508, 0.13276312, 0.35459062, 0.23732096, 0.25898236, 0.14870696 159 | -0.24388756, -0.33935338, 0.4314035, 0.29582542, -0.004696289, -0.2965215, -0.2345116, -0.13108563, 0.11187571, -0.07431427, -0.15052675, -0.027056072, -0.087024055, -0.15186213, 0.15790698, -0.17257854, 0.21151827, -0.15008046 160 | 0.006386515, -0.0023288378, 0.2686441, -0.056793388, -0.36475015, 0.35719103, 0.329284, 0.29043147, 0.40615568, 0.3198816, 0.32426262, 0.4728465, -0.23188284, 0.26525685, -0.39503676, 0.24099314, -0.2664799, 0.29244864 161 | 0.512771, 0.4337211, 0.4094182, 0.47219086, 0.46579334, -0.33246642, -0.2782624, -0.28092676, -0.5601132, -0.48507354, -0.39634255, -0.59577316, 0.4220579, -0.24186806, 0.4608998, -0.32178575, 0.55968326, -0.43493116 162 | 0.19959961, 0.28052065, -0.20391546, 0.059990842, 0.19360638, 0.32413545, 0.14653456, 0.12610376, 0.05317927, 0.15648054, 0.13177557, 0.047604714, 0.15118644, 0.30619168, 0.32676497, 0.21816495, 0.29668024, 0.1790219 163 | 0.040950753, -0.07346931, 0.59025335, 0.5599282, 0.043197248, 0.0028743697, -8.24326e-05, 0.13652329, 0.47291133, 0.2433921, 0.06840847, 0.54949695, -0.0135193765, -0.017399428, -0.004050851, 0.011169744, 0.06870031, 0.0726728 164 | 0.13149045, -0.0052844603, 0.41493216, 0.2658147, 0.15846312, -0.026193347, -0.032592345, -0.019546105, 0.05832547, -0.005246592, -0.12141591, 0.066549875, -0.07110818, -0.17764732, 0.27211156, -0.14741452, 0.2509818, 0.015081236 165 | 0.15363711, 0.17101458, 0.15697366, 0.07527533, 0.28762802, 0.22593778, 0.15009756, 0.13746163, 0.06107057, 0.23956862, 0.18548495, 0.19820932, 0.20256396, 0.27537823, 0.42928427, 0.2598913, 0.3029602, 0.15755773 166 | 0.20851246, 0.28222272, 0.26178476, 0.29885495, 0.26735696, 0.21550389, 0.13767396, 0.2189323, 0.24370651, 0.1501676, 0.16697673, 0.23398621, 0.34645483, 0.27281433, 0.21681039, 0.123401135, 0.30482805, 0.23288216 167 | 0.34641862, 0.3064444, 0.43586415, 0.2736842, 0.43912992, 0.25336218, 0.2304252, 0.14941064, -0.070904404, -0.024245791, 0.15425874, -0.17591555, 0.46288848, 0.18336059, 0.34018448, 0.22227702, 0.2812513, 0.19923069 168 | 0.2582267, 0.19490731, -0.34972954, -0.27069655, 0.072518684, 0.3070498, 0.18493578, 0.31518582, 0.20837489, 0.20459564, 0.21569702, 0.08323322, 0.2431243, 0.17122644, 0.010919361, 0.32511964, -0.011177466, 0.2806915 169 | 0.32439736, 0.33857834, 0.26366284, 0.16935576, 0.111912675, 0.23283428, 0.34374943, 0.27702138, 0.3516652, 0.3360937, 0.23950782, 0.32054666, 0.13773488, 0.35801348, -0.02820806, 0.2873979, -0.049552154, 0.18517366 170 | 0.4109215, 0.43865895, -0.088223256, 0.018873671, 0.25351545, 0.2778703, 0.28295776, 0.37700486, 0.25282264, 0.24768914, 0.29762375, 0.23918994, 0.39822602, 0.35147327, 0.26216167, 0.40271115, 0.2949649, 0.33106574 171 | 0.24961863, 0.29193637, 0.04856874, 0.24264602, 0.2845074, 0.09304854, 0.0658794, 0.016377069, -0.42218143, -0.32211483, 0.14472951, -0.2708264, 0.46036458, 0.07679588, 0.49328375, 0.08996834, 0.49378565, 0.084710084 172 | 0.37464648, 0.2344348, -0.3514848, -0.3814783, 0.14860943, 0.3247261, 0.40414578, 0.4308092, 0.2659137, 0.32145154, 0.4499286, 0.35306272, 0.35293236, 0.3697894, -0.27131644, 0.36589253, -0.35812014, 0.37609246 173 | 0.23630464, 0.17744112, -0.24443582, -0.24584985, 0.15815368, 0.2989411, 0.23133066, 0.19701718, 0.18256976, 0.23400627, 0.19764537, 0.3113117, 0.16120543, 0.30530608, 0.13085799, 0.23812667, 0.10123346, 0.30917704 174 | 0.15627794, 0.1250594, -0.13906828, -0.055084217, 0.2523301, 0.1269696, 0.22378258, 0.26074022, 0.13957235, 0.2376971, 0.18772085, 0.2600542, 0.22235742, 0.18322244, 0.15627566, 0.25906998, 0.13185392, 0.2550326 175 | 0.33992043, 0.45024362, 0.35050717, 0.36336324, 0.29757792, -0.036127493, 0.1904372, 0.292182, 0.16341479, 0.23234122, 0.27274212, 0.27304396, 0.3471404, 0.07247361, 0.44090858, 0.29018864, 0.42371795, 0.23698372 176 | 0.41730538, 0.3458746, -0.25867796, 0.14870024, 0.36815426, 0.23934998, 0.32715556, 0.18544373, -0.34899592, -0.07466126, 0.20003477, -0.26084128, 0.41178063, 0.27355734, 0.43557516, 0.20282175, 0.43428946, 0.17446157 177 | 0.23857509, 0.27696002, 0.18623321, 0.39298278, 0.3012908, 0.06846735, 0.07888331, 0.13335511, -0.18485342, 0.005016427, -0.006253706, -0.25667772, 0.27415666, -0.04595337, 0.35179842, 0.13435596, 0.44580287, 0.081194974 178 | 0.05742713, -0.058866467, 0.44156834, 0.37811577, -0.22751786, 0.008583196, -0.045633804, 0.039118487, 0.38977683, 0.14768729, 0.045879535, 0.35391244, -0.08838042, -0.071462676, 0.0725975, -0.09627475, 0.05745791, 0.049198743 179 | 0.36410144, 0.3421305, 0.1473758, 0.0933857, 0.27330786, 0.2071659, 0.3626963, 0.19419384, 0.15752284, 0.16615838, 0.2761021, 0.23452386, 0.27871096, 0.17871776, 0.1380271, 0.2739511, 0.017654225, 0.2267907 180 | 0.29794845, 0.40952182, -0.3613752, -0.27385974, 0.21933696, 0.42579424, 0.3250875, 0.26142573, 0.27798787, 0.23496105, 0.21950391, 0.34120843, 0.3583256, 0.3164535, 0.05434149, 0.40666562, -0.18546696, 0.34958956 181 | -0.118228465, -0.18927462, 0.53848857, 0.5095073, -0.12009334, 0.064844444, 0.054123342, -0.036216553, 0.35178053, 0.29538643, -0.02988646, 0.47989744, -0.20897941, 0.040643223, -0.07163122, -0.019499207, -0.18728232, -0.014044987 182 | 0.1094609, 0.08471232, 0.2276954, 0.38810685, 0.32122955, -0.113441214, -0.14395201, 0.027909053, 0.1883406, 0.15775476, -0.023429964, 0.031643115, 0.28554592, -0.09996638, 0.29949096, -0.004665111, 0.3235491, 0.061816607 183 | 0.124424964, 0.109877564, 0.37854534, 0.43021774, 0.33808714, -0.11291743, -0.18676423, -0.0424813, -0.0445537, -0.20163365, -0.14237045, -0.20804326, 0.07700643, -0.054053593, 0.36235315, -0.23873602, 0.39134598, -0.04847288 184 | 0.30254602, 0.21846947, -0.33155885, -0.3528918, -0.28905225, 0.29772237, 0.34907308, 0.25220427, 0.3689946, 0.22618127, 0.31043687, 0.2816992, 0.21143909, 0.34400162, -0.281702, 0.25289196, -0.40112972, 0.24497491 185 | 0.31195465, 0.3312487, -0.30120838, -0.502334, -0.18774748, 0.35797116, 0.3739536, 0.32721886, 0.2817965, 0.3058054, 0.31340563, 0.41204792, 0.40229464, 0.50808626, -0.2798187, 0.33258078, -0.3948458, 0.31025615 186 | 0.12839948, 0.1958947, 0.0028700063, -0.1368753, -0.26052377, 0.34851944, 0.29765752, 0.39251605, 0.3753485, 0.3715545, 0.2593941, 0.34962785, -0.007863275, 0.26772955, -0.30399385, 0.18567571, -0.24972008, 0.3935453 187 | -0.09280515, -0.12519714, 0.3119411, 0.28869665, 0.08395211, 0.0036706375, -0.12977709, -0.15632223, 0.09736328, -0.027388642, -0.09839988, 0.11252109, -0.034730334, -0.06478066, 0.08032203, -0.09216807, 0.07964252, -0.05926376 188 | 0.34206885, 0.33226272, -0.31716558, -0.14050996, 0.20357361, 0.34931836, 0.38621807, 0.30839068, 0.04589315, 0.25119475, 0.41260973, -0.086439945, 0.28510222, 0.35788462, 0.3035448, 0.38482434, 0.24331674, 0.24461654 189 | 0.25455368, 0.317319, 0.36375546, 0.39836943, 0.34007388, -0.1371074, -0.026922178, 0.058269873, -0.15962176, -0.1299214, -0.017525502, -0.21486835, 0.30794954, -0.039097093, 0.22744364, 0.12139493, 0.30160508, 0.083586864 190 | 0.32947326, 0.20193595, 0.21832617, 0.27469355, 0.19690076, 0.104604825, 0.043757252, 0.08856541, -0.08027017, -0.041019566, 0.11800662, -0.13891034, 0.18137118, 0.17100185, 0.28367308, 0.16382805, 0.13413411, 0.20654951 191 | -0.10483686, -0.058800675, 0.44976184, 0.39528072, 0.16820517, -0.12608783, -0.08559025, -0.07953272, -0.2744518, -0.17802736, -0.23354982, -0.33257082, -0.032457218, -0.03779347, 0.31872877, -0.19068542, 0.22303753, -0.14524236 192 | 0.049543384, 0.067002, 0.43541884, 0.36793432, 0.007248546, 0.18967502, 0.19067563, 0.2216402, 0.3167946, 0.15454881, 0.2626529, 0.3429306, 0.16212109, 0.15499546, 0.07955037, 0.2185099, 0.2335025, 0.2124301 193 | 0.31641293, 0.368701, -0.03810502, 0.17178924, 0.42086273, 0.2302517, 0.28966394, 0.38802156, 0.082659975, 0.12134331, 0.18790597, 0.081574984, 0.5092477, 0.33379695, 0.27919105, 0.23725347, 0.35294262, 0.23076463 194 | 0.1625363, 0.15014727, 0.32382628, 0.3098876, 0.076966085, 0.10856199, 0.04518157, 0.27961278, 0.16274548, 0.1662591, 0.06984624, 0.26576537, 0.06053364, 0.13812149, 0.17294031, 0.09853717, 0.15692484, 0.18387052 195 | 0.1447244, 0.23059398, 0.16799697, 0.08587844, 0.24290806, 0.15746905, 0.15410873, 0.05544845, -0.27468807, -0.10861726, 0.05795508, -0.11311673, 0.23697819, 0.101965435, 0.20946984, 0.14723401, 0.2264883, 0.17313363 196 | -0.07634605, -0.007617277, 0.4138176, 0.39046857, -0.20430003, 0.11037299, 0.11394612, 0.20230839, 0.5278899, 0.28125295, 0.13132073, 0.4958319, -0.21646996, 0.13735239, -0.22813879, 0.08798978, -0.13756393, 0.093467616 197 | -0.26585898, -0.34548265, 0.47951508, 0.5419562, -0.1475303, -0.070715755, -0.1850253, -0.04922864, 0.44802353, 0.46442822, -0.12960349, 0.5932088, -0.2334829, -0.15575364, -0.1542841, -0.11582084, -0.10007296, -0.1353492 198 | 0.104787074, -0.03787764, 0.3186271, 0.06412956, -0.3418959, 0.33767334, 0.19183594, 0.33904034, 0.49537542, 0.35879305, 0.24107824, 0.37739938, -0.263561, 0.2738881, -0.42532694, 0.31193677, -0.22633494, 0.21465907 199 | 0.3091256, 0.34399694, -0.1157791, 0.036072, 0.26134253, 0.22716461, 0.19976434, 0.036895867, -0.1524707, -0.088658154, 0.18211243, -0.15435575, 0.27435568, 0.0707224, 0.2811012, 0.07695423, 0.41819265, 0.04707946 200 | 0.121514946, 0.00011404735, 0.30231795, 0.19017437, -0.21972038, 0.23978807, 0.15104678, 0.18248712, 0.27296758, 0.44386616, 0.15575595, 0.35859847, 0.034502104, 0.21511188, -0.3148021, 0.15420838, -0.12627704, 0.28367373 201 | 0.070899725, -0.06975933, -0.06927744, -0.14178842, -0.51123273, 0.30741808, 0.29509822, 0.2951447, 0.48256266, 0.38205066, 0.16094036, 0.4368529, -0.23729275, 0.2785381, -0.29925147, 0.35049114, -0.38859764, 0.3677379 202 | 0.21197875, 0.24421544, 0.40780413, 0.5222693, 0.33605096, -0.10023116, -0.06743856, -0.12861122, 0.31710047, 0.1253999, -0.17077626, 0.21352951, 0.31418252, -0.073487654, 0.36608097, -0.16185667, 0.37546855, -0.06638673 203 | 0.23135288, 0.29176757, 0.31767488, 0.040539578, 0.11932876, 0.2456601, 0.35502702, 0.23471744, 0.42717898, 0.41643798, 0.36990163, 0.41213635, 0.18973145, 0.361915, -0.05850372, 0.2008092, 0.15904005, 0.3062378 204 | -0.17706084, -0.1714874, 0.43255237, 0.41216093, 0.14713533, -0.1084711, -0.19895235, -0.14098908, 0.13525845, 0.05329772, -0.12492766, 0.23791428, -0.1235512, -0.04953912, 0.15300812, -0.24438857, 0.15565123, -0.09692162 205 | 0.17245726, 0.20003662, 0.47463262, 0.3448086, 0.12518257, 0.18682465, 0.1839035, 0.14331664, 0.23520645, 0.17578273, 0.30935606, 0.34249696, 0.11329498, 0.23752825, 0.19505136, 0.16846702, 0.20586027, 0.2745272 206 | -0.33520108, -0.318177, 0.45386884, 0.501632, -0.53553534, -0.104333855, -0.015613244, -0.08291136, 0.49260774, 0.47088447, -0.18317163, 0.43635315, -0.5045271, -0.19617194, -0.4145729, -0.058223218, -0.31298798, -0.0744932 207 | -0.04790709, 0.0022715768, 0.400961, 0.3463138, 0.060180493, -0.15892811, -0.16654019, -0.07493609, -0.15902345, -0.18109109, -0.13331711, -0.07682634, -0.08670728, -0.17698526, 0.28286874, -0.10154704, 0.31406733, -0.19644152 208 | 0.009843712, -0.06883118, 0.40176198, 0.313933, 0.06600317, -0.08871818, -0.09903242, 0.033242255, 0.25799704, 0.22538017, -0.021592727, 0.32061997, -0.122101575, -0.11436896, 0.18307586, -0.17102596, 0.19175056, -0.068136394 209 | -0.27491587, -0.18856218, 0.37027818, 0.22893348, -0.2684281, 0.090232015, 0.15218212, 0.19780219, 0.28629592, 0.29925287, 0.2140538, 0.26196796, -0.3036195, 0.0653442, -0.3521672, 0.1092124, -0.38939714, 0.13202606 210 | 0.16966115, 0.22391386, 0.3258438, 0.36568654, 0.31898263, 0.19807121, 0.12577839, 0.030800119, 0.14515203, 0.12981273, 0.17531909, 0.088921055, 0.21530731, -0.0029367968, 0.24193084, 0.1628108, 0.18918778, 0.07310815 211 | -0.14507584, -0.0135904765, 0.3483617, 0.2811391, 0.17512329, -0.21607788, -0.14379925, -0.09868124, 0.14050007, -0.09135644, -0.10414174, -0.06798624, 0.098066404, -0.20754503, 0.2393195, -0.20132542, 0.28641453, -0.1523883 212 | 0.22139052, 0.11836153, 0.41917047, 0.42336938, 0.3358866, -0.08355997, -0.08349924, -0.25342894, -0.17738774, -0.142639, -0.16543859, -0.21759716, 0.2841019, -0.18356799, 0.25048122, -0.068510965, 0.31100193, -0.18202287 213 | 0.18399598, 0.1712209, 0.49808213, 0.40235734, 0.28448746, -0.40918848, -0.3083872, -0.27558738, -0.3572493, -0.257269, -0.2748457, -0.3160231, 0.25439164, -0.29534933, 0.39208966, -0.3456746, 0.40458453, -0.2990244 214 | -0.0005179719, -0.092348814, 0.4576908, 0.4415781, -0.029506125, -0.1970794, -0.19838175, -0.18987116, -0.01583069, -0.077396475, -0.23559782, -0.027917394, -0.062079385, -0.26672634, 0.09085878, -0.18413743, 0.303958, -0.11399267 215 | -0.20311452, -0.2396217, 0.5262924, 0.49618977, -0.3522957, -0.1348401, -0.2647668, -0.32184863, 0.32045484, 0.067028224, -0.19865341, 0.20083888, -0.32019913, -0.2568554, -0.3916563, -0.25551763, -0.20574628, -0.23431185 216 | -0.28761002, -0.3521551, 0.46783334, 0.37866157, -0.35454383, -0.17856814, -0.17204136, -0.2250623, 0.3501698, 0.14142707, -0.12970746, 0.35017145, -0.2761394, -0.14388962, -0.4296871, -0.23721291, -0.3916852, -0.18257183 217 | 0.20977962, 0.16707015, 0.5355119, 0.44399422, 0.04725039, 0.29014975, 0.3185721, 0.22674239, 0.47703546, 0.24635926, 0.15899004, 0.43081918, 0.20152669, 0.18757021, 0.15813349, 0.22790998, 0.03744035, 0.30033946 218 | 0.07444278, 0.09599193, 0.3861156, 0.3307156, 0.24000186, -0.27898315, -0.09659794, -0.11771571, -0.23490489, -0.18291722, -0.06516755, -0.20786531, 0.1941768, -0.08483925, 0.33576077, -0.15984958, 0.281784, -0.1492793 219 | 0.21681377, 0.32629758, 0.47061744, 0.32070127, 0.3945863, -0.064092904, 0.07271712, 0.09015077, -0.27402315, -0.0933827, -0.1378183, -0.31921428, 0.22154771, -0.07238039, 0.28746855, -0.014762627, 0.38177538, -0.15370288 220 | 0.42927936, 0.42234543, 0.319761, 0.30848822, 0.3259482, -0.22499438, -0.21668209, -0.1485767, -0.31571218, -0.22496824, -0.29862684, -0.26935837, 0.32259712, -0.10821637, 0.47874954, -0.1837502, 0.43211776, -0.28284925 221 | -0.14049804, -0.042386416, 0.45092204, 0.40103084, -0.3420713, 0.077702545, 0.10943975, -0.009022838, 0.3290655, 0.18849765, 0.027631063, 0.24933714, -0.08659515, -0.01541435, -0.23126845, 0.08581617, -0.31852633, -0.08993441 222 | -0.17589574, -0.16323853, 0.41038015, 0.5793206, -0.35846722, -0.2168931, -0.21421453, -0.20073219, 0.24176861, 0.05675966, -0.042153966, 0.4113348, -0.21973012, -0.12091476, -0.34462744, -0.18337303, -0.34030756, -0.27481145 223 | -0.001174286, 0.08455056, 0.29129538, 0.44900268, 0.018824464, 0.15317123, 0.12098576, 0.18361984, 0.11432575, 0.08866331, 0.15634757, 0.21386558, 0.12762243, 0.16727991, 0.1741395, 0.084171236, 0.18710326, 0.057350215 224 | 0.05584464, 0.14488089, 0.19020988, 0.08861327, -0.20813423, 0.31059632, 0.26750833, 0.31727096, 0.49354458, 0.39237645, 0.37161854, 0.45812252, -0.030259937, 0.33881393, -0.26548317, 0.39489552, -0.40999502, 0.21800527 225 | -0.14441282, -0.15553437, 0.36026025, 0.5027971, -0.25419277, -0.19611482, -0.1636145, -0.015539261, 0.39016375, 0.26701486, -0.09565326, 0.25867406, -0.18130498, 0.026401212, -0.2595124, -0.077680595, -0.17672986, -0.057489607 226 | 0.12534615, 0.12571295, 0.40997678, 0.41536242, 0.25379637, 0.074476644, 0.13700978, 0.120106675, 0.3606135, 0.23944244, 0.09743085, 0.35184613, 0.022320645, 0.136854, 0.2766121, 0.14713466, 0.24407814, 0.054372735 227 | -0.36007488, -0.23993078, 0.5348303, 0.35187498, -0.3816799, -0.15313154, -0.24235912, -0.14771713, 0.45843574, 0.2043766, -0.22839251, 0.34768283, -0.25423476, -0.23267533, -0.4377145, -0.14541133, -0.3818583, -0.10571339 228 | -0.10468787, -0.14958134, 0.4768551, 0.460711, 0.17731932, -0.31661165, -0.18890499, -0.1919787, 0.11691231, -0.14479461, -0.3446362, 0.016317844, 0.0026126616, -0.18148875, 0.15839255, -0.18619779, 0.2954249, -0.22369973 229 | 0.28554288, 0.36666918, 0.3331651, 0.24297516, 0.4612352, 0.12713806, -0.052452452, -0.010646426, -0.33526245, -0.26132286, 0.018861994, -0.33878645, 0.3210177, 0.07750233, 0.3255996, 0.16983426, 0.44037318, -0.04543892 230 | -0.17608482, -0.22555037, 0.30967468, 0.4389361, 0.11633694, -0.21515556, -0.19995528, -0.1387494, 0.054288235, -0.04944911, -0.21704917, -0.037948024, -0.1879301, -0.18825077, 0.25432014, -0.299579, 0.1035926, -0.15527645 231 | 0.11099659, 0.17246802, 0.48164782, 0.3570045, 0.36021838, -0.11294376, -0.2561994, -0.29118875, -0.26718938, -0.23537366, -0.1671835, -0.22406581, 0.24653164, -0.24994357, 0.25556773, -0.13856375, 0.43967924, -0.22460502 232 | 0.08781829, 0.2905638, 0.3227506, 0.3974746, 0.13197528, 0.24990466, 0.29181314, 0.4321103, 0.35225296, 0.3319819, 0.43295774, 0.18221715, 0.25501487, 0.38253826, 0.11249785, 0.25059345, 0.08392053, 0.2865632 233 | 0.29760996, 0.3177463, 0.39917007, 0.4065741, 0.2992868, -0.30454695, -0.2239584, -0.2113476, -0.14309065, -0.22640282, -0.21093732, -0.24586445, 0.29906493, -0.23779586, 0.45250356, -0.22509266, 0.4039852, -0.16057612 234 | 0.42633313, 0.29786462, 0.3939232, 0.44520488, 0.2779711, -0.07290474, 0.0071213692, 0.021583263, 0.26658154, 0.19155703, 0.026344502, 0.13197917, 0.3224987, 0.045902144, 0.3571685, -0.040044025, 0.28846467, 0.018579967 235 | 0.26483017, 0.1840791, 0.4718109, 0.38308448, 0.48755273, -0.27047196, -0.32046032, -0.1893394, 0.0598058, -0.1571035, -0.14772995, 0.048951983, 0.24057743, -0.26667923, 0.39674777, -0.30259964, 0.44807625, -0.17206305 236 | 0.3510827, 0.383736, 0.25820568, 0.37053663, 0.4016851, -0.31147915, -0.23538151, -0.3095967, -0.34501556, -0.2262992, -0.38095728, -0.34009126, 0.49610725, -0.25700206, 0.47345138, -0.2098936, 0.4860322, -0.31256065 237 | 0.33067027, 0.24438708, -0.27981988, -0.28001177, 0.17910731, 0.32601953, 0.258654, 0.23136102, 0.18601342, 0.3040094, 0.4000897, 0.12557116, 0.35656944, 0.3882682, 0.2476109, 0.20101385, 0.04274165, 0.37502632 238 | 0.38188002, 0.4090765, 0.31141225, 0.2806468, 0.4159955, -0.050061107, -0.19984372, -0.12388132, -0.21513644, -0.30507013, -0.175166, -0.24270216, 0.4015211, -0.102706365, 0.27758682, -0.12702295, 0.4667313, -0.17503029 239 | 0.40546256, 0.22154367, 0.15172604, 0.21694437, 0.3211977, 0.24548599, 0.22816612, 0.28184327, 0.03313014, 0.20475619, 0.29545146, 0.13422285, 0.19192575, 0.22879316, 0.2897066, 0.25580308, 0.26209205, 0.3246484 240 | 0.4573753, 0.38011938, 0.41395506, 0.31546286, 0.4732557, -0.30995986, -0.40221548, -0.4349189, -0.400279, -0.36223862, -0.2772947, -0.4164924, 0.45880115, -0.3758756, 0.36902627, -0.3994079, 0.5368176, -0.4112273 241 | 0.34648818, 0.38349703, 0.45285398, 0.34149167, 0.35345122, 0.1421008, 0.050839335, -0.0047570243, -0.004813944, 0.012200316, -0.0074293157, 0.014709001, 0.26776272, 0.04942426, 0.44127402, 0.1278302, 0.4250949, -0.013777312 242 | 0.07617774, 0.03347366, 0.33715576, 0.34811553, 0.38977814, -0.26912266, -0.19503358, -0.29868186, -0.12504844, -0.32504818, -0.19413152, -0.23280664, 0.24727216, -0.19684832, 0.39441168, -0.2673731, 0.41158047, -0.29508865 243 | 0.2296602, 0.214739, -0.14002521, -0.28746152, 0.13443728, 0.20792843, 0.1761376, 0.27225167, 0.08759623, 0.23205827, 0.1597271, 0.09901568, 0.10075226, 0.15717135, -0.103106, 0.13649778, -0.1077556, 0.13321331 244 | 0.27261108, 0.22955175, 0.42058784, 0.33218855, 0.2987917, -0.18622272, -0.15810293, -0.26447725, -0.30742034, -0.27729648, -0.18184645, -0.32380128, 0.24532485, -0.048380233, 0.22951435, -0.2969889, 0.40652695, -0.0891499 245 | 0.30760872, 0.33933806, 0.32623598, 0.48346376, 0.52190363, -0.19493262, -0.33335286, -0.27404836, -0.514422, -0.30586612, -0.3407141, -0.4128023, 0.35281193, -0.32353452, 0.4274333, -0.27338523, 0.5072691, -0.2741457 246 | -0.050244804, 0.10036141, 0.40536365, 0.42105457, 0.16559602, -0.034132432, -0.05612585, -0.045343965, 0.035614416, -0.13426179, -0.063002996, 0.04668373, 0.18690109, -0.21211022, 0.29014722, -0.16498487, 0.12044833, -0.16242228 247 | -0.22700728, -0.37593955, 0.3806383, 0.37588516, -0.38763306, -0.17353454, -0.11396494, -0.23234199, 0.21409841, -0.02318246, -0.18635687, 0.3218703, -0.2642578, -0.17891844, -0.3967685, -0.29665565, -0.23617761, -0.26375407 248 | -0.35615352, -0.3523098, 0.57376117, 0.45209894, -0.31447873, -0.19705108, -0.3212184, -0.40067294, 0.2945068, -0.13298465, -0.3384113, 0.21801111, -0.4259126, -0.24483697, -0.26194292, -0.3194764, -0.18624394, -0.23780869 249 | 0.31736675, 0.44906896, -0.17586711, 0.093249656, 0.34359837, 0.19655605, 0.17302701, 0.18670993, -0.06879964, 0.25056627, 0.16345055, 0.11464471, 0.40742776, 0.18560335, 0.26691723, 0.32499778, 0.2710888, 0.31111595 250 | -0.26625144, -0.12125861, 0.41424164, 0.29453465, -0.30922058, 0.18325636, 0.087997645, 0.21921743, 0.31515726, 0.2048269, 0.12749721, 0.3361457, -0.20252508, 0.061031885, -0.22733732, 0.22986737, -0.30245152, 0.17755044 251 | 0.287583, 0.35656273, 0.3959828, 0.25594267, 0.22102082, 0.18033855, 0.12256509, 0.23713766, 0.14019798, 0.15659922, 0.3053639, 0.23130377, 0.23019548, 0.25557008, 0.3419387, 0.14481874, 0.1837957, 0.25787312 252 | 0.2068582, 0.11330884, 0.48670766, 0.36481643, 0.47713622, -0.386818, -0.45262283, -0.37777868, -0.29569244, -0.4744225, -0.43735623, -0.3084751, 0.40469038, -0.44622463, 0.46053812, -0.29715586, 0.3614327, -0.29148346 253 | 0.08230357, 0.26153517, 0.4113524, 0.38824412, 0.09413541, 0.18523906, 0.15339084, 0.19892068, 0.29120755, 0.27356607, 0.18318215, 0.3562362, 0.11127397, 0.16258882, -0.064321846, 0.17368741, 0.12594838, 0.15021773 254 | -0.29577512, -0.15396221, 0.43160376, 0.44963908, 0.30027762, -0.35355356, -0.21765587, -0.22337975, -0.18435755, -0.31394425, -0.4034319, -0.12245057, -0.02268662, -0.29381981, 0.35637963, -0.22121203, 0.2220973, -0.23597479 255 | 0.12708844, 0.032340467, 0.3811262, 0.51031077, 0.4172129, -0.28402138, -0.19610566, -0.2522179, -0.047456115, -0.06933882, -0.32733127, -0.07051537, 0.23827814, -0.19708997, 0.46211052, -0.29819185, 0.32133117, -0.27975622 256 | 0.030948205, 0.03256651, 0.23858878, 0.3274099, 0.23808609, -0.21256834, -0.23270635, -0.2876077, -0.29808414, -0.25199154, -0.19885027, -0.24476692, 0.082407705, -0.16121951, 0.2616111, -0.16796643, 0.36108705, -0.3047772 257 | 0.004103665, 0.04436905, 0.45139596, 0.34235296, 0.21337211, -0.22256257, -0.065653235, -0.14051269, -0.21451129, -0.23291248, -0.070627734, -0.25196746, 0.12087039, -0.23617776, 0.37241012, -0.18910936, 0.37595174, -0.25387555 258 | -0.27305406, -0.15745787, 0.35800368, 0.38133764, -0.14457911, -0.092415184, -0.13419707, -0.18307915, 0.30941194, 0.22059512, -0.042453602, 0.34214455, -0.22115116, -0.13784534, -0.2473676, -0.18577002, -0.16528946, -0.10779435 259 | -0.07527654, -0.044341996, 0.29010874, 0.32539475, 0.022671139, -0.17119157, -0.10992067, -0.105809115, 0.047020916, -0.14021426, -0.25275725, 0.009240807, -0.31527445, -0.22459483, 0.04198984, -0.092307374, 0.08983377, -0.103904374 260 | -0.31683552, -0.25704283, 0.46653694, 0.5199843, -0.3862296, -0.05323357, -0.06740504, 0.0053144083, 0.4029008, 0.21331623, 0.06641378, 0.3064524, -0.22736706, -0.020624029, -0.29561514, -0.13350782, -0.33528188, 0.013312084 261 | -0.052927125, -0.1666151, 0.39956602, 0.42331183, -0.009025642, -0.032077163, 0.12698676, 0.09186682, 0.26835153, 0.29810837, -0.030460162, 0.29072553, -0.1794135, 0.049604572, 0.03912962, -0.10609246, 0.0114659285, 0.13417365 262 | 0.35016164, 0.43131664, 0.22398563, 0.31015512, 0.35042608, -0.12747972, -0.10112944, -0.08682547, -0.53991306, -0.3115385, -0.24413896, -0.34081542, 0.371279, -0.07089423, 0.4150717, 0.0024330413, 0.3833677, -0.05296976 263 | -0.13127267, 0.010617494, 0.51010615, 0.4363778, 0.015206847, -0.12124799, -0.064722836, -0.26237318, 0.2116397, -0.05144066, -0.11885031, 0.13179697, -0.07658069, -0.13922273, 0.107674606, -0.07284902, 0.17537653, -0.17271908 264 | -0.14040577, -0.23967929, 0.3385334, 0.32961133, -0.24104656, -0.05488424, 0.048587408, -0.05905993, 0.33968028, 0.20577647, -0.07077765, 0.20677872, -0.12798828, -0.11042263, -0.11139672, -0.0403267, -0.18102077, -0.013779881 265 | 0.30656675, 0.28029054, 0.3240761, 0.34115568, 0.27708763, -0.17975381, -0.32614955, -0.3816147, -0.42412397, -0.39586738, -0.28278548, -0.3554126, 0.3362367, -0.22987893, 0.33359233, -0.26859656, 0.29920492, -0.35834205 266 | 0.12177354, 0.16048793, 0.353942, 0.255185, 0.4089409, -0.2532051, -0.17095925, -0.23607863, -0.33306432, -0.35677844, -0.15279111, -0.19339947, 0.11490409, -0.22812775, 0.24318501, -0.13470395, 0.27150968, -0.08662033 267 | -0.17472771, -0.22785597, 0.31492737, 0.28447932, 0.14353509, -0.1889957, -0.16400339, -0.24524432, 0.028144669, -0.15951373, -0.27881026, 0.09085304, -0.09295272, -0.27901047, 0.17412692, -0.3206835, 0.35666135, -0.37264445 268 | 0.39908993, 0.2731859, -0.15131317, -0.32355303, 0.22735333, 0.47063458, 0.29750726, 0.26829204, 0.34924954, 0.2951732, 0.44361165, 0.32624513, 0.35933244, 0.30618486, 0.23789509, 0.3552847, 0.1726784, 0.45227656 269 | -0.13501422, -0.11809109, 0.4474665, 0.33378223, -0.19086713, -0.23128994, -0.27317035, -0.17766824, 0.3461728, 0.00027694835, -0.15301107, 0.31821188, -0.276029, -0.20530492, -0.23292753, -0.14952013, -0.3329581, -0.09517471 270 | -0.17362298, -0.18724783, 0.54289633, 0.39765608, 0.14569102, -0.29214007, -0.27244592, -0.43205833, -0.057900142, -0.28585467, -0.30456397, -0.078621745, -0.12878662, -0.2652695, 0.15397589, -0.37612414, 0.24236181, -0.39595738 271 | -0.26069218, -0.16046594, 0.38126782, 0.38318196, -0.28885418, 0.16138951, 0.05864334, 0.08928492, 0.41635957, 0.31063253, 0.08392644, 0.5552533, -0.31731632, 0.09035487, -0.29737723, 0.18720877, -0.37607378, 0.015705762 272 | -0.11611084, -0.060453378, 0.5155561, 0.5205746, -0.27935842, 0.012191718, -0.014600514, -0.047992755, 0.30708003, 0.34725317, 0.13069007, 0.39623934, -0.10024644, 0.072168075, -0.2933758, 0.025205562, -0.32039234, 0.10168129 273 | 0.32817313, 0.40791818, 0.44902983, 0.4346029, 0.45095715, -0.29848564, -0.33374134, -0.29778516, -0.4599564, -0.27480575, -0.4166078, -0.43347922, 0.3993706, -0.42956516, 0.38844958, -0.26872203, 0.5015769, -0.44805187 274 | 0.35890284, 0.41890806, -0.29623395, -0.1708233, 0.30929685, 0.27980715, 0.30075452, 0.28267795, 0.09837729, 0.17026949, 0.26850963, 0.12172234, 0.36040312, 0.4292722, 0.22300546, 0.35503635, 0.3212541, 0.23413044 275 | -0.06046002, -0.0056874217, 0.37148643, 0.42262164, 0.12071782, -0.06543764, -0.082338996, -0.054792646, -0.07252144, -0.18374394, -0.036370467, -0.18489745, -0.08369551, -0.015506179, 0.22810087, -0.1321046, 0.10306003, -0.08753641 276 | 0.06953091, 0.16875483, 0.48266125, 0.41417146, 0.33121285, -0.21517885, -0.016268075, -0.029489227, 0.047600836, 0.019681018, -0.21438916, 0.04815697, 0.11850285, -0.07017467, 0.3086666, -0.12772629, 0.3567728, -0.17850786 277 | 0.038697638, 0.13383831, 0.301637, 0.29683477, 0.32691854, -0.13613479, -0.06191482, -0.19494285, -0.26979148, -0.1792388, -0.10939098, -0.15985931, 0.21298839, -0.20132391, 0.22672778, -0.030276284, 0.32120293, -0.13498822 278 | 0.18767267, 0.1265686, 0.38235855, 0.31334457, 0.12471647, -0.014110618, 0.06633496, -0.04494974, 0.0021312716, 0.05744301, 0.04755151, -0.022134075, 0.18969424, -0.10588737, 0.21389617, 0.016214726, 0.12897684, 0.012390946 279 | 0.37326458, 0.18139, 0.38354093, 0.24037988, 0.36498666, -0.052898902, -0.17722537, -0.034214232, -0.30858523, -0.2245751, -0.09878819, -0.26622465, 0.25561622, -0.12007883, 0.3411238, -0.21288082, 0.30881456, -0.180303 280 | -0.07881487, -0.21912092, 0.41866973, 0.33146882, 0.0076415436, -0.0833398, -0.05528646, -0.13372488, 0.21475019, 0.25662908, -0.04823596, 0.24077448, 0.022799052, -0.08689813, 0.021272933, -0.12632273, 0.16189742, -0.11099132 281 | -0.29873317, -0.2821248, 0.41429433, 0.37951386, -0.38545296, -0.16885152, -0.16428412, -0.088875495, 0.27033928, 0.14025624, -0.06699535, 0.2675286, -0.1844706, -0.011322666, -0.16810353, -0.016050026, -0.11148473, -0.14901496 282 | 0.23239619, 0.2946559, -0.11884407, -0.29297245, 0.024346197, 0.19665591, 0.43099353, 0.42084622, 0.34671825, 0.21612194, 0.42641482, 0.33871615, 0.20399842, 0.35541147, -0.18442948, 0.35796177, 0.12071395, 0.3333371 283 | -0.30347124, -0.29280895, 0.41882583, 0.5078522, -0.19180052, -0.13070995, -0.1818682, -0.36174783, 0.30445358, -0.04358775, -0.2523945, 0.29269746, -0.16654947, -0.265145, -0.12603804, -0.31742352, -0.13668631, -0.3308158 284 | 0.23775595, 0.33771464, -0.11872028, 0.17418323, 0.39532268, 0.08062102, 0.11845708, 0.18865894, -0.23929325, -0.04808868, 0.22028698, -0.15960898, 0.42225102, 0.20364577, 0.5299239, 0.18473263, 0.53370017, 0.07373336 285 | 0.11542532, 0.17906092, 0.49223423, 0.49577883, 0.22301811, 0.041226, -0.15170684, -0.06567612, 0.3864557, 0.09482808, -0.13554068, 0.3263236, 0.12202352, -0.028994417, 0.22837354, 0.05047007, 0.32482624, -0.060306255 286 | 0.33607322, 0.31119934, -0.314749, -0.4743054, -0.33572516, 0.45334843, 0.42374048, 0.31673753, 0.38253543, 0.37756574, 0.3677491, 0.3029951, 0.2806521, 0.36552945, -0.495178, 0.36823022, -0.34227526, 0.29000723 287 | 0.24960768, 0.3176045, -0.42963377, -0.2547465, -0.1632174, 0.3142623, 0.37518594, 0.3581397, 0.30599618, 0.38808465, 0.37596995, 0.3123435, 0.3705211, 0.37879962, -0.37934503, 0.2847048, -0.2699927, 0.36892346 288 | 0.24299619, 0.37090343, -0.1814953, -0.31950346, -0.043817505, 0.34816405, 0.2912323, 0.3302645, 0.2452913, 0.24980402, 0.32260936, 0.3318515, 0.25325122, 0.29679188, -0.16176614, 0.26773375, -0.21993765, 0.41615972 289 | 0.11980272, 0.15203561, 0.50154996, 0.35064748, 0.25087035, 0.008048918, -0.12348579, -0.09569085, 0.12835118, 0.0077575142, -0.17015058, 0.18066542, 0.07421094, -0.14587177, 0.19002308, -0.1044455, 0.35600504, -0.25055018 290 | -0.32590932, -0.14526843, 0.4996314, 0.4093787, -0.06321327, -0.12396419, -0.12903237, -0.13476557, 0.3581894, 0.16854532, -0.1486274, 0.44615644, -0.12849678, -0.10392522, -0.12798142, -0.13417916, -0.25886014, -0.106752604 291 | 0.16243923, 0.21047571, 0.2619169, 0.34822896, 0.24364072, -0.06544281, -0.15311366, -0.103831604, -0.25603634, -0.19822976, -0.015714655, -0.28283173, 0.30377084, -0.055214718, 0.34955856, 0.11096514, 0.39707386, -0.029780244 292 | 0.28631952, 0.18199696, -0.24046993, -0.32237375, -0.2504548, 0.27980694, 0.24200442, 0.28651953, 0.30995166, 0.39383662, 0.24347275, 0.30122358, 0.2750196, 0.28326485, -0.29295972, 0.36564574, -0.2825683, 0.2675106 293 | 0.09591718, 0.23628968, -0.31394643, -0.30853793, -0.012227874, 0.20586047, 0.24986523, 0.36305767, 0.25538975, 0.23740153, 0.32423267, 0.3391172, 0.15766536, 0.38454387, -0.26293707, 0.30869815, -0.22278973, 0.4013387 294 | 0.38176778, 0.2492478, 0.4204495, 0.36303222, 0.42504442, -0.04190711, -0.018818505, 0.019030564, -0.17305036, 0.08421843, 0.14192213, -0.20128535, 0.4136976, 0.0256729, 0.35486358, 0.1227525, 0.33557808, 0.086988226 295 | 0.015756967, 0.18352053, 0.4999805, 0.541752, 0.2819697, -0.029214237, -0.22222888, -0.10911857, 0.030719995, 0.10756008, -0.10797579, -0.06644364, 0.16822843, -0.08922866, 0.29239956, -0.031800173, 0.39615065, -0.09189187 296 | 0.41743398, 0.38162488, 0.37615427, 0.23760599, 0.32435635, 0.093291685, 0.21744719, 0.022117307, -0.16662462, -0.18553908, 0.10172149, -0.17292534, 0.4035963, 0.24233498, 0.38261503, 0.2543303, 0.33373442, 0.10042296 297 | -0.037649862, 0.12851809, 0.44104317, 0.4646907, 0.3159476, -0.10599855, -0.15598184, -0.08233519, 0.22698338, 0.16003235, -0.04781547, 0.32925364, 0.15539439, -0.100959286, 0.3241949, -0.17897089, 0.3004915, -0.11826646 298 | 0.02345114, -0.15730464, 0.37951753, 0.46619225, 0.32886517, -0.1503841, -0.12649913, -0.21551378, 0.27152583, -0.120154314, -0.09356994, 0.22596273, -0.011758278, -0.11853868, 0.2797174, -0.1319981, 0.33859766, -0.13104899 299 | 0.21182737, 0.21109578, 0.07137325, -0.20232849, -0.12069776, 0.17669731, 0.1868957, 0.31223324, 0.26172182, 0.17608662, 0.1779763, 0.33315843, 0.079938434, 0.32543403, -0.25505078, 0.21367596, -0.1402333, 0.37798747 300 | 0.1239403, 0.16973203, -0.074997574, -0.21629979, -0.28971726, 0.3640402, 0.23947476, 0.25914434, 0.42778647, 0.27896056, 0.33129138, 0.354216, -0.020310685, 0.3667973, -0.30503836, 0.31933507, -0.21858627, 0.26006484 301 | -0.31937984, -0.3570719, 0.49166745, 0.45313272, -0.37075663, -0.1925416, -0.077281244, -0.14718732, 0.5017985, 0.17173117, -0.13784945, 0.49577138, -0.2536168, -0.12773365, -0.34388006, -0.24341612, -0.21496354, -0.1515281 302 | 0.25745976, 0.43007058, 0.3537463, 0.31241518, 0.40458354, -0.17364477, -0.08792649, -0.11143076, -0.08002014, -0.17694409, -0.1853397, -0.035191763, 0.33871847, -0.24946725, 0.31012395, -0.22792128, 0.41918883, -0.25854862 303 | 0.14495192, 0.10186761, 0.48107713, 0.4566588, 0.044771917, 0.024183413, -0.048607323, 0.0034579665, 0.40411368, 0.19088444, 0.01592394, 0.33443534, -0.06314032, -0.026318962, 0.20691694, 0.107334346, 0.21792361, -0.04509451 304 | 0.27513266, 0.24959007, 0.25592816, 0.32307917, 0.28557113, -0.109127544, -0.18014763, -0.102821484, -0.32622308, -0.19439851, -0.09558615, -0.29707932, 0.36470363, -0.070592925, 0.368901, -0.122088164, 0.4244986, -0.18151228 305 | 0.15462866, 0.21982014, 0.17422667, 0.33067018, 0.24678549, 0.1778882, 0.089193776, 0.22397693, 0.208859, 0.059175942, 0.07672524, 0.1491059, 0.22045399, 0.23839186, 0.31756136, 0.19720438, 0.37025073, 0.25763234 306 | 0.1634604, 0.20405236, -0.31032506, -0.26244077, -0.091714665, 0.29044428, 0.31337085, 0.33139583, 0.38651374, 0.34078908, 0.29394585, 0.22089909, 0.25400388, 0.24899566, -0.15457594, 0.35021776, -0.23962037, 0.4018098 307 | 0.41472873, 0.3678669, 0.32446212, 0.26794583, 0.30543762, -0.0003169974, 0.2077546, 0.09506974, -0.2268697, -0.10512354, 0.0884674, -0.32151413, 0.4600716, -0.004268566, 0.41063428, 0.23858824, 0.4239581, 0.10993957 308 | 0.36000213, 0.32792822, -0.3243484, -0.3145067, 0.33731705, 0.11728298, 0.24117339, 0.27328113, 0.10934132, 0.3070802, 0.37987685, -0.031474683, 0.44533795, 0.23758766, 0.22111914, 0.19644225, 0.25275674, 0.20365094 309 | 0.14735666, 0.073967904, 0.36087754, 0.38563192, 0.36868814, -0.11733347, -0.047062773, -0.09642832, 0.24578154, 0.15074073, 0.00989344, 0.26663736, 0.11560061, 0.044339288, 0.23393299, 0.029964937, 0.32697853, -0.041233696 310 | -0.113813825, -0.21518889, 0.37989765, 0.37176427, -0.11094251, -0.054912705, 0.151546, 0.07980799, 0.4294122, 0.26183084, 0.057605878, 0.46130413, -0.1212395, 0.027230421, -0.22839768, 0.042418752, -0.24274662, 0.115077786 311 | 0.1960963, 0.2538376, -0.07236657, -0.2406355, 0.11225368, 0.31844315, 0.2736437, 0.26759923, 0.15436037, 0.24504653, 0.16846605, 0.24086826, 0.123496145, 0.2934809, 0.10988632, 0.33264923, 0.11547306, 0.14103611 312 | 0.16124712, 0.18041465, -0.11117216, -0.26627824, 0.22863722, 0.21511365, 0.2523845, 0.18329711, 0.060447965, 0.21871987, 0.28547877, 0.14493395, 0.2604421, 0.30342418, 0.23754726, 0.3051422, 0.18193556, 0.3819364 313 | 0.26296228, 0.21957062, 0.12638032, 0.18094662, 0.23389691, 0.24403572, 0.14760987, 0.18233748, 0.04686566, 0.22991349, 0.19154821, 0.15361445, 0.28499725, 0.16115382, 0.26772377, 0.15688294, 0.39357683, 0.22353601 314 | 0.15000205, 0.0010116659, 0.059777897, -0.12063531, -0.16271459, 0.3504639, 0.2360241, 0.2765969, 0.30438295, 0.29821685, 0.3015402, 0.19954687, 0.033190075, 0.3284976, -0.29857346, 0.26651126, -0.19846389, 0.33250672 315 | -0.11251647, -0.12711732, 0.38859653, 0.43955866, 0.038420532, -0.14118768, -0.22898537, -0.18668714, 0.20278911, -0.11868343, -0.21047077, 0.17856681, -0.2001223, -0.3515397, -0.09897618, -0.32465345, 0.030794147, -0.2610868 316 | 0.00042364333, 0.112137035, 0.44452882, 0.27740693, 0.34460056, -0.036202803, -0.0019074781, -0.20000248, 0.12946057, -0.09214615, -0.15917967, 0.034299426, 0.20975566, -0.0039600027, 0.18480213, -0.09936647, 0.37071493, -0.052464243 317 | -0.030765235, -0.04810874, 0.3935045, 0.43848166, 0.37597036, -0.33939415, -0.30984962, -0.29170182, -0.42351127, -0.27795702, -0.28866085, -0.41480768, 0.1135586, -0.25403503, 0.403095, -0.33773798, 0.45985824, -0.29627144 318 | 0.359146, 0.20281048, -0.22846143, 0.06305738, 0.19181772, 0.19949555, 0.20445713, 0.15223776, -0.09753774, 0.1545375, 0.17932507, -0.0902793, 0.25787294, 0.18262222, 0.34358177, 0.32741192, 0.26925212, 0.2529739 319 | 0.25605622, 0.23723224, 0.3738198, 0.34435344, 0.36638784, -0.08340422, -0.069755085, -0.20814718, -0.03262812, -0.045882985, -0.15357383, 0.106587045, 0.14272133, -0.18575856, 0.21296552, -0.064722024, 0.3346667, -0.1482493 320 | -0.24886484, -0.18609199, 0.2986154, 0.3774361, -0.25432128, -0.023449492, 0.08207154, -0.1373787, 0.33908114, 0.17587356, 0.0040884158, 0.1554048, -0.27936018, 0.016072532, -0.31626585, -0.1310174, -0.150136, -0.053685147 321 | 0.12560652, 0.15503255, 0.34149143, 0.39233774, 0.398699, -0.108292736, -0.118401915, -0.23544489, -0.026755854, -0.04062638, -0.12026876, 0.06315053, 0.2210531, -0.20126928, 0.3623976, -0.29742378, 0.2889314, -0.18074861 322 | 0.30478376, 0.19716725, 0.07904167, -0.13310084, 0.007938962, -0.0732859, 0.27572033, 0.23945166, 0.41281623, 0.324974, 0.34507772, 0.28395447, 0.23852792, 0.34672707, 0.03963631, 0.15973367, 0.03761663, 0.24966738 323 | -0.2109922, -0.1842319, 0.3521558, 0.2791035, 0.09899199, -0.04284607, -0.14614944, -0.09386219, 0.12031015, -0.02083094, -0.1852549, 0.21326809, 0.068759784, -0.0783646, 0.041756433, -0.27979454, 0.01952833, -0.18210873 324 | 0.16470727, -0.018788554, 0.44087365, 0.41664296, 0.1348398, 0.25704783, 0.06509557, 0.2522639, 0.38365343, 0.43476054, 0.21567477, 0.39237526, 0.040643733, 0.11787203, -0.014523823, 0.07241617, -0.07732947, 0.24448568 325 | -0.2603583, -0.08869315, 0.37174124, 0.5065202, 0.16091803, -0.14591958, -0.18403037, -0.25490636, -0.04222208, -0.1807557, -0.27439898, 0.018906636, -0.082513414, -0.1813282, 0.24749663, -0.15161966, 0.32796344, -0.2532307 326 | 0.40554497, 0.42499632, 0.21470594, 0.21670283, 0.46956444, 0.0786604, -0.1325014, -0.18180603, -0.3463908, -0.10030471, -0.038908668, -0.33420992, 0.36651304, -0.113727525, 0.33347222, -0.021339158, 0.504111, -0.06286487 327 | -0.14765675, -0.084597245, 0.42171243, 0.2951011, -0.20925286, 0.1377741, 0.054231547, 0.2066622, 0.34753755, 0.37287876, 0.059955925, 0.30124208, -0.24609935, 0.21880874, -0.22972816, 0.13416955, -0.30594823, 0.08114019 328 | -0.26560083, -0.22668919, 0.37379363, 0.3830397, -0.26953217, 0.034454115, 0.062019784, 0.10387682, 0.45877478, 0.3910081, 0.008705093, 0.36266577, -0.35938346, -0.061083484, -0.27493718, -0.084538594, -0.4213607, -0.16336553 329 | 0.35615286, 0.47735515, 0.057691503, 0.37065265, 0.48962238, 0.025627408, 0.014504588, -0.011036991, -0.48710752, -0.40733585, 0.14234558, -0.33444098, 0.42022657, -0.061066296, 0.37268966, 0.17539729, 0.43363777, 0.01633635 330 | 0.3758345, 0.2614042, 0.44459516, 0.4887619, 0.43849188, -0.30121335, -0.19245535, -0.19067228, -0.2546784, -0.20513941, -0.2848507, -0.32559565, 0.48794726, -0.20429498, 0.37857735, -0.3408529, 0.34471548, -0.20125419 331 | 0.22216102, 0.17778261, 0.21077603, 0.302415, 0.18447995, -0.0029662747, 0.07838399, 0.14206797, 0.122273915, 0.05257969, 0.028287228, 0.08080072, 0.18214469, 0.11843208, 0.2501164, 0.14873262, 0.17869589, 0.10234682 332 | 0.4324338, 0.44615167, 0.25211942, 0.43312883, 0.45407167, -0.21373707, -0.078818806, -0.19924156, -0.35387436, -0.37382877, -0.083059914, -0.3359734, 0.35409072, -0.14787534, 0.48851946, -0.22551031, 0.38321957, -0.07792452 333 | 0.42735142, 0.33444336, 0.3431463, 0.33223435, 0.4121779, -0.25702602, -0.31538996, -0.3474758, -0.43449518, -0.2739319, -0.26819432, -0.33025584, 0.35868096, -0.29478413, 0.36562085, -0.34625998, 0.36389214, -0.37753582 334 | 0.07539209, 0.19008675, 0.09527958, 0.27174142, 0.16117603, 0.10280391, 0.20759982, 0.14685372, 0.11318209, 0.13786252, 0.09472257, 0.17624947, 0.20897461, 0.12733738, -0.004640264, 0.2853783, 0.025473988, 0.17937009 335 | 0.15533644, 0.26113632, 0.21350844, 0.18790759, 0.1374149, 0.3518838, 0.23242664, 0.3426809, 0.1751445, 0.19534968, 0.25550374, 0.15589607, 0.27893722, 0.22485256, 0.1730286, 0.3405007, 0.13575779, 0.2699516 336 | -0.325393, -0.22375911, 0.46304414, 0.35491452, -0.19862464, -0.1488823, -0.18889384, -0.16015446, 0.34893155, 0.18869953, -0.13327831, 0.22365004, -0.33953866, -0.15196256, -0.23821835, -0.2691102, -0.32756898, -0.17324302 337 | 0.005870132, 0.062263444, 0.37818608, 0.4487909, -0.002844036, -0.07924766, -0.08502647, -0.1490329, 0.25309256, -0.07058727, -0.047934715, 0.18485504, 0.08317243, -0.13148996, 0.20510252, -0.168898, 0.23579101, -0.24466123 338 | 0.35188654, 0.44050637, 0.46225607, 0.26835096, 0.47119632, -0.034464166, -0.081624486, -0.15122443, -0.3436463, -0.17172475, -0.057906806, -0.2865216, 0.4064867, -0.15721437, 0.3525555, 0.03309836, 0.30054623, -0.06002896 339 | -0.037641123, 0.098408885, 0.4418509, 0.46634808, 0.27269018, -0.15124507, -0.20950612, -0.30607012, 0.0815427, -0.29354942, -0.2933087, 0.11437449, 0.079366595, -0.16927542, 0.3757219, -0.15064779, 0.2999826, -0.35194722 340 | 0.31207982, 0.35091302, -0.04058019, 0.019060776, 0.18448362, 0.27163258, 0.25927088, 0.12482989, 0.10026312, 0.25365028, 0.174996, 0.026494656, 0.1913558, 0.24504927, 0.16817668, 0.14962244, 0.25981537, 0.21195622 341 | 0.30742273, 0.19942988, 0.040124185, 0.17856364, 0.31733483, 0.3256916, 0.24206495, 0.1481423, 0.17951931, 0.13423502, 0.28545997, 0.056336757, 0.36837193, 0.19142939, 0.37129214, 0.1575451, 0.36761576, 0.30032158 342 | 0.21710107, 0.29986158, -0.37044066, -0.4754663, 0.19887874, 0.28343245, 0.40586895, 0.33912748, 0.24994755, 0.36874574, 0.35030708, 0.3291737, 0.24877714, 0.36499318, 0.016072022, 0.20697111, -0.12226796, 0.29731053 343 | 0.30841807, 0.16284327, 0.32126462, 0.37566346, 0.24125633, 0.17464265, 0.20970687, 0.176944, 0.159824, 0.13853991, 0.13737637, 0.05739119, 0.30728677, 0.32476738, 0.28557906, 0.14453842, 0.22530238, 0.32016253 344 | -0.02129005, -0.078537084, 0.3950257, -0.0038633626, -0.37214038, 0.3258883, 0.28554094, 0.29708424, 0.39867908, 0.2558041, 0.21860664, 0.4598813, -0.24497761, 0.25169688, -0.39189836, 0.36249033, -0.26544198, 0.35617834 345 | 0.23123492, 0.14252414, 0.13811465, -0.06897685, -0.25826898, 0.3638352, 0.29077026, 0.21326879, 0.33262146, 0.4025197, 0.1978583, 0.3058569, 0.07755577, 0.18822722, -0.24762839, 0.28509554, -0.24363235, 0.2719866 346 | 0.21502483, 0.29289874, -0.36264423, -0.29997587, -0.2864068, 0.3155139, 0.43188673, 0.2689207, 0.32881606, 0.2231245, 0.34416807, 0.3458931, 0.33902603, 0.35406655, -0.4062798, 0.32207075, -0.3424208, 0.2758828 347 | 0.4118307, 0.48033482, 0.2921705, 0.39066958, 0.42001778, -0.31169686, -0.39638975, -0.4580406, -0.34638798, -0.44017503, -0.44316545, -0.41699585, 0.5631722, -0.46782604, 0.3646655, -0.27875346, 0.46010393, -0.40930033 348 | -0.25459033, -0.24418513, 0.46959975, 0.42079917, -0.08053426, -0.14731924, -0.17585999, -0.2944405, 0.368491, -0.03952971, -0.16714893, 0.27780363, -0.1252089, -0.089448765, 0.09746033, -0.22577065, 0.008045894, -0.2265041 349 | 0.20238541, 0.06464676, 0.27581176, 0.017853977, -0.31236598, 0.15371723, 0.15236232, 0.23178445, 0.42755866, 0.43347067, 0.36367893, 0.42115483, 0.043729085, 0.26491365, -0.2926648, 0.23323959, -0.2650761, 0.37896845 350 | 0.0983753, -0.0010188445, 0.08249543, -0.02789435, -0.014019951, 0.05774088, 0.05950639, 0.21957174, 0.19666113, 0.21032766, 0.081719756, 0.26258636, -0.018530138, 0.2223312, -0.07934934, 0.16016163, -0.0738483, 0.15663332 351 | 0.23438331, 0.12545691, 0.35420984, 0.3723574, 0.41734263, -0.033280194, -0.17547332, 0.010604145, 0.02563531, -0.14362851, -0.111108996, -0.034063157, 0.16557126, -0.11749286, 0.33117813, -0.12170512, 0.29636577, -0.0032336647 352 | 0.1177997, 0.12369398, 0.48170426, 0.3512037, 0.35437706, -0.19685014, -0.24156997, -0.389186, -0.046356183, -0.23677571, -0.3525684, -0.0857303, 0.048407182, -0.325062, 0.31737724, -0.18744922, 0.3151399, -0.18733452 353 | 0.34348845, 0.2880168, 0.19626796, -0.023419172, -0.016598852, 0.23364735, 0.45137978, 0.33230066, 0.3302767, 0.27988303, 0.26965943, 0.2719623, 0.3201051, 0.45522502, -0.01992686, 0.4637987, -0.023978254, 0.4251455 354 | 0.2904451, 0.36651203, -0.46874332, -0.22613093, 0.20342734, 0.34836698, 0.3062367, 0.39414397, 0.32180882, 0.3069678, 0.29923078, 0.28163406, 0.24423085, 0.42054647, -0.04962372, 0.33499086, -0.13931912, 0.27403066 355 | 0.03551675, -0.11550996, 0.41134396, 0.2682319, -0.01585463, 0.02637434, 0.04690845, 0.026731605, 0.26200455, 0.16391648, -0.00049774506, 0.26918778, -0.0008833939, 0.0624168, -0.019456485, 0.07594493, 0.12666354, -0.033989288 356 | -0.01884698, 0.0031411417, 0.40306696, 0.3710708, 0.20480587, -0.25969952, -0.20569164, -0.1428422, 0.112892896, -0.20147324, -0.16247512, 0.06864282, 0.04946492, -0.2161003, 0.18089437, -0.16808625, 0.25602466, -0.2591379 357 | 0.17836769, 0.15124832, 0.34878582, 0.14904188, -0.22554377, 0.1875409, 0.20512772, 0.19913578, 0.32306504, 0.26526642, 0.13462926, 0.2750969, 0.022108719, 0.18026341, -0.2970933, 0.24182561, -0.33674023, 0.1476519 358 | -0.22473927, -0.285635, 0.50423443, 0.4303561, -0.3995204, -0.05332564, -0.11679852, -0.15354232, 0.5221621, 0.2668571, -0.18029366, 0.5229908, -0.35927978, -0.119917005, -0.38804775, -0.18614985, -0.3318234, -0.2227294 359 | 0.1962014, 0.17801031, -0.015757376, -0.11576661, -0.13075547, 0.21101712, 0.17051357, 0.25766665, 0.2782141, 0.25581792, 0.3314299, 0.1596521, 0.12973008, 0.14919716, -0.16115908, 0.30581895, -0.18685643, 0.3154814 360 | 0.35739863, 0.3882716, 0.3338494, 0.43987563, 0.35525152, 0.1325622, 0.009138779, -0.16694269, -0.18475975, -0.22087857, 0.0034870412, -0.17207748, 0.25481015, -0.02264184, 0.3779467, 0.06267321, 0.44277367, -0.122722596 361 | -0.30557814, -0.23060548, 0.51522183, 0.4223084, -0.17192824, -0.41889006, -0.37978986, -0.2686884, 0.23163413, -0.15650235, -0.43840554, 0.19295028, -0.31818122, -0.39162895, -0.2271488, -0.33972058, -0.32715836, -0.31309542 362 | 0.13802795, 0.23106985, 0.3100651, 0.438132, 0.31537727, 0.0049682874, -0.062922254, -0.059317928, 0.0461243, 0.054260325, -0.056822855, -0.027293807, 0.27769256, -0.06993146, 0.33642617, -0.10369483, 0.27242464, -0.02903364 363 | -0.0067476397, -0.032745052, 0.28786802, 0.39725775, -0.039818686, 0.005343594, 0.034367416, 0.13081804, 0.19642428, 0.017045863, -0.04415435, 0.17987652, -0.062413722, 0.0095344065, 0.042963143, 0.0877864, 0.16001923, -0.0136028705 364 | 0.39684227, 0.36176378, 0.28785422, 0.2609337, 0.36871693, -0.026052484, 0.048755843, -0.1786172, -0.30160242, -0.1658796, -0.13089551, -0.34962326, 0.28408477, -0.079649635, 0.41033262, -0.027415257, 0.46343768, -0.047024995 365 | 0.22994098, 0.37493384, 0.422851, 0.26183128, 0.2588474, 0.097262315, -0.032934625, -0.005234292, -0.26190808, -0.18494093, 0.043472268, -0.27112332, 0.3195732, -0.020364812, 0.3681304, 0.004212122, 0.3623982, 0.083008856 366 | 0.2907082, 0.1656012, 0.3164997, 0.1842691, 0.04195749, 0.23372178, 0.30786988, 0.2146526, 0.3331777, 0.2913363, 0.36909616, 0.1978313, 0.15331158, 0.18379855, -0.058014564, 0.33624786, -0.048085112, 0.3094938 367 | 0.066059366, 0.03200753, 0.47011387, 0.35723487, 0.13312496, -0.22375242, -0.23237003, -0.26314434, 0.0006782204, -0.27224383, -0.23799531, -0.027016439, 0.12484705, -0.18477045, 0.2755443, -0.11962006, 0.25734878, -0.1998765 368 | 0.26726148, 0.2769531, -0.27774754, -0.24188156, 0.28135526, 0.2765107, 0.18517621, 0.39517266, 0.013440462, 0.27481252, 0.31352118, 0.048793234, 0.44920477, 0.39248684, 0.32453054, 0.22268979, 0.31695047, 0.22844392 369 | 0.15311745, 0.30935594, -0.06603601, -0.24408239, 0.22578612, 0.18302502, 0.19073124, 0.30420637, 0.14297919, 0.33776236, 0.31138715, 0.13190132, 0.22153163, 0.19583417, 0.18721361, 0.22160077, -0.027702188, 0.3487857 370 | 0.13302714, 0.16321193, 0.20383434, 0.25758117, 0.43407312, -0.15688547, -0.09855583, -0.29005495, -0.15615276, -0.28916273, -0.20823523, -0.13554552, 0.19262806, -0.2612648, 0.23644926, -0.20356989, 0.28907165, -0.1426142 371 | 0.45871794, 0.38923723, -0.10615231, 0.19383284, 0.2667065, 0.22412327, 0.10043756, 0.22089916, -0.36523533, -0.19761258, 0.15025972, -0.3203077, 0.5061147, 0.173758, 0.35228118, 0.24847968, 0.3587102, 0.32680374 372 | 0.24323554, 0.11745272, 0.18359554, -0.084495015, -0.3879747, 0.39227465, 0.20438156, 0.3757069, 0.34849355, 0.31622797, 0.36463606, 0.2955828, 0.13906652, 0.29074156, -0.30184102, 0.35666752, -0.3862638, 0.32768753 373 | 0.30730033, 0.36289278, 0.29517975, 0.22335424, 0.14129674, 0.035064097, 0.11767578, 0.12994806, 0.20840877, 0.19791207, 0.03735467, 0.2662046, 0.14737326, 0.099439576, 0.13618945, 0.27319962, 0.15350525, 0.06394358 374 | 0.24885294, 0.24945042, -0.33768716, -0.42969713, 0.2136756, 0.4019337, 0.26524305, 0.41572568, 0.16839682, 0.37231117, 0.38673145, 0.1622516, 0.32847238, 0.3694269, 0.100521825, 0.22008173, -0.12776287, 0.3785785 375 | 0.26629147, 0.2189995, 0.3236717, 0.24552684, 0.2678918, 0.055346537, 0.12982965, -0.026841514, -0.27875602, -0.15759134, 0.109336086, -0.20498818, 0.36247426, -0.036837522, 0.35142547, 0.010982395, 0.42846054, 0.03142402 376 | 0.2732785, 0.19746108, -0.18494482, -0.11436718, 0.40222767, 0.21854655, 0.07116003, 0.1950841, -0.21331502, -0.053508483, 0.21455374, -0.03250298, 0.28413653, 0.0470517, 0.33683762, 0.23412266, 0.25309524, 0.115841664 377 | 0.1403838, 0.08350964, 0.2328094, 0.38117167, 0.17354128, -0.08493782, -0.08653084, -0.0051484974, -0.07305779, -0.028780883, 0.033950526, -0.22151627, 0.11010565, 0.005039897, 0.17732035, -0.17732257, 0.24107346, 0.051711287 378 | -0.009145985, 0.10449615, 0.44029707, 0.45993352, 0.29089954, -0.1316651, -0.09890557, -0.09842144, 0.23567165, 0.12114453, -0.15873255, 0.23902333, 0.1286391, -0.20594488, 0.36023375, 0.038096786, 0.23590764, -0.030789493 379 | 0.24930085, 0.13822038, 0.4576981, 0.44679767, 0.2920523, 0.15284213, 0.29625836, 0.20199966, 0.28943664, 0.3191416, 0.15807804, 0.4195009, 0.15556648, 0.16413486, 0.33906728, 0.122069575, 0.32200125, 0.13836107 380 | -0.46201313, -0.37674704, 0.55673224, 0.5034267, -0.29803792, -0.19902696, -0.28483802, -0.34997398, 0.46387982, 0.3890817, -0.2492271, 0.55396783, -0.32572642, -0.22120732, -0.27970368, -0.40156567, -0.28616127, -0.31046584 381 | 0.103128135, 0.11553147, 0.39295068, 0.49545985, 0.38173845, -0.18324012, -0.35218042, -0.36491376, -0.15285173, -0.2243256, -0.21627443, -0.1768809, 0.14254233, -0.21330398, 0.41935045, -0.27527294, 0.46540835, -0.3484314 382 | 0.12220898, 0.17998195, 0.35734552, 0.25153193, 0.34641674, -0.14263442, 0.010423873, 0.032359786, 0.1121118, 0.002007286, 0.0020349456, 0.043366853, 0.08902693, -0.07173077, 0.2972331, -0.10737068, 0.3056942, -0.110037304 383 | 0.25436664, 0.27703118, 0.54054576, 0.4672475, 0.40472484, -0.17889236, -0.20362772, -0.13727139, -0.13372365, -0.23975573, -0.2593834, -0.22859493, 0.33492878, -0.14969897, 0.3373182, -0.17392395, 0.37439477, -0.11488861 384 | 0.21340357, 0.19432837, 0.34375736, 0.43022853, 0.31007767, 0.03208966, -0.037764493, -0.1006018, -0.021824714, -0.009697699, 0.051620714, -0.14093126, 0.2120977, 0.046209995, 0.36014947, -0.045988113, 0.36030337, 0.022133866 385 | 0.059304047, 0.11972267, -0.027102886, -0.30934814, -0.21486548, 0.21002875, 0.32113093, 0.35607865, 0.28797573, 0.2833205, 0.21874917, 0.36575925, 0.059593055, 0.2528358, -0.22013451, 0.34777492, -0.24948661, 0.25571838 386 | 0.07317423, 0.009495084, 0.41891298, 0.29909968, 0.22283188, -0.23702644, -0.13036036, -0.060849905, -0.12774986, -0.27268627, -0.22140367, -0.07475085, 0.1205374, -0.109486446, 0.271492, -0.25775826, 0.36879826, -0.12418175 387 | -0.13085294, -0.17604253, 0.41900617, 0.5877243, 0.2439724, -0.31609112, -0.14128007, -0.21307, 0.39628014, 0.02774345, -0.19998252, 0.38662115, -0.16703075, -0.11286314, 0.24418277, -0.19055063, 0.36036146, -0.1251591 388 | 0.20871904, 0.24019545, 0.39887252, 0.55148894, 0.34777474, -0.29283085, -0.4293939, -0.38949186, -0.45190793, -0.36088297, -0.3601627, -0.43579802, 0.26239645, -0.42259625, 0.46471718, -0.43271124, 0.3675826, -0.36714002 389 | 0.1662299, 0.34823674, 0.14788753, 0.26441726, 0.3306873, 0.20696007, 0.19712707, 0.06513628, -0.059874147, 0.04521074, 0.2285858, -0.07078383, 0.23162253, 0.19444323, 0.28175202, 0.16055031, 0.28915492, 0.20393537 390 | 0.24085121, 0.2838138, -0.19519314, -0.23796195, 0.04699372, 0.20312926, 0.3841183, 0.24238311, 0.14451385, 0.26479858, 0.2844928, 0.33505616, 0.30899566, 0.36934528, -0.0910206, 0.30821097, -0.053322893, 0.22984046 391 | 0.4528849, 0.3702224, -0.5367613, -0.37780583, 0.16147368, 0.13623735, 0.49270567, 0.41906366, 0.23794875, 0.41115975, 0.40352413, 0.20375378, 0.27748045, 0.532774, 0.0703901, 0.56609976, 0.1539765, 0.49670017 392 | 0.1893651, 0.23651129, 0.30431694, 0.23575693, 0.33013865, -0.082174756, 0.039174523, 0.039977923, -0.07935293, -0.033892907, 0.063574135, -0.1389226, 0.16445509, 0.06613858, 0.33909848, 0.06523388, 0.26544628, 0.015222999 393 | 0.30165002, 0.31637192, -0.16689976, -0.21417846, 0.351416, 0.33086383, 0.33240855, 0.28678894, 0.2206078, 0.1957529, 0.17555735, 0.094581194, 0.23058969, 0.22391118, 0.2841657, 0.32952535, 0.096987404, 0.22203115 394 | -0.16772863, -0.1079227, 0.38477698, 0.37941495, -0.09975111, -0.1467591, -0.2219679, -0.1680572, 0.32799563, -0.034239072, -0.28844494, 0.19964994, -0.08224887, -0.27642712, -0.009247063, -0.23020737, -0.009838156, -0.24303357 395 | 0.18962812, 0.25690404, 0.22194189, 0.41455695, 0.3327004, 0.06509988, 0.020850848, 0.20107034, 0.077847995, 0.019615686, 0.027312389, 0.013677682, 0.28339285, 0.17674722, 0.2266758, 0.027206212, 0.24505825, 0.058734156 396 | -0.30898157, -0.31434324, 0.47217184, 0.45310488, -0.30179912, -0.043841116, -0.20130101, -0.20611833, 0.510488, 0.3402195, -0.09920521, 0.5684026, -0.32826492, -0.24233127, -0.2066361, -0.26744762, -0.2429889, -0.23624912 397 | -0.06743275, 0.031077532, 0.33915618, 0.33804756, 0.2821108, -0.13946854, -0.09177016, -0.20230122, -0.1865998, -0.195627, -0.13162042, -0.20269188, 0.10202499, -0.067343205, 0.27598456, -0.12209774, 0.273572, -0.089537844 398 | -0.39240438, -0.35563058, 0.4100533, 0.43325078, -0.3495524, -0.07003896, -0.24508399, -0.13223493, 0.46724305, 0.30471566, -0.1898505, 0.36661667, -0.34438875, -0.18242463, -0.2854667, -0.2963861, -0.40011793, -0.26278937 399 | 0.32345325, 0.24821156, 0.3416526, 0.48530003, 0.3987455, 0.05679843, -0.0020141539, -0.03692673, -0.05953487, -0.043503325, 0.040499687, -0.10054144, 0.21153668, 0.016214103, 0.41384268, -0.052253075, 0.36228827, -0.08921813 400 | -0.33402532, -0.2025154, 0.5413305, 0.35079455, -0.27058047, -0.030389458, -0.07655726, 0.011182787, 0.4085171, 0.30834672, -0.07275599, 0.30885592, -0.19385897, -0.054016955, -0.19758692, 0.02093412, -0.31918594, -0.10225472 401 | -0.27108046, -0.26872948, 0.35109377, 0.3015988, -0.3065812, -0.09925191, -0.020938396, -0.08374101, 0.3842273, 0.1361013, -0.09349789, 0.33736002, -0.23334889, -0.07550021, -0.21565178, -0.2545927, -0.29632714, -0.21512058 402 | -0.15394256, -0.2907581, 0.38057506, 0.4272801, -0.26240367, 0.027990323, 0.15212686, 0.12387474, 0.53552294, 0.28888994, 0.24900058, 0.45742455, -0.326409, 0.11889931, -0.22715245, 0.1891549, -0.3009698, 0.22100578 403 | 0.12735839, 0.09736842, 0.43660432, 0.29218632, 0.22124201, -0.028179614, -0.09758597, -0.02401688, -0.22558555, -0.13599074, -0.13141704, -0.24863996, 0.0811223, -0.09690782, 0.35307965, -0.13117081, 0.2263749, -0.04599967 404 | 0.11913264, 0.0825305, 0.32436374, 0.38583246, 0.26155433, 0.022130236, -0.118367516, -0.020312145, -0.17476425, -0.21039796, -0.0618504, -0.0969119, 0.20561916, -0.023821067, 0.30878684, -0.18544826, 0.31393394, -0.062996976 405 | 0.2720373, 0.3296104, 0.28480732, 0.45099556, 0.39205882, -0.15844654, -0.18709461, -0.19986935, -0.33455208, -0.25849026, -0.25047964, -0.3403461, 0.24613017, -0.090912044, 0.43866527, -0.12688296, 0.284833, -0.13812114 406 | 0.30601016, 0.30518892, 0.31685007, 0.3427045, 0.4555841, -0.14203273, -0.2318906, -0.34037554, -0.28164726, -0.48724777, -0.20439106, -0.3084268, 0.42106417, -0.23319356, 0.40681362, -0.17339502, 0.3213747, -0.18227142 407 | -0.23941599, -0.18574852, 0.43409142, 0.34016448, -0.23001966, -0.119713575, -0.27806228, -0.19749983, 0.20864296, 0.13721274, -0.23160015, 0.12009153, -0.16807888, -0.11793972, -0.00390638, -0.29581892, 0.1262238, -0.27145502 408 | -0.13823868, -0.16015355, 0.40583083, 0.44486767, -0.14469154, 0.018573187, 0.13407099, 0.18732055, 0.33177072, 0.20156984, 0.063163854, 0.45984182, -0.108547956, 0.11044018, -0.16595721, 0.19439054, -0.26208195, 0.061114084 409 | 0.29967505, 0.2538364, 0.13825083, 0.38436368, 0.43549842, -0.08323567, -0.10891747, -0.091791816, -0.440927, -0.3882438, -0.13509764, -0.41151577, 0.31130698, -0.1307855, 0.4507376, -0.20574525, 0.33202466, -0.0914736 410 | 0.29333544, 0.3128951, -0.32487583, -0.38630605, 0.107871614, 0.28368363, 0.24356358, 0.41072237, 0.12630935, 0.17853206, 0.36647558, 0.093876556, 0.34972915, 0.24018914, 0.043880522, 0.34876066, 0.010384544, 0.28801915 411 | 0.2877216, 0.18680024, -0.039196577, 0.014325031, 0.28872952, 0.20635855, 0.3069176, 0.16793543, 0.21569508, 0.12902975, 0.11734097, 0.20125477, 0.24008118, 0.089480914, 0.20886089, 0.14912611, 0.104394175, 0.23826264 412 | 0.36817762, 0.27534616, 0.21917444, 0.3496678, 0.4255271, -0.01803777, -0.108365126, -0.029476177, -0.3281488, -0.36611927, -0.09032019, -0.3235855, 0.4475423, 0.019735068, 0.4342751, 0.06900563, 0.52523667, 0.059624 413 | 0.13794059, 0.11841479, 0.3263897, 0.29438716, 0.059647165, 0.08707236, 0.25871912, 0.1905203, 0.39185372, 0.15784164, 0.28154624, 0.43602133, 0.18514654, 0.25218213, 0.06519305, 0.27663767, 0.04205542, 0.22823232 414 | -0.3699183, -0.20841321, 0.4077671, 0.45128635, -0.2931366, -0.2455824, -0.33387038, -0.3523841, 0.2975667, 0.22191827, -0.27813083, 0.35504952, -0.20020565, -0.29247355, -0.394374, -0.29831254, -0.36875322, -0.3376466 415 | 0.23810273, 0.34598386, 0.30872595, 0.3102744, 0.3445799, 0.17031237, 0.23719425, 0.11124285, -0.29820788, -0.14441043, 0.2388974, -0.2719715, 0.29694295, 0.1556735, 0.42844936, 0.21088225, 0.37290353, 0.09112346 416 | -0.18256721, -0.34472197, 0.53298414, 0.37851214, -0.3864251, -0.002294091, 0.022654634, 0.08512115, 0.49243134, 0.42815834, -0.05914515, 0.59807444, -0.31792995, 0.034119327, -0.40999693, -0.13951547, -0.39414728, -0.09268155 417 | 0.33531675, 0.27007198, 0.5204746, 0.50392526, 0.34068733, -0.30949983, -0.26051858, -0.28860745, -0.41419208, -0.18791856, -0.28203455, -0.28882933, 0.41089085, -0.23034415, 0.395519, -0.2645231, 0.51636267, -0.21550661 418 | -0.08497666, -0.28505456, 0.35469303, 0.23976402, -0.10361807, -0.13607515, 0.04821927, 0.042593077, 0.23305802, 0.107380964, -0.09950086, 0.22484554, -0.17949179, 0.038045123, 0.04280563, -0.10423103, -0.021472761, -0.08916361 419 | 0.3794646, 0.35361308, 0.39077333, 0.4382456, 0.5175495, -0.30699942, -0.28221664, -0.31929064, -0.3705993, -0.3168691, -0.11184454, -0.42396894, 0.477163, -0.23415236, 0.48274818, -0.2500441, 0.4134672, -0.27923664 420 | 0.1360472, 0.042306803, 0.35128108, 0.33179379, 0.33842632, -0.00025578355, -0.17539705, -0.06149854, -0.1252663, -0.21967396, -0.18834476, -0.15547033, 0.17983568, -0.16989318, 0.36360437, -0.07194296, 0.20278573, -0.18491419 421 | 0.29379278, 0.32373038, -0.16744442, 0.12635787, 0.34248173, 0.10007273, 0.2684447, 0.16902909, -0.21092077, 0.07423133, 0.26800656, -0.1481379, 0.25253382, 0.16765116, 0.40419325, 0.1589993, 0.23978916, 0.25331157 422 | 0.32221496, 0.44233763, -0.3051958, -0.35993284, 0.2307644, 0.4111416, 0.37799868, 0.35821986, 0.3034301, 0.27666077, 0.37623116, 0.21840584, 0.41482103, 0.37430078, -0.13714764, 0.4291246, -0.1220592, 0.3145533 423 | 0.4870428, 0.36292353, 0.19747648, 0.25066957, 0.4232307, -0.14896998, -0.14088358, -0.09329706, -0.25448734, -0.23592196, -0.031063909, -0.2815423, 0.39840287, -0.043837015, 0.5049637, -0.09738959, 0.38212013, -0.17713745 424 | -0.29879475, -0.39183944, 0.5459434, 0.6028946, -0.23777443, -0.050758295, -0.14419216, -0.05779532, 0.49118993, 0.30930683, -0.1852625, 0.42237738, -0.37456378, -0.11010694, -0.4094363, -0.2019332, -0.43593663, -0.08338781 425 | 0.29515865, 0.22916351, -0.18649767, -0.19856723, 0.2584016, 0.28514874, 0.12753443, 0.17723809, 0.1455009, 0.13669251, 0.24522278, 0.19812796, 0.2904023, 0.3091053, 0.12048847, 0.2555529, -0.026470577, 0.3251234 426 | 0.022311125, -0.008460289, 0.3334259, 0.4264568, -0.08695903, 0.09195717, 0.19109006, 0.26510733, 0.48938686, 0.3956952, 0.24309435, 0.48372874, 0.061745286, 0.06962833, -0.21267767, 0.14620967, -0.16467068, 0.079345986 427 | -0.09781582, -0.16726057, 0.28080642, 0.30565175, 0.073482946, 0.07014934, -0.11527224, -0.1622859, 0.09019034, 0.014470692, -0.17878442, 0.027977671, -0.20285699, -0.19573519, -0.013549894, -0.1698246, 0.14698948, -0.116069935 428 | 0.040491305, 0.04649758, 0.35213044, 0.42953497, 0.22808273, -0.13802262, -0.15269859, -0.16019705, 0.062007386, -0.14104962, -0.21561955, 0.033497225, 0.05868016, -0.13918647, 0.2215888, -0.27815786, 0.34100625, -0.13652919 429 | 0.15905999, 0.23181516, -0.108438306, -6.8243564e-05, 0.12822111, 0.13753618, 0.29210708, 0.3443582, 0.12108172, 0.26848498, 0.27837184, -0.053265534, 0.16545816, 0.27107126, 0.31867355, 0.17084928, 0.27334636, 0.22977346 430 | 0.134863, 0.030828163, 0.46749914, 0.41209087, 0.18571283, 0.17486578, 0.022448074, -0.0073991036, 0.38780424, 0.25579032, 0.080019906, 0.42427364, 0.12657464, 0.101831764, 0.12531778, 0.14746714, 0.08065193, 0.15285477 431 | -0.196669, -0.37669072, 0.48073268, 0.39979804, -0.3669561, -0.30929497, -0.19965865, -0.22636956, 0.3198691, 0.110833116, -0.16282001, 0.39190266, -0.19861996, -0.2404777, -0.19678669, -0.3334718, -0.11115342, -0.18279977 432 | 0.07377922, 0.13257995, 0.3872511, 0.46363708, 0.28802523, 0.09679222, -0.05267868, -0.19629315, 0.20153089, 0.07528764, 0.06152333, 0.22077572, 0.19669081, 0.0072325696, 0.17954113, 0.053436164, 0.20862456, -0.19305259 433 | 0.13779016, 0.005980273, -0.1248558, -0.20551778, -0.104313046, 0.13933012, 0.32907212, 0.21382724, 0.29266632, 0.3564037, 0.30793184, 0.25408417, -0.044665307, 0.14849252, -0.29666936, 0.16536073, -0.19805053, 0.2580314 434 | 0.25055498, 0.24032447, -0.21338543, -0.4635089, -0.23716518, 0.21743424, 0.32586503, 0.3934686, 0.36706227, 0.40000632, 0.4336008, 0.3838943, 0.12686925, 0.3774107, -0.21697989, 0.38549677, -0.12201095, 0.44108677 435 | 0.032271937, 0.25312442, 0.5499414, 0.5264421, -0.11406043, 0.1522051, 0.13845782, 0.21600665, 0.4763155, 0.50039625, 0.19725966, 0.47709715, 0.0902303, 0.20644903, -0.11052843, 0.31191513, -0.14992742, 0.21705817 436 | -0.44152957, -0.37225568, 0.5645318, 0.4060549, -0.27307066, -0.2630404, -0.05291726, -0.05394748, 0.44704056, 0.331797, -0.24769808, 0.38093376, -0.27242208, -0.12963559, -0.17221051, -0.23271662, -0.27252272, -0.14230941 437 | -0.19444424, -0.049005434, 0.35520878, 0.03776591, -0.287663, 0.11455522, 0.02108931, 0.09922275, 0.27294874, 0.27972516, 0.12455383, 0.4160885, -0.21740368, 0.087410904, -0.22761682, 0.14404115, -0.27779192, 0.019039406 438 | 0.15794681, 0.19590086, -0.13865173, -0.14959085, -0.07508994, 0.20277706, 0.32671344, 0.3467774, 0.19943532, 0.28540316, 0.29589567, 0.31074858, 0.196745, 0.22788703, -0.122237, 0.20281267, -0.26167893, 0.3114576 439 | 0.41511592, 0.357157, 0.15444152, 0.19592212, 0.3503538, 0.1475251, 0.2829935, 0.2838421, -0.07813097, 0.13321152, 0.29255268, 0.0120284725, 0.3905327, 0.18836693, 0.4060338, 0.2611562, 0.29072037, 0.2542698 440 | 0.3325987, 0.15070912, 0.3284141, 0.4271073, 0.24410243, -0.04478056, -0.1773548, -0.19647905, -0.2385867, -0.24673231, -0.288039, -0.25386128, 0.29039642, -0.2542561, 0.36353967, -0.06734999, 0.25828075, -0.16057195 441 | -0.07057076, 0.05329763, 0.23813468, -0.18837795, -0.33680758, 0.20495428, 0.28308827, 0.41490912, 0.3446822, 0.44900525, 0.28137392, 0.4071932, -0.13599853, 0.43095446, -0.32912356, 0.41524175, -0.4368358, 0.3881524 442 | 0.39024043, 0.31617442, 0.24575283, 0.35935447, 0.39697447, -0.20061746, -0.21980461, -0.2087381, -0.32356346, -0.32016152, -0.12800011, -0.47801653, 0.38025868, -0.14068395, 0.37326673, -0.12047643, 0.4706809, -0.22399253 443 | 0.015840095, 0.023787161, 0.35437778, 0.23123118, -0.25853977, 0.30576026, 0.3075574, 0.32875943, 0.42157325, 0.30783096, 0.1577313, 0.3136588, -0.12336416, 0.28559566, -0.26228443, 0.20282988, -0.20966162, 0.280567 444 | 0.5402192, 0.5145566, 0.24452429, 0.32394895, 0.4406751, -0.09001775, -0.17418465, -0.08729374, -0.557206, -0.41633657, -0.21899821, -0.5415872, 0.49812704, -0.13253967, 0.5250019, -0.22267185, 0.3843738, -0.13839787 445 | -0.25612065, -0.45925367, 0.51909703, 0.4598694, -0.40888658, -0.23641, -0.37407836, -0.21063703, 0.45164773, 0.2509049, -0.17834407, 0.44706845, -0.25003332, -0.1554264, -0.3875479, -0.2729309, -0.45548257, -0.2661068 446 | -0.274536, -0.09999214, 0.37310153, 0.328635, -0.34742486, -0.002508273, -0.024443785, -0.007829881, 0.35598367, 0.100007646, -0.08049516, 0.30688742, -0.22952338, -0.134797, -0.3723775, 0.024072487, -0.19942603, -0.021559037 447 | -0.01625238, 0.21157108, 0.33236253, 0.46265188, 0.26398253, -0.18002227, -0.3161421, -0.29720855, -0.37261167, -0.2412251, -0.13822527, -0.33694252, 0.31328782, -0.13658693, 0.29615754, -0.22403386, 0.2420377, -0.21965206 448 | -0.080635756, -0.06028703, 0.42889088, 0.53301245, 0.35706493, -0.20379595, -0.4636927, -0.3579293, 0.405641, -0.20413487, -0.27565596, 0.33574072, -0.027734373, -0.36403352, 0.14806825, -0.23296842, 0.28992677, -0.3118898 449 | -0.35241488, -0.37390146, 0.39603117, 0.024379566, -0.32552582, 0.23193242, 0.11912209, 0.20276889, 0.3316381, 0.41120082, 0.27191216, 0.45467705, -0.35645887, 0.30592352, -0.2224981, 0.29264122, -0.3955726, 0.25018775 450 | -0.46521348, -0.42919946, 0.5799677, 0.5963513, -0.4356062, -0.34251666, -0.34237418, -0.36884788, 0.67432064, 0.224983, -0.2771562, 0.59462714, -0.41475266, -0.2809726, -0.35242203, -0.32139128, -0.29923794, -0.39682525 451 | 0.24009465, 0.23295318, 0.48720288, 0.31558546, 0.37887678, -0.11709965, -0.12694487, -0.07347004, 0.15239637, -0.021607637, -0.21409816, 0.17679003, 0.29369855, -0.07120979, 0.29210663, -0.116305456, 0.39010975, -0.10994218 452 | -0.4019939, -0.3140648, 0.43435353, 0.5887131, -0.3532961, -0.22503704, -0.1694147, -0.12670128, 0.38593477, 0.25774318, -0.16002196, 0.48799604, -0.30576584, -0.20156558, -0.30925637, -0.20926727, -0.33765215, -0.14746861 453 | 0.28435108, 0.31288028, 0.21171351, 0.3943585, 0.18323667, -0.02109255, -0.026864266, -0.12323964, -0.17816882, -0.14506812, -0.086550735, -0.23219779, 0.2595153, 0.13761342, 0.14294155, -0.018227367, 0.22092268, 0.10578729 454 | -0.0055858437, 0.03998616, 0.356626, 0.3633791, 0.24622987, -0.14687133, -0.1584376, -0.27520087, -0.20568913, -0.4095966, -0.15364629, -0.28229457, 0.1802252, -0.14581247, 0.35484198, -0.1406342, 0.33315167, -0.18293545 455 | 0.34556544, 0.35282508, 0.120309494, 0.35032526, 0.4314042, 0.13069475, 0.032760218, -0.11800217, -0.30201387, -0.3203463, -0.08634444, -0.3383428, 0.37886134, -0.03821095, 0.2942781, 0.12511936, 0.28416616, -0.053784 456 | -0.3089342, -0.1658064, 0.50319105, 0.2071057, -0.19254366, 0.03427111, 0.14728451, 0.28258455, 0.34412056, 0.23106855, 0.06379939, 0.47662494, -0.26737627, 0.1127848, -0.32840165, -0.030458782, -0.361124, 0.119779296 457 | 0.2304951, 0.33000758, -0.18837456, -0.20319988, 0.23945408, 0.23394677, 0.37778738, 0.18782324, 0.2074957, 0.17374174, 0.34213752, 0.0896976, 0.16450346, 0.2559948, -0.028898599, 0.1977544, -0.05839589, 0.3241355 458 | -0.3872696, -0.35921484, 0.4541276, 0.45829502, -0.42626143, -0.18841149, -0.23855619, -0.27760294, 0.5920883, 0.20849448, -0.20795144, 0.57343084, -0.29670602, -0.20746328, -0.29782483, -0.3059962, -0.44261956, -0.2682981 459 | 0.11202109, 0.05120979, 0.28404295, 0.22892965, 0.1785091, -0.027617194, 0.051708467, 0.15518577, -0.020060794, 0.007232088, 0.0360922, -0.14730811, 0.05573759, 0.12480696, 0.13129002, -0.04092929, 0.22346501, 0.11104452 460 | 0.21767682, 0.24713093, 0.3918078, 0.38138026, 0.32662728, 0.049862117, 0.069215395, 0.23385951, 0.2795674, 0.2653276, 0.22818708, 0.34155282, 0.1632898, 0.19583698, 0.23797034, 0.22197795, 0.11830119, 0.2698285 461 | -0.26910576, -0.3799188, 0.50312954, 0.24823406, -0.22889523, -0.14610781, -0.25234824, -0.2448314, 0.22649536, 0.10778244, -0.30233425, 0.3236436, -0.3165642, -0.16123791, -0.20474783, -0.23790368, -0.28070354, -0.29387718 462 | -0.39119497, -0.28232807, 0.3850018, 0.21666227, -0.40659136, -0.26137245, -0.33942884, -0.20544758, 0.2657092, 0.17709374, -0.34018242, 0.38662198, -0.20488633, -0.15196, -0.37461376, -0.30374807, -0.394902, -0.27625573 463 | 0.36366266, 0.3834895, -0.15960124, 0.034293626, 0.30166775, 0.11904795, 0.10561603, 0.19313727, -0.10394055, 0.039087713, 0.086219475, -0.089029945, 0.24414295, 0.18974689, 0.33628368, 0.13203777, 0.27162096, 0.22230875 464 | 0.36807463, 0.2420698, 0.25392735, 0.37345457, 0.2433451, -0.14913207, -0.08930998, -0.2795085, -0.3296708, -0.2650145, -0.066360354, -0.3018613, 0.29230762, -0.09252324, 0.4223905, -0.06792698, 0.42946005, -0.19403501 465 | 0.24665028, 0.34133247, 0.26427788, 0.36233184, 0.34174696, -0.44892314, -0.37325466, -0.41256738, -0.35180506, -0.44933695, -0.48929614, -0.5017892, 0.29766577, -0.31193194, 0.4737451, -0.35160804, 0.47139758, -0.44987768 466 | -0.16312517, -0.11370502, 0.37714624, 0.3576635, 0.09097855, -0.19611546, -0.16595736, -0.09424915, 0.13699462, -0.051343504, -0.26363894, 0.24055044, 0.024132991, -0.21198444, 0.141306, -0.17523432, 0.14841525, -0.24195963 467 | -0.31903538, -0.15451889, 0.50296545, 0.37444896, -0.044281483, -0.25851768, -0.2895304, -0.25761774, 0.33024874, 0.021104783, -0.1486096, 0.19723913, -0.089612015, -0.27601293, -0.12365705, -0.16950545, -0.104338735, -0.23657943 468 | 0.23142387, 0.2969301, -0.26438147, -0.28018126, 0.20567207, 0.2542968, 0.29668212, 0.28037596, 0.19941732, 0.13554434, 0.24204049, 0.13917716, 0.20416023, 0.32087323, -0.012208607, 0.338286, -0.15902996, 0.2882513 469 | 0.0058578984, -0.0026971912, 0.14788954, 0.10332905, 0.02537704, 0.0048241853, 0.12108723, 0.10491074, 0.13779776, -0.04446732, -0.022751989, 0.11413318, -0.104094975, 0.031950932, 0.16445827, 0.111489475, 0.2311327, 0.16479191 470 | 0.13541502, 0.23565389, -0.0010190656, 0.25325292, 0.3145468, 0.22500578, 0.14221022, 0.12212714, -0.16328703, 0.081047185, 0.056765717, -0.11484624, 0.1970577, 0.052549973, 0.43639603, 0.057690624, 0.3479557, 0.1950111 471 | 0.29562855, 0.25233838, 0.2632212, 0.30829197, 0.3991422, -0.132316, -0.26055038, -0.29929435, -0.20975748, -0.1884776, -0.14779222, -0.3539742, 0.25571567, -0.26706395, 0.42457756, -0.2584726, 0.35043252, -0.17300998 472 | -0.24362601, -0.35479876, 0.5571956, 0.58162916, -0.28117484, -0.32037136, -0.06406365, -0.14543036, 0.42807138, 0.33367035, -0.17817932, 0.48279807, -0.23178689, -0.20319477, -0.2430696, -0.22963744, -0.27764294, -0.26184112 473 | -0.3762099, -0.3033874, 0.4801397, 0.46569654, -0.21493122, -0.24186145, -0.31214398, -0.24648765, 0.44097376, 0.27500075, -0.27717716, 0.546171, -0.33027843, -0.383392, -0.22909853, -0.1920324, -0.38598233, -0.30703363 474 | 0.18793587, 0.20106167, 0.07515264, 0.23012677, 0.13950448, 0.105291985, 0.10369839, 0.19919606, 0.22042271, 0.28003848, 0.2164961, 0.2808955, 0.1687613, 0.09515142, 0.09568828, 0.23395608, 0.10019209, 0.23549972 475 | 0.3628515, 0.47413737, 0.28789908, 0.41292998, 0.41072553, -0.31339297, -0.33924475, -0.27218953, -0.3332509, -0.34773573, -0.19725147, -0.38574597, 0.42527097, -0.19020721, 0.4767914, -0.22957847, 0.5134168, -0.19477549 476 | 0.16518134, 0.16192299, 0.21100344, 0.14774954, 0.33094633, 0.114962734, 0.19478208, 0.12420579, -0.060181376, 0.21990728, 0.13110544, -0.03647819, 0.16519898, 0.19246304, 0.36320028, 0.21845786, 0.22296983, 0.23501217 477 | 0.08128391, 0.023486366, 0.32602233, 0.37590098, 0.23171774, -0.3021504, -0.20208237, -0.21936186, -0.2729843, -0.23314582, -0.22031963, -0.273629, 0.18717481, -0.27057824, 0.28769073, -0.23301585, 0.39163283, -0.27548754 478 | -0.06387645, -0.031107863, 0.36313128, 0.13616313, -0.4250604, -0.077757604, 0.2918627, 0.3909465, 0.56428176, 0.51622117, 0.17196646, 0.58085984, -0.10968199, 0.1990062, -0.17257237, 0.1368982, -0.383644, 0.19786957 479 | 0.04171643, 0.064599454, -0.22273506, -0.32484865, -0.26514512, -0.05808542, 0.28437057, 0.26848838, 0.2503099, 0.2970595, 0.45210856, 0.44717187, -0.096325494, 0.30590707, -0.30887994, 0.26374704, -0.33743626, 0.26338467 480 | 0.3440361, 0.4100995, -0.5137313, -0.48162854, -0.3745328, 0.37125945, 0.52496773, 0.35640073, 0.35676873, 0.39036056, 0.5122222, 0.32100928, 0.32196093, 0.45571733, -0.22824925, 0.38899207, -0.24606182, 0.5279041 481 | 0.1453274, 0.21724404, 0.14035992, 0.27921146, 0.18161821, 0.2728087, 0.17811584, 0.124351315, 0.25011277, 0.276763, 0.19987136, 0.30162257, 0.20304644, 0.123883575, 0.24125995, 0.18271011, 0.31933963, 0.27691075 482 | 0.32327828, 0.23503341, -0.23557214, -0.31773183, 0.16698523, 0.32146356, 0.2545894, 0.30674645, 0.20196089, 0.25963908, 0.29002032, 0.18664998, 0.30881956, 0.24928597, 0.2094687, 0.25851732, 0.060088806, 0.25113842 483 | -0.3885845, -0.33759248, 0.32094696, -0.018120712, -0.35761827, -0.07484962, -0.00813177, 0.24242763, 0.38265184, 0.40719143, -0.041690987, 0.3714488, -0.2860014, -0.14369214, -0.34471485, -0.195676, -0.42488325, 0.013194804 484 | -0.2049236, -0.23761936, 0.34198856, 0.2978616, -0.23509698, -0.20738977, -0.18674298, -0.10220273, 0.18392842, 0.020749673, -0.1908439, 0.13891849, -0.19497135, -0.25720686, -0.27918896, -0.22995792, -0.34179023, -0.2929841 485 | -0.3223215, -0.40321562, 0.55516833, 0.4987126, -0.39737654, -0.19293597, -0.39264876, -0.28089795, 0.4433983, -0.05435262, -0.41244578, 0.4330621, -0.40044847, -0.31446287, -0.46856472, -0.3185325, -0.41720536, -0.26818985 486 | 0.31305763, 0.3118437, 0.22586091, 0.3186742, 0.2832728, -0.03941832, -0.07919959, 0.028828135, -0.15816122, -0.07313854, -0.004274161, -0.003408672, 0.27092597, 0.014392178, 0.43670416, 0.06948844, 0.45216668, 0.065568104 487 | -0.014292158, -0.07428696, 0.5032855, 0.40855542, -0.2579551, -0.09521212, 0.080695644, 0.05743706, 0.4989273, 0.3473842, 0.04731121, 0.41638115, -0.009462514, -0.025158085, -0.11258923, 0.018186312, -0.23915365, 0.023264956 488 | 0.35038415, 0.29155943, -0.34553316, -0.30951038, 0.24685785, 0.21605521, 0.33028853, 0.34473887, 0.12771825, 0.3516778, 0.38842815, 0.22011176, 0.31843284, 0.3265495, 0.22819626, 0.30893677, 0.19007596, 0.41274485 489 | -0.02626557, -0.18010774, 0.41440016, 0.4249913, 0.218987, -0.11115825, -0.06396275, -0.23994671, 0.1056321, 0.077164374, -0.07353013, 0.18048197, 0.07974087, -0.19544336, 0.16733399, -0.0761172, 0.18475334, -0.24357432 490 | -0.10116346, -0.20209368, -0.35444292, -0.22756866, -0.19386026, 0.17690071, 0.34122196, 0.38238224, 0.28996247, 0.23704663, 0.30209377, 0.2713408, -0.31047842, 0.28398758, -0.27961716, 0.3300155, -0.30930218, 0.36015466 491 | 0.11783292, 0.22999847, -0.1608966, -0.17633046, -0.15511067, 0.23475571, 0.32003435, 0.27634916, 0.3506803, 0.16470404, 0.29127163, 0.27871397, 0.048161957, 0.25888306, -0.16473362, 0.31944972, -0.13252467, 0.2329882 492 | 0.27045977, 0.12993719, 0.25230756, 0.15683386, 0.2868091, -0.06911284, -0.086210676, -0.03950033, -0.1214533, -0.1528348, -0.13467696, -0.2656057, 0.24393763, -0.054723583, 0.24166685, -0.05440523, 0.2709275, -0.07640642 493 | 0.29019225, 0.3687901, -0.2017767, -0.102274165, 0.326284, 0.26847333, 0.2422999, 0.10103312, -0.10475022, 0.07548375, 0.24434322, -0.04360924, 0.29184934, 0.19235504, 0.32578966, 0.20525809, 0.38346985, 0.21751343 494 | 0.3596075, 0.2549848, 0.32703888, 0.44645154, 0.31336856, -0.2631456, -0.20709644, -0.2641091, -0.28243387, -0.328761, -0.29125297, -0.2423484, 0.245199, -0.31197104, 0.47167858, -0.3685339, 0.29073974, -0.42789963 495 | -0.3809265, -0.40672076, 0.49764076, 0.47904348, -0.42159885, -0.07860618, -0.06378494, -0.054174013, 0.35291478, 0.3178289, -0.18212259, 0.53434885, -0.26896003, -0.090268865, -0.44856942, -0.07437749, -0.3972155, -0.05166069 496 | -0.38428003, -0.33505493, 0.38119802, 0.3690651, -0.3738424, -0.12921563, -0.08477559, -0.2466299, 0.39073485, 0.1996394, -0.2625006, 0.4161931, -0.3175774, -0.15091993, -0.20082815, -0.2851432, -0.18443961, -0.19427776 497 | -0.35089257, -0.51616293, 0.5799015, 0.6432637, -0.3597399, -0.14033636, -0.3779201, -0.3279648, 0.60671806, 0.21224613, -0.39121312, 0.58064914, -0.17433062, -0.20663022, -0.15168051, -0.34626302, -0.32088062, -0.17250852 498 | 0.3539326, 0.41298345, -0.52747166, -0.47319892, 0.3179016, 0.49615034, 0.5118504, 0.43246186, 0.013073737, 0.3045542, 0.41171357, 0.043397885, 0.49099737, 0.46246037, 0.47186807, 0.37711358, 0.320251, 0.40945455 499 | 0.3375728, 0.26860687, 0.21142873, 0.3088204, 0.26564166, -0.29117262, -0.09777814, -0.102149814, -0.17625855, -0.19542818, -0.130223, -0.14106764, 0.2666788, -0.20473583, 0.29751897, -0.2445124, 0.35736912, -0.24640831 500 | -0.2636599, -0.1366745, 0.4648413, 0.3888409, -0.35527328, -0.119929455, 0.022530956, 0.02197705, 0.39358714, 0.4352088, -0.07262862, 0.4774816, -0.095391095, -0.022304647, -0.3569653, -0.053482823, -0.2973808, -0.0053399405 501 | -------------------------------------------------------------------------------- /examples/gcn/matrices/pubmed_weights2.txt: -------------------------------------------------------------------------------- 1 | 0.7579167, 0.9366205, -1.0090231 2 | 0.7828346, 1.0217696, -0.75969136 3 | -0.8154551, 0.16244075, 1.1567742 4 | -1.1044643, 0.36528847, 0.7424926 5 | -0.54971486, 0.9363912, -1.0632129 6 | 0.65649503, -0.54954535, -0.66892785 7 | 0.30878904, -0.9381629, -0.9488146 8 | 0.7495417, -0.707781, -0.51830244 9 | 0.40373445, -0.88318837, 0.65076596 10 | 0.81169844, -1.0042897, 0.37210122 11 | 0.8485579, -0.4469304, -0.5616686 12 | 0.09047271, -1.1410731, 0.37149823 13 | 0.49857736, 0.9871631, -0.81478816 14 | 1.076114, -0.12633924, -0.15536001 15 | -0.6447635, 1.0595416, -0.9052363 16 | 0.87495726, -0.5007354, -0.8606716 17 | -0.6738954, 1.0011489, -0.74409163 18 | 0.78171194, -0.551189, -0.5995115 19 | -------------------------------------------------------------------------------- /examples/gcn/matrix.h: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Democritus University of Thrace 2 | // Integrated Circuits Lab 3 | // 4 | // Example using Fast-Float4HLS to build a Graph Convolutional Network 5 | #ifndef _MATRIX_H 6 | #define _MATRIX_H 7 | 8 | template 9 | class Matrix { 10 | private: 11 | unsigned _rows, _cols; 12 | T *_data; 13 | 14 | public: 15 | 16 | Matrix(int rows, int cols, T *data) : _rows(rows), _cols(cols), _data(data) {} 17 | 18 | T *operator[](int row) { 19 | return _data + (row * _cols); 20 | } 21 | 22 | }; 23 | 24 | template 25 | class Array : public Matrix { 26 | public: 27 | 28 | Array(int _dim, T *data) : Matrix(1, _dim, data) {} 29 | 30 | }; 31 | 32 | #endif -------------------------------------------------------------------------------- /examples/matrix_mul/README.md: -------------------------------------------------------------------------------- 1 | # Matrix multiplication implementation 2 | 3 | This example provides three different implementations matrix-matrix multiplications using the Fast-Float4HLS library. 4 | 5 | > matrix_mul_basic.cpp : Contains an implementation using the basic operators + and *. 6 | 7 | > matrix_mul_fma.cpp : Contains an implementation using the fma implementation. 8 | 9 | > matrix_mul_dot.cpp : Contains an implementation using the dot product implementation. 10 | 11 | All implementations are based on the Fast-Float4HLS library. The templatized C++ functions are implemented for HLS using the Catapult HLS tool. The sizes of the two input matrices to be multiplied can be selected through the template parameters ''N'', ''M'' and ''K''. 12 | 13 | To synthesize the design on Catapult HLS use the *go_hls.tcl* script. The given examples synthesize the multiplication of two matrices of size 4x4 and 4x2 accordingly. When changing the size of the matrices through the template parameter 14 | 15 | ```c++ 16 | const int N=4, M=4, K=2; 17 | matXmat(A,B,OM); 18 | ``` 19 | 20 | you should also change the value of the corresponding variables at the top of the *go_hls.tcl* TCL script. 21 | 22 | ```tcl 23 | set N 4 24 | set M 4 25 | set K 2 26 | ``` 27 | 28 | Furthermore, through the SET_IMPL variable you can select the example to be synthesized. 29 | 30 | ```tcl 31 | set IMPLEMENTATIONS_LIST {basic fma dot} 32 | set SEL_IMPL 2 33 | ``` 34 | 35 | To synthesize the design launch catapult in the directory of the example. 36 | 37 | ```bash 38 | catapult -f go_hls.tcl 39 | ``` 40 | 41 | -------------------------------------------------------------------------------- /examples/matrix_mul/go_hls.tcl: -------------------------------------------------------------------------------- 1 | # Define the 3 different implementations of the design using 2 | # (a) basic + and * operators, 3 | # (b) using fma and 4 | # (c) using dot product 5 | # Select through the SEL_IMPL variable using indexes 0, 1 or 2 6 | set IMPLEMENTATIONS_LIST {basic fma dot} 7 | set SEL_IMPL 2 8 | 9 | # Define template parameters for top level 10 | # N, M, K : Dimensions of the two matrices 11 | # Matrix A [ N x M ] 12 | # Matrix B [ M x K ] 13 | set N 4 14 | set M 4 15 | set K 2 16 | 17 | # Definition of top level module 18 | set TOP "matXmat<${N}, ${M}, ${K}>" 19 | 20 | # Definition path to top (tb) cpp file 21 | set CUR_IMPL [lindex $IMPLEMENTATIONS_LIST $SEL_IMPL] 22 | set FPATH "./matrix_mul_${CUR_IMPL}.cpp" 23 | 24 | # Definition project name 25 | set PROJECT "matrix_mul_example" 26 | 27 | 28 | # GO_HLS 29 | 30 | project new -name $PROJECT 31 | solution new -state initial 32 | solution options defaults 33 | solution options set /ComponentLibs/SearchPath . -append 34 | solution options set /Interface/DefaultClockPeriod 2 35 | solution options set /Input/CppStandard c++11 36 | solution options set /Input/CompilerFlags { -DHLS_CATAPULT=1 } 37 | solution options set /Input/SearchPath { ../../ } 38 | solution options set /Flows/QuestaSIM/SCCOM_OPTS {-O3 -x c++ -Wall -Wno-unused-label -Wno-unknown-pragmas} 39 | solution options set /Flows/SCVerify/USE_CCS_BLOCK true 40 | flow package require /SCVerify 41 | flow package require /QuestaSIM 42 | solution file add $FPATH -type C++ 43 | directive set -DESIGN_GOAL latency 44 | go new 45 | solution design set $TOP -top 46 | go analyze 47 | directive set -CLOCKS {clk {-CLOCK_PERIOD 2.0 -CLOCK_UNCERTAINTY 0.0 -CLOCK_HIGH_TIME 1.0}} 48 | solution library add nangate-45nm_beh -- -rtlsyntool OasysRTL -vendor Nangate -technology 045nm 49 | solution library add ccs_sample_mem 50 | go libraries 51 | go assembly 52 | go architect 53 | go allocate 54 | go extract 55 | 56 | #COSIM 57 | flow run /SCVerify/launch_make ./scverify/Verify_concat_sim_rtl_v_msim.mk {} SIMTOOL=msim sim 58 | 59 | -------------------------------------------------------------------------------- /examples/matrix_mul/matrix_mul_basic.cpp: -------------------------------------------------------------------------------- 1 | // Copyright 2022 Democritus University of Thrace 2 | // Integrated Circuits Lab 3 | // 4 | // Example using Fast-Float4HLS to build Matrix-Vector & Matrix-Matrix multiplication 5 | #include 6 | #include 7 | #include "fast_float.h" 8 | #include "mc_scverify.h" 9 | 10 | typedef ffp32 T; 11 | 12 | template 13 | void CCS_BLOCK(matXvec)(T A[N][M], T V[M], T O[N]) { 14 | 15 | for (int i=0; i 27 | void CCS_BLOCK(matXmat) (T A[N][M], T B[M][K], T O[N][K]) { 28 | for (int i=0; i(A,V,OV); 36 | 37 | #pragma hls_unroll 38 | for (int j=0; j (rand()) /( static_cast (RAND_MAX/(HI-LO))); 47 | }; 48 | 49 | CCS_MAIN(int argc, char** argv) { 50 | 51 | const int N=4, M=4, K=2; 52 | 53 | T A[N][M]; 54 | T B[M][K]; 55 | T OM[N][K]; 56 | 57 | srand(time(NULL)); 58 | 59 | for (int j=0; j(A,B,OM); 68 | 69 | std::cout << "\nMATRIX x MATRIX\n" << std::endl; 70 | for (int i=0; i 6 | #include 7 | #include "fast_float.h" 8 | #include "mc_scverify.h" 9 | 10 | typedef ffp32 T; 11 | 12 | template 13 | void CCS_BLOCK(matXvec)(T A[N][M], T V[M], T O[N]) { 14 | 15 | #pragma hls_pipeline_init_interval 1 16 | for (int i=0; i(A[i],V); 20 | 21 | O[i] = sum; 22 | } 23 | }; 24 | 25 | #pragma hls_design 26 | template 27 | void CCS_BLOCK(matXmat) (T A[N][M], T B[M][K], T O[N][K]) { 28 | for (int i=0; i(A,V,OV); 36 | 37 | #pragma hls_unroll 38 | for (int j=0; j (rand()) /( static_cast (RAND_MAX/(HI-LO))); 47 | }; 48 | 49 | CCS_MAIN(int argc, char** argv) { 50 | 51 | const int N=4, M=4, K=2; 52 | 53 | T A[N][M], B[M][K], OM[N][K]; 54 | 55 | srand(time(NULL)); 56 | 57 | for (int j=0; j(A,B,OM); 66 | 67 | std::cout << "\nMATRIX x MATRIX\n" << std::endl; 68 | for (int i=0; i 6 | #include 7 | #include "fast_float.h" 8 | #include "mc_scverify.h" 9 | 10 | typedef ffp32 T; 11 | 12 | template 13 | void CCS_BLOCK(matXvec)(T A[N][M], T V[M], T O[N]) { 14 | 15 | for (int i=0; i 27 | void CCS_BLOCK(matXmat) (T A[N][M], T B[M][K], T O[N][K]) { 28 | for (int i=0; i(A,V,OV); 36 | 37 | #pragma hls_unroll 38 | for (int j=0; j (rand()) /( static_cast (RAND_MAX/(HI-LO))); 47 | }; 48 | 49 | CCS_MAIN(int argc, char** argv) { 50 | 51 | const int N=4, M=4, K=2; 52 | 53 | T A[N][M], B[M][K], OM[N][K]; 54 | 55 | srand(time(NULL)); 56 | 57 | for (int j=0; j(A,B,OM); 66 | 67 | std::cout << "\nMATRIX x MATRIX\n" << std::endl; 68 | for (int i=0; i 11 | #include 12 | 13 | template 14 | bool lzc_reduce (ac_int a) { 15 | ac_int odd, even; 16 | 17 | 18 | // split odd even bits of a 19 | #pragma unroll yes 20 | SPLIT:for (int i=0; i < W/2; i++) { 21 | even[i] = a[2*i]; 22 | odd[i] = a[2*i+1]; 23 | } 24 | 25 | // prefix AND from MSB-to-LSB of inverted even bits 26 | even = even.bit_complement(); 27 | ac_int even_prefix; 28 | ac_int<1,false> t=true; 29 | 30 | #pragma unroll yes 31 | PREFIXAND:for (int i=W/2-1; i >=0; i--) { 32 | if (i == W/2-1) t = even[i]; 33 | else t = t & even[i]; 34 | even_prefix[i] = t; 35 | } 36 | 37 | // fix alignment of prefixed and terms 38 | even_prefix = even_prefix >> 1; 39 | even_prefix[W/2-1] = 1; 40 | 41 | // prepare terms for each bit position 42 | ac_int tmp = even_prefix & odd; 43 | 44 | // return the wide OR of those terms 45 | return tmp.or_reduce(); 46 | } 47 | 48 | // Version 1: try to do it 49 | template 50 | struct lzc_s { 51 | template 52 | static void lzc(ac_int a, T &out) { 53 | ac_int a0; 54 | out[ac::log2_ceil::val] = lzc_reduce(a); 55 | 56 | #pragma unroll yes 57 | for (int i = 0; i < N / 2; i++) { 58 | a0[i] = a[2*i] | a[2*i + 1]; 59 | } 60 | lzc_s::lzc(a0,out); 61 | } 62 | }; 63 | 64 | template<> 65 | struct lzc_s<1> { 66 | template 67 | static void lzc(ac_int<1,false> a, T &out) { 68 | out[0] = a[0]; 69 | } 70 | }; 71 | 72 | 73 | template 74 | ac_int::val+1,false> lzcount(ac_int x) { 75 | ac_int::val+1,false> b,res; 76 | lzc_s::lzc(x,b); 77 | 78 | // reverse bits 79 | #pragma unroll yes 80 | for (int i=0; i< ac::log2_ceil::val+1; i++) { 81 | res[i] = b[ac::log2_ceil::val - i]; 82 | } 83 | 84 | // complement them and send them out 85 | return (res.or_reduce() == 0) ? (ac_int::val+1,false>)0 : res.bit_complement(); 86 | } 87 | 88 | 89 | template 90 | struct max_s { 91 | template 92 | static T max(T *a) { 93 | T m0 = max_s::max(a); 94 | T m1 = max_s::max(a+N/2); 95 | 96 | return m0 > m1 ? m0 : m1; 97 | } 98 | }; 99 | 100 | template<> 101 | struct max_s<1> { 102 | template 103 | static T max(T *a) { 104 | return a[0]; 105 | } 106 | }; 107 | 108 | template 109 | T max(T *a) { 110 | return max_s::max(a); 111 | }; 112 | 113 | // Fast Float class 114 | template 115 | class fast_float { 116 | public: 117 | typedef ac_int man_t; 118 | typedef ac_int exp_t; 119 | typedef ac_int<1,false> sgn_t; 120 | 121 | man_t mantissa; 122 | exp_t exponent; 123 | sgn_t sign; 124 | 125 | static const int width = M + E + 1; 126 | static const int man_width = M; 127 | static const int exp_width = E; 128 | static const int e_bias = (1 << (E-1)) - 1; 129 | static const int frac_bits = M + 1; 130 | 131 | enum RND_ENUM {EVEN, ODD, INF}; 132 | 133 | // Constructors 134 | fast_float() {}; 135 | fast_float(const ac_int &in) { 136 | this->operator=(in); 137 | } 138 | fast_float(const fast_float &in) { 139 | this->operator=(in); 140 | } 141 | ~fast_float() {}; 142 | 143 | void set(sgn_t s, exp_t e, man_t m) { 144 | sign = s; 145 | exponent = e; 146 | mantissa = m; 147 | } 148 | 149 | void setNan() { this->set(0, (1<set(0, (1<set(1, (1< data; 160 | for (int i=0; i tmpExp = (exponent==0) ? ( ac_int<8,false>)0 : ( ac_int<8,false>)(exponent - e_bias + 127); 167 | for (int i=0; i<8; i++) 168 | data[23+i] = (exponent == (1< ieee_data; 173 | ieee_data.set_data(data); 174 | return ieee_data.to_float(); 175 | } 176 | 177 | /** FLOATING POINT OPERATIONS **/ 178 | 179 | /* Floating Point Addition 180 | * adds the value of 'a' to this fast_float and 181 | * return the result to the 'output'. 182 | * The addition is implemented using dual path (Far-Near). 183 | */ 184 | template 185 | void fpa_dual(const fast_float a, fast_float &output) { 186 | 187 | // Set create needed lengths. 188 | const int signif_uniform_W = M + 4; 189 | 190 | // Calculate effective sign. 191 | const ac_int<1,false> sign_eff = sign ^ a.sign; 192 | 193 | // Infinity check: 194 | ac_int<1,false> inf_sign = sign; 195 | bool Is_inf = false; 196 | if (( exponent).and_reduce()) { 197 | Is_inf = true; 198 | } else if ((a.exponent).and_reduce()) { 199 | inf_sign = a.sign; 200 | Is_inf = true; 201 | } 202 | 203 | 204 | // End of infinity check. 205 | 206 | // Create normalized significant with guard bits. 207 | 208 | ac_int norm_significant_1; 209 | ac_int norm_significant_2; 210 | 211 | norm_significant_1 = mantissa; 212 | norm_significant_1 <<= 2; 213 | 214 | norm_significant_2 = a.mantissa; 215 | norm_significant_2 <<= 2; 216 | 217 | const ac_int<1,false> in_1_subnorm = ( exponent == 0); 218 | const ac_int<1,false> in_2_subnorm = (a.exponent == 0); 219 | const ac_int<1,false> both_ins_subnorm = in_1_subnorm & in_2_subnorm; 220 | const ac_int<1,false> only_one_in_subnorm = in_1_subnorm ^ in_2_subnorm; 221 | 222 | norm_significant_1[signif_uniform_W - 2] = (DENORMALS) ? ((in_1_subnorm) ? 0 : 1) : 1; 223 | norm_significant_2[signif_uniform_W - 2] = (DENORMALS) ? ((in_2_subnorm) ? 0 : 1) : 1; 224 | 225 | 226 | // Start of R-path: 227 | 228 | // Compute exponent difference. 229 | 230 | const ac_int R_exp_diff_1 = exponent - a.exponent; 231 | const ac_int R_exp_diff_2 = a.exponent - exponent; 232 | ac_int R_abs_exp_diff; 233 | 234 | // Initialize swap variables. 235 | 236 | ac_int R_nsignif_small; 237 | ac_int R_nsignif_large; 238 | ac_int R_exp_large; 239 | ac_int<1,false> R_sign_large = 0; 240 | 241 | const int R_align_sft_extra_W = M + 3; 242 | 243 | ac_int R_small_signif_aligner; 244 | 245 | // Swap and allign. 246 | 247 | if (!R_exp_diff_1[E]) { 248 | 249 | R_nsignif_large = norm_significant_1; 250 | R_exp_large = exponent; 251 | R_sign_large = sign; 252 | R_nsignif_small = norm_significant_2; 253 | R_abs_exp_diff = R_exp_diff_1; 254 | 255 | } else if (!R_exp_diff_2[E]) { 256 | 257 | R_nsignif_large = norm_significant_2; 258 | R_exp_large = a.exponent; 259 | R_sign_large = a.sign; 260 | R_nsignif_small = norm_significant_1; 261 | R_abs_exp_diff = R_exp_diff_2; 262 | 263 | } 264 | 265 | R_small_signif_aligner = R_nsignif_small; 266 | 267 | if (R_abs_exp_diff < R_align_sft_extra_W) { 268 | R_small_signif_aligner <<= R_align_sft_extra_W; 269 | if (DENORMALS) R_small_signif_aligner <<= only_one_in_subnorm; 270 | R_small_signif_aligner >>= R_abs_exp_diff; 271 | } 272 | 273 | R_nsignif_small = R_small_signif_aligner.template slc(R_align_sft_extra_W); 274 | 275 | const ac_int<1,false> R_sticky = (R_small_signif_aligner.template slc(0)).or_reduce(); 276 | const ac_int<1,false> R_add_1 = !R_sticky; 277 | 278 | 279 | 280 | // Significant Addition. Compute sum and both rounded sums. 281 | 282 | ac_int R_sum; 283 | ac_int R_rounded_sum; // rounded sum in case no normalization left shift is needed. 284 | ac_int R_unnormal_rounded_sum; // rounded sum requires left shift normalition. 285 | 286 | if (sign_eff) { 287 | 288 | R_sum = R_nsignif_large + (~R_nsignif_small) + R_add_1; 289 | R_rounded_sum = R_nsignif_large + (~R_nsignif_small) + R_add_1 + 4; 290 | R_unnormal_rounded_sum = R_nsignif_large + (~R_nsignif_small) + R_add_1 + 2; 291 | 292 | } else { 293 | 294 | R_sum = R_nsignif_large + R_nsignif_small; 295 | R_rounded_sum = R_nsignif_large + R_nsignif_small + 4; 296 | R_unnormal_rounded_sum = R_nsignif_large + R_nsignif_small + 2; 297 | 298 | } 299 | 300 | bool Ris_zero = !(R_sum.or_reduce()); 301 | 302 | // Normalize and overflow check R_sum, R_rounded_sum 303 | // and R_unnormal_rounded_sum. 304 | 305 | const ac_int R_exp_large_plus_1 = R_exp_large + 1; 306 | const ac_int R_exp_large_min_1 = R_exp_large - 1; 307 | 308 | bool R_sum_overf = false; 309 | bool R_sum_is_unnormal = false; 310 | bool R_rounded_sum_overf = false; 311 | bool R_is_unnormal_rounded = false; 312 | 313 | const ac_int<1,false> R_sum_sticky_hold = R_sum[0]; 314 | 315 | if (DENORMALS) { 316 | if (R_sum[signif_uniform_W - 1]) { 317 | 318 | R_sum >>= 1; 319 | R_sum[0] = R_sum[0] | R_sum_sticky_hold; 320 | R_sum_overf = true; 321 | 322 | } else if (both_ins_subnorm && R_sum[signif_uniform_W - 2]) { 323 | 324 | R_sum_overf = true; 325 | 326 | } else if (!both_ins_subnorm && !R_sum[signif_uniform_W - 2]) { 327 | 328 | R_sum <<= 1; 329 | R_sum_is_unnormal = true; 330 | 331 | } 332 | } else { 333 | if (R_sum[signif_uniform_W - 1]) { 334 | R_sum >>= 1; 335 | R_sum[0] = R_sum[0] | R_sum_sticky_hold; 336 | R_sum_overf = true; 337 | 338 | } else if (!R_sum[signif_uniform_W - 2]) { 339 | 340 | R_sum <<= 1; 341 | R_sum_is_unnormal = true; 342 | 343 | } 344 | } 345 | 346 | if (DENORMALS) { 347 | if (R_rounded_sum[signif_uniform_W - 1]) { 348 | 349 | R_rounded_sum >>= 1; 350 | R_rounded_sum_overf = true; 351 | 352 | } else if (both_ins_subnorm && R_rounded_sum[signif_uniform_W - 2]) { 353 | 354 | R_rounded_sum_overf = true; 355 | 356 | } 357 | } else { 358 | if (R_rounded_sum[signif_uniform_W - 1]) { 359 | 360 | R_rounded_sum >>= 1; 361 | R_rounded_sum_overf = true; 362 | 363 | } 364 | } 365 | 366 | if (DENORMALS) { 367 | if (!both_ins_subnorm && !R_unnormal_rounded_sum.template slc<2>(signif_uniform_W - 2)) { 368 | 369 | R_unnormal_rounded_sum <<= 1; 370 | R_is_unnormal_rounded = true; 371 | } 372 | } else { 373 | if (!R_unnormal_rounded_sum.template slc<2>(signif_uniform_W - 2)) { 374 | 375 | R_unnormal_rounded_sum <<= 1; 376 | R_is_unnormal_rounded = true; 377 | } 378 | } 379 | 380 | // Rounding Decision. 381 | 382 | bool rnd = false; 383 | 384 | switch (RND_MODE) { 385 | 386 | case EVEN: 387 | // Round to nearest tie to even. 388 | rnd = R_sum[1] & (R_sum[0] | R_sum[2] | R_sticky); 389 | break; 390 | case ODD: 391 | // Round to nearest tie to odd. 392 | rnd = R_sum[1] & (R_sum[0] | (!R_sum[2]) | R_sticky); 393 | break; 394 | case INF: 395 | // Round infinity. 396 | rnd = R_sum[1]; 397 | break; 398 | 399 | } 400 | 401 | ac_int R_magn_result; 402 | ac_int R_exp_result; 403 | 404 | if (rnd) { 405 | 406 | if (R_is_unnormal_rounded) { 407 | 408 | R_magn_result = R_unnormal_rounded_sum.template slc(2); 409 | R_exp_result = R_exp_large_min_1; 410 | 411 | } else { 412 | 413 | R_magn_result = R_rounded_sum.template slc(2); 414 | R_exp_result = (R_rounded_sum_overf) ? R_exp_large_plus_1 : R_exp_large; 415 | 416 | } 417 | 418 | } else { 419 | 420 | R_magn_result = R_sum.template slc(2); 421 | 422 | if (R_sum_overf) { 423 | 424 | R_exp_result = R_exp_large_plus_1; 425 | 426 | } else if (R_sum_is_unnormal) { 427 | 428 | R_exp_result = R_exp_large_min_1; 429 | 430 | } else { 431 | 432 | R_exp_result = R_exp_large; 433 | 434 | } 435 | 436 | } 437 | 438 | 439 | // End of R-path. 440 | 441 | 442 | // Start of N-path: 443 | 444 | // 2-bit exponent difference. 445 | 446 | const ac_int<3,true> N_exp_diff = exponent.template slc<2>(0) - a.exponent.template slc<2>(0); 447 | 448 | // Swap and 1-bit allign. 449 | 450 | ac_int N_nsignif_small; 451 | ac_int N_nsignif_large; 452 | ac_int N_exp_large; 453 | ac_int<1,false> N_sign_large = 0; 454 | 455 | if (N_exp_diff[1]) { 456 | 457 | N_nsignif_large = norm_significant_2; 458 | N_exp_large = a.exponent; 459 | N_sign_large = a.sign; 460 | N_nsignif_small = norm_significant_1; 461 | 462 | } else { 463 | 464 | N_nsignif_large = norm_significant_1; 465 | N_exp_large = exponent; 466 | N_sign_large = sign; 467 | N_nsignif_small = norm_significant_2; 468 | 469 | } 470 | 471 | if (DENORMALS) { 472 | if (N_exp_diff.or_reduce() && (!only_one_in_subnorm)) { 473 | N_nsignif_small >>= 1; 474 | 475 | } 476 | } else { 477 | if (N_exp_diff.or_reduce()) { 478 | 479 | N_nsignif_small >>= 1; 480 | 481 | } 482 | } 483 | 484 | // Significant substraction. 485 | 486 | const ac_int N_large_sub_small = N_nsignif_large - N_nsignif_small; 487 | const ac_int N_small_sub_large = N_nsignif_small - N_nsignif_large; 488 | 489 | ac_int N_chosen_sub; 490 | 491 | if (!N_small_sub_large[signif_uniform_W - 1]) { 492 | 493 | N_sign_large = !N_sign_large; 494 | N_chosen_sub = N_small_sub_large; 495 | 496 | } else if (!N_large_sub_small[signif_uniform_W - 1]) { 497 | 498 | N_chosen_sub = N_large_sub_small; 499 | 500 | } 501 | 502 | // Normalize chosen sub. 503 | 504 | const bool N_no_normalize = N_chosen_sub[signif_uniform_W - 2]; 505 | 506 | bool N_zero = false; 507 | 508 | // const ac_int::val, false> N_lz_cnt = (N_chosen_sub).leading_sign(N_zero); 509 | // M+3 = 23 + 3 = 26 510 | // M+3 = 7 + 3 = 10 511 | // M+3 = 3 + 3 = 6 512 | const int ww = (M+3 <= 8) ? 8 : 513 | (M+3 <= 16) ? 16 : 514 | (M+3 <= 32) ? 32 : 64; 515 | const int uu = ww - M - 3; 516 | ac_int tcz = 0; 517 | #pragma hls_unroll 518 | for (int ii=0; ii::val, false> N_lz_cnt = lzcount(tcz); 521 | // REMOVE LINE -3 522 | // ADD LINES -2 AND -1 523 | // CHANGES FOR LEADING ZERO COUNT 524 | 525 | if (N_zero) { 526 | 527 | N_exp_large = 0; 528 | N_sign_large = 0; 529 | 530 | } else { 531 | 532 | N_chosen_sub <<= N_lz_cnt; 533 | N_exp_large -= N_lz_cnt; 534 | 535 | } 536 | 537 | if (DENORMALS) 538 | N_chosen_sub >>= ((N_exp_large == 0) && !both_ins_subnorm) ? 1 : 0; 539 | 540 | 541 | // End of N-path. 542 | 543 | // Result Decision. 544 | 545 | const bool Is_R1 = (R_abs_exp_diff >= 2); 546 | const bool Is_R2 = sign_eff & !Is_R1 & N_no_normalize; 547 | const bool Is_R = !sign_eff | Is_R1 | Is_R2; 548 | 549 | 550 | 551 | if (R_exp_result.and_reduce() & Is_R) { 552 | Is_inf = true; 553 | } 554 | 555 | sgn_t tmp_s = (Is_inf) ? inf_sign : ((Is_R) ? R_sign_large : N_sign_large); 556 | man_t tmp_m = (Is_inf) ? ac_int(0) : ((Is_R) ? R_magn_result : N_chosen_sub.template slc(2)); 557 | exp_t tmp_e = (Is_inf) ? ac_int((1 << E) - 1) : ((Is_R) ? R_exp_result : N_exp_large); 558 | 559 | 560 | bool zero_res = (Is_R) ? Ris_zero : !(N_chosen_sub.or_reduce()); 561 | 562 | sgn_t tmp_s_A = (in_1_subnorm) ? a.sign : (sgn_t)0; 563 | man_t tmp_m_A = (in_1_subnorm) ? a.mantissa : (man_t)0; 564 | exp_t tmp_e_A = (in_1_subnorm) ? a.exponent : (exp_t)0; 565 | 566 | sgn_t tmp_s_B = (in_2_subnorm) ? sign : (sgn_t)0; 567 | man_t tmp_m_B = (in_2_subnorm) ? mantissa : (man_t)0; 568 | exp_t tmp_e_B = (in_2_subnorm) ? exponent : (exp_t)0; 569 | 570 | output.sign = (DENORMALS) ? tmp_s : ((in_1_subnorm) ? tmp_s_A : ((in_2_subnorm) ? tmp_s_B : ((zero_res) ? (sgn_t)0 : tmp_s))); 571 | output.exponent = (DENORMALS) ? tmp_e : ((in_1_subnorm) ? tmp_e_A : ((in_2_subnorm) ? tmp_e_B : ((zero_res) ? (exp_t)0 : tmp_e))); 572 | output.mantissa = (DENORMALS) ? tmp_m : ((in_1_subnorm) ? tmp_m_A : ((in_2_subnorm) ? tmp_m_B : tmp_m)); 573 | } 574 | 575 | 576 | template 577 | void fpma_dual(const fast_float a, const fast_float b, fast_float &output) { 578 | 579 | const bool t_in_a_is_inf = (exponent).and_reduce(); 580 | const bool t_in_c_is_inf = (a.exponent).and_reduce(); 581 | const bool t_in_b_is_inf = (b.exponent).and_reduce(); 582 | 583 | // Start by calculating the multiplication 584 | 585 | //Infinite check 586 | const bool mul_is_inf = t_in_a_is_inf | t_in_c_is_inf; 587 | 588 | // Find mul sign. 589 | const ac_int<1,false> mul_sign = sign ^ a.sign; 590 | 591 | // Create significants of mul. 592 | ac_int mul_signif_a = mantissa; 593 | ac_int mul_signif_b = a.mantissa; 594 | 595 | const ac_int<1,false> a_denorm = (exponent == 0); 596 | const ac_int<1,false> b_denorm = (a.exponent == 0); 597 | const ac_int<1,false> c_denorm = (b.exponent == 0); 598 | 599 | const ac_int<1,false> a_and_b_denorm = a_denorm & b_denorm; 600 | const ac_int<1,false> a_or_b_denorm = a_denorm ^ b_denorm; 601 | 602 | mul_signif_a[M] = (DENORMALS) ? ((a_denorm) ? 0 : 1) : 1; 603 | mul_signif_b[M] = (DENORMALS) ? ((b_denorm) ? 0 : 1) : 1; 604 | 605 | if (DENORMALS) { 606 | mul_signif_a <<= a_denorm; 607 | mul_signif_b <<= b_denorm; 608 | } 609 | 610 | // Calculate exponent result 611 | /*static*/ const ac_int mul_exp_base = (1 << (E-1)) - 1; 612 | /*static*/ const ac_int mul_exp_base_min_1 = (1 << (E-1)) - 2; 613 | const ac_int mul_exp_overf = exponent + a.exponent - mul_exp_base_min_1; 614 | const ac_int mul_exp = exponent + a.exponent - mul_exp_base; 615 | 616 | // Do the multiplication. 617 | /*static*/ const int mul_input_W = M + 1; 618 | /*static*/ const int mul_W = (mul_input_W) << 1; 619 | 620 | ac_int mul_prod1, mul_prod; 621 | 622 | mul_prod1 = mul_signif_a*mul_signif_b; 623 | 624 | mul_prod = (DENORMALS) ? mul_prod1 : ((a_denorm || b_denorm) ? (ac_int)0 : mul_prod1); 625 | 626 | ac_int<1,false> mul_overf = mul_prod[mul_W-1]; 627 | mul_prod <<= !mul_overf; 628 | ac_int mul_exp_result1 = (mul_overf) ? mul_exp_overf : mul_exp; 629 | ac_int mul_exp_result = (DENORMALS) ? mul_exp_result1 : ((a_denorm || b_denorm) ? (ac_int)0 : mul_exp_result1); 630 | 631 | // ONLY CHANGE FIX IT 632 | // ONLY CHANGE FIX IT 633 | // ONLY CHANGE FIX IT 634 | // ONLY CHANGE FIX IT 635 | // ONLY CHANGE FIX IT 636 | bool mul_zero = (DENORMALS) ? false : (a_denorm || b_denorm); 637 | int mul_prod_lz_cnt = 0; 638 | 639 | if (DENORMALS) { 640 | // int mul_prod_lz_cnt = (mul_prod).leading_sign(mul_zero); 641 | 642 | 643 | // 2*M+2 = 2*(23 + 1) = 48 644 | // 2*M+2 = 2*(7 + 1) = 16 645 | // 2*M+2 = 2*(3 + 1) = 8 646 | const int ww = (2*M+2 <= 8) ? 8 : 647 | (2*M+2 <= 16) ? 16 : 648 | (2*M+2 <= 32) ? 32 : 64; 649 | const int uu = ww - mul_W; 650 | ac_int tcz = 0; 651 | #pragma hls_unroll 652 | for (int ii=0; ii(tcz);//.leading_sign(mul_zero); 655 | 656 | 657 | if (mul_zero) { 658 | mul_exp_result = 0; 659 | } else { 660 | mul_prod <<= mul_prod_lz_cnt; 661 | mul_exp_result -= mul_prod_lz_cnt; 662 | } 663 | } 664 | // ONLY CHANGE FIX IT 665 | // ONLY CHANGE FIX IT 666 | // ONLY CHANGE FIX IT 667 | // ONLY CHANGE FIX IT 668 | // ONLY CHANGE FIX IT 669 | 670 | 671 | // Perform the addition 672 | 673 | //Infinite check 674 | bool add_is_inf = mul_is_inf | t_in_b_is_inf; 675 | 676 | // Calculate add effective operation. 677 | const ac_int<1,false> add_eff_sign = mul_sign ^ b.sign; 678 | 679 | // Create add significant. 680 | ac_int add_signif_c = (DENORMALS) ? b.mantissa : ((c_denorm) ? (man_t)0 : b.mantissa); 681 | add_signif_c[M] = (DENORMALS) ? ((c_denorm) ? 0 : 1) : 1; 682 | 683 | if (DENORMALS) add_signif_c <<= c_denorm; 684 | 685 | add_signif_c <<= M + 1; 686 | 687 | 688 | // Start of Far Path: 689 | 690 | // Compute exponent difference. 691 | 692 | const ac_int Far_exp_diff_1 = mul_exp_result - b.exponent; 693 | const ac_int Far_exp_diff_2 = b.exponent - mul_exp_result; 694 | 695 | ac_int Far_abs_exp_diff; 696 | 697 | // Initialize swap variables. 698 | 699 | ac_int Far_nsignif_small; 700 | ac_int Far_nsignif_large; 701 | ac_int Far_exp_large; 702 | ac_int<1,false> Far_sign_large; 703 | ac_int<1,false> Far_large_is_mul; 704 | 705 | const int Far_align_extra_W = M + 3; 706 | 707 | ac_int Far_small_signif_aligner; 708 | 709 | // Swap and allign. 710 | 711 | if (!Far_exp_diff_1[E+2]) { 712 | 713 | Far_nsignif_large = mul_prod; 714 | Far_exp_large = mul_exp_result; 715 | Far_sign_large = mul_sign; 716 | Far_nsignif_small = add_signif_c; 717 | Far_abs_exp_diff = Far_exp_diff_1.template slc(0); 718 | Far_large_is_mul = 1; 719 | 720 | } else if (!Far_exp_diff_2[E+2]) { 721 | 722 | Far_nsignif_large = add_signif_c; 723 | Far_exp_large = b.exponent; 724 | Far_sign_large = b.sign; 725 | Far_nsignif_small = mul_prod; 726 | Far_abs_exp_diff = Far_exp_diff_2.template slc(0); 727 | Far_large_is_mul = 0; 728 | 729 | } 730 | 731 | 732 | Far_small_signif_aligner = Far_nsignif_small; 733 | 734 | 735 | const int Far_align_max_sft = (Far_large_is_mul) ? mul_W : Far_align_extra_W; 736 | 737 | Far_small_signif_aligner <<= Far_align_extra_W; 738 | 739 | if (Far_abs_exp_diff < Far_align_max_sft) { 740 | Far_small_signif_aligner >>= Far_abs_exp_diff; 741 | } else { 742 | Far_small_signif_aligner >>= Far_align_max_sft; 743 | } 744 | 745 | 746 | Far_nsignif_small = Far_small_signif_aligner.template slc(Far_align_extra_W); 747 | 748 | 749 | const ac_int<1,false> Far_sticky = (Far_small_signif_aligner.template slc(0)).or_reduce(); 750 | const ac_int<1,false> Far_add_1 = (add_eff_sign) ? (!Far_sticky) : 0; 751 | 752 | const ac_int Far_exp_large_overf = Far_exp_large + 1; 753 | const ac_int Far_exp_large_underf = Far_exp_large - 1; 754 | ac_int Far_exp_result; 755 | 756 | 757 | const ac_int Far_nsignif_small_compl2 = (add_eff_sign) ? (~Far_nsignif_small) : Far_nsignif_small; 758 | 759 | const ac_int Far_sum_1 = Far_nsignif_large + Far_nsignif_small_compl2 + Far_add_1; 760 | const ac_int Far_sum_2 = Far_nsignif_small - Far_nsignif_large; 761 | ac_int<1,false> Far_sign_result; 762 | 763 | ac_int Far_sum; 764 | 765 | if (!Far_sum_2[mul_W+1]) { 766 | Far_sign_result = !Far_sign_large; 767 | Far_sum = Far_sum_2; 768 | } 769 | if (!Far_sum_1[mul_W+1]) { 770 | Far_sign_result = Far_sign_large; 771 | Far_sum = Far_sum_1; 772 | } 773 | 774 | 775 | const ac_int<1,false> Far_sticky_hold = Far_sum[0]; 776 | 777 | 778 | if (Far_sum[mul_W]) { 779 | 780 | Far_sum >>= 1; 781 | Far_sum[0] = Far_sum[0] | Far_sticky_hold; 782 | Far_exp_result = Far_exp_large_overf; 783 | 784 | } else if (!Far_sum[mul_W-1]) { 785 | 786 | Far_sum <<= 1; 787 | Far_exp_result = Far_exp_large_underf; 788 | 789 | } else { 790 | 791 | Far_exp_result = Far_exp_large; 792 | 793 | } 794 | 795 | 796 | // Start of Near Path: 797 | 798 | // 2-bit exponent difference. 799 | 800 | const ac_int<2,false> mul_exp_result_slc = mul_exp_result.template slc<2>(0); 801 | 802 | const ac_int<3,true> Near_exp_diff = mul_exp_result_slc - b.exponent.template slc<2>(0); 803 | 804 | // Swap and 1-bit allign. 805 | ac_int Near_nsignif_large = (Near_exp_diff[1]) ? add_signif_c : mul_prod; 806 | ac_int Near_exp_large = (Near_exp_diff[1]) ? (ac_int)b.exponent : (ac_int)mul_exp_result; 807 | ac_int<1,false> Near_sign_large = (Near_exp_diff[1]) ? b.sign : mul_sign; 808 | ac_int Near_nsignif_small = (Near_exp_diff[1]) ? mul_prod : add_signif_c; 809 | 810 | 811 | ac_int<1,false> Near_sticky_hold = 0; 812 | 813 | 814 | if (Near_exp_diff.or_reduce()) { 815 | Near_sticky_hold = Near_nsignif_small[0]; 816 | Near_nsignif_small >>= 1; 817 | } 818 | 819 | const ac_int<1,false> Near_add_1 = !Near_sticky_hold; 820 | 821 | 822 | // Significant substraction. 823 | 824 | const ac_int Near_large_sub_small = Near_nsignif_large + (~Near_nsignif_small) + Near_add_1; 825 | const ac_int Near_small_sub_large = Near_nsignif_small - Near_nsignif_large; 826 | ac_int Near_exp_result; 827 | 828 | 829 | ac_int Near_chosen_sub; 830 | ac_int<1,false> Near_sign_result; 831 | 832 | if (!Near_large_sub_small[mul_W]) { 833 | Near_sign_result = Near_sign_large; 834 | Near_chosen_sub = Near_large_sub_small; 835 | } else if (!Near_small_sub_large[mul_W]) { 836 | Near_sign_result = !Near_sign_large; 837 | Near_chosen_sub = Near_small_sub_large; 838 | } 839 | 840 | 841 | bool Near_zero = false; 842 | //const int Near_lz_cnt = (Near_chosen_sub).leading_sign(Near_zero); 843 | 844 | 845 | // 2*M+2 = 2*(23 + 1) = 48 846 | // 2*M+2 = 2*(7 + 1) = 16 847 | // 2*M+2 = 2*(3 + 1) = 8 848 | const int ww = (2*M+2 <= 8) ? 8 : 849 | (2*M+2 <= 16) ? 16 : 850 | (2*M+2 <= 32) ? 32 : 64; 851 | const int uu = ww - mul_W; 852 | ac_int tcz = 0; 853 | #pragma hls_unroll 854 | for (int ii=0; ii(tcz); 857 | 858 | 859 | 860 | if (Near_zero) { 861 | Near_exp_result = 0; 862 | } else { 863 | Near_chosen_sub <<= Near_lz_cnt; 864 | Near_exp_result = Near_exp_large - Near_lz_cnt; 865 | } 866 | 867 | const bool Is_Near = (Far_abs_exp_diff < 2) & add_eff_sign; 868 | 869 | ac_int Chosen_signif_result = (Is_Near) ? (ac_int)Near_chosen_sub : Far_sum; 870 | ac_int Chosen_exp_result = (Is_Near) ? Near_exp_result : Far_exp_result; 871 | ac_int<1,false> Chosen_sign_result = (Is_Near) ? Near_sign_result : Far_sign_result; 872 | ac_int<1,false> Chosen_sticky = (Is_Near) ? Near_sticky_hold : Far_sticky; 873 | 874 | // Round. 875 | 876 | /*static*/ const int inj_point = M + 1; 877 | 878 | ac_int<1,false> round; 879 | switch (RND_MODE) { 880 | 881 | case EVEN: 882 | // Round to nearest tie to even. 883 | round = Chosen_signif_result[inj_point-1] & (Chosen_signif_result[inj_point] | Chosen_signif_result[inj_point-2] | Chosen_sticky); 884 | break; 885 | case ODD: 886 | // Round to nearest tie to odd. 887 | round = Chosen_signif_result[inj_point-1] & (Chosen_signif_result[inj_point] | (!Chosen_signif_result[inj_point-2]) | Chosen_sticky); 888 | break; 889 | case INF: 890 | // Round infinity. 891 | round = Chosen_signif_result[inj_point-1]; 892 | break; 893 | 894 | } 895 | 896 | 897 | ac_int Final_signif = Chosen_signif_result.template slc(inj_point); 898 | 899 | bool zero_res = !(Final_signif.or_reduce() | round); 900 | Chosen_sign_result = (zero_res) ? mul_sign : Chosen_sign_result; 901 | 902 | ac_int Final_signif_result = Final_signif + round; 903 | 904 | ac_int Chosen_exp_result_overf = Chosen_exp_result + 1; 905 | ac_int Final_exp_result; 906 | 907 | 908 | if (Final_signif_result[M+1]) { 909 | Final_signif_result >>= 1; 910 | Final_exp_result = Chosen_exp_result_overf; 911 | } else { 912 | Final_exp_result = Chosen_exp_result; 913 | } 914 | 915 | add_is_inf = (Final_exp_result >= ((1 << E) - 1)) ? true : add_is_inf; 916 | 917 | const ac_int<1,false> inf_sign = (t_in_b_is_inf) ? b.sign : mul_sign; 918 | 919 | 920 | output.sign = (add_is_inf) ? inf_sign :((zero_res) ? (sgn_t)0 : Chosen_sign_result); 921 | output.exponent = (add_is_inf) ? (exp_t)((1 << E) - 1) : ((zero_res) ? (exp_t)0 : Final_exp_result.template slc(0)); 922 | output.mantissa = (add_is_inf) ? (man_t)0 : Final_signif_result.template slc(0); 923 | } 924 | 925 | 926 | template 927 | void fpmul(const fast_float a, fast_float &output) { 928 | 929 | static const ac_int mul_exp_base = (1 << (E-1)) - 1; 930 | static const int signif_W = M + 1; 931 | static const int mul_W = (signif_W) << 1; 932 | 933 | ac_int<1,false> a_is_zero, c_is_zero; 934 | 935 | // Sign Calculation 936 | const ac_int<1,false> sign_res = sign ^ a.sign; 937 | 938 | // Create significants of mul. 939 | ac_int mul_signif_a = mantissa; 940 | ac_int mul_signif_c = a.mantissa; 941 | 942 | ac_int<1,false> is_a_subnormal = (exponent == 0); 943 | ac_int<1,false> is_c_subnormal = (a.exponent == 0); 944 | 945 | mul_signif_a[M] = (DENORMALS) ? ((is_a_subnormal) ? 0 : 1) : 1; 946 | mul_signif_c[M] = (DENORMALS) ? ((is_c_subnormal) ? 0 : 1) : 1; 947 | 948 | if (DENORMALS) { 949 | mul_signif_a <<= is_a_subnormal; 950 | mul_signif_c <<= is_c_subnormal; 951 | 952 | a_is_zero = ~(mul_signif_a.or_reduce()); 953 | c_is_zero = ~(mul_signif_c.or_reduce()); 954 | } 955 | 956 | // Infinity Check. 957 | 958 | bool Is_inf = ((exponent).and_reduce() | (a.exponent).and_reduce()); 959 | 960 | // Calculate exponent result and overf exponent result. 961 | ac_int mul_exp = (DENORMALS) ? 962 | ((a_is_zero | c_is_zero) ? (ac_int)0 : (ac_int)(exponent + a.exponent - mul_exp_base)) : 963 | ((is_a_subnormal | is_c_subnormal)) ? (ac_int)0 : (ac_int)(exponent + a.exponent - mul_exp_base); 964 | if (mul_exp < 0) 965 | mul_exp = 0; 966 | else if (mul_exp >= ((1< mul_exp_overf = (DENORMALS) ? 971 | ((a_is_zero | c_is_zero) ? (ac_int)0 : (ac_int)(exponent + a.exponent - mul_exp_base + 1)) : 972 | ((is_a_subnormal | is_c_subnormal)) ? (ac_int)0 : (ac_int)(exponent + a.exponent - mul_exp_base + 1); 973 | if (mul_exp_overf < 0) 974 | mul_exp_overf = 0; 975 | else if (mul_exp_overf >= ((1< right_shift; 979 | if (DENORMALS) { 980 | right_shift = (a_is_zero | c_is_zero) ? (ac_int)0 : (ac_int)(mul_exp_base - exponent - a.exponent); 981 | if (right_shift < 0) 982 | right_shift = 0; 983 | else if (right_shift > M+2) 984 | right_shift = M+2; 985 | 986 | } 987 | 988 | ac_int<1,false> mul_zero = (DENORMALS) ? (a_is_zero | c_is_zero) : (is_a_subnormal | is_c_subnormal); 989 | 990 | // Do the multiplication. 991 | ac_int mul_res = mul_signif_a*mul_signif_c; 992 | ac_int mul_prod = (DENORMALS) ? ((a_is_zero | c_is_zero) ? (ac_int)0 : mul_res) : ((is_a_subnormal | is_c_subnormal) ? (ac_int)0 : mul_res); 993 | 994 | 995 | // Overflow Check. 996 | ac_int<1,false> mul_overflow = mul_prod[mul_W-1]; 997 | ac_int exp_res = (mul_overflow) ? mul_exp_overf : mul_exp; 998 | 999 | // Normalization. 1000 | if (DENORMALS) { 1001 | // const ac_int::val,false> mul_lzc = mul_prod.leading_sign(); 1002 | 1003 | 1004 | // 2*M+2 = 2*(23 + 1) = 48 1005 | // 2*M+2 = 2*(7 + 1) = 16 1006 | // 2*M+2 = 2*(3 + 1) = 8 1007 | const int ww = (2*M+2 <= 8) ? 8 : 1008 | (2*M+2 <= 16) ? 16 : 1009 | (2*M+2 <= 32) ? 32 : 64; 1010 | const int uu = ww - mul_W; 1011 | ac_int tcz = 0; 1012 | #pragma hls_unroll 1013 | for (int ii=0; ii::val,false> mul_lzc = lzcount(tcz); 1016 | 1017 | if (exp_res==0) { 1018 | mul_prod >>= right_shift; 1019 | } else { 1020 | //mul_prod <<= mul_lzc; 1021 | if (mul_lzc >= exp_res) { 1022 | mul_prod <<= exp_res; 1023 | exp_res = 0; 1024 | } else { 1025 | mul_prod <<= (mul_lzc <= 1) ? (ac_int::val,false>)0 : (ac_int::val,false>)(mul_lzc-1); 1026 | exp_res -= (mul_lzc <= 1) ? (ac_int::val,false>)0 : (ac_int::val,false>)(mul_lzc-1); 1027 | } 1028 | } 1029 | 1030 | // Subnormal Result Check. 1031 | mul_prod >>= ((exp_res == 0) && (!mul_overflow)); 1032 | } 1033 | 1034 | 1035 | 1036 | // Injection Rounding. 1037 | const int inj_point = M; 1038 | 1039 | ac_int<1,false> mul_round; 1040 | switch (RND_MODE) { 1041 | 1042 | case EVEN: 1043 | // Round to nearest tie to even. 1044 | mul_round = (mul_overflow) ? mul_prod[inj_point] & (mul_prod[inj_point+1] | mul_prod[inj_point-1] | (mul_prod.template slc(0)).or_reduce()) : 1045 | mul_prod[inj_point-1] & (mul_prod[inj_point] | mul_prod[inj_point-2] | (mul_prod.template slc(0)).or_reduce()); 1046 | break; 1047 | case ODD: 1048 | // Round to nearest tie to odd. 1049 | mul_round = (mul_overflow) ? mul_prod[inj_point] & (mul_prod[inj_point+1] | !mul_prod[inj_point-1] | (mul_prod.template slc(0)).or_reduce()) : 1050 | mul_prod[inj_point-1] & (mul_prod[inj_point] | !mul_prod[inj_point-2] | (mul_prod.template slc(0)).or_reduce()); 1051 | break; 1052 | case INF: 1053 | // Round infinity. 1054 | mul_round = (mul_overflow) ? mul_prod[inj_point] : mul_prod[inj_point-1]; 1055 | break; 1056 | 1057 | } 1058 | 1059 | // TODO: check if moving addition after saves area 1060 | ac_int mul_rounded = (mul_overflow) ? mul_prod.template slc(inj_point+1) + mul_round : mul_prod.template slc(inj_point) + mul_round; 1061 | 1062 | ac_int<1,false> extra_shift = 0; 1063 | ac_int<1,false> extra_exp = 0; 1064 | // Rounding Overflow Check. 1065 | if (DENORMALS) { 1066 | if ((exp_res == 0) && mul_rounded[M]) { 1067 | extra_shift = 0; 1068 | extra_exp = 1; 1069 | } 1070 | } else { 1071 | if (mul_rounded[M+1]) { 1072 | extra_shift = 1; 1073 | extra_exp = 1; 1074 | } 1075 | } 1076 | 1077 | exp_t tmp_exp = exp_res.template slc(0); 1078 | exp_t mul_exp_result = (tmp_exp == (1<(extra_shift); 1087 | } 1088 | 1089 | // TODO : Support for denormals 1090 | template 1091 | void dotProd(const fast_float A[N], const fast_float B[N]) { 1092 | 1093 | static const ac_int mul_exp_base = e_bias; 1094 | static const ac_int mul_exp_base_min_1 = e_bias-1; 1095 | static const int mul_input_W = M + 1; 1096 | static const int mul_W = (mul_input_W) << 1; 1097 | 1098 | bool AisInf[N], BisInf[N], AisZero[N], BisZero[N]; 1099 | 1100 | sgn_t infSign; 1101 | sgn_t mulSign[N]; 1102 | 1103 | ac_int fracA[N], fracB[N]; 1104 | 1105 | 1106 | ac_int mulisInf; 1107 | ac_int mul_exp_overf[N]; 1108 | ac_int mul_exp[N]; 1109 | ac_int mul_exp_result[N]; 1110 | 1111 | #pragma hls_unroll 1112 | INP_DEC: for (int i=0; i< N; i++){ 1113 | // Check for infinite values 1114 | AisInf[i] = A[i].exponent.and_reduce(); 1115 | BisInf[i] = B[i].exponent.and_reduce(); 1116 | 1117 | // Check for zero values (DENORMALS==0) 1118 | AisZero[i] = A[i].exponent == 0; 1119 | BisZero[i] = B[i].exponent == 0; 1120 | 1121 | mulSign[i] = A[i].sign ^ B[i].sign; 1122 | 1123 | mulisInf[i] = AisInf[i] | BisInf[i]; 1124 | infSign =mulSign[i]; // TODO : check sign for infinity 1125 | 1126 | fracA[i] = A[i].mantissa; 1127 | fracA[i][M] = 1; 1128 | 1129 | fracB[i] = B[i].mantissa; 1130 | fracB[i][M] = 1; 1131 | 1132 | // Calculate exponent result 1133 | 1134 | 1135 | mul_exp[i] = (AisZero[i] || BisZero[i]) ? (ac_int )0 : A[i].exponent + B[i].exponent - mul_exp_base; 1136 | if (mul_exp[i]<0) 1137 | mul_exp[i] = 0; 1138 | else if (mul_exp[i] >= ((1< )0 : A[i].exponent + B[i].exponent - mul_exp_base_min_1; 1142 | if (mul_exp_overf[i]<0) 1143 | mul_exp_overf[i] = 0; 1144 | else if (mul_exp_overf[i] >= ((1< mul_prod[N]; 1151 | ac_int<1,false> mul_overf[N]; 1152 | 1153 | #pragma hls_unroll 1154 | DO_MUL: for (int i=0; i= ((1< addisInf = mulisInf.or_reduce(); // check infinity 1177 | 1178 | ac_int maxExp = max(mul_exp_result); // find max exponent 1179 | 1180 | ac_int shifted_exp_res[N]; 1181 | ac_int shifted_prod[N]; 1182 | ac_int diffE[N]; 1183 | #pragma hls_unroll 1184 | ALLIGN: for (int i=0; i> diffE[i]; 1187 | shifted_exp_res[i] = mul_exp_result[i] + diffE[i]; 1188 | } 1189 | 1190 | ac_int add_op[N]; 1191 | ac_int acc=0; 1192 | 1193 | #pragma hls_unroll 1194 | TWOs_COMPL_ADD: for (int i=0; i res_sign = acc[mul_W+N]; 1205 | 1206 | ac_int res1 = acc; 1207 | ac_int res2 = acc.bit_complement(); 1208 | 1209 | ac_int res; 1210 | res = (res_sign) ? res2.template slc(0) : res1.template slc(0); 1211 | 1212 | // const int lead_zer = res.leading_sign(); 1213 | // mul_W+N = (23 + 1)*2 + 4 = 52 (or 56 for dot<8>) 1214 | // mul_W+N = (7 + 1)*2 + 4 = 20 (or 24 for dot<8>) 1215 | // mul_W+N = (3 + 1)*2 + 4 = 12 (or 16 for dot<8>) 1216 | const int ww = (2*M+2+N <= 8) ? 8 : 1217 | (2*M+2+N <= 16) ? 16 : 1218 | (2*M+2+N <= 32) ? 32 : 64; 1219 | const int uu = ww - mul_W - N; 1220 | ac_int tcz = 0; 1221 | #pragma hls_unroll 1222 | for (int ii=0; ii(tcz); 1225 | 1226 | res <<= lead_zer; 1227 | maxExp -= (lead_zer); 1228 | maxExp += (lead_zer==0) ? N-1 : N; 1229 | 1230 | // res width = 2M+2+N, we need to keep 1+M bits, so we start 1231 | // from the M+N+2-1 index and keep M+1 1232 | static const int ind = M+N+1; 1233 | ac_int rounded_res = res.template slc(ind); 1234 | 1235 | ac_int<1,false> mul_round; 1236 | switch (RND_MODE) { 1237 | 1238 | case EVEN: 1239 | // Round to nearest tie to even. 1240 | mul_round = res[ind-1] & ((res[ind] | res[ind-2] | (res.template slc(0)).or_reduce())); 1241 | break; 1242 | case ODD: 1243 | // Round to nearest tie to odd. 1244 | mul_round = res[ind-1] & ((res[ind] | res[ind-2] | ~(res.template slc(0)).or_reduce())); 1245 | break; 1246 | case INF: 1247 | // Round infinity. 1248 | mul_round = res[ind-1]; 1249 | break; 1250 | 1251 | } 1252 | rounded_res += (mul_round+res_sign); 1253 | 1254 | exp_t tmp_exp = maxExp.template slc(0); 1255 | exp_t over_exp = (tmp_exp == (1<(1) : rounded_res.template slc(0); 1258 | exponent = (addisInf) ? (exp_t)((1< int_bin = int_part; 1274 | ac_fixed<32,0,false> fra_bin = fra_part; 1275 | 1276 | int right_shift = -1; 1277 | if (int_bin > 0) { 1278 | for (int i = 0; i < 32; i++) { 1279 | if (int_bin[i] == 1) { 1280 | right_shift = i; 1281 | } 1282 | } 1283 | } 1284 | int left_shift = -1; 1285 | for (int i = 0; i < 32; i++) { 1286 | if (fra_bin[i] == 1) { 1287 | left_shift = 32- i; 1288 | } 1289 | } 1290 | 1291 | ac_int<64,false> bin; 1292 | 1293 | for(int i = 0; i < 32; i++) { 1294 | bin[i] = fra_bin[i]; 1295 | } 1296 | for(int i = 0; i < 32; i++) { 1297 | bin[32+i] = int_bin[i]; 1298 | } 1299 | 1300 | int e = 0; 1301 | if (right_shift >= 0) { 1302 | bin = bin >> right_shift; 1303 | e = right_shift; 1304 | } else if (left_shift >= 0) { 1305 | bin = bin << left_shift; 1306 | e = -left_shift; 1307 | } 1308 | 1309 | e += e_bias; 1310 | iszer = (iszer || (e<0)) ? true : false; 1311 | 1312 | int maxE = ((1 << (E)) - 1); 1313 | bool isinf = (e >= maxE) ? true : false; 1314 | 1315 | sign = (iszer) ? (sgn_t)0 : ((inFP < 0) ? (sgn_t)1 : (sgn_t)0); 1316 | exponent = (iszer) ? (exp_t)0 : ((isinf) ? (exp_t)((1 << (E)) - 1) : (exp_t)e); 1317 | mantissa = (iszer) ? (man_t)0 : ((isinf) ? (man_t)0 : (man_t)(bin.template slc(32-M))); 1318 | 1319 | #endif 1320 | } 1321 | 1322 | void operator = (const ac_int &in) { 1323 | sign = in[M+E]; 1324 | exponent = in.template slc(M); 1325 | mantissa = in.template slc(0); 1326 | } 1327 | 1328 | void operator = (const fast_float &in) { 1329 | mantissa = in.mantissa; 1330 | exponent = in.exponent; 1331 | sign = in.sign; 1332 | } 1333 | 1334 | fast_float operator + (const fast_float &b) { 1335 | fast_float r; 1336 | fpa_dual(b,r); 1337 | return r; 1338 | } 1339 | 1340 | fast_float operator - (const fast_float &b) { 1341 | fast_float r, tmp; 1342 | tmp = b; 1343 | tmp.sign = ~tmp.sign; 1344 | fpa_dual(tmp,r); 1345 | return r; 1346 | } 1347 | 1348 | fast_float operator * (const fast_float &b) { 1349 | fast_float r; 1350 | fpmul(b,r); 1351 | return r; 1352 | } 1353 | 1354 | fast_float &operator += (const fast_float &b) { 1355 | *this = this->operator+(b); 1356 | return *this; 1357 | } 1358 | 1359 | fast_float &operator -= (const fast_float &b) { 1360 | *this = this->operator-(b); 1361 | return *this; 1362 | } 1363 | 1364 | fast_float &operator *= (const fast_float &b) { 1365 | *this = this->operator*(b); 1366 | return *this; 1367 | } 1368 | 1369 | bool operator == (const fast_float b) { 1370 | return ((sign == b.sign) && (mantissa == b.mantissa) && (exponent == b.exponent)); 1371 | } 1372 | 1373 | bool operator != (const fast_float b) { 1374 | return ((sign ^ b.sign) || (mantissa != b.mantissa) || (exponent != b.exponent)); 1375 | } 1376 | 1377 | bool operator > (const fast_float b) { 1378 | bool greaterA = (exponent>b.exponent || (exponent==b.exponent && mantissa>b.mantissa)); 1379 | bool greaterB = (exponent b) { 1385 | bool lessA = (exponentb.exponent || (exponent==b.exponent && mantissa>b.mantissa)); 1387 | bool less = (sign == 0) ? lessA : lessB; 1388 | return (sign > b.sign || (sign==b.sign && less)); 1389 | } 1390 | 1391 | bool operator >= (const fast_float b) { 1392 | bool grOReqA = exponent>b.exponent || (exponent==b.exponent && mantissa>=b.mantissa); 1393 | bool grOReqB = exponent b) { 1399 | bool lsOReqA = exponentb.exponent || (exponent==b.exponent && mantissa>=b.mantissa); 1401 | bool lsOReq = (sign==0) ? lsOReqA : lsOReqB; 1402 | return (sign>b.sign || (sign==b.sign && lsOReq)); 1403 | } 1404 | 1405 | }; 1406 | 1407 | // double-precission IEEE754 1408 | typedef fast_float<52,11> ffp64; 1409 | // single-precission IEEE754 1410 | typedef fast_float<23,8> ffp32; 1411 | // half-precission IEEE754 1412 | typedef fast_float<10,5> ffp16; 1413 | // bfloat16 1414 | typedef fast_float<7, 8> ffp16b; 1415 | 1416 | #endif 1417 | -------------------------------------------------------------------------------- /set_libs.sh: -------------------------------------------------------------------------------- 1 | # Copyright 2022 Democritus University of Thrace 2 | # Integrated Circuits Lab 3 | # 4 | # Shell script to automatically download required libraries for Fast-Float4HLS examples 5 | 6 | # Configure Fast-Float4HLS 7 | if [ ! -d ./Fast-Float4HLS ]; then 8 | echo "Downloading Fast-Float4HLS..." 9 | git clone https://github.com/ic-lab-duth/Fast-Float4HLS.git 10 | fi 11 | FAST_FLOAT=`pwd`/Fast-Float4HLS 12 | export FAST_FLOAT 13 | 14 | # Configure AC Datatypes 15 | if [ ! -d ./ac_types ]; then 16 | echo "Downloading AC_Types..." 17 | git clone http://github.com/hlslibs/ac_types.git 18 | fi 19 | AC_TYPES=`pwd`/ac_types 20 | export AC_TYPES 21 | 22 | # Configure AC Simutils 23 | if [ ! -d ./ac_simutils ]; then 24 | echo "Downloading AC_Simutils..." 25 | git clone http://github.com/hlslibs/ac_simutils.git 26 | fi 27 | AC_SIMUTILS=`pwd`/ac_simutils 28 | export AC_SIMUTILS --------------------------------------------------------------------------------