Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
KiT-RT
KiT-RT
Commits
bf911fca
Commit
bf911fca
authored
Feb 16, 2021
by
steffen.schotthoefer
Browse files
Merge branch 'develop' into 'master'
Develop See merge request
!39
parents
cf7f8e3a
765aa5a4
Pipeline
#135520
passed with stage
in 18 minutes and 5 seconds
Changes
126
Pipelines
2
Hide whitespace changes
Inline
Side-by-side
.gitlab-ci.yml
View file @
bf911fca
...
...
@@ -7,17 +7,17 @@ unit_tests:
stage
:
unit_tests
script
:
-
git submodule update --init --recursive
-
cd code/build/
release
-
cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -D
build_tests
=ON ../../
-
cd code/build/
debug
-
cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug -D
BUILD_TESTS
=ON ../../
-
ninja
-
OMP_NUM_THREADS=1 ./unit_tests -r junit > unit_tests_report.xml
-
gcovr -e ../../ext/ -e ../../tests/ -r ../../
artifacts
:
when
:
always
paths
:
-
code/build/
release
/unit_tests_report.xml
-
code/build/
debug
/unit_tests_report.xml
reports
:
junit
:
code/build/
release
/unit_tests_report.xml
junit
:
code/build/
debug
/unit_tests_report.xml
timeout
:
4h
rules
:
-
if
:
$CI_PIPELINE_SOURCE == "merge_request_event" || $CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH == "develop"
...
...
.gitmodules
View file @
bf911fca
...
...
@@ -10,3 +10,6 @@
[submodule "code/ext/parmetis"]
path = code/ext/parmetis
url = https://github.com/slydex/parmetis.git
[submodule "code/ext/neuralEntropy"]
path = code/ext/neuralEntropy
url = https://github.com/ScSteffen/neuralEntropy.git
Dockerfile
0 → 100644
View file @
bf911fca
FROM
ubuntu:20.04
ENV
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib" \
PYTHONPATH=/usr/local/gmsh/lib:$PYTHONPATH \
PATH=/opt/conda/bin:/usr/local/gmsh/bin:$PATH
RUN
apt-get update
\
&&
DEBIAN_FRONTEND
=
noninteractive apt-get
install
-qq
\
gcc
\
g++
\
libopenmpi-dev
\
openmpi-bin
\
libblas-dev
\
liblapack-dev
\
git
\
make
\
ninja-build
\
cmake
\
wget
\
ssh
\
libssl-dev
\
libxt-dev
\
libgl1-mesa-dev
\
libglu1
\
libxrender1
\
libxcursor-dev
\
libxft-dev
\
libxinerama-dev
\
python3
\
python3-pip
\
vim
RUN
pip3
install
tensorflow
==
2.2.2
\
pygmsh
==
6.1.1 Pillow pydicom gcovr
\
matplotlib
\
scipy
RUN
cd
/usr/local
\
&&
wget
-nc
--quiet
http://gmsh.info/bin/Linux/gmsh-4.7.0-Linux64-sdk.tgz
\
&&
tar
xzf gmsh-4.7.0-Linux64-sdk.tgz
\
&&
mv
gmsh-4.7.0-Linux64-sdk gmsh
\
&&
rm
gmsh-4.7.0-Linux64-sdk.tgz
RUN
wget
-nc
--no-check-certificate
--quiet
https://www.vtk.org/files/release/8.2/VTK-8.2.0.tar.gz
\
&&
tar
xzf VTK-8.2.0.tar.gz
\
&&
mkdir
VTK-8.2.0/build
\
&&
cd
VTK-8.2.0/build
\
&&
cmake
-G
Ninja
-DCMAKE_BUILD_TYPE
=
Release
-DBUILD_DOCUMENTATION
=
OFF
-DBUILD_TESTING
=
OFF ../
\
&&
ninja
\
&&
ninja
install
>
/dev/null
\
&&
cd
-
\
&&
rm
-rf
VTK-
*
RUN
apt-get clean
\
&&
apt-get autoremove
--purge
\
&&
rm
-rf
/var/lib/apt/lists/
*
WORKDIR
/home
README.md
View file @
bf911fca
...
...
@@ -20,6 +20,11 @@ TBD
-
VTK
-
git
-
ninja or make
-
gmsh
### Python dependencies
-
pygmsh version 6.1.1 'pip install pygmsh==6.1.1' (note that newer versions are not yet supported)
### Obtain submodules
Note that an
**active internet connection is required for the first build**
in order to download the latest versions of the required submodules!
...
...
code/CMakeLists.txt
View file @
bf911fca
...
...
@@ -2,7 +2,8 @@ cmake_minimum_required( VERSION 3.12.4 )
project
(
KiT-RT VERSION 0.1.0 LANGUAGES CXX
)
### OPTIONS #####################################
option
(
build_tests
"enables compiling of unit_tests"
OFF
)
option
(
BUILD_TESTS
"builds all available unit tests"
OFF
)
option
(
BUILD_GUI
"additionally builds a user interface"
OFF
)
#################################################
### COMPILER ####################################
...
...
@@ -27,7 +28,7 @@ include_directories( ${LAPACK_INCLUDE_DIR} )
find_package
(
BLAS
)
find_package
(
VTK
REQUIRED
COMPONENTS vtkIOGeometry vtkFiltersCore
)
find_package
(
VTK COMPONENTS vtkIOGeometry vtkFiltersCore
REQUIRED
)
find_package
(
Python3 COMPONENTS Interpreter Development NumPy REQUIRED
)
include_directories
(
${
Python3_INCLUDE_DIRS
}
${
Python3_NumPy_INCLUDE_DIRS
}
)
...
...
@@ -73,6 +74,13 @@ add_compile_definitions( GIT_HASH="${GIT_HASH}" )
### BUILD KIT-RT ################################
file
(
GLOB_RECURSE SRCS RELATIVE
${
CMAKE_SOURCE_DIR
}
"src/*.cpp"
"include/*.h"
)
set
(
EXCLUDE_DIR
"/gui/"
)
foreach
(
TMP_PATH
${
SRCS
}
)
string
(
FIND
${
TMP_PATH
}
${
EXCLUDE_DIR
}
EXCLUDE_DIR_FOUND
)
if
(
NOT
${
EXCLUDE_DIR_FOUND
}
EQUAL -1
)
list
(
REMOVE_ITEM SRCS
${
TMP_PATH
}
)
endif
()
endforeach
(
TMP_PATH
)
include_directories
(
${
CMAKE_SOURCE_DIR
}
/include
)
add_executable
(
${
CMAKE_PROJECT_NAME
}
${
SRCS
}
${
EXT_SRCS
}
)
target_link_libraries
(
${
CMAKE_PROJECT_NAME
}
${
CORE_LIBRARIES
}
)
...
...
@@ -84,18 +92,18 @@ target_compile_options( ${CMAKE_PROJECT_NAME} PUBLIC "$<$<CONFIG:RELEASE>:${KITR
### BUILD UNIT TESTS ############################
if
(
build_tests
)
if
(
BUILD_TESTS
)
include
(
CTest
)
set
(
CMAKE_MODULE_PATH
${
PROJECT_SOURCE_DIR
}
/ext/Catch2/contrib
${
CMAKE_MODULE_PATH
}
)
include
(
Catch
)
set
(
CATCH_INCLUDE_DIR
${
CMAKE_SOURCE_DIR
}
/ext/Catch2/single_include/catch2
)
add_compile_definitions
(
BUILD_TESTING
)
add_compile_definitions
(
TESTS_PATH=
"
${
CMAKE_SOURCE_DIR
}
/tests/"
)
add_library
(
Catch INTERFACE
)
target_include_directories
(
Catch INTERFACE
${
CATCH_INCLUDE_DIR
}
)
file
(
GLOB_RECURSE TEST_SRCS RELATIVE
${
CMAKE_SOURCE_DIR
}
"tests/*.cpp"
)
list
(
REMOVE_ITEM SRCS
"src/main.cpp"
)
add_executable
(
unit_tests
${
TEST_SRCS
}
${
SRCS
}
${
EXT_SRCS
}
)
target_compile_definitions
(
unit_tests PUBLIC BUILD_TESTING
)
target_compile_definitions
(
unit_tests PUBLIC TESTS_PATH=
"
${
CMAKE_SOURCE_DIR
}
/tests/"
)
target_link_libraries
(
unit_tests Catch
${
CORE_LIBRARIES
}
)
target_compile_options
(
unit_tests PUBLIC
"$<$<CONFIG:DEBUG>:
${
KITRT_DEBUG_OPTIONS
}
>"
)
if
(
CMAKE_COMPILER_IS_GNUCXX
)
...
...
@@ -108,3 +116,25 @@ if( build_tests )
catch_discover_tests
(
unit_tests
)
endif
()
#################################################
### BUILD GUI ###################################
if
(
BUILD_GUI
)
find_package
(
Qt5 COMPONENTS Core Widgets Gui OpenGL REQUIRED
)
find_package
(
VTK COMPONENTS vtkGUISupportQt vtkInteractionStyle vtkInteractionWidgets vtkRenderingAnnotation vtkRenderingCore vtkRenderingFreeType vtkRenderingOpenGL2 REQUIRED
)
include_directories
(
${
CMAKE_SOURCE_DIR
}
/include/gui
)
file
(
GLOB_RECURSE GUI_SRCS RELATIVE
${
CMAKE_SOURCE_DIR
}
"src/gui/*"
)
file
(
GLOB_RECURSE GUI_INCL RELATIVE
${
CMAKE_SOURCE_DIR
}
"include/gui/*"
)
add_executable
(
${
CMAKE_PROJECT_NAME
}
_gui
${
SRCS
}
${
EXT_SRCS
}
${
GUI_SRCS
}
${
GUI_INCL
}
)
target_compile_definitions
(
${
CMAKE_PROJECT_NAME
}
_gui PUBLIC BUILD_GUI
)
set_target_properties
(
${
CMAKE_PROJECT_NAME
}
_gui PROPERTIES AUTOMOC ON
)
set_target_properties
(
${
CMAKE_PROJECT_NAME
}
_gui PROPERTIES AUTOUIC ON
)
set_target_properties
(
${
CMAKE_PROJECT_NAME
}
_gui PROPERTIES AUTORCC ON
)
set
(
GUI_LIBRARIES Qt5::Core Qt5::Widgets Qt5::Gui Qt5::OpenGL
${
VTK_LIBRARIES
}
)
target_link_libraries
(
${
CMAKE_PROJECT_NAME
}
_gui
${
CORE_LIBRARIES
}
${
GUI_LIBRARIES
}
)
set_target_properties
(
${
CMAKE_PROJECT_NAME
}
_gui PROPERTIES RUNTIME_OUTPUT_DIRECTORY
"
${
CMAKE_SOURCE_DIR
}
/bin"
)
target_compile_options
(
${
CMAKE_PROJECT_NAME
}
_gui PUBLIC
"$<$<CONFIG:DEBUG>:
${
KITRT_DEBUG_OPTIONS
}
>"
)
target_compile_options
(
${
CMAKE_PROJECT_NAME
}
_gui PUBLIC
"$<$<CONFIG:RELWITHDEBINFO>:
${
KITRT_RELWITHDEBINFO_OPTIONS
}
>"
)
target_compile_options
(
${
CMAKE_PROJECT_NAME
}
_gui PUBLIC
"$<$<CONFIG:RELEASE>:
${
KITRT_RELEASE_OPTIONS
}
>"
)
endif
()
#################################################
neuralEntropy
@
54f38c0a
Subproject commit 54f38c0a6154004efa2f8cad4737d127f6dcde59
code/include/common/config.h
View file @
bf911fca
...
...
@@ -4,8 +4,6 @@
* DO NOT CREATE SETTERS FOR THIS CLASS! ALL OPTIONS ARE CONSTANT (after SetPostprocessing).
*
* @author S. Schotthöfer
*
* Disclaimer: This class structure was copied and (heavily) modifed with open source permission from SU2 v7.0.3 https://su2code.github.io/
*/
#ifndef CONFIG_H
...
...
@@ -50,7 +48,17 @@ class Config
unsigned
_nQuadPoints
;
// Mesh
unsigned
_nCells
;
unsigned
_nCells
;
/*!< @brief: Number of cells in the mesh */
unsigned
short
_dim
;
/*!< @brief: spatial dimensionality of the mesh/test case */
// Boundary Conditions
/*!< @brief List of all Pairs (marker, BOUNDARY_TYPE), e.g. (farfield,DIRICHLET).
Each Boundary Conditions must have an entry in enum BOUNDARY_TYPE*/
std
::
vector
<
std
::
pair
<
std
::
string
,
BOUNDARY_TYPE
>>
_boundaries
;
unsigned
short
_nMarkerDirichlet
;
/*!< @brief Number of Dirichlet BC markers. Enum entry: DIRICHLET */
unsigned
short
_nMarkerNeumann
;
/*!< @brief Number of Neumann BC markers. Enum entry: Neumann */
std
::
vector
<
std
::
string
>
_MarkerDirichlet
;
/*!< @brief Dirichlet BC markers. */
std
::
vector
<
std
::
string
>
_MarkerNeumann
;
/*!< @brief Neumann BC markers. */
// Solver
double
_CFL
;
/*!< @brief CFL Number for Solver*/
...
...
@@ -61,26 +69,23 @@ class Config
unsigned
short
_maxMomentDegree
;
/*!< @brief Maximal Order of Moments for PN and MN Solver */
unsigned
short
_reconsOrder
;
/*!< @brief Spatial Order of Accuracy for Solver */
// Linesource
double
_sigmaS
;
/*!< @brief Scattering coeffient for Linesource test case */
/*!< @brief If true, very low entries (10^-10 or smaller) of the flux matrices will be set to zero,
* to improve floating point accuracy */
bool
_cleanFluxMat
;
bool
_allGaussPts
;
/*!< @brief If true, the SN Solver uses all Gauss pts in the quadrature */
bool
_csd
;
/*!< @brief If true, continuous slowing down approximation will be used */
bool
_csd
;
// LEGACY! /*!< @brief If true, continuous slowing down approximation will be used */
std
::
string
_hydrogenFile
;
/*!< @brief Name of hydrogen cross section file */
std
::
string
_oxygenFile
;
/*!< @brief Name of oxygen cross section file */
// --- Problems ---
// Boundary Conditions
/*!< @brief List of all Pairs (marker, BOUNDARY_TYPE), e.g. (farfield,DIRICHLET).
Each Boundary Conditions must have an entry in enum BOUNDARY_TYPE*/
std
::
vector
<
std
::
pair
<
std
::
string
,
BOUNDARY_TYPE
>>
_boundaries
;
unsigned
short
_nMarkerDirichlet
;
/*!< @brief Number of Dirichlet BC markers. Enum entry: DIRICHLET */
unsigned
short
_nMarkerNeumann
;
/*!< @brief Number of Neumann BC markers. Enum entry: Neumann */
std
::
vector
<
std
::
string
>
_MarkerDirichlet
;
/*!< @brief Dirichlet BC markers. */
std
::
vector
<
std
::
string
>
_MarkerNeumann
;
/*!< @brief Neumann BC markers. */
// Linesource
double
_sigmaS
;
/*!< @brief Scattering coeffient for Linesource test case */
// Database ICRU
std
::
string
_dataDir
;
/*!< @brief material directory */
// ElectronRT
std
::
string
_hydrogenFile
;
/*!< @brief Name of hydrogen cross section file path*/
std
::
string
_oxygenFile
;
/*!< @brief Name of oxygen cross section file path */
std
::
string
_stoppingPowerFile
;
/*!< @brief Name of stopping power file path */
// Scattering Kernel
KERNEL_NAME
_kernelName
;
/*!< @brief Scattering Kernel Name*/
...
...
@@ -96,6 +101,8 @@ class Config
unsigned
long
_newtonLineSearchIter
;
/*!< @brief Maximal Number of line search iterations for newton optimizer */
bool
_newtonFastMode
;
/*!< @brief If true, we skip the NewtonOptimizer for quadratic entropy and assign alpha = u */
// NeuralModel
unsigned
short
_neuralModel
;
/*!< @brief: Version number of the employed neural model */
// Output Options
unsigned
short
_nVolumeOutput
;
/*!< @brief Number of volume outputs */
std
::
vector
<
VOLUME_OUTPUT
>
_volumeOutput
;
/*!< @brief Output groups for volume output*/
...
...
@@ -235,13 +242,18 @@ class Config
*/
// File structure
std
::
string
inline
GetCTFile
()
const
{
return
std
::
filesystem
::
path
(
_ctFile
).
lexically_normal
();
}
std
::
string
inline
GetHydrogenFile
()
const
{
return
std
::
filesystem
::
path
(
_hydrogenFile
).
lexically_normal
();
}
std
::
string
inline
GetLogDir
()
const
{
return
std
::
filesystem
::
path
(
_logDir
).
lexically_normal
();
}
std
::
string
inline
GetLogFile
()
const
{
return
std
::
filesystem
::
path
(
_logFileName
).
lexically_normal
();
}
std
::
string
inline
GetMeshFile
()
const
{
return
std
::
filesystem
::
path
(
_meshFile
).
lexically_normal
();
}
std
::
string
inline
GetOutputDir
()
const
{
return
std
::
filesystem
::
path
(
_outputDir
).
lexically_normal
();
}
std
::
string
inline
GetOutputFile
()
const
{
return
std
::
filesystem
::
path
(
_outputFile
).
lexically_normal
();
}
// Problem Files
std
::
string
inline
GetHydrogenFile
()
const
{
return
std
::
filesystem
::
path
(
_hydrogenFile
).
lexically_normal
();
}
std
::
string
inline
GetOxygenFile
()
const
{
return
std
::
filesystem
::
path
(
_oxygenFile
).
lexically_normal
();
}
std
::
string
inline
GetStoppingPowerFile
()
const
{
return
std
::
filesystem
::
path
(
_stoppingPowerFile
).
lexically_normal
();
}
std
::
string
inline
GetDataDir
()
const
{
return
std
::
filesystem
::
path
(
_dataDir
).
lexically_normal
();
}
// Quadrature Structure
unsigned
GetNQuadPoints
()
{
return
_nQuadPoints
;
}
...
...
@@ -250,6 +262,7 @@ class Config
// Mesh Structure
unsigned
GetNCells
()
{
return
_nCells
;
}
unsigned
short
GetDim
()
{
return
_dim
;
}
// Solver Structure
double
inline
GetCFL
()
const
{
return
_CFL
;
}
...
...
@@ -274,6 +287,9 @@ class Config
bool
inline
GetNewtonFastMode
()
const
{
return
_newtonFastMode
;
}
OPTIMIZER_NAME
inline
GetOptimizerName
()
const
{
return
_entropyOptimizerName
;
}
// Neural Closure
unsigned
short
inline
GetNeuralModel
()
{
return
_neuralModel
;
}
// Boundary Conditions
BOUNDARY_TYPE
GetBoundaryType
(
std
::
string
nameMarker
)
const
;
/*! @brief Get Boundary Type of given marker */
...
...
@@ -308,6 +324,8 @@ class Config
void
SetQuadName
(
QUAD_NAME
quadName
)
{
_quadName
=
quadName
;
}
/*! @brief Never change the quadName! This is only for the test framework. */
void
SetQuadOrder
(
unsigned
quadOrder
)
{
_quadOrder
=
quadOrder
;
}
/*! @brief Never change the quadOrder! This is only for the test framework. */
void
SetSNAllGaussPts
(
bool
useall
)
{
_allGaussPts
=
useall
;
}
/*! @brief Never change the this! This is only for the test framework. */
// Mesh Structure
void
SetNCells
(
unsigned
nCells
)
{
_nCells
=
nCells
;
}
};
#endif // CONFIG_H
code/include/common/globalconstants.h
View file @
bf911fca
/*!
/*!
* \file GlobalConstants.h
* \brief All global defined (physical) constants, enums etc
* \author <blank>
...
...
@@ -55,7 +55,16 @@ enum BOUNDARY_TYPE { DIRICHLET, NEUMANN, NONE, INVALID };
/*! @brief Enum for all currently available quadratures in rtsn.
* Option enums are written in capital letters with underscores as spaces (e.g option "time integration" has option enum "TIME_INTEGRATION")
*/
enum
QUAD_NAME
{
QUAD_MonteCarlo
,
QUAD_GaussLegendreTensorized
,
QUAD_GaussLegendre1D
,
QUAD_LevelSymmetric
,
QUAD_Lebedev
,
QUAD_LDFESA
,
QUAD_Product
};
enum
QUAD_NAME
{
QUAD_MonteCarlo
,
QUAD_GaussLegendreTensorized
,
QUAD_GaussLegendre1D
,
QUAD_LevelSymmetric
,
QUAD_Lebedev
,
QUAD_LDFESA
,
QUAD_Product
,
QUAD_GaussChebyshev1D
};
/*! @brief Conversion Map String to enum
*/
...
...
@@ -77,7 +86,8 @@ enum PROBLEM_NAME {
PROBLEM_LineSource_Pseudo_1D_Physics
,
PROBLEM_AirCavity
,
PROBLEM_MuscleBoneLung
,
PROBLEM_Phantom2D
PROBLEM_Phantom2D
,
PROBLEM_IsotropicSource_2D
};
inline
std
::
map
<
std
::
string
,
PROBLEM_NAME
>
Problem_Map
{
{
"LINESOURCE"
,
PROBLEM_LineSource
},
...
...
@@ -87,6 +97,7 @@ inline std::map<std::string, PROBLEM_NAME> Problem_Map{ { "LINESOURCE", PROBLEM_
{
"AIRCAVITY"
,
PROBLEM_AirCavity
},
{
"MUSCLEBONELUNG"
,
PROBLEM_MuscleBoneLung
},
{
"PHANTOM2D"
,
PROBLEM_Phantom2D
},
{
"ISOTROPICPOINTSOURCE2D"
,
PROBLEM_IsotropicSource_2D
},
{
"LINESOURCE_PSEUDO_1D"
,
PROBLEM_LineSource_Pseudo_1D
},
{
"LINESOURCE_PSEUDO_1D_PHYSICS"
,
PROBLEM_LineSource_Pseudo_1D_Physics
}
};
...
...
@@ -130,10 +141,10 @@ enum OPTIMIZER_NAME { NEWTON, ML };
inline
std
::
map
<
std
::
string
,
OPTIMIZER_NAME
>
Optimizer_Map
{
{
"NEWTON"
,
NEWTON
},
{
"ML"
,
ML
}
};
// Volume output
enum
VOLUME_OUTPUT
{
ANALYTIC
,
MINIMAL
,
MOMENTS
,
DUAL_MOMENTS
,
DOSE
};
enum
VOLUME_OUTPUT
{
ANALYTIC
,
MINIMAL
,
MOMENTS
,
DUAL_MOMENTS
,
MEDICAL
};
inline
std
::
map
<
std
::
string
,
VOLUME_OUTPUT
>
VolOutput_Map
{
{
"ANALYTIC"
,
ANALYTIC
},
{
"MINIMAL"
,
MINIMAL
},
{
"MOMENTS"
,
MOMENTS
},
{
"DUAL_MOMENTS"
,
DUAL_MOMENTS
},
{
"
DOSE"
,
DOSE
}
};
{
"ANALYTIC"
,
ANALYTIC
},
{
"MINIMAL"
,
MINIMAL
},
{
"MOMENTS"
,
MOMENTS
},
{
"DUAL_MOMENTS"
,
DUAL_MOMENTS
},
{
"
MEDICAL"
,
MEDICAL
}
};
// Scalar output
enum
SCALAR_OUTPUT
{
ITER
,
MASS
,
RMS_FLUX
,
VTK_OUTPUT
,
CSV_OUTPUT
};
...
...
code/include/gui/cmap.h
0 → 100644
View file @
bf911fca
#ifndef CMAP_H
#define CMAP_H
#include
"common/typedef.h"
const
Matrix
viridis
{
{
0
.
0
,
0
.
267004
,
0
.
004
874
,
0
.
329415
},
{
0
.
003
92156862745098
,
0
.
26851
,
0
.
00
9605
,
0
.
335427
},
{
0
.
007
84313725490196
,
0
.
269944
,
0
.
014625
,
0
.
341379
},
{
0
.
011764705
882352941
,
0
.
271305
,
0
.
01
9942
,
0
.
347269
},
{
0
.
0156
8627450980392
,
0
.
272594
,
0
.
025563
,
0
.
353093
},
{
0
.
01
96078431372549
,
0
.
273809
,
0
.
0314
97
,
0
.
358853
},
{
0
.
02352
9411764705882
,
0
.
274952
,
0
.
037752
,
0
.
364543
},
{
0
.
027450
980392156862
,
0
.
276022
,
0
.
044167
,
0
.
370164
},
{
0
.
03137254
901960784
,
0
.
277018
,
0
.
050344
,
0
.
375715
},
{
0
.
0352
9411764705882
,
0
.
277941
,
0
.
056324
,
0
.
381191
},
{
0
.
03
92156862745098
,
0
.
278791
,
0
.
062145
,
0
.
386592
},
{
0
.
043137254
901960784
,
0
.
279566
,
0
.
067
836
,
0
.
391917
},
{
0
.
04705
8823529411764
,
0
.
280267
,
0
.
073417
,
0
.
397163
},
{
0
.
050
980392156862744
,
0
.
280894
,
0
.
07
8907
,
0
.
402329
},
{
0
.
054
901960784313725
,
0
.
281446
,
0
.
08432
,
0
.
407414
},
{
0
.
05
8823529411764705
,
0
.
281924
,
0
.
089666
,
0
.
412415
},
{
0
.
0627450
9803921569
,
0
.
282327
,
0
.
094955
,
0
.
417331
},
{
0
.
06666666666666667
,
0
.
282656
,
0
.
100196
,
0
.
42216
},
{
0
.
0705
8823529411765
,
0
.
28291
,
0
.
105393
,
0
.
426902
},
{
0
.
07450
980392156863
,
0
.
283091
,
0
.
110553
,
0
.
431554
},
{
0
.
07
84313725490196
,
0
.
283197
,
0
.
11568
,
0
.
436115
},
{
0
.
08235294117647059
,
0
.
283229
,
0
.
120777
,
0
.
440584
},
{
0
.
08627450980392157
,
0
.
283187
,
0
.
125848
,
0
.
44496
},
{
0
.
09019607843137255
,
0
.
283072
,
0
.
130895
,
0
.
449241
},
{
0
.
09411764705882353
,
0
.
282884
,
0
.
13592
,
0
.
453427
},
{
0
.
09803921568627451
,
0
.
282623
,
0
.
140926
,
0
.
457517
},
{
0
.
10196078431372549
,
0
.
28229
,
0
.
145912
,
0
.
46151
},
{
0
.
10588235294117647
,
0
.
281887
,
0
.
150881
,
0
.
465405
},
{
0
.
10980392156862745
,
0
.
281412
,
0
.
155834
,
0
.
469201
},
{
0
.
11372549019607843
,
0
.
280868
,
0
.
160771
,
0
.
472899
},
{
0
.
11764705882352941
,
0
.
280255
,
0
.
165693
,
0
.
476498
},
{
0
.
12156862745098039
,
0
.
279574
,
0
.
170599
,
0
.
479997
},
{
0
.
12549019607843137
,
0
.
278826
,
0
.
17549
,
0
.
483397
},
{
0
.
12941176470588237
,
0
.
278012
,
0
.
180367
,
0
.
486697
},
{
0
.
13333333333333333
,
0
.
277134
,
0
.
185228
,
0
.
489898
},
{
0
.
13725490196078433
,
0
.
276194
,
0
.
190074
,
0
.
493001
},
{
0
.
1411764705882353
,
0
.
275191
,
0
.
194905
,
0
.
496005
},
{
0
.
1450980392156863
,
0
.
274128
,
0
.
199721
,
0
.
498911
},
{
0
.
14901960784313725
,
0
.
273006
,
0
.
20452
,
0
.
501721
},
{
0
.
15294117647058825
,
0
.
271828
,
0
.
209303
,
0
.
504434
},
{
0
.
1568627450980392
,
0
.
270595
,
0
.
214069
,
0
.
507052
},
{
0
.
1607843137254902
,
0
.
269308
,
0
.
218818
,
0
.
509577
},
{
0
.
16470588235294117
,
0
.
267968
,
0
.
223549
,
0
.
512008
},
{
0
.
16862745098039217
,
0
.
26658
,
0
.
228262
,
0
.
514349
},
{
0
.
17254901960784313
,
0
.
265145
,
0
.
232956
,
0
.
516599
},
{
0
.
17647058823529413
,
0
.
263663
,
0
.
237631
,
0
.
518762
},
{
0
.
1803921568627451
,
0
.
262138
,
0
.
242286
,
0
.
520837
},
{
0
.
1843137254901961
,
0
.
260571
,
0
.
246922
,
0
.
522828
},
{
0
.
18823529411764706
,
0
.
258965
,
0
.
251537
,
0
.
524736
},
{
0
.
19215686274509805
,
0
.
257322
,
0
.
25613
,
0
.
526563
},
{
0
.
19607843137254902
,
0
.
255645
,
0
.
260703
,
0
.
528312
},
{
0
.
2
,
0
.
253935
,
0
.
265254
,
0
.
529983
},
{
0
.
20392156862745098
,
0
.
252194
,
0
.
269783
,
0
.
531579
},
{
0
.
20784313725490197
,
0
.
250425
,
0
.
27429
,
0
.
533103
},
{
0
.
21176470588235294
,
0
.
248629
,
0
.
278775
,
0
.
534556
},
{
0
.
21568627450980393
,
0
.
246811
,
0
.
283237
,
0
.
535941
},
{
0
.
2196078431372549
,
0
.
244972
,
0
.
287675
,
0
.
53726
},
{
0
.
2235294117647059
,
0
.
243113
,
0
.
292092
,
0
.
538516
},
{
0
.
22745098039215686
,
0
.
241237
,
0
.
296485
,
0
.
539709
},
{
0
.
23137254901960785
,
0
.
239346
,
0
.
300855
,
0
.
540844
},
{
0
.
23529411764705882
,
0
.
237441
,
0
.
305202
,
0
.
541921
},
{
0
.
23921568627450981
,
0
.
235526
,
0
.
309527
,
0
.
542944
},
{
0
.
24313725490196078
,
0
.
233603
,
0
.
313828
,
0
.
543914
},
{
0
.
24705882352941178
,
0
.
231674
,
0
.
318106
,
0
.
544834
},
{
0
.
25098039215686274
,
0
.
229739
,
0
.
322361
,
0
.
545706
},
{
0
.
2549019607843137
,
0
.
227802
,
0
.
326594
,
0
.
546532
},
{
0
.
25882352941176473
,
0
.
225863
,
0
.
330805
,
0
.
547314
},
{
0
.
2627450980392157
,
0
.
223925
,
0
.
334994
,
0
.
548053
},
{
0
.
26666666666666666
,
0
.
221989
,
0
.
339161
,
0
.
548752
},
{
0
.
27058823529411763
,
0
.
220057
,
0
.
343307
,
0
.
549413
},
{
0
.
27450980392156865
,
0
.
21813
,
0
.
347432
,
0
.
550038
},
{
0
.
2784313725490196
,
0
.
21621
,
0
.
351535
,
0
.
550627
},
{
0
.
2823529411764706
,
0
.
214298
,
0
.
355619
,
0
.
551184
},
{
0
.
28627450980392155
,
0
.
212395
,
0
.
359683
,
0
.
55171
},
{
0
.
2901960784313726
,
0
.
210503
,
0
.
363727
,
0
.
552206
},
{
0
.
29411764705882354
,
0
.
208623
,
0
.
367752
,
0
.
552675
},
{
0
.
2980392156862745
,
0
.
206756
,
0
.
371758
,
0
.
553117
},
{
0
.
30196078431372547
,
0
.
204903
,
0
.
375746
,
0
.
553533
},
{
0
.
3058823529411765
,
0
.
203063
,
0
.
379716
,
0
.
553925
},
{
0
.
30980392156862746
,
0
.
201239
,
0
.
38367
,
0
.
554294
},
{
0
.
3137254901960784
,
0
.
19943
,
0
.
387607
,
0
.
554642
},
{
0
.
3176470588235294
,
0
.
197636
,
0
.
391528
,
0
.
554969
},
{
0
.
3215686274509804
,
0
.
19586
,
0
.
395433
,
0
.
555276
},
{
0
.
3254901960784314
,
0
.
1941
,
0
.
399323
,
0
.
555565
},
{
0
.
32941176470588235
,
0
.
192357
,
0
.
403199
,
0
.
555836
},
{
0
.
3333333333333333
,
0
.
190631
,
0
.
407061
,
0
.
556089
},
{
0
.
33725490196078434
,
0
.
188923
,
0
.
41091
,
0
.
556326
},
{
0
.
3411764705882353
,
0
.
187231
,
0
.
414746
,
0
.
556547
},
{
0
.
34509803921568627
,
0
.
185556
,
0
.
41857
,
0
.
556753
},
{
0
.
34901960784313724
,
0
.
183898
,
0
.
422383
,
0
.
556944
},
{
0
.
35294117647058826
,
0
.
182256
,
0
.
426184
,
0
.
55712
},
{
0
.
3568627450980392
,
0
.
180629
,
0
.
429975
,
0
.
557282
},
{
0
.
3607843137254902
,
0
.
179019
,
0
.
433756
,
0
.
55743
},
{
0
.
36470588235294116
,
0
.
177423
,
0
.
437527
,
0
.
557565
},
{
0
.
3686274509803922
,
0
.
175841
,
0
.
44129
,
0
.
557685
},
{
0
.
37254901960784315
,
0
.
174274
,
0
.
445044
,
0
.
557792
},
{
0
.
3764705882352941
,
0
.
172719
,
0
.
448791
,
0
.
557885
},
{
0
.
3803921568627451
,
0
.
171176
,
0
.
45253
,
0
.
557965
},
{
0
.
3843137254901961
,
0
.
169646
,
0
.
456262
,
0
.
55803
},
{
0
.
38823529411764707
,
0
.
168126
,
0
.
459988
,
0
.
558082
},
{
0
.
39215686274509803
,
0
.
166617
,
0
.
463708
,
0
.
558119
},
{
0
.
396078431372549
,
0
.
165117
,
0
.
467423
,
0
.
558141
},
{
0
.
4
,
0
.
163625
,
0
.
471133
,
0
.
558148
},
{
0
.
403921568627451
,
0
.
162142
,
0
.
474838
,
0
.
55814
},
{
0
.
40784313725490196
,
0
.
160665
,
0
.
47854
,
0
.
558115
},
{
0
.
4117647058823529
,
0
.
159194
,
0
.
482237
,
0
.
558073
},
{
0
.
41568627450980394
,
0
.
157729
,
0
.
485932
,
0
.
558013
},
{
0
.
4196078431372549
,
0
.
15627
,
0
.
489624
,
0
.
557936
},
{
0
.
4235294117647059
,
0
.
154815
,
0
.
493313
,
0
.
55784
},
{
0
.
42745098039215684
,
0
.
153364
,
0
.
497
,
0
.
557724
},
{
0
.
43137254901960786
,
0
.
151918
,
0
.
500685
,
0
.
557587
},
{
0
.
43529411764705883
,
0
.
150476
,
0
.
504369
,
0
.
55743
},
{
0
.
4392156862745098
,
0
.
149039
,
0
.
508051
,
0
.
55725
},
{
0
.
44313725490196076
,
0
.
147607
,
0
.
511733
,
0
.
557049
},
{
0
.
4470588235294118
,
0
.
14618
,
0
.
515413
,
0
.
556823
},
{
0
.
45098039215686275
,
0
.
144759
,
0
.
519093
,
0
.
556572
},
{
0
.
4549019607843137
,
0
.
143343
,
0
.
522773
,
0
.
556295
},
{
0
.
4588235294117647
,
0
.
141935
,
0
.
526453
,
0
.
555991
},
{
0
.
4627450980392157
,
0
.
140536
,
0
.
530132
,
0
.
555659
},
{
0
.
4666666666666667
,
0
.
139147
,
0
.
533812
,
0
.
555298
},
{
0
.
47058823529411764
,
0
.
13777
,
0
.
537492
,
0
.
554906
},
{
0
.
4745098039215686
,
0
.
136408
,
0
.
541173
,
0
.
554483
},
{
0
.
47843137254901963
,
0
.
135066
,
0
.
544853
,
0
.
554029
},
{
0
.
4823529411764706
,
0
.
133743
,
0
.
548535
,
0
.
553541
},
{
0
.
48627450980392156
,
0
.
132444
,
0
.
552216
,
0
.
553018
},
{
0
.
49019607843137253
,
0
.
131172
,
0
.
555899
,
0
.
552459
},
{
0
.
49411764705882355
,
0
.
129933
,
0
.
559582
,
0
.
551864
},
{
0
.
4980392156862745
,
0
.
128729
,
0
.
563265
,
0
.
551229
},
{
0
.
5019607843137255
,
0
.
127568
,
0
.
566949
,
0
.
550556
},
{
0
.
5058823529411764
,
0
.
126453
,
0
.
570633
,
0
.
549841
},
{
0
.
5098039215686274
,
0
.
125394
,
0
.
574318
,
0
.
549086
},
{
0
.
5137254901960784
,
0
.
124395
,
0
.
578002
,
0
.
548287
},
{
0
.
5176470588235295
,
0
.
123463
,
0
.
581687
,
0
.
547445
},
{
0
.
5215686274509804
,
0
.
122606
,
0
.
585371
,
0
.
546557
},
{
0
.
5254901960784314
,
0
.
121831
,
0
.
589055
,
0
.
545623
},
{
0
.
5294117647058824
,
0
.
121148
,
0
.
592739
,
0
.
544641
},
{
0
.
5333333333333333
,
0
.
120565
,
0
.
596422
,
0
.
543611
},
{
0
.
5372549019607843
,
0
.
120092
,
0
.
600104
,
0
.
54253
},
{
0
.
5411764705882353
,
0
.
119738
,
0
.
603785
,
0
.
5414
},
{
0
.
5450980392156862
,
0
.
119512
,
0
.
607464
,
0
.
540218
},
{
0
.
5490196078431373
,
0
.
119423
,
0
.
611141
,
0
.
538982
},
{
0
.
5529411764705883
,
0
.
119483
,
0
.
614817
,
0
.
537692
},
{
0
.
5568627450980392
,
0
.
119699
,
0
.
61849
,
0
.
536347
},
{
0
.
5607843137254902
,
0
.
120081
,
0
.
622161
,
0
.
534946
},
{
0
.
5647058823529412
,
0
.
120638
,
0
.
625828
,
0
.
533488
},
{
0
.
5686274509803921
,
0
.
12138
,
0
.
629492
,
0
.
531973
},
{
0
.
5725490196078431
,
0
.
122312
,
0
.
633153
,
0
.
530398
},
{
0
.
5764705882352941
,
0
.
123444
,
0
.
636809
,
0
.
528763
},
{
0
.
5803921568627451
,
0
.
12478
,
0
.
640461
,
0
.
527068
},
{
0
.
5843137254901961
,
0
.
126326
,
0
.
644107
,
0
.
525311
},
{
0
.
5882352941176471
,
0
.
128087
,
0
.
647749
,
0
.
523491
},
{
0
.
592156862745098
,
0
.
130067
,
0
.
651384
,
0
.
521608
},
{
0
.
596078431372549
,
0
.
132268
,
0
.
655014
,
0
.
519661
},
{
0
.
6
,
0
.
134692
,
0
.
658636
,
0
.
517649
},
{
0
.
6039215686274509
,
0
.
137339
,
0
.
662252
,
0
.
515571
},
{
0
.
6078431372549019
,
0
.
14021
,
0
.
665859
,
0
.
513427
},
{
0
.
611764705882353
,
0
.
143303
,
0
.
669459
,
0
.
511215
},
{
0
.
615686274509804
,
0
.
146616
,
0
.
67305
,
0
.
508936
},
{
0
.
6196078431372549
,
0
.
150148
,
0
.
676631
,
0
.
506589
},
{
0
.
6235294117647059
,
0
.
153894
,
0
.
680203
,
0
.
504172
},
{
0
.
6274509803921569
,
0
.
157851
,
0
.
683765
,
0
.
501686
},
{
0
.
6313725490196078
,
0
.
162016
,
0
.
687316
,
0
.
499129
},
{
0
.
6352941176470588
,
0
.
166383
,
0
.
690856
,
0
.
496502
},
{
0
.
6392156862745098
,
0
.
170948
,
0
.
694384
,
0
.
493803
},
{
0
.
6431372549019608
,
0
.
175707
,
0
.
6979
,
0
.
491033
},
{
0
.
6470588235294118
,
0
.
180653
,
0
.
701402
,
0
.
488189
},
{
0
.
6509803921568628
,
0
.
185783
,
0
.
704891
,
0
.
485273
},
{
0
.
6549019607843137
,
0
.
19109
,
0
.
708366
,
0
.
482284
},
{
0
.
6588235294117647
,
0
.
196571
,
0
.
711827
,
0
.
479221
},
{
0
.
6627450980392157
,
0
.
202219
,
0
.
715272
,
0
.
476084
},
{
0
.
6666666666666666
,
0
.
20803
,
0
.
718701
,
0
.
472873
},
{
0
.
6705882352941176
,
0
.
214
,
0
.
722114
,
0
.
469588
},
{
0
.
6745098039215687
,
0
.
220124
,
0
.
725509
,
0
.
466226
},
{
0
.
6784313725490196
,
0
.
226397
,
0
.
728888
,
0
.
462789
},
{
0
.
6823529411764706
,
0
.
232815
,
0
.
732247
,
0
.
459277
},
{
0
.
6862745098039216
,
0
.
239374
,
0
.
735588
,
0
.
455688
},
{
0
.
6901960784313725
,
0
.
24607
,
0
.
73891
,
0
.
452024
},
{
0
.
6941176470588235
,
0
.
252899
,
0
.
742211
,
0
.
448284
},
{
0
.
6980392156862745
,
0
.
259857
,
0
.
745492
,
0
.
444467
},
{
0
.
7019607843137254
,
0
.
266941
,
0
.
748751
,
0
.
440573
},
{
0
.
7058823529411765
,
0
.
274149
,
0
.
751988
,
0
.
436601
},
{
0
.
7098039215686275
,
0
.
281477
,
0
.
755203
,
0
.
432552
},
{
0
.
7137254901960784
,
0
.
288921
,
0
.
758394
,
0
.
428426
},
{
0
.
7176470588235294
,
0
.
296479
,
0
.
761561
,
0
.
424223
},
{
0
.
7215686274509804
,
0
.
304148
,
0
.
764704
,
0
.
419943
},
{
0
.
7254901960784313
,
0
.
311925
,
0
.
767822
,
0
.
415586
},
{
0
.
7294117647058823
,
0
.
319809
,
0
.
770914
,
0
.
411152
},
{
0
.
7333333333333333
,
0
.
327796
,
0
.
77398
,
0
.
40664
},
{
0
.
7372549019607844
,
0
.
335885
,
0
.
777018
,
0
.
402049
},
{
0
.
7411764705882353
,
0
.
344074
,
0
.
780029
,
0
.
397381
},
{
0
.
7450980392156863
,
0
.
35236
,
0
.
783011
,
0
.
392636
},
{
0
.
7490196078431373
,
0
.
360741
,
0
.
785964
,
0
.
387814
},
{
0
.
7529411764705882
,
0
.
369214
,
0
.
788888
,
0
.
382914
},
{
0
.
7568627450980392
,
0
.
377779
,
0
.
791781
,
0
.
377939
},
{
0
.
7607843137254902
,
0
.
386433
,
0
.
794644
,
0
.
372886
},
{
0
.
7647058823529411
,
0
.
395174
,
0
.
797475
,
0
.
367757
},
{
0
.
7686274509803922
,
0
.
404001
,
0
.
800275
,
0
.
362552
},
{
0
.
7725490196078432
,
0
.
412913
,
0
.
803041
,
0
.
357269
},
{
0
.
7764705882352941
,
0
.
421908
,
0
.
805774
,
0
.
35191
},
{
0
.
7803921568627451
,
0
.
430983
,
0
.
808473
,
0
.
346476
},
{
0
.
7843137254901961
,
0
.
440137
,
0
.
811138
,
0
.
340967
},
{
0
.
788235294117647
,
0
.
449368
,
0
.
813768
,
0
.
335384
},
{
0
.
792156862745098
,
0
.
458674
,
0
.
816363
,
0
.
329727
},
{
0
.
796078431372549
,
0
.
468053
,
0
.
818921
,
0
.
323998
},