From 99bf76eb5e647390e623bf3f8a9bdd03d3f3a05f Mon Sep 17 00:00:00 2001 From: Dan Smith Date: Mon, 13 Mar 2023 17:26:44 -0400 Subject: [PATCH] Squashed 'externals/nitro/' changes from e1a64da1f..c8ecbe9ae c8ecbe9ae Merge commit '55a407b04834573e5d6a1a1fb43d8c6a77608c06' 55a407b04 Squashed 'externals/coda-oss/' changes from ab45464820..e87c32b4de 4fa700ed2 merge 'master' 6b9d2bac1 Merge branch 'master' 9ae5fec7d update to 'main' 342f55276 NITRO 2.10.13 (#542) f0cc26bdd latest from coda-oss (#540) 7d77233db latest from coda-oss (#536) 437978da8 latest from coda-oss (#535) eea09a38d latest from coda-oss (#534) e2f038e45 adjust compiler flags for clean CMake builds (#533) b871d2b9c latest from coda-oss (#532) e8ff6b444 apps: fix display of TREs from file extended header section (#529) 463c9e418 latest from coda-oss (#531) 24ff32863 -j 6 seems to work for SIX, how about NITRO? 713ee8538 -j 6 seems to work for SIX, how about NITRO? 4ccdf5b37 latest from coda-oss (#527) c71acc492 latest from coda-oss (#526) 08cbb96f9 build with older C++14 compilers (#524) git-subtree-dir: externals/nitro git-subtree-split: c8ecbe9aeff9af801df2a9d56922b6d8b8486854 --- .github/workflows/frequent_check.yml | 4 +- .github/workflows/main.yml | 2 +- CMakeLists.txt | 38 +- ReleaseNotes.md | 2 +- copy_externals.csh | 2 +- externals/coda-oss/.gitignore | 6 +- externals/coda-oss/CMakeLists.txt | 30 +- externals/coda-oss/ReleaseNotes.md | 15 +- externals/coda-oss/UnitTest/UnitTest.vcxproj | 18 +- externals/coda-oss/UnitTest/pch.h | 29 +- externals/coda-oss/build/build.py | 44 +- externals/coda-oss/modules/c++/CMakeLists.txt | 24 +- .../modules/c++/cli/unittests/test_cli.cpp | 8 +- .../modules/c++/coda-oss-lite.vcxproj | 25 +- .../modules/c++/coda-oss-lite.vcxproj.filters | 18 + .../c++/coda_oss/include/coda_oss/CPlusPlus.h | 8 +- .../c++/coda_oss/include/coda_oss/memory.h | 37 + .../c++/coda_oss/include/coda_oss/optional_.h | 45 +- .../coda_oss/include/coda_oss/type_traits.h | 8 + .../config/disable_compiler_warnings.h | 49 + .../c++/except/include/except/Backtrace.h | 10 + .../c++/except/include/except/Context.h | 1 + .../modules/c++/except/include/except/Error.h | 6 +- .../c++/except/include/except/Exception.h | 32 +- .../c++/except/include/except/Throwable.h | 1 + .../modules/c++/except/source/Backtrace.cpp | 6 + .../modules/c++/except/tests/Gen2Test.cpp | 2 +- externals/coda-oss/modules/c++/framework.h | 3 + .../modules/c++/hdf5.lite/CMakeLists.txt | 4 +- .../include/hdf5/lite/HDF5Exception.h | 6 +- .../c++/hdf5.lite/include/hdf5/lite/Info.h | 27 +- .../c++/hdf5.lite/include/hdf5/lite/Read.h | 8 +- .../c++/hdf5.lite/include/hdf5/lite/SpanRC.h | 115 + .../c++/hdf5.lite/include/hdf5/lite/Write.h | 80 + .../hdf5.lite/include/hdf5/lite/highfive.h | 75 + .../modules/c++/hdf5.lite/source/H5.h | 8 +- .../modules/c++/hdf5.lite/source/Info.cpp | 38 +- .../modules/c++/hdf5.lite/source/Read.cpp | 70 +- .../modules/c++/hdf5.lite/source/Write.cpp | 115 + .../c++/hdf5.lite/source/hdf5.lite.cpp | 23 +- .../modules/c++/hdf5.lite/source/hdf5.lite.h | 18 +- .../unittests/123_barfoo_catdog_cx.h5 | Bin 0 -> 31248 bytes .../unittests/H5_creation_dummy.ipynb | 3851 +++++++++++++++++ .../unittests/create_123_barfoo_catdog_cx.m | 55 + .../nested_complex_float32_data_small.h5 | Bin 0 -> 172552 bytes .../c++/hdf5.lite/unittests/test_hdf5info.cpp | 190 +- .../c++/hdf5.lite/unittests/test_hdf5read.cpp | 83 +- .../hdf5.lite/unittests/test_hdf5write.cpp | 95 + .../c++/hdf5.lite/unittests/test_highfive.cpp | 396 ++ .../coda-oss/modules/c++/hdf5.lite/wscript | 2 +- .../coda-oss/modules/c++/include/TestCase.h | 2 + .../c++/io/include/io/BufferViewStream.h | 10 +- .../modules/c++/io/include/io/ByteStream.h | 10 +- .../c++/io/include/io/CountingStreams.h | 2 +- .../modules/c++/io/include/io/DataStream.h | 4 +- .../modules/c++/io/include/io/DbgStream.h | 2 +- .../c++/io/include/io/FileInputStreamOS.h | 12 +- .../c++/io/include/io/FileOutputStreamOS.h | 10 +- .../modules/c++/io/include/io/NullStreams.h | 12 +- .../modules/c++/io/include/io/PipeStream.h | 8 +- .../modules/c++/io/include/io/ProxyStreams.h | 12 +- .../io/include/io/RotatingFileOutputStream.h | 2 +- .../c++/io/include/io/SerializableFile.h | 4 +- .../c++/io/include/io/StandardStreams.h | 8 +- .../modules/c++/io/include/io/StringStream.h | 8 +- .../modules/c++/io/include/io/TempFile.h | 5 +- .../c++/io/source/FileInputStreamIOS.cpp | 10 - .../modules/c++/io/source/FileUtils.cpp | 2 +- .../modules/c++/io/source/InputStream.cpp | 8 +- .../modules/c++/io/source/StringStream.cpp | 9 - .../modules/c++/io/source/TempFile.cpp | 2 +- .../modules/c++/io/tests/serializeTest1.cpp | 4 +- .../c++/io/unittests/test_tempfile.cpp | 3 +- .../c++/logging/include/logging/Enums.h | 16 +- .../c++/logging/include/logging/FileHandler.h | 2 + .../c++/logging/include/logging/LogRecord.h | 2 +- .../logging/include/logging/MemoryHandler.h | 2 +- .../include/logging/StandardFormatter.h | 2 +- .../logging/include/logging/StreamHandler.h | 8 +- .../logging/include/logging/XMLFormatter.h | 2 +- .../modules/c++/logging/source/LogRecord.cpp | 3 +- .../modules/c++/logging/source/Setup.cpp | 15 +- .../unittests/test_exception_logger.cpp | 5 +- .../logging/unittests/test_rotating_log.cpp | 5 +- .../include/math/linear/Matrix2D.h | 2 +- .../include/math/linear/MatrixMxN.h | 166 +- .../math.linear/include/math/linear/VectorN.h | 39 +- .../c++/math.linear/unittests/test_lin.cpp | 4 +- .../c++/math/include/math/ConvexHull.h | 2 +- .../coda-oss/modules/c++/mem/CMakeLists.txt | 2 +- .../modules/c++/mem/include/mem/AutoPtr.h | 2 +- .../modules/c++/mem/include/mem/ComplexView.h | 367 ++ .../modules/c++/mem/include/mem/ScopedPtr.h | 2 +- .../c++/mem/tests/ScratchVisualization.cpp | 2 +- .../c++/mem/unittests/test_scratch_memory.cpp | 6 +- .../mem/unittests/test_vector_pointers.cpp | 140 + externals/coda-oss/modules/c++/mem/wscript | 2 +- .../coda-oss/modules/c++/mt/CMakeLists.txt | 2 +- .../c++/mt/include/mt/BalancedRunnable1D.h | 2 +- .../c++/mt/include/mt/BasicThreadPool.h | 2 +- .../mt/include/mt/CPUAffinityInitializer.h | 2 +- .../include/mt/CPUAffinityInitializerWin32.h | 2 +- .../include/mt/CPUAffinityThreadInitializer.h | 2 +- .../mt/CPUAffinityThreadInitializerLinux.h | 2 +- .../mt/CPUAffinityThreadInitializerWin32.h | 2 +- .../c++/mt/include/mt/GenerationThreadPool.h | 4 +- .../c++/mt/include/mt/GenericRequestHandler.h | 2 +- .../modules/c++/mt/include/mt/Runnable1D.h | 2 +- .../modules/c++/mt/include/mt/Singleton.h | 1 + .../modules/c++/mt/include/mt/ThreadGroup.h | 2 +- .../mt/WorkSharingBalancedRunnable1D.h | 2 +- .../modules/c++/mt/include/mt/WorkerThread.h | 2 +- .../mt/source/CPUAffinityInitializerLinux.cpp | 4 +- .../c++/mt/tests/BasicThreadPoolTest.cpp | 2 +- .../c++/mt/tests/GenerationThreadPoolTest.cpp | 2 +- .../modules/c++/mt/tests/MTSingletonTest.cpp | 16 +- .../c++/mt/tests/ThreadExceptionTest.cpp | 8 +- .../c++/mt/tests/ThreadGroupAffinityTest.cpp | 2 +- .../c++/mt/unittests/Runnable1DTest.cpp | 2 + .../c++/mt/unittests/ThreadGroupTest.cpp | 2 +- externals/coda-oss/modules/c++/mt/wscript | 3 +- .../net/ssl/SSLConnectionClientFactory.h | 2 +- .../c++/net/include/net/ClientSocketFactory.h | 2 +- .../modules/c++/net/include/net/Daemon.h | 2 +- .../modules/c++/net/include/net/DaemonUnix.h | 18 +- .../modules/c++/net/include/net/DaemonWin32.h | 2 +- .../c++/net/include/net/NetConnection.h | 6 +- .../net/PerRequestThreadAllocStrategy.h | 6 +- .../c++/net/include/net/RequestHandler.h | 2 +- .../c++/net/include/net/ServerSocketFactory.h | 4 +- .../include/net/SingleThreadedAllocStrategy.h | 4 +- .../modules/c++/net/include/net/Socket.h | 2 +- .../c++/net/include/net/SocketAddress.h | 2 +- .../modules/c++/net/include/net/Sockets.h | 2 +- .../modules/c++/net/include/net/SocketsUnix.h | 21 - .../net/include/net/ThreadPoolAllocStrategy.h | 8 +- .../modules/c++/net/include/net/URL.h | 15 +- .../modules/c++/net/source/DaemonUnix.cpp | 2 +- .../modules/c++/net/source/SocketAddress.cpp | 2 +- .../coda-oss/modules/c++/net/source/URL.cpp | 15 +- .../c++/net/tests/NetConnectionServerTest.cpp | 2 +- .../include/numpyutils/numpyutils.h | 2 +- .../c++/numpyutils/source/numpyutils.cpp | 2 +- externals/coda-oss/modules/c++/pch.h | 38 +- .../c++/plugin/include/plugin/ErrorHandler.h | 10 +- .../c++/plugin/include/plugin/PluginDefines.h | 4 +- .../c++/re/include/re/RegexPredicate.h | 2 +- .../sio.lite/include/sio/lite/SioFileReader.h | 6 +- .../sio.lite/include/sio/lite/StreamReader.h | 4 +- .../modules/c++/std/include/import/cpp14.h | 61 + .../modules/c++/std/include/import/cpp17.h | 36 + .../modules/c++/std/include/import/std.h | 58 + .../coda-oss/modules/c++/std/include/std/bit | 5 +- .../modules/c++/std/include/std/cstddef | 3 +- .../modules/c++/std/include/std/filesystem | 5 +- .../modules/c++/std/include/std/memory | 19 +- .../modules/c++/std/include/std/optional | 5 +- .../coda-oss/modules/c++/std/include/std/span | 5 +- .../modules/c++/std/include/std/string | 4 +- .../modules/c++/std/include/std/type_traits | 20 +- .../c++/str/include/str/EncodedStringView.h | 10 +- .../modules/c++/str/include/str/Encoding.h | 5 - .../modules/c++/str/include/str/utf8.h | 8 +- .../c++/str/source/EncodedStringView.cpp | 25 +- .../modules/c++/str/source/Encoding.cpp | 15 +- .../coda-oss/modules/c++/str/source/Manip.cpp | 3 +- .../c++/str/unittests/test_base_convert.cpp | 6 +- .../c++/sys/include/sys/ConditionVarPosix.h | 12 +- .../modules/c++/sys/include/sys/Conf.h | 72 +- .../modules/c++/sys/include/sys/DLL.h | 2 +- .../modules/c++/sys/include/sys/DateTime.h | 1 + .../modules/c++/sys/include/sys/Dbg.h | 8 +- .../modules/c++/sys/include/sys/Err.h | 2 +- .../modules/c++/sys/include/sys/Exec.h | 4 +- .../modules/c++/sys/include/sys/File.h | 69 +- .../modules/c++/sys/include/sys/FileFinder.h | 14 +- .../c++/sys/include/sys/LocalDateTime.h | 6 +- .../modules/c++/sys/include/sys/MutexCpp11.h | 4 +- .../modules/c++/sys/include/sys/MutexPosix.h | 4 +- .../modules/c++/sys/include/sys/MutexWin32.h | 2 +- .../coda-oss/modules/c++/sys/include/sys/OS.h | 4 +- .../modules/c++/sys/include/sys/OSUnix.h | 66 +- .../modules/c++/sys/include/sys/OSWin32.h | 2 +- .../modules/c++/sys/include/sys/Process.h | 2 +- .../c++/sys/include/sys/ProcessInterface.h | 2 +- .../modules/c++/sys/include/sys/ProcessUnix.h | 16 +- .../c++/sys/include/sys/ProcessWin32.h | 2 +- .../sys/include/sys/ScopedCPUAffinityUnix.h | 2 +- .../c++/sys/include/sys/SemaphorePosix.h | 4 +- .../c++/sys/include/sys/SemaphoreWin32.h | 2 +- .../modules/c++/sys/include/sys/StopWatch.h | 16 +- .../c++/sys/include/sys/ThreadInterface.h | 2 +- .../modules/c++/sys/include/sys/ThreadPosix.h | 6 +- .../modules/c++/sys/include/sys/ThreadWin32.h | 2 +- .../modules/c++/sys/include/sys/UTCDateTime.h | 4 +- .../c++/sys/include/sys/sys_filesystem.h | 9 + .../modules/c++/sys/source/AbstractOS.cpp | 6 + .../modules/c++/sys/source/DLLUnix.cpp | 2 +- .../modules/c++/sys/source/DLLWin32.cpp | 2 +- .../modules/c++/sys/source/DateTime.cpp | 2 +- .../modules/c++/sys/source/ErrUnix.cpp | 2 +- .../modules/c++/sys/source/ErrWin32.cpp | 2 +- .../modules/c++/sys/source/ExecUnix.cpp | 2 +- .../modules/c++/sys/source/ExecWin32.cpp | 2 +- .../coda-oss/modules/c++/sys/source/File.cpp | 238 + .../modules/c++/sys/source/FileUnix.cpp | 20 +- .../modules/c++/sys/source/FileWin32.cpp | 20 +- .../modules/c++/sys/source/MutexWin32.cpp | 2 +- .../modules/c++/sys/source/OSUnix.cpp | 2 +- .../modules/c++/sys/source/OSWin32.cpp | 14 +- .../coda-oss/modules/c++/sys/source/Path.cpp | 11 +- .../modules/c++/sys/source/ProcessUnix.cpp | 2 +- .../modules/c++/sys/source/ProcessWin32.cpp | 2 +- .../c++/sys/source/ScopedCPUAffinityUnix.cpp | 2 +- .../modules/c++/sys/source/SemaphoreWin32.cpp | 2 +- .../modules/c++/sys/source/ThreadPosix.cpp | 2 +- .../modules/c++/sys/source/ThreadWin32.cpp | 2 +- .../modules/c++/sys/tests/MutexTest.cpp | 2 +- .../c++/sys/tests/ReadWriteMutexTest.cpp | 2 +- .../modules/c++/sys/tests/ReentrantTest.cpp | 2 +- .../modules/c++/sys/tests/ThreadFreeTest.cpp | 2 +- .../modules/c++/sys/tests/ThreadTest4.cpp | 6 +- .../modules/c++/sys/tests/ThreadTest5.cpp | 4 +- .../c++/sys/unittests/test_NaN_testing.cpp | 1 + .../c++/sys/unittests/test_atomic_counter.cpp | 4 +- .../modules/c++/sys/unittests/test_os.cpp | 142 +- .../modules/c++/sys/unittests/test_path.cpp | 4 +- .../c++/tiff/include/tiff/GenericType.h | 10 +- .../modules/c++/tiff/include/tiff/Header.h | 4 +- .../modules/c++/tiff/include/tiff/IFD.h | 4 +- .../modules/c++/tiff/include/tiff/IFDEntry.h | 4 +- .../modules/c++/tiff/source/ImageWriter.cpp | 44 +- .../modules/c++/tiff/source/Utils.cpp | 2 +- .../c++/types/include/types/RangeList.h | 8 +- .../modules/c++/types/source/RangeList.cpp | 2 +- .../modules/c++/unique/source/UUID.cpp | 4 +- .../modules/c++/xml.lite/CMakeLists.txt | 5 + .../xml.lite/include/xml/lite/Attributes.h | 5 +- .../c++/xml.lite/include/xml/lite/Document.h | 3 +- .../include/xml/lite/MinidomHandler.h | 2 +- .../include/xml/lite/UtilitiesXerces.h | 28 +- .../include/xml/lite/ValidatorXerces.h | 4 +- .../xml.lite/include/xml/lite/XMLException.h | 6 +- .../c++/xml.lite/include/xml/lite/XMLReader.h | 1 + .../include/xml/lite/XMLReaderXerces.h | 10 +- .../c++/xml.lite/source/ValidatorXerces.cpp | 13 +- .../c++/xml.lite/tests/NamespaceStackTest.cpp | 2 +- .../xml.lite/unittests/test_soapelements.cpp | 66 + .../xml.lite/unittests/test_xmlattribute.cpp | 4 +- .../xml.lite/unittests/test_xmlelement.cpp | 4 +- .../c++/xml.lite/unittests/test_xmlparser.cpp | 1 + .../c++/zip/include/zip/GZipInputStream.h | 2 +- .../c++/zip/include/zip/GZipOutputStream.h | 4 +- .../c++/zip/include/zip/ZipOutputStream.h | 4 +- .../modules/c++/zip/source/ZipEntry.cpp | 2 + .../coda-oss/modules/drivers/CMakeLists.txt | 13 +- .../modules/drivers/hdf5/CMakeLists.txt | 7 + .../modules/drivers/hdf5/source/H5MM.c | 4 +- .../modules/drivers/highfive/CMakeLists.txt | 19 + .../drivers/highfive/HighFive-2.6.2.zip | Bin 0 -> 9815 bytes .../highfive/HighFive-2.6.2/.clang-format | 93 + .../HighFive-2.6.2/.git-blame-ignore-revs | 2 + .../.github/ISSUE_TEMPLATE/bug_report.md | 31 + .../.github/ISSUE_TEMPLATE/config.yml | 5 + .../.github/ISSUE_TEMPLATE/feature_request.md | 20 + .../highfive/HighFive-2.6.2/.github/build.sh | 11 + .../.github/pull_request_template.md | 25 + .../check_doxygen_awesome_version.yml | 49 + .../HighFive-2.6.2/.github/workflows/ci.yml | 282 ++ .../.github/workflows/clang_format.yml | 36 + .../.github/workflows/gh-pages.yml | 53 + .../.github/workflows/integration_trigger.yml | 15 + .../highfive/HighFive-2.6.2/.gitignore | 5 + .../highfive/HighFive-2.6.2/.gitmodules | 3 + .../highfive/HighFive-2.6.2/.travis.yml | 138 + .../highfive/HighFive-2.6.2/AUTHORS.txt | 52 + .../highfive/HighFive-2.6.2/CHANGELOG.md | 220 + .../CMake/HighFiveConfig.cmake.in | 67 + .../CMake/HighFiveTargetDeps.cmake | 93 + .../CMake/HighFiveTargetExport.cmake | 48 + .../CMake/config/CompilerFlagsHelpers.cmake | 59 + .../CMake/config/ReleaseDebugAutoFlags.cmake | 45 + .../CMake/config/TestHelpers.cmake | 113 + .../highfive/HighFive-2.6.2/CMakeLists.txt | 124 + .../drivers/highfive/HighFive-2.6.2/LICENSE | 25 + .../drivers/highfive/HighFive-2.6.2/README.md | 225 + .../drivers/highfive/HighFive-2.6.2/VERSION | 1 + .../HighFive-2.6.2/doc/CMakeLists.txt | 7 + .../highfive/HighFive-2.6.2/doc/Doxyfile | 2618 +++++++++++ .../HighFive-2.6.2/doc/DoxygenLayout.xml | 241 ++ .../doxygen-awesome-css/doxygen-awesome.css | 2405 ++++++++++ .../update_doxygen_awesome.sh | 47 + .../HighFive-2.6.2/doc/environment.yaml | 12 + .../highfive/HighFive-2.6.2/doc/mainpage.md | 16 + .../doc/poster/example1_hdf5.cpp | 53 + .../doc/poster/example1_highfive.cpp | 17 + .../HighFive-2.6.2/doc/poster/example3.cpp | 29 + .../HighFive-2.6.2/doc/poster/example6.cpp | 51 + .../doc/poster/example_boost.cpp | 23 + .../doc/poster/example_boost_ublas.cpp | 47 + .../doc/poster/example_easy_h5py.py | 26 + .../doc/poster/example_easy_highfive.cpp | 28 + .../doc/poster/example_eigen.cpp | 35 + .../doc/poster/example_props.cpp | 24 + .../HighFive-2.6.2/doc/poster/examples.js | 37 + .../HighFive-2.6.2/doc/poster/godbolt.org.ico | Bin 0 -> 16958 bytes .../HighFive-2.6.2/doc/poster/index.html | 264 ++ .../include/highfive/H5Attribute.hpp | 106 + .../include/highfive/H5DataSet.hpp | 118 + .../include/highfive/H5DataSpace.hpp | 121 + .../include/highfive/H5DataType.hpp | 415 ++ .../include/highfive/H5Easy.hpp | 403 ++ .../include/highfive/H5Exception.hpp | 167 + .../include/highfive/H5File.hpp | 131 + .../include/highfive/H5FileDriver.hpp | 40 + .../include/highfive/H5Group.hpp | 67 + .../include/highfive/H5Object.hpp | 134 + .../include/highfive/H5PropertyList.hpp | 506 +++ .../include/highfive/H5Reference.hpp | 85 + .../include/highfive/H5Selection.hpp | 63 + .../include/highfive/H5Utility.hpp | 40 + .../include/highfive/H5Version.hpp.in | 17 + .../highfive/bits/H5Annotate_traits.hpp | 85 + .../highfive/bits/H5Annotate_traits_misc.hpp | 121 + .../highfive/bits/H5Attribute_misc.hpp | 131 + .../highfive/bits/H5Converter_misc.hpp | 721 +++ .../include/highfive/bits/H5DataSet_misc.hpp | 70 + .../include/highfive/bits/H5DataType_misc.hpp | 499 +++ .../highfive/bits/H5Dataspace_misc.hpp | 171 + .../highfive/bits/H5Exception_misc.hpp | 65 + .../highfive/bits/H5FileDriver_misc.hpp | 23 + .../include/highfive/bits/H5File_misc.hpp | 157 + .../highfive/bits/H5Iterables_misc.hpp | 57 + .../include/highfive/bits/H5Node_traits.hpp | 218 + .../highfive/bits/H5Node_traits_misc.hpp | 358 ++ .../include/highfive/bits/H5Object_misc.hpp | 117 + .../include/highfive/bits/H5Path_traits.hpp | 35 + .../highfive/bits/H5Path_traits_misc.hpp | 46 + .../highfive/bits/H5PropertyList_misc.hpp | 222 + .../highfive/bits/H5ReadWrite_misc.hpp | 142 + .../highfive/bits/H5Reference_misc.hpp | 68 + .../highfive/bits/H5Selection_misc.hpp | 44 + .../include/highfive/bits/H5Slice_traits.hpp | 345 ++ .../highfive/bits/H5Slice_traits_misc.hpp | 267 ++ .../include/highfive/bits/H5Utils.hpp | 70 + .../include/highfive/bits/H5_definitions.hpp | 50 + .../highfive/h5easy_bits/H5Easy_Eigen.hpp | 147 + .../highfive/h5easy_bits/H5Easy_misc.hpp | 156 + .../highfive/h5easy_bits/H5Easy_opencv.hpp | 102 + .../highfive/h5easy_bits/H5Easy_public.hpp | 173 + .../highfive/h5easy_bits/H5Easy_scalar.hpp | 135 + .../highfive/h5easy_bits/H5Easy_vector.hpp | 83 + .../highfive/h5easy_bits/H5Easy_xtensor.hpp | 86 + .../HighFive-2.6.2/src/benchmarks/README.md | 17 + .../src/benchmarks/hdf5_bench.cpp | 59 + .../src/benchmarks/hdf5_bench_improved.cpp | 62 + .../src/benchmarks/highfive_bench.cpp | 15 + .../src/benchmarks/imgs/bench_hdf5_base.png | Bin 0 -> 139672 bytes .../benchmarks/imgs/bench_hdf5_improved.png | Bin 0 -> 129812 bytes .../src/benchmarks/imgs/bench_highfive.png | Bin 0 -> 135724 bytes .../src/benchmarks/run_benchmark.sh | 29 + .../src/examples/CMakeLists.txt | 41 + .../src/examples/boost_multi_array_2D.cpp | 51 + .../src/examples/boost_multiarray_complex.cpp | 31 + .../src/examples/boost_ublas_double.cpp | 64 + .../src/examples/compound_types.cpp | 43 + .../create_attribute_string_integer.cpp | 69 + .../src/examples/create_dataset_double.cpp | 46 + .../examples/create_dataset_half_float.cpp | 56 + .../src/examples/create_datatype.cpp | 110 + .../examples/create_extensible_dataset.cpp | 71 + .../examples/create_page_allocated_files.cpp | 80 + .../src/examples/easy_attribute.cpp | 39 + .../src/examples/easy_dumpoptions.cpp | 88 + .../src/examples/easy_load_dump.cpp | 102 + .../src/examples/eigen_matrix.cpp | 50 + .../examples/parallel_hdf5_collective_io.cpp | 124 + .../examples/parallel_hdf5_independent_io.cpp | 105 + .../examples/read_write_dataset_string.cpp | 60 + .../examples/read_write_fixedlen_string.cpp | 52 + .../src/examples/read_write_raw_ptr.cpp | 81 + .../src/examples/read_write_single_scalar.cpp | 53 + .../examples/read_write_vector_dataset.cpp | 71 + .../read_write_vector_dataset_references.cpp | 81 + .../src/examples/readme_snippet.cpp | 31 + .../src/examples/renaming_objects.cpp | 72 + .../examples/select_by_id_dataset_cpp11.cpp | 75 + .../examples/select_partial_dataset_cpp11.cpp | 56 + .../test_dependent_library/CMakeLists.txt | 42 + .../test_dependent_library/deps/.gitignore | 4 + .../include/simpleton.hpp | 27 + .../test_dependent_library/src/otherton.cpp | 5 + .../test_dependent_library/src/simpleton.cpp | 9 + .../tests/test_project_integration.sh | 51 + .../HighFive-2.6.2/tests/unit/CMakeLists.txt | 53 + .../tests/unit/tests_high_five.hpp | 188 + .../tests/unit/tests_high_five_base.cpp | 2588 +++++++++++ .../tests/unit/tests_high_five_easy.cpp | 450 ++ .../tests/unit/tests_high_five_multi_dims.cpp | 214 + .../tests/unit/tests_high_five_parallel.cpp | 182 + .../unit/tests_import_public_headers.cpp | 7 + .../coda-oss/modules/drivers/highfive/LICENSE | 25 + .../modules/drivers/highfive/README.txt | 2 + .../highfive/include/highfive/H5Attribute.hpp | 106 + .../highfive/include/highfive/H5DataSet.hpp | 118 + .../highfive/include/highfive/H5DataSpace.hpp | 121 + .../highfive/include/highfive/H5DataType.hpp | 415 ++ .../highfive/include/highfive/H5Easy.hpp | 415 ++ .../highfive/include/highfive/H5Exception.hpp | 167 + .../highfive/include/highfive/H5File.hpp | 131 + .../include/highfive/H5FileDriver.hpp | 40 + .../highfive/include/highfive/H5Group.hpp | 67 + .../highfive/include/highfive/H5Object.hpp | 134 + .../include/highfive/H5PropertyList.hpp | 506 +++ .../highfive/include/highfive/H5Reference.hpp | 85 + .../highfive/include/highfive/H5Selection.hpp | 63 + .../highfive/include/highfive/H5Utility.hpp | 40 + .../include/highfive/H5Version.hpp.in | 17 + .../highfive/bits/H5Annotate_traits.hpp | 85 + .../highfive/bits/H5Annotate_traits_misc.hpp | 121 + .../highfive/bits/H5Attribute_misc.hpp | 132 + .../highfive/bits/H5Converter_misc.hpp | 721 +++ .../include/highfive/bits/H5DataSet_misc.hpp | 70 + .../include/highfive/bits/H5DataType_misc.hpp | 499 +++ .../highfive/bits/H5Dataspace_misc.hpp | 171 + .../highfive/bits/H5Exception_misc.hpp | 65 + .../highfive/bits/H5FileDriver_misc.hpp | 23 + .../include/highfive/bits/H5File_misc.hpp | 157 + .../highfive/bits/H5Iterables_misc.hpp | 57 + .../include/highfive/bits/H5Node_traits.hpp | 218 + .../highfive/bits/H5Node_traits_misc.hpp | 358 ++ .../include/highfive/bits/H5Object_misc.hpp | 117 + .../include/highfive/bits/H5Path_traits.hpp | 35 + .../highfive/bits/H5Path_traits_misc.hpp | 46 + .../highfive/bits/H5PropertyList_misc.hpp | 222 + .../highfive/bits/H5ReadWrite_misc.hpp | 142 + .../highfive/bits/H5Reference_misc.hpp | 68 + .../highfive/bits/H5Selection_misc.hpp | 44 + .../include/highfive/bits/H5Slice_traits.hpp | 345 ++ .../highfive/bits/H5Slice_traits_misc.hpp | 268 ++ .../include/highfive/bits/H5Utils.hpp | 70 + .../include/highfive/bits/H5_definitions.hpp | 50 + .../highfive/h5easy_bits/H5Easy_Eigen.hpp | 147 + .../highfive/h5easy_bits/H5Easy_misc.hpp | 156 + .../highfive/h5easy_bits/H5Easy_opencv.hpp | 102 + .../highfive/h5easy_bits/H5Easy_public.hpp | 175 + .../highfive/h5easy_bits/H5Easy_scalar.hpp | 135 + .../highfive/h5easy_bits/H5Easy_vector.hpp | 83 + .../highfive/h5easy_bits/H5Easy_xtensor.hpp | 86 + .../highfive/include/import/highfive.h | 35 + .../highfive/unittests/tests_high_five.hpp | 188 + .../unittests/tests_high_five_base.cpp | 2670 ++++++++++++ .../coda-oss/modules/drivers/highfive/wscript | 10 + .../modules/drivers/zlib/CMakeLists.txt | 4 - .../coda-oss/modules/python/CMakeLists.txt | 12 + modules/c++/CMakeLists.txt | 16 + modules/c++/cpp.h | 3 + modules/c++/nitf/CMakeLists.txt | 3 + modules/c++/nitf/apps/show_nitf++.cpp | 2 +- modules/c++/nitf/include/nitf/Handle.hpp | 8 +- .../c++/nitf/include/nitf/ImageSubheader.hpp | 2 +- modules/c++/nitf/include/nitf/Object.hpp | 9 +- modules/c++/nitf/include/nitf/Utils.hpp | 2 +- .../c++/nitf/unittests/test_image_writer.cpp | 4 +- .../nitf/unittests/test_j2k_compress_tile.cpp | 6 + .../c++/nitf/unittests/test_j2k_loading++.cpp | 14 +- .../c++/nitf/unittests/test_j2k_read_tile.cpp | 1 + .../c++/nitf/unittests/test_tre_create++.cpp | 1 + .../c++/nitf/unittests/test_tre_mods++.cpp | 4 + modules/c++/pch.h | 2 + modules/c/CMakeLists.txt | 21 + modules/c/cgm/source/MetafileReader.c | 1 + modules/c/j2k/shared/J2KCompress.c | 2 + modules/c/j2k/shared/J2KDecompress.c | 2 + modules/c/jpeg/source/LibjpegDecompress.c | 9 +- modules/c/nitf/unittests/test_moveTREs.c | 6 +- .../c/nrt/include/nrt/nrt_config.h.cmake.in | 2 + modules/c/nrt/source/Utils.c | 4 +- modules/python/CMakeLists.txt | 11 + 479 files changed, 38832 insertions(+), 1014 deletions(-) create mode 100644 externals/coda-oss/modules/c++/config/include/config/disable_compiler_warnings.h create mode 100644 externals/coda-oss/modules/c++/hdf5.lite/include/hdf5/lite/SpanRC.h create mode 100644 externals/coda-oss/modules/c++/hdf5.lite/include/hdf5/lite/Write.h create mode 100644 externals/coda-oss/modules/c++/hdf5.lite/include/hdf5/lite/highfive.h create mode 100644 externals/coda-oss/modules/c++/hdf5.lite/source/Write.cpp create mode 100644 externals/coda-oss/modules/c++/hdf5.lite/unittests/123_barfoo_catdog_cx.h5 create mode 100644 externals/coda-oss/modules/c++/hdf5.lite/unittests/H5_creation_dummy.ipynb create mode 100644 externals/coda-oss/modules/c++/hdf5.lite/unittests/create_123_barfoo_catdog_cx.m create mode 100644 externals/coda-oss/modules/c++/hdf5.lite/unittests/nested_complex_float32_data_small.h5 create mode 100644 externals/coda-oss/modules/c++/hdf5.lite/unittests/test_hdf5write.cpp create mode 100644 externals/coda-oss/modules/c++/hdf5.lite/unittests/test_highfive.cpp create mode 100644 externals/coda-oss/modules/c++/mem/include/mem/ComplexView.h create mode 100644 externals/coda-oss/modules/c++/std/include/import/cpp14.h create mode 100644 externals/coda-oss/modules/c++/std/include/import/cpp17.h create mode 100644 externals/coda-oss/modules/c++/std/include/import/std.h create mode 100644 externals/coda-oss/modules/c++/sys/source/File.cpp create mode 100644 externals/coda-oss/modules/c++/xml.lite/unittests/test_soapelements.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/CMakeLists.txt create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2.zip create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.clang-format create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.git-blame-ignore-revs create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.github/ISSUE_TEMPLATE/bug_report.md create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.github/ISSUE_TEMPLATE/config.yml create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.github/ISSUE_TEMPLATE/feature_request.md create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.github/build.sh create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.github/pull_request_template.md create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.github/workflows/check_doxygen_awesome_version.yml create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.github/workflows/ci.yml create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.github/workflows/clang_format.yml create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.github/workflows/gh-pages.yml create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.github/workflows/integration_trigger.yml create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.gitignore create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.gitmodules create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.travis.yml create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/AUTHORS.txt create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CHANGELOG.md create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMake/HighFiveConfig.cmake.in create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMake/HighFiveTargetDeps.cmake create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMake/HighFiveTargetExport.cmake create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMake/config/CompilerFlagsHelpers.cmake create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMake/config/ReleaseDebugAutoFlags.cmake create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMake/config/TestHelpers.cmake create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMakeLists.txt create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/LICENSE create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/README.md create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/VERSION create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/doc/CMakeLists.txt create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/doc/Doxyfile create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/doc/DoxygenLayout.xml create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/doc/doxygen-awesome-css/doxygen-awesome.css create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/doc/doxygen-awesome-css/update_doxygen_awesome.sh create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/doc/environment.yaml create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/doc/mainpage.md create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/doc/poster/example1_hdf5.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/doc/poster/example1_highfive.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/doc/poster/example3.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/doc/poster/example6.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/doc/poster/example_boost.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/doc/poster/example_boost_ublas.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/doc/poster/example_easy_h5py.py create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/doc/poster/example_easy_highfive.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/doc/poster/example_eigen.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/doc/poster/example_props.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/doc/poster/examples.js create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/doc/poster/godbolt.org.ico create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/doc/poster/index.html create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/H5Attribute.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/H5DataSet.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/H5DataSpace.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/H5DataType.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/H5Easy.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/H5Exception.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/H5File.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/H5FileDriver.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/H5Group.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/H5Object.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/H5PropertyList.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/H5Reference.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/H5Selection.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/H5Utility.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/H5Version.hpp.in create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/bits/H5Annotate_traits.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/bits/H5Annotate_traits_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/bits/H5Attribute_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/bits/H5Converter_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/bits/H5DataSet_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/bits/H5DataType_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/bits/H5Dataspace_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/bits/H5Exception_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/bits/H5FileDriver_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/bits/H5File_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/bits/H5Iterables_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/bits/H5Node_traits.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/bits/H5Node_traits_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/bits/H5Object_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/bits/H5Path_traits.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/bits/H5Path_traits_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/bits/H5PropertyList_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/bits/H5ReadWrite_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/bits/H5Reference_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/bits/H5Selection_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/bits/H5Slice_traits.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/bits/H5Slice_traits_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/bits/H5Utils.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/bits/H5_definitions.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/h5easy_bits/H5Easy_Eigen.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/h5easy_bits/H5Easy_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/h5easy_bits/H5Easy_opencv.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/h5easy_bits/H5Easy_public.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/h5easy_bits/H5Easy_scalar.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/h5easy_bits/H5Easy_vector.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/include/highfive/h5easy_bits/H5Easy_xtensor.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/benchmarks/README.md create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/benchmarks/hdf5_bench.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/benchmarks/hdf5_bench_improved.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/benchmarks/highfive_bench.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/benchmarks/imgs/bench_hdf5_base.png create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/benchmarks/imgs/bench_hdf5_improved.png create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/benchmarks/imgs/bench_highfive.png create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/benchmarks/run_benchmark.sh create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/examples/CMakeLists.txt create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/examples/boost_multi_array_2D.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/examples/boost_multiarray_complex.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/examples/boost_ublas_double.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/examples/compound_types.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/examples/create_attribute_string_integer.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/examples/create_dataset_double.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/examples/create_dataset_half_float.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/examples/create_datatype.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/examples/create_extensible_dataset.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/examples/create_page_allocated_files.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/examples/easy_attribute.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/examples/easy_dumpoptions.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/examples/easy_load_dump.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/examples/eigen_matrix.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/examples/parallel_hdf5_collective_io.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/examples/parallel_hdf5_independent_io.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/examples/read_write_dataset_string.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/examples/read_write_fixedlen_string.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/examples/read_write_raw_ptr.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/examples/read_write_single_scalar.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/examples/read_write_vector_dataset.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/examples/read_write_vector_dataset_references.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/examples/readme_snippet.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/examples/renaming_objects.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/examples/select_by_id_dataset_cpp11.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/src/examples/select_partial_dataset_cpp11.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/tests/test_dependent_library/CMakeLists.txt create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/tests/test_dependent_library/deps/.gitignore create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/tests/test_dependent_library/include/simpleton.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/tests/test_dependent_library/src/otherton.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/tests/test_dependent_library/src/simpleton.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/tests/test_project_integration.sh create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/tests/unit/CMakeLists.txt create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/tests/unit/tests_high_five.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/tests/unit/tests_high_five_base.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/tests/unit/tests_high_five_easy.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/tests/unit/tests_high_five_multi_dims.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/tests/unit/tests_high_five_parallel.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/tests/unit/tests_import_public_headers.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/LICENSE create mode 100644 externals/coda-oss/modules/drivers/highfive/README.txt create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/H5Attribute.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/H5DataSet.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/H5DataSpace.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/H5DataType.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/H5Easy.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/H5Exception.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/H5File.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/H5FileDriver.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/H5Group.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/H5Object.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/H5PropertyList.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/H5Reference.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/H5Selection.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/H5Utility.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/H5Version.hpp.in create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/bits/H5Annotate_traits.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/bits/H5Annotate_traits_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/bits/H5Attribute_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/bits/H5Converter_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/bits/H5DataSet_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/bits/H5DataType_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/bits/H5Dataspace_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/bits/H5Exception_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/bits/H5FileDriver_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/bits/H5File_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/bits/H5Iterables_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/bits/H5Node_traits.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/bits/H5Node_traits_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/bits/H5Object_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/bits/H5Path_traits.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/bits/H5Path_traits_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/bits/H5PropertyList_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/bits/H5ReadWrite_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/bits/H5Reference_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/bits/H5Selection_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/bits/H5Slice_traits.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/bits/H5Slice_traits_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/bits/H5Utils.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/bits/H5_definitions.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/h5easy_bits/H5Easy_Eigen.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/h5easy_bits/H5Easy_misc.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/h5easy_bits/H5Easy_opencv.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/h5easy_bits/H5Easy_public.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/h5easy_bits/H5Easy_scalar.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/h5easy_bits/H5Easy_vector.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/highfive/h5easy_bits/H5Easy_xtensor.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/include/import/highfive.h create mode 100644 externals/coda-oss/modules/drivers/highfive/unittests/tests_high_five.hpp create mode 100644 externals/coda-oss/modules/drivers/highfive/unittests/tests_high_five_base.cpp create mode 100644 externals/coda-oss/modules/drivers/highfive/wscript diff --git a/.github/workflows/frequent_check.yml b/.github/workflows/frequent_check.yml index a183d1c648..28857d3e73 100644 --- a/.github/workflows/frequent_check.yml +++ b/.github/workflows/frequent_check.yml @@ -22,7 +22,7 @@ jobs: - name: make run: | cd build - cmake --build . --config Release -j 2 + cmake --build . --config Release -j cmake --build . --config Release --target install - name: test run: | @@ -48,7 +48,7 @@ jobs: run: | cd build # using the default number of threads (-j) causes G++ to crash - cmake --build . -j 2 + cmake --build . -j 6 cmake --build . --target install - name: test run: | diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a7f9330dfd..8df40ccc1c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -52,7 +52,7 @@ jobs: run: | cd build # using the default number of threads (-j) causes G++ to crash - cmake --build . -j 2 + cmake --build . -j 6 cmake --build . --target install - name: test run: | diff --git a/CMakeLists.txt b/CMakeLists.txt index bb5b4e553b..62f249850c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,31 +7,23 @@ set(CXX_STANDARD_REQUIRED true) if (${CMAKE_PROJECT_NAME} STREQUAL nitro) # we are the top-level project and are responsible for configuration - # set up warnings + # Always turn on "warnings as errors" to avoid lots of (meaningless?) build output; + # we'll dial-back warnings as necessary. if (MSVC) - # set warning level to /W4 - string(REGEX REPLACE "/W[0-4]" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - string(REGEX REPLACE "/W[0-4]" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") - add_compile_options(/W4) - add_compile_options(/wd4100) # '...': unreferenced formal parameter - add_compile_options(/wd4127) # conditional expression is constant - if (ENABLE_ASAN) - # https://docs.microsoft.com/en-us/cpp/sanitizers/asan?view=msvc-160 - add_compile_options(/fsanitize=address) - endif() - add_compile_options(/std:c++14) + add_compile_options(/WX) # warnings as errors + + if (ENABLE_ASAN) + # https://docs.microsoft.com/en-us/cpp/sanitizers/asan?view=msvc-160 + add_compile_options(/fsanitize=address) + endif() + elseif (UNIX) - add_compile_options( - -Wall - -Wno-deprecated - -Wno-unused-value - -Wno-unused-but-set-variable - ) - if (ENABLE_ASAN) - # https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html - add_compile_options(-fsanitize=address) - endif() - add_compile_options(-std=c++14) + add_compile_options(-Werror) # warnings as errors + + if (ENABLE_ASAN) + # https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html + add_compile_options(-fsanitize=address) + endif() endif() if (EXISTS "${CMAKE_BINARY_DIR}/conan_paths.cmake") diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 3446ae82f6..b45ad2d6bb 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -20,7 +20,7 @@ except that C++14 is now required. [master](https://github.com/mdaus/nitro/tree * [coda-oss](https://github.com/mdaus/coda-oss) release [2022-08-30](https://github.com/mdaus/coda-oss/releases/tag/2022-08-30) * Build JPEG decompression as a plug-in. * tweak unittests so they run in SIX. -* Final C++11 release 🤞🏻; future releases will be C++14 from [main](https://github.com/mdaus/nitro/tree/main). +* ~~Final C++11 release 🤞🏻; future releases will be C++14 from [main](https://github.com/mdaus/nitro/tree/main).~~ ## [Version 2.10.11](https://github.com/mdaus/nitro/releases/tag/NITRO-2.10.11); August 2, 2022 * [coda-oss](https://github.com/mdaus/coda-oss) release [2022-08-02](https://github.com/mdaus/coda-oss/releases/tag/2022-08-02) diff --git a/copy_externals.csh b/copy_externals.csh index 0f5b0fd28b..1674c143d1 100755 --- a/copy_externals.csh +++ b/copy_externals.csh @@ -1,7 +1,7 @@ #!/bin/csh -f rm -r -f tmp && mkdir tmp && cd tmp -git clone -b main git@github.com:mdaus/coda-oss.git +git clone --depth 1 -b main git@github.com:mdaus/coda-oss.git rm -r -f coda-oss/.git cd .. diff --git a/externals/coda-oss/.gitignore b/externals/coda-oss/.gitignore index e1ff9db154..7489cb720e 100644 --- a/externals/coda-oss/.gitignore +++ b/externals/coda-oss/.gitignore @@ -2,8 +2,8 @@ *~ *.pyc __pycache__/ -# Build artifacts +# Build artifacts install/ install-*/ target/ @@ -20,6 +20,7 @@ CMakeFiles/ Makefile modules/**/Makefile out/ +CMakeSettings.json # Waf .waf-* @@ -51,4 +52,5 @@ project.sln **/x64/ *.vcxproj.user -CMakeSettings.json +# Unit-tests +TEST_*_TMP.* diff --git a/externals/coda-oss/CMakeLists.txt b/externals/coda-oss/CMakeLists.txt index b41b3ddd46..f1aa8e5ac9 100644 --- a/externals/coda-oss/CMakeLists.txt +++ b/externals/coda-oss/CMakeLists.txt @@ -3,13 +3,11 @@ # Author: Scott A. Colcord cmake_minimum_required(VERSION 3.14) +project(coda-oss) -set(TARGET_LANGUAGE c++) set(CMAKE_CXX_STANDARD 14) set(CXX_STANDARD_REQUIRED true) -project(coda-oss) - if (EXISTS "${CMAKE_BINARY_DIR}/conanbuildinfo.cmake") # build and package with conan include("${CMAKE_BINARY_DIR}/conanbuildinfo.cmake") @@ -21,19 +19,23 @@ endif() if (${CMAKE_PROJECT_NAME} STREQUAL coda-oss) # this is the top level project - # set up warnings + # Always turn on "warnings as errors" to avoid lots of (meaningless?) build output; + # we'll dial-back warnings as necessary. if (MSVC) - # set warning level to /W3 - string(REGEX REPLACE "/W[0-4]" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - string(REGEX REPLACE "/W[0-4]" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") - add_compile_options(/std:c++14) + add_compile_options(/WX) # warnings as errors + add_compile_options(/MP) # multi-processor compile + + if (ENABLE_ASAN) + # https://docs.microsoft.com/en-us/cpp/sanitizers/asan?view=msvc-160 + add_compile_options(/fsanitize=address) + endif() elseif (UNIX) - add_compile_options( - -Wno-deprecated - -Wno-unused-value - -Wno-unused-but-set-variable - ) - add_compile_options(-std=c++14) + add_compile_options(-Werror) # warnings as errors + if (ENABLE_ASAN) + # https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html + add_compile_options(-fsanitize=address) + add_link_options(-fsanitize=address) + endif() endif() list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") diff --git a/externals/coda-oss/ReleaseNotes.md b/externals/coda-oss/ReleaseNotes.md index dd7dd197e4..f473ce0160 100644 --- a/externals/coda-oss/ReleaseNotes.md +++ b/externals/coda-oss/ReleaseNotes.md @@ -11,8 +11,15 @@ ``` # coda-oss Release Notes +## [Release 2023-??-??](https://github.com/mdaus/coda-oss/releases/tag/2023-??-??) +* *zlib* updated to [1.2.13](https://github.com/madler/zlib/releases/tag/v1.2.13). +* new `mem::ComplexView` class to make it easier to process complex data stored in parallel. +* adjust compiler flags for clean *CMake* builds. +* wrap common "file open" routines (e.g., `fopen()`) to support `sys::expandEnvironmentVariables()`. +* add header-only [HighFive](https://github.com/BlueBrain/HighFive) HDF5-wrapper library. + ## [Release 2022-12-14](https://github.com/mdaus/coda-oss/releases/tag/2022-12-14) -* removed remaining vestigates of `std::auto_ptr`, provide `mem::AutoPtr` for the tiny handful of +* removed remaining vestiges of `std::auto_ptr`, provide `mem::AutoPtr` for the tiny handful of places (e.g., SWIG bindings) that still need copying. * `xml::lite::Element` overloads to make creting new XML documents easier; see unittests for examples. * try even harder to find unittest files in various scenarios. @@ -30,16 +37,16 @@ * Utilitiy routines for finding various files when unit-testing. * Removed C++14 work-arounds needed in C++11. Legacy C++ exception specificatons removed. * Rebuild `waf` for FIPS error; added more debug options. - + ## [Release 2022-08-30](https://github.com/mdaus/coda-oss/releases/tag/2022-08-30) * XML is now always written as UTF-8; the code will still try to read Windows-1252. * `Uri`s are no longer validated by default. * Minor tweaks from other projects. -* Final C++11 release 🤞🏻; future releases will be C++14 from [main](https://github.com/mdaus/coda-oss/tree/main). +* ~~Final C++11 release 🤞🏻; future releases will be C++14 from [main](https://github.com/mdaus/coda-oss/tree/main).~~ ## [Release 2022-08-02](https://github.com/mdaus/coda-oss/releases/tag/2022-08-02) * remove *Expat* and *libXML* modules and support in **xml.lite**; only *Xerces* was actively used. -* fix `waf` to work-around FIPS warning because of insecure *md5* hashing. +* ~~fix `waf` to work-around FIPS warning because of insecure *md5* hashing.~~ * tweak `str::EncodedStringView` and `str::EncodedString` for [future XML changes](https://github.com/mdaus/coda-oss/tree/feature/always-write-xml-as-utf8). diff --git a/externals/coda-oss/UnitTest/UnitTest.vcxproj b/externals/coda-oss/UnitTest/UnitTest.vcxproj index 1d301cb7c6..5f55f6360d 100644 --- a/externals/coda-oss/UnitTest/UnitTest.vcxproj +++ b/externals/coda-oss/UnitTest/UnitTest.vcxproj @@ -23,16 +23,18 @@ DynamicLibrary true v143 - Unicode false + Unicode + true DynamicLibrary false v143 true - Unicode false + Unicode + true @@ -64,10 +66,13 @@ true true Guard - true - true ProgramDatabase true + true + true + true + true + /Zc:__cplusplus %(AdditionalOptions) Windows @@ -88,6 +93,11 @@ true Guard true + true + true + true + true + /Zc:__cplusplus %(AdditionalOptions) Windows diff --git a/externals/coda-oss/UnitTest/pch.h b/externals/coda-oss/UnitTest/pch.h index d47d48d8e8..8229e0b47a 100644 --- a/externals/coda-oss/UnitTest/pch.h +++ b/externals/coda-oss/UnitTest/pch.h @@ -10,9 +10,12 @@ // add headers that you want to pre-compile here #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +#pragma warning(push) +#pragma warning(disable: 5105) // macro expansion producing '...' has undefined behavior #include #include #include +#pragma warning(pop) #undef min #undef max @@ -20,35 +23,19 @@ #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "import/std.h" + #include #include #include #include #include -#include -#include // std::endian -#include -#include // std::accumulate #include -#include -#include -#include +#include // std::endian #include "CppUnitTest.h" +#include "coda_oss/span.h" #include "gsl/gsl.h" #include "import/sys.h" #include "import/math.h" @@ -58,6 +45,7 @@ #include "import/mem.h" #include #include +#include #include "import/cli.h" #include "polygon/DrawPolygon.h" #include "polygon/PolygonMask.h" @@ -104,6 +92,7 @@ #include #include #include +#include "io/StringStream.h" #include "TestCase.h" diff --git a/externals/coda-oss/build/build.py b/externals/coda-oss/build/build.py index 531295dbc4..e9fd0ecdea 100644 --- a/externals/coda-oss/build/build.py +++ b/externals/coda-oss/build/build.py @@ -21,6 +21,12 @@ from makewheel import makewheel from package import package +try: + import hashlib + hashlib.md5() +except ValueError: + Logs.error('MD5 error - you are likely trying to use an old python on a new machine to run waf. ' + 'If you run into a fatal FIPS error try finding a newer version of python.') COMMON_EXCLUDES = '.bzr .bzrignore .git .gitignore .svn CVS .cvsignore .arch-ids {arch} SCCS BitKeeper .hg _MTN _darcs Makefile Makefile.in config.log'.split() COMMON_EXCLUDES_EXT ='~ .rej .orig .pyc .pyo .bak .tar.bz2 tar.gz .zip .swp'.split() @@ -29,8 +35,8 @@ for ext in COMMON_EXCLUDES_EXT: TaskGen.extension(ext)(Utils.nada) -if sys.version_info < (2,6,0): - raise Errors.WafError('Build system requires at least Python 2.6') +if sys.version_info < (3,6,0): + raise Errors.WafError('Build system requires at least Python 3.6') # provide a partial function if we don't have one try: @@ -891,12 +897,6 @@ def configureCompilerOptions(self): # If you want the plugins to not depend on Intel libraries, # configure with: # --with-cflags=-static-intel --with-cxxflags=-static-intel --with-linkflags=-static-intel - if cxxCompiler == 'gcc': - config['cxx']['debug'] = '-ggdb3' - config['cxx']['optz_debug'] = '-Og' - elif cxxCompiler == 'icpc': - config['cxx']['debug'] = '-g' - config['cxx']['optz_debug'] = '' if cxxCompiler == 'g++' or cxxCompiler == 'icpc': config['cxx']['warn'] = warningFlags.split() config['cxx']['verbose'] = '-v' @@ -912,10 +912,11 @@ def configureCompilerOptions(self): # The "fastest-possible" option is new; see comments above. config['cxx']['optz_fastest-possible'] = [ config['cxx']['optz_fastest'], '-march=native' ] + self.env.append_value('CXXFLAGS', '-fPIC'.split()) if not Options.options.enablecpp17: - gxxCompileFlags='-fPIC -std=c++14' + gxxCompileFlags='-std=c++14' else: - gxxCompileFlags='-fPIC -std=c++17' + gxxCompileFlags='-std=c++17' self.env.append_value('CXXFLAGS', gxxCompileFlags.split()) # DEFINES and LINKFLAGS will apply to both gcc and g++ @@ -930,12 +931,21 @@ def configureCompilerOptions(self): self.env.append_value('LINKFLAGS', linkFlags.split()) - if ccCompiler == 'gcc': - config['cc']['debug'] = '-ggdb3' - config['cc']['optz_debug'] = '-Og' - elif ccCompiler == 'icc': - config['cc']['debug'] = '-g' - config['cc']['optz_debug'] = '' + if Options.options.debugging: + if cxxCompiler == 'g++': + config['cxx']['debug'] = '-ggdb3' + config['cxx']['optz_debug'] = '-Og' + elif cxxCompiler == 'icpc': + config['cxx']['debug'] = '-g' + config['cxx']['optz_debug'] = '' + + if ccCompiler == 'gcc': + config['cc']['debug'] = '-ggdb3' + config['cc']['optz_debug'] = '-Og' + elif ccCompiler == 'icc': + config['cc']['debug'] = '-g' + config['cc']['optz_debug'] = '' + if ccCompiler == 'gcc' or ccCompiler == 'icc': config['cc']['warn'] = warningFlags.split() config['cc']['verbose'] = '-v' @@ -952,6 +962,8 @@ def configureCompilerOptions(self): config['cc']['optz_fastest-possible'] = [ config['cc']['optz_fastest'], '-march=native' ] self.env.append_value('CFLAGS', '-fPIC'.split()) + # "gnu99" enables POSIX and BSD + self.env.append_value('CFLAGS', '-std=gnu99'.split()) elif re.match(winRegex, sys_platform): crtFlag = '/%s' % Options.options.crt diff --git a/externals/coda-oss/modules/c++/CMakeLists.txt b/externals/coda-oss/modules/c++/CMakeLists.txt index 368653ad54..5d6ec9ed88 100644 --- a/externals/coda-oss/modules/c++/CMakeLists.txt +++ b/externals/coda-oss/modules/c++/CMakeLists.txt @@ -1,13 +1,25 @@ set(TARGET_LANGUAGE c++) -set(CMAKE_CXX_STANDARD 14) -set(CXX_STANDARD_REQUIRED true) -# turn on warnings as errors +# turn on maximum warnings if (MSVC) - add_compile_options(/WX) - add_compile_options(/W4) + add_compile_options(/std:c++14) + + # By default, there is a /W3 on the command-line from somewhere (?); adding + # /Wn results in a compiler warning. + #add_compile_options(/W4) # /Wall + string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") # /Wall + elseif (UNIX) - add_compile_options(-Werror) + add_compile_options(-std=c++14) + + add_compile_options(-Wall -pedantic -Wextra) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wregister") # -Wvolatile + #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Weffc++") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wzero-as-null-pointer-constant") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Woverloaded-virtual") + #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wold-style-cast") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsuggest-final-types -Wsuggest-final-methods") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsuggest-override") endif() # add an interface library for unittests diff --git a/externals/coda-oss/modules/c++/cli/unittests/test_cli.cpp b/externals/coda-oss/modules/c++/cli/unittests/test_cli.cpp index ba10dfdee1..62fa2192f9 100644 --- a/externals/coda-oss/modules/c++/cli/unittests/test_cli.cpp +++ b/externals/coda-oss/modules/c++/cli/unittests/test_cli.cpp @@ -171,10 +171,10 @@ TEST_CASE(testRequired) parser.addArgument("-v --verbose", "Toggle verbose", cli::STORE_TRUE); parser.addArgument("-c --config", "Specify a config file", cli::STORE)->setRequired(true); - std::unique_ptr results; - TEST_EXCEPTION(results.reset(parser.parse(str::split("")))); - TEST_EXCEPTION(results.reset(parser.parse(str::split("-c")))); - results.reset(parser.parse(str::split("-c configFile"))); + const std::string program(testName); + TEST_EXCEPTION(parser.parse(program, str::split(""))); + TEST_EXCEPTION(parser.parse(program, str::split("-c"))); + const auto results = parser.parse(program, str::split("-c configFile")); TEST_ASSERT_EQ(results->get("config"), "configFile"); } diff --git a/externals/coda-oss/modules/c++/coda-oss-lite.vcxproj b/externals/coda-oss/modules/c++/coda-oss-lite.vcxproj index b622944fae..f50ac4a193 100644 --- a/externals/coda-oss/modules/c++/coda-oss-lite.vcxproj +++ b/externals/coda-oss/modules/c++/coda-oss-lite.vcxproj @@ -28,6 +28,7 @@ + @@ -116,6 +117,7 @@ + @@ -174,6 +176,9 @@ + + + @@ -344,6 +349,7 @@ + @@ -415,12 +421,14 @@ DynamicLibrary true v143 + true DynamicLibrary false v143 true + true @@ -436,6 +444,8 @@ true + true + AllRules.ruleset false @@ -445,16 +455,20 @@ EnableAllWarnings true _DEBUG;_LIB;%(PreprocessorDefinitions);CODA_OSS_EXPORTS;CODA_OSS_DLL;MT_DEFAULT_PINNING=0;RE_ENABLE_STD_REGEX=1 - true pch.h cli\include\;coda_oss\include;config\include\;except\include\;gsl\include\;io\include\;logging\include\;math\include\;math.linear\include\;math.poly\include\;mem\include\;mt\include\;plugin\include\;polygon\include\;re\include\;sio.lite\include\;std\include\;str\include\;sys\include\;tiff\include;types\include\;units\include\ Use pch.h true Guard - true ProgramDatabase true + true + true + true + true + /Zc:__cplusplus %(AdditionalOptions) + true @@ -469,15 +483,18 @@ true true NDEBUG;_LIB;%(PreprocessorDefinitions);CODA_OSS_EXPORTS;CODA_OSS_DLL;MT_DEFAULT_PINNING=0;RE_ENABLE_STD_REGEX=1 - true pch.h cli\include\;coda_oss\include;config\include\;except\include\;gsl\include\;io\include\;logging\include\;math\include\;math.linear\include\;math.poly\include\;mem\include\;mt\include\;plugin\include\;polygon\include\;re\include\;sio.lite\include\;std\include\;str\include\;sys\include\;tiff\include;types\include\;units\include\ Use pch.h true Guard - true true + true + true + true + true + /Zc:__cplusplus %(AdditionalOptions) diff --git a/externals/coda-oss/modules/c++/coda-oss-lite.vcxproj.filters b/externals/coda-oss/modules/c++/coda-oss-lite.vcxproj.filters index 34ff4e3d06..75b5514713 100644 --- a/externals/coda-oss/modules/c++/coda-oss-lite.vcxproj.filters +++ b/externals/coda-oss/modules/c++/coda-oss-lite.vcxproj.filters @@ -720,6 +720,21 @@ mem + + mem + + + std + + + std + + + std + + + config + @@ -1059,6 +1074,9 @@ sys + + sys + diff --git a/externals/coda-oss/modules/c++/coda_oss/include/coda_oss/CPlusPlus.h b/externals/coda-oss/modules/c++/coda_oss/include/coda_oss/CPlusPlus.h index 68eb6f37b0..f28d64236b 100644 --- a/externals/coda-oss/modules/c++/coda_oss/include/coda_oss/CPlusPlus.h +++ b/externals/coda-oss/modules/c++/coda_oss/include/coda_oss/CPlusPlus.h @@ -48,14 +48,18 @@ #if defined(__GNUC__) #endif // __GNUC__ + + #if defined(__INTEL_COMPILER) + #endif // __INTEL_COMPILER #endif // CODA_OSS_cplusplus + #if CODA_OSS_cplusplus < 202002L // oops ... try to fix - #if defined(__GNUC__) && (__cplusplus >= 201709L) // note > C++ 17 of 201703L + #if defined(__GNUC__) && (__cplusplus >= 201709L) // note > C++ 17 of 201703L // Enough C++20 for our needs #undef CODA_OSS_cplusplus #define CODA_OSS_cplusplus 202002L - #endif + #endif #endif // CODA_OSS_cplusplus // Define a few macros as that's less verbose than testing against a version number diff --git a/externals/coda-oss/modules/c++/coda_oss/include/coda_oss/memory.h b/externals/coda-oss/modules/c++/coda_oss/include/coda_oss/memory.h index df4099f75e..a546428fb9 100644 --- a/externals/coda-oss/modules/c++/coda_oss/include/coda_oss/memory.h +++ b/externals/coda-oss/modules/c++/coda_oss/include/coda_oss/memory.h @@ -26,5 +26,42 @@ #pragma once #include +#include +#include + +#include "config/compiler_extensions.h" + +#include "coda_oss/namespace_.h" +namespace coda_oss +{ +// C++11 inadvertently ommitted make_unique; provide it here. (Swiped from .) +template ::value, int>::type = 0> +std::unique_ptr make_unique(TArgs&&... args) +{ + CODA_OSS_disable_warning_push + #if _MSC_VER + #pragma warning(disable: 26409) // Avoid calling new and delete explicitly, use std::make_unique instead (r .11). + #endif + return std::unique_ptr(new T(std::forward(args)...)); + CODA_OSS_disable_warning_pop +} + +template ::value && std::extent::value == 0, int>::type = 0> +std::unique_ptr make_unique(size_t size) +{ + using element_t = typename std::remove_extent::type; + + CODA_OSS_disable_warning_push + #if _MSC_VER + #pragma warning(disable: 26409) // Avoid calling new and delete explicitly, use std::make_unique instead (r .11). + #endif + return std::unique_ptr(new element_t[size]()); + CODA_OSS_disable_warning_pop +} + +template ::value != 0, int>::type = 0> +void make_unique(TArgs&&...) = delete; + +} // namespace coda_oss #endif // CODA_OSS_coda_oss_memory_h_INCLUDED_ diff --git a/externals/coda-oss/modules/c++/coda_oss/include/coda_oss/optional_.h b/externals/coda-oss/modules/c++/coda_oss/include/coda_oss/optional_.h index 9ce2bf2efc..8aa35e198d 100644 --- a/externals/coda-oss/modules/c++/coda_oss/include/coda_oss/optional_.h +++ b/externals/coda-oss/modules/c++/coda_oss/include/coda_oss/optional_.h @@ -63,27 +63,21 @@ class optional final using value_type = T; #if defined(_MSC_VER) && _PREFAST_ // Visual Studio /analyze - __pragma(warning(push)) __pragma(warning( - disable : 26495)) // Variable '...' is uninitialized. Always - // initialize a member variable(type.6). + __pragma(warning(push)) __pragma(warning(disable : 26495)) // Variable '...' is uninitialized. Always initialize a member variable(type.6). #endif - optional() noexcept + optional() noexcept { } #if defined(_MSC_VER) && _PREFAST_ __pragma(warning(pop)) #endif - optional(const value_type& v) : - value_(v), has_value_(true) + optional(const value_type& v) : value_(v), has_value_(true) { } #if defined(_MSC_VER) && _PREFAST_ // Visual Studio /analyze - __pragma(warning(push)) __pragma(warning( - disable : 26495)) // Variable '...' is uninitialized. Always - // initialize a member variable(type.6). + __pragma(warning(push)) __pragma(warning(disable : 26495)) // Variable '...' is uninitialized. Always initialize a member variable(type.6). #endif - optional(const optional& other) : - has_value_(other.has_value_) + optional(const optional& other) : has_value_(other.has_value_) { if (has_value()) { @@ -93,19 +87,30 @@ class optional final #if defined(_MSC_VER) && _PREFAST_ __pragma(warning(pop)) #endif + optional& operator=(const optional& other) + { + if (has_value() && !other.has_value()) + { + reset(); + } + else if (other.has_value()) + { + value_ = other.value_; + has_value_ = true; + } + + return *this; + } - template < - typename... Args> // https://en.cppreference.com/w/cpp/utility/Optional/emplace - T& emplace(Args&&... args) + template // https://en.cppreference.com/w/cpp/utility/Optional/emplace + T& emplace(Args&&... args) { value_ = value_type(std::forward(args)...); has_value_ = true; return value_; } - template < - typename U = - T> // https://en.cppreference.com/w/cpp/utility/optional/operator%3D + template // https://en.cppreference.com/w/cpp/utility/optional/operator%3D optional& operator=(U&& value) noexcept { value_ = std::forward(value); @@ -124,6 +129,7 @@ class optional final void reset() noexcept { + value_ = T{}; has_value_ = false; } @@ -163,11 +169,10 @@ class optional final // contains a value!" } - const T& operator*() const& + const T& operator*() const& noexcept { assert(has_value()); - return value_; // "This operator does not check whether the optional - // contains a value!" + return value_; // "This operator does not check whether the optional contains a value!" } T& operator*() & { diff --git a/externals/coda-oss/modules/c++/coda_oss/include/coda_oss/type_traits.h b/externals/coda-oss/modules/c++/coda_oss/include/coda_oss/type_traits.h index c5389890bc..5c92c1d321 100644 --- a/externals/coda-oss/modules/c++/coda_oss/include/coda_oss/type_traits.h +++ b/externals/coda-oss/modules/c++/coda_oss/include/coda_oss/type_traits.h @@ -24,4 +24,12 @@ #include +#include "CPlusPlus.h" + +#include "coda_oss/namespace_.h" +namespace coda_oss +{ +using std::is_trivially_copyable; +} + #endif // CODA_OSS_coda_oss_type_traits_h_INCLUDED_ diff --git a/externals/coda-oss/modules/c++/config/include/config/disable_compiler_warnings.h b/externals/coda-oss/modules/c++/config/include/config/disable_compiler_warnings.h new file mode 100644 index 0000000000..a3b1a5125e --- /dev/null +++ b/externals/coda-oss/modules/c++/config/include/config/disable_compiler_warnings.h @@ -0,0 +1,49 @@ +/* ========================================================================= + * This file is part of config-c++ + * ========================================================================= + * + * (C) Copyright 2023, Maxar Technologies, Inc. + * + * config-c++ is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; If not, + * see . + * + */ +#ifndef CODA_OSS_config_disable_compiler_warnings_h_INCLUDED_ +#define CODA_OSS_config_disable_compiler_warnings_h_INCLUDED_ +#pragma once + +#include "compiler_extensions.h" + +#if defined(_MSC_VER) +// We don't care about any padding added to structs +#pragma warning(disable: 4820) // '...': '...' bytes padding added after data member '...' + +// Assume any unreferenced functions will be used in other code +#pragma warning(disable: 4514) // '...': unreferenced inline function has been removed + +// ??? +#pragma warning(disable: 4668) // '...' is not defined as a preprocessor macro, replacing with '...' for '...' + +// ??? +#pragma warning(disable: 5045) // Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified + + +#elif defined(__GNUC__) || defined(__clang__) + +// don't care about compatibility between different -std=c++nn values +CODA_OSS_disable_warning(-Wnoexcept-type) + +#endif // _MSC_VER + +#endif // CODA_OSS_config_disable_compiler_warnings_h_INCLUDED_ diff --git a/externals/coda-oss/modules/c++/except/include/except/Backtrace.h b/externals/coda-oss/modules/c++/except/include/except/Backtrace.h index 97bee2952d..42cf6ba6a4 100644 --- a/externals/coda-oss/modules/c++/except/include/except/Backtrace.h +++ b/externals/coda-oss/modules/c++/except/include/except/Backtrace.h @@ -40,7 +40,17 @@ #endif namespace version { namespace except { +#if _MSC_VER +#pragma warning(push) +#pragma warning(disable: 4619) // #pragma warning: there is no warning number '...' +#pragma warning(disable: 5264) // '...': '...' variable is not used +#endif // _MSC_VER + constexpr auto backtrace = CODA_OSS_except_Backtrace; + +#if _MSC_VER +#pragma warning(pop) +#endif // _MSC_VER } } namespace except diff --git a/externals/coda-oss/modules/c++/except/include/except/Context.h b/externals/coda-oss/modules/c++/except/include/except/Context.h index cef7af1763..83f80acee3 100644 --- a/externals/coda-oss/modules/c++/except/include/except/Context.h +++ b/externals/coda-oss/modules/c++/except/include/except/Context.h @@ -29,6 +29,7 @@ #include #include "config/Exports.h" +#include "config/disable_compiler_warnings.h" /*! * \file diff --git a/externals/coda-oss/modules/c++/except/include/except/Error.h b/externals/coda-oss/modules/c++/except/include/except/Error.h index 10231ae15b..56fcdb78ca 100644 --- a/externals/coda-oss/modules/c++/except/include/except/Error.h +++ b/externals/coda-oss/modules/c++/except/include/except/Error.h @@ -46,13 +46,13 @@ _Name##Error_(const except::Throwable& t, const except::Context& c) : _Base(t, c){} \ _Name##Error_(const except::ThrowableEx& t, const except::Context& c) : _Base(t, c){} \ std::string getType() const noexcept override { return #_Name; } \ - }; + } #define DECLARE_EXTENDED_ERROR(_Name, _Base) DECLARE_EXTENDED_ERROR_(_Name, Error, _Base) #define DECLARE_EXTENDED_ERROREX(_Name, _Base) DECLARE_EXTENDED_ERROR_(_Name, ErrorEx, _Base) // Need to keep this around for existing code #define DECLARE_ERROR(_Name) \ - DECLARE_EXTENDED_ERROR(_Name, except::Error); \ + DECLARE_EXTENDED_ERROR(_Name, except::Error); \ DECLARE_EXTENDED_ERROREX(_Name, except::ErrorEx) namespace except @@ -156,7 +156,7 @@ using Error11 = ErrorEx; // keep old name around for other projects * \class InvalidDerivedTypeError * \brief Represents an invalid derived type error. */ -DECLARE_ERROR(InvalidDerivedType) +DECLARE_ERROR(InvalidDerivedType); } diff --git a/externals/coda-oss/modules/c++/except/include/except/Exception.h b/externals/coda-oss/modules/c++/except/include/except/Exception.h index 9bbbe03d91..33a8563632 100644 --- a/externals/coda-oss/modules/c++/except/include/except/Exception.h +++ b/externals/coda-oss/modules/c++/except/include/except/Exception.h @@ -63,13 +63,13 @@ _Name##Exception_(const except::ThrowableEx& t, const except::Context& c) : _Base(t, c){} \ CODA_OSS_except_Exception_suppress_26447_BEGIN_ \ std::string getType() const noexcept override { return #_Name #Exception_; } \ - CODA_OSS_except_Exception_suppress_26447_END_ }; + CODA_OSS_except_Exception_suppress_26447_END_ } #define DECLARE_EXTENDED_EXCEPTION(_Name, _Base) DECLARE_EXTENDED_EXCEPTION_(_Name, Exception, _Base) #define DECLARE_EXTENDED_EXCEPTIONEX(_Name, _Base) DECLARE_EXTENDED_EXCEPTION_(_Name, ExceptionEx, _Base) // Need to keep this around for existing code #define DECLARE_EXCEPTION(_Name) \ - DECLARE_EXTENDED_EXCEPTION(_Name, except::Exception) \ + DECLARE_EXTENDED_EXCEPTION(_Name, except::Exception); \ DECLARE_EXTENDED_EXCEPTIONEX(_Name, except::ExceptionEx) namespace except @@ -172,37 +172,37 @@ using Exception11 = ExceptionEx; // keep old name around for other projects * \class IOException * \brief Throwable related to IO problems. */ -DECLARE_EXCEPTION(IO) +DECLARE_EXCEPTION(IO); /*! * \class FileNotFoundException * \brief Throwable related to a file not found. */ -DECLARE_EXTENDED_EXCEPTION(FileNotFound, except::IOException) +DECLARE_EXTENDED_EXCEPTION(FileNotFound, except::IOException); /*! * \class BadCastException * \brief Exception for bad casting operations */ -DECLARE_EXCEPTION(BadCast) +DECLARE_EXCEPTION(BadCast); /*! * \class InvalidFormatException * \brief Throwable related to an invalid file format. */ -DECLARE_EXCEPTION(InvalidFormat) +DECLARE_EXCEPTION(InvalidFormat); /*! * \class IndexOutOfRangeException * \brief Throwable related to an index being out of range. */ -DECLARE_EXCEPTION(IndexOutOfRange) +DECLARE_EXCEPTION(IndexOutOfRange); /*! * \class OutOfMemoryException * \brief Throwable related to memory allocation problems. */ -DECLARE_EXCEPTION(OutOfMemory) +DECLARE_EXCEPTION(OutOfMemory); /*! * \class NullPointerReference @@ -211,7 +211,7 @@ DECLARE_EXCEPTION(OutOfMemory) * This class is currently treated as an exception, meaning that its * behavior is not necessarily fatal. */ -DECLARE_EXCEPTION(NullPointerReference) +DECLARE_EXCEPTION(NullPointerReference); //! For backwards-compatibility typedef NullPointerReferenceException NullPointerReference; @@ -219,43 +219,43 @@ typedef NullPointerReferenceException NullPointerReference; * \class NoSuchKeyException * \brief Throwable related to unknown keys. */ -DECLARE_EXCEPTION(NoSuchKey) +DECLARE_EXCEPTION(NoSuchKey); /*! * \class NoSuchReferenceException * \brief Throwable related to unknown references. */ -DECLARE_EXCEPTION(NoSuchReference) +DECLARE_EXCEPTION(NoSuchReference); /*! * \class KeyAlreadyExistsException * \brief Throwable related to duplicate keys. */ -DECLARE_EXCEPTION(KeyAlreadyExists) +DECLARE_EXCEPTION(KeyAlreadyExists); /*! * \class NotImplementedException * \brief Throwable related to code not being implemented yet. */ -DECLARE_EXCEPTION(NotImplemented) +DECLARE_EXCEPTION(NotImplemented); /*! * \class InvalidArgumentException * \brief Throwable related to an invalid argument being passed. */ -DECLARE_EXCEPTION(InvalidArgument) +DECLARE_EXCEPTION(InvalidArgument); /*! * \class SerializationException * \brief Throwable related to failing to serialize/deserialize data. */ -DECLARE_EXTENDED_EXCEPTION(Serialization, except::IOException) +DECLARE_EXTENDED_EXCEPTION(Serialization, except::IOException); /*! * \class ParseException * \brief Throwable related to failing to parse data. */ -DECLARE_EXTENDED_EXCEPTION(Parse, except::IOException) +DECLARE_EXTENDED_EXCEPTION(Parse, except::IOException); } diff --git a/externals/coda-oss/modules/c++/except/include/except/Throwable.h b/externals/coda-oss/modules/c++/except/include/except/Throwable.h index 0f3427ed45..84fe4d0385 100644 --- a/externals/coda-oss/modules/c++/except/include/except/Throwable.h +++ b/externals/coda-oss/modules/c++/except/include/except/Throwable.h @@ -34,6 +34,7 @@ #include "config/Exports.h" #include "config/compiler_extensions.h" +#include "config/disable_compiler_warnings.h" #include "except/Trace.h" /* Determine whether except::Throwable derives from std::exception. diff --git a/externals/coda-oss/modules/c++/except/source/Backtrace.cpp b/externals/coda-oss/modules/c++/except/source/Backtrace.cpp index 3131668082..a6a326415e 100644 --- a/externals/coda-oss/modules/c++/except/source/Backtrace.cpp +++ b/externals/coda-oss/modules/c++/except/source/Backtrace.cpp @@ -28,6 +28,8 @@ #include #include +#include "config/disable_compiler_warnings.h" + #if !CODA_OSS_except_Backtrace static std::string getBacktrace_(bool& supported, std::vector&) @@ -55,6 +57,10 @@ struct BacktraceHelper final BacktraceHelper(char** stackSymbols) : mStackSymbols(stackSymbols) {} + BacktraceHelper(const BacktraceHelper&) = delete; + BacktraceHelper& operator=(const BacktraceHelper&) = delete; + BacktraceHelper(BacktraceHelper&&) = default; + BacktraceHelper& operator=(BacktraceHelper&&) = default; ~BacktraceHelper() { diff --git a/externals/coda-oss/modules/c++/except/tests/Gen2Test.cpp b/externals/coda-oss/modules/c++/except/tests/Gen2Test.cpp index 65623ff21c..b7d641d898 100644 --- a/externals/coda-oss/modules/c++/except/tests/Gen2Test.cpp +++ b/externals/coda-oss/modules/c++/except/tests/Gen2Test.cpp @@ -29,7 +29,7 @@ using std::endl; using std::cout; using namespace except; -DECLARE_EXCEPTION(DivideByZero) +DECLARE_EXCEPTION(DivideByZero); typedef DivideByZeroException DivideByZero; double Divide(double x, double y); diff --git a/externals/coda-oss/modules/c++/framework.h b/externals/coda-oss/modules/c++/framework.h index 4b63b165b6..ced33cae73 100644 --- a/externals/coda-oss/modules/c++/framework.h +++ b/externals/coda-oss/modules/c++/framework.h @@ -8,8 +8,11 @@ #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #define NOMINMAX // no min()/max() macros +#pragma warning(push) +#pragma warning(disable: 5105) // macro expansion producing '...' has undefined behavior #include #include #include +#pragma warning(pop) #pragma comment(lib, "Ws2_32") #pragma warning(pop) diff --git a/externals/coda-oss/modules/c++/hdf5.lite/CMakeLists.txt b/externals/coda-oss/modules/c++/hdf5.lite/CMakeLists.txt index bb8ec4bcfb..0efec0c88a 100644 --- a/externals/coda-oss/modules/c++/hdf5.lite/CMakeLists.txt +++ b/externals/coda-oss/modules/c++/hdf5.lite/CMakeLists.txt @@ -1,8 +1,8 @@ set(MODULE_NAME hdf5.lite) if(CODA_ENABLE_HDF5) - set(MODULE_DEPS str-c++ except-c++ types-c++ io-c++ logging-c++ str-c++ coda_oss-c++ config-c++ gsl-c++) - list(APPEND MODULE_DEPS hdf5-c++) + set(MODULE_DEPS highfive-c++ hdf5-c++) + list(APPEND MODULE_DEPS except-c++ types-c++ io-c++ coda_oss-c++) coda_add_module( ${MODULE_NAME} diff --git a/externals/coda-oss/modules/c++/hdf5.lite/include/hdf5/lite/HDF5Exception.h b/externals/coda-oss/modules/c++/hdf5.lite/include/hdf5/lite/HDF5Exception.h index 74079b59ee..83fd276bba 100644 --- a/externals/coda-oss/modules/c++/hdf5.lite/include/hdf5/lite/HDF5Exception.h +++ b/externals/coda-oss/modules/c++/hdf5.lite/include/hdf5/lite/HDF5Exception.h @@ -46,9 +46,9 @@ namespace lite */ CODA_OSS_DECLARE_EXCEPTION(HDF5); -CODA_OSS_DECLARE_EXTENDED_EXCEPTION(DataSet, hdf5::lite::HDF5Exception) -CODA_OSS_DECLARE_EXTENDED_EXCEPTION(DataSpace, hdf5::lite::HDF5Exception) -CODA_OSS_DECLARE_EXTENDED_EXCEPTION(DataType, hdf5::lite::HDF5Exception) +CODA_OSS_DECLARE_EXTENDED_EXCEPTION(DataSet, hdf5::lite::HDF5Exception); +CODA_OSS_DECLARE_EXTENDED_EXCEPTION(DataSpace, hdf5::lite::HDF5Exception); +CODA_OSS_DECLARE_EXTENDED_EXCEPTION(DataType, hdf5::lite::HDF5Exception); } } diff --git a/externals/coda-oss/modules/c++/hdf5.lite/include/hdf5/lite/Info.h b/externals/coda-oss/modules/c++/hdf5.lite/include/hdf5/lite/Info.h index b25ad780b5..ee62c137d0 100644 --- a/externals/coda-oss/modules/c++/hdf5.lite/include/hdf5/lite/Info.h +++ b/externals/coda-oss/modules/c++/hdf5.lite/include/hdf5/lite/Info.h @@ -20,8 +20,8 @@ * */ -#ifndef CODA_OSS_hdf5_lite_Read_h_INCLUDED_ -#define CODA_OSS_hdf5_lite_Read_h_INCLUDED_ +#ifndef CODA_OSS_hdf5_lite_Info_h_INCLUDED_ +#define CODA_OSS_hdf5_lite_Info_h_INCLUDED_ #pragma once #include @@ -64,21 +64,21 @@ struct NamedObject std::string name; }; -struct DatatypeInfo final : public NamedObject +struct DataTypeInfo final : public NamedObject { Class h5Class; // Type size_t size = 0; }; -struct DataspaceInfo final +struct DataSpaceInfo final { }; -struct DatasetInfo final : public NamedObject +struct DataSetInfo final : public NamedObject { - DatatypeInfo datatype; - DataspaceInfo dataspace; + DataTypeInfo dataType; + DataSpaceInfo dataSpace; // ChunkSize // FillValue // Filter @@ -88,8 +88,8 @@ struct DatasetInfo final : public NamedObject struct GroupInfo : public NamedObject { std::vector groups; - std::vector datasets; - std::vector datatypes; + std::vector dataSets; + std::vector dataTypes; // Links // Attributes }; @@ -99,12 +99,11 @@ struct FileInfo final : public GroupInfo }; -CODA_OSS_API FileInfo fileInfo(coda_oss::filesystem::path); -CODA_OSS_API GroupInfo groupInfo(coda_oss::filesystem::path, std::string loc); -CODA_OSS_API DatasetInfo datasetInfo(coda_oss::filesystem::path, std::string loc); +CODA_OSS_API FileInfo fileInfo(const coda_oss::filesystem::path&); +CODA_OSS_API GroupInfo groupInfo(const coda_oss::filesystem::path&, const std::string& loc); +CODA_OSS_API DataSetInfo dataSetInfo(const coda_oss::filesystem::path&, const std::string& loc); } } -#endif // CODA_OSS_hdf5_lite_Read_h_INCLUDED_ - +#endif // CODA_OSS_hdf5_lite_Info_h_INCLUDED_ diff --git a/externals/coda-oss/modules/c++/hdf5.lite/include/hdf5/lite/Read.h b/externals/coda-oss/modules/c++/hdf5.lite/include/hdf5/lite/Read.h index 4cc80d4784..09a8502ee4 100644 --- a/externals/coda-oss/modules/c++/hdf5.lite/include/hdf5/lite/Read.h +++ b/externals/coda-oss/modules/c++/hdf5.lite/include/hdf5/lite/Read.h @@ -28,7 +28,7 @@ * \file Read.h * \brief HDF File-reading API * - * These are simple routines to read HDF5 files; they're loosly modeled after the MATLab API + * These are simple routines to read HDF5 files; they're loosely modeled after the MATLab API * https://www.mathworks.com/help/matlab/import_export/import-hdf5-files.html */ @@ -39,15 +39,17 @@ #include "sys/filesystem.h" #include "types/RowCol.h" +#include "SpanRC.h" + namespace hdf5 { namespace lite { -CODA_OSS_API types::RowCol readFile(coda_oss::filesystem::path, std::string datasetName, std::vector&); +CODA_OSS_API SpanRC readFile(const coda_oss::filesystem::path&, const std::string& loc, std::vector&); +CODA_OSS_API SpanRC readFile(const coda_oss::filesystem::path&, const std::string& loc, std::vector&); } } #endif // CODA_OSS_hdf5_lite_Read_h_INCLUDED_ - diff --git a/externals/coda-oss/modules/c++/hdf5.lite/include/hdf5/lite/SpanRC.h b/externals/coda-oss/modules/c++/hdf5.lite/include/hdf5/lite/SpanRC.h new file mode 100644 index 0000000000..9392890bb2 --- /dev/null +++ b/externals/coda-oss/modules/c++/hdf5.lite/include/hdf5/lite/SpanRC.h @@ -0,0 +1,115 @@ +/* ========================================================================= + * This file is part of hdf5.lite-c++ + * ========================================================================= + * + * (C) Copyright 2022, Maxar Technologies, Inc. + * + * hdf5.lite-c++ is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; If not, + * see . + * + */ + +#ifndef CODA_OSS_hdf5_lite_SpanRC_h_INCLUDED_ +#define CODA_OSS_hdf5_lite_SpanRC_h_INCLUDED_ +#pragma once + +/*! + * \file SpanRC.h + * + * This is a super-simple version of C++23's mdspan. It's here because 1) don't want widespread use, and + * 2) CODA already has a View2D. + */ + +#include + +#include "config/Exports.h" +#include "coda_oss/span.h" +#include "types/RowCol.h" + +namespace hdf5 +{ +namespace lite +{ + +template +struct SpanRC final +{ + using size_type = types::RowCol; + using element_type = T; + using pointer = T*; + using reference = T&; + + SpanRC() = default; + SpanRC(pointer p, size_type rc) noexcept : s_(p, rc.area()), rc_(rc) + { + } + SpanRC(pointer p, size_t r, size_t c) noexcept : SpanRC(p, size_type(r, c)) + { + } + SpanRC(const SpanRC&) noexcept = default; + + constexpr pointer data() const noexcept + { + return s_.data(); + } + + /*constexpr*/ reference operator[](size_t idx) const noexcept + { + assert(idx < size()); // prevents "constexpr" in C++11 + return data()[idx]; + } + /*constexpr*/ reference operator()(size_t r, size_t c) const noexcept + { + const auto offset = (r * dims().col) + c; + return (*this)[offset]; + } + /*constexpr*/ reference operator[](size_type idx) const noexcept + { + return (*this)(idx.row, idx.col); + } + + constexpr size_t size() const noexcept + { + assert(s_.size() == rc_.area()); + return s_.size(); + } + constexpr size_t area() const noexcept + { + return size(); + } + + constexpr size_type size_bytes() const noexcept + { + return s_.size_bytes(); + } + + constexpr bool empty() const noexcept + { + return s_.empty(); + } + + const auto& dims() const + { + return rc_; + } + + private: + coda_oss::span s_; + types::RowCol rc_; +}; + +} +} + +#endif // CODA_OSS_hdf5_lite_SpanRC_h_INCLUDED_ diff --git a/externals/coda-oss/modules/c++/hdf5.lite/include/hdf5/lite/Write.h b/externals/coda-oss/modules/c++/hdf5.lite/include/hdf5/lite/Write.h new file mode 100644 index 0000000000..dea204a7f9 --- /dev/null +++ b/externals/coda-oss/modules/c++/hdf5.lite/include/hdf5/lite/Write.h @@ -0,0 +1,80 @@ +/* ========================================================================= + * This file is part of hdf5.lite-c++ + * ========================================================================= + * + * (C) Copyright 2023, Maxar Technologies, Inc. + * + * hdf5.lite-c++ is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; If not, + * see . + * + */ + +#ifndef CODA_OSS_hdf5_lite_Write_h_INCLUDED_ +#define CODA_OSS_hdf5_lite_Write_h_INCLUDED_ +#pragma once + +/*! + * \file Write.h + * \brief HDF File-writing API + * + * These are simple routines to write HDF5 files; they're loosely modeled after the MATLab API + * https://www.mathworks.com/help/matlab/ref/h5create.html + * https://www.mathworks.com/help/matlab/ref/h5write.html + */ + +#include +#include + +#include "config/Exports.h" +#include "sys/filesystem.h" +#include "types/RowCol.h" + +#include "SpanRC.h" + +namespace hdf5 +{ +namespace lite +{ +template // currently implemented for float and double +CODA_OSS_API void createFile(const coda_oss::filesystem::path&, const std::string& ds, const types::RowCol&); +CODA_OSS_API void createFile(const coda_oss::filesystem::path&, const std::string& ds, SpanRC); +inline void createFile(const coda_oss::filesystem::path& path, const std::string& ds, SpanRC data_) +{ + SpanRC data(data_.data(), data_.dims()); + createFile(path, ds, data); +} +CODA_OSS_API void createFile(const coda_oss::filesystem::path&, const std::string& ds, SpanRC); +inline void createFile(const coda_oss::filesystem::path& path, const std::string& ds, SpanRC data_) +{ + SpanRC data(data_.data(), data_.dims()); + createFile(path, ds, data); +} + +CODA_OSS_API void writeFile(const coda_oss::filesystem::path&, const std::string& loc, SpanRC); +inline void writeFile(const coda_oss::filesystem::path& path, const std::string& ds, SpanRC data_) +{ + SpanRC data(data_.data(), data_.dims()); + writeFile(path, ds, data); +} +CODA_OSS_API void writeFile(const coda_oss::filesystem::path&, const std::string& loc, SpanRC); +inline void writeFile(const coda_oss::filesystem::path& path, const std::string& ds, SpanRC data_) +{ + SpanRC data(data_.data(), data_.dims()); + writeFile(path, ds, data); +} + +} +} + +#endif // CODA_OSS_hdf5_lite_Write_h_INCLUDED_ diff --git a/externals/coda-oss/modules/c++/hdf5.lite/include/hdf5/lite/highfive.h b/externals/coda-oss/modules/c++/hdf5.lite/include/hdf5/lite/highfive.h new file mode 100644 index 0000000000..6203344c30 --- /dev/null +++ b/externals/coda-oss/modules/c++/hdf5.lite/include/hdf5/lite/highfive.h @@ -0,0 +1,75 @@ +/* ========================================================================= + * This file is part of hdf5.lite-c++ + * ========================================================================= + * + * (C) Copyright 2022, Maxar Technologies, Inc. + * + * hdf5.lite-c++ is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; If not, + * see . + * + */ + +#ifndef CODA_OSS_hdf5_lite_highfive_h_INCLUDED_ +#define CODA_OSS_hdf5_lite_highfive_h_INCLUDED_ +#pragma once + +/*! + * \file highfive.h + * \brief Utility routines for using HighFive + */ + +#include + +#include "highfive/H5Easy.hpp" +#include "highfive/H5DataSet.hpp" + +#include "SpanRC.h" + +namespace hdf5 +{ +namespace lite +{ +template +inline HighFive::DataSet writeDataSet(H5Easy::File& file, SpanRC data, const std::string& dataset_name /*, TODO ...*/) +{ + const std::vector dims{data.dims().row, data.dims().col}; + const HighFive::DataSpace dataspace{dims}; + auto retval = file.createDataSet(dataset_name, dataspace); + retval.write_raw(data.data()); + return retval; +} + +template +inline SpanRC readDataSet(HighFive::DataSet& dataSet, std::vector& result /*, TODO ...*/) +{ + const auto dimensions = dataSet.getSpace().getDimensions(); + const types::RowCol dims(dimensions[0], dimensions[1]); + + result.resize(dims.area()); + dataSet.read(result.data()); + + return SpanRC(result.data(), dims); +} + +template +inline SpanRC load(H5Easy::File& file, const std::string& dataset_name, std::vector& result /*, TODO ...*/) +{ + auto dataSet = file.getDataSet(dataset_name); + return readDataSet(dataSet, result); +} + +} +} + +#endif // CODA_OSS_hdf5_lite_highfive_h_INCLUDED_ diff --git a/externals/coda-oss/modules/c++/hdf5.lite/source/H5.h b/externals/coda-oss/modules/c++/hdf5.lite/source/H5.h index 8f3abb0830..24b0d8cfc1 100644 --- a/externals/coda-oss/modules/c++/hdf5.lite/source/H5.h +++ b/externals/coda-oss/modules/c++/hdf5.lite/source/H5.h @@ -20,6 +20,10 @@ * */ +#ifndef CODA_OSS_hdf5_lite_H5_h_INCLUDED_ +#define CODA_OSS_hdf5_lite_H5_h_INCLUDED_ +#pragma once + #include // see https://docs.hdfgroup.org/archive/support/HDF5/doc1.8/cpplus_RM/readdata_8cpp-example.html @@ -42,4 +46,6 @@ types::RowCol getSimpleExtentSize(const H5::DataSet&); } } -} \ No newline at end of file +} + +#endif // CODA_OSS_hdf5_lite_H5_h_INCLUDED_ diff --git a/externals/coda-oss/modules/c++/hdf5.lite/source/Info.cpp b/externals/coda-oss/modules/c++/hdf5.lite/source/Info.cpp index 6c9fc78565..18062343ab 100644 --- a/externals/coda-oss/modules/c++/hdf5.lite/source/Info.cpp +++ b/externals/coda-oss/modules/c++/hdf5.lite/source/Info.cpp @@ -70,18 +70,18 @@ static herr_t dataset_info(hid_t loc_id, const char *name, const H5L_info_t* /*l { H5Dclose(obj); - hdf5::lite::DatasetInfo info; + hdf5::lite::DataSetInfo info; info.name = name; - auto pRetval = static_cast*>(opdata); + auto pRetval = static_cast*>(opdata); pRetval->push_back(info); } return 0; } -static std::vector getDatasets(H5::Group& group) +static std::vector getDataSets(H5::Group& group) { - std::vector retval; + std::vector retval; const auto herr = H5Literate(group.getId(), H5_INDEX_NAME, H5_ITER_INC, nullptr /*idx*/, dataset_info, &retval); if (herr != 0) @@ -102,18 +102,18 @@ static herr_t datatype_info(hid_t loc_id, const char *name, const H5L_info_t* /* { H5Tclose(obj); - hdf5::lite::DatatypeInfo info; + hdf5::lite::DataTypeInfo info; info.name = name; - auto pRetval = static_cast*>(opdata); + auto pRetval = static_cast*>(opdata); pRetval->push_back(info); } return 0; } -static std::vector getDatatypes(H5::Group& group) +static std::vector getDataTypes(H5::Group& group) { - std::vector retval; + std::vector retval; const auto herr = H5Literate(group.getId(), H5_INDEX_NAME, H5_ITER_INC, nullptr /*idx*/, datatype_info, &retval); if (herr != 0) @@ -126,7 +126,7 @@ static std::vector getDatatypes(H5::Group& group) } // https://docs.hdfgroup.org/archive/support/HDF5/doc1.8/cpplus_RM/readdata_8cpp-example.html -static hdf5::lite::GroupInfo groupInfo_(coda_oss::filesystem::path filename, std::string loc) +static hdf5::lite::GroupInfo groupInfo_(const coda_oss::filesystem::path& filename, const std::string& loc) { hdf5::lite::GroupInfo retval; retval.filename = filename.string(); @@ -139,16 +139,16 @@ static hdf5::lite::GroupInfo groupInfo_(coda_oss::filesystem::path filename, std auto group = file.openGroup(retval.name); retval.groups = getGroups(group); - retval.datasets = getDatasets(group); - retval.datatypes = getDatatypes(group); + retval.dataSets = getDataSets(group); + retval.dataTypes = getDataTypes(group); return retval; } -hdf5::lite::GroupInfo hdf5::lite::groupInfo(coda_oss::filesystem::path filename, std::string loc) +hdf5::lite::GroupInfo hdf5::lite::groupInfo(const coda_oss::filesystem::path& filename, const std::string& loc) { - return details::try_catch_H5Exceptions(groupInfo_, filename, loc); + return details::try_catch_H5Exceptions(groupInfo_, __FILE__, __LINE__, filename, loc); } -hdf5::lite::FileInfo hdf5::lite::fileInfo(coda_oss::filesystem::path filename) +hdf5::lite::FileInfo hdf5::lite::fileInfo(const coda_oss::filesystem::path& filename) { hdf5::lite::FileInfo retval; hdf5::lite::GroupInfo& retval_ = retval; @@ -185,9 +185,9 @@ static hdf5::lite::Class H5T_class_to_Class(const H5::DataSet& dataset) } // https://docs.hdfgroup.org/archive/support/HDF5/doc1.8/cpplus_RM/readdata_8cpp-example.html -static hdf5::lite::DatasetInfo datasetInfo_(coda_oss::filesystem::path filename, std::string loc) +static hdf5::lite::DataSetInfo dataSetInfo_(const coda_oss::filesystem::path& filename, const std::string& loc) { - hdf5::lite::DatasetInfo retval; + hdf5::lite::DataSetInfo retval; retval.filename = filename.string(); /* @@ -202,11 +202,11 @@ static hdf5::lite::DatasetInfo datasetInfo_(coda_oss::filesystem::path filename, /* * Get the class of the datatype that is used by the dataset. */ - retval.datatype.h5Class = H5T_class_to_Class(dataset); + retval.dataType.h5Class = H5T_class_to_Class(dataset); return retval; } -hdf5::lite::DatasetInfo hdf5::lite::datasetInfo(coda_oss::filesystem::path filename, std::string loc) +hdf5::lite::DataSetInfo hdf5::lite::dataSetInfo(const coda_oss::filesystem::path& filename, const std::string& loc) { - return details::try_catch_H5Exceptions(datasetInfo_, filename, loc); + return details::try_catch_H5Exceptions(dataSetInfo_, __FILE__, __LINE__, filename, loc); } diff --git a/externals/coda-oss/modules/c++/hdf5.lite/source/Read.cpp b/externals/coda-oss/modules/c++/hdf5.lite/source/Read.cpp index 85b021fc62..325111a4fe 100644 --- a/externals/coda-oss/modules/c++/hdf5.lite/source/Read.cpp +++ b/externals/coda-oss/modules/c++/hdf5.lite/source/Read.cpp @@ -27,39 +27,65 @@ #include "coda_oss/cstddef.h" // byte +#include "hdf5/lite/HDF5Exception.h" #include "H5.h" #include "hdf5.lite.h" -template -static types::RowCol readDatasetT(const H5::DataSet& dataset, H5T_class_t type_class, const H5::DataType& mem_type, - std::vector& result) +static void read(const H5::DataSet& dataset, std::vector& result) { - if (type_class != dataset.getTypeClass()) + static_assert(sizeof(double) * 8 == 64, "'double' should be 64-bits"); // IEEE_F64LE + + const auto mem_type = dataset.getDataType(); + if (mem_type != H5::PredType::IEEE_F64LE) { - throw std::invalid_argument("getTypeClass() returned wrong value."); + const except::Context context("getDataType() != IEEE_F64LE", __FILE__, __LINE__, "read"); + throw hdf5::lite::DataSetException(context); } + dataset.read(result.data(), mem_type); +} +static void read(const H5::DataSet& dataset, std::vector& result) +{ + static_assert(sizeof(float) * 8 == 32, "'float' should be 32-bits"); // IEEE_F32LE - const auto retval = hdf5::lite::details::getSimpleExtentSize(dataset); - result.resize(retval.area()); + const auto mem_type = dataset.getDataType(); + if (mem_type != H5::PredType::IEEE_F32LE) + { + const except::Context context("getDataType() != IEEE_F32LE", __FILE__, __LINE__, "read"); + throw hdf5::lite::DataSetException(context); + } dataset.read(result.data(), mem_type); +} +template +static hdf5::lite::SpanRC readDatasetT(const H5::DataSet& dataset, std::vector& result) +{ + if (dataset.getTypeClass() != H5T_FLOAT) + { + const except::Context context("getTypeClass() != H5T_FLOAT", __FILE__, __LINE__, "readDatasetT"); + throw hdf5::lite::DataSetException(context); + } + + const auto dims = hdf5::lite::details::getSimpleExtentSize(dataset); + result.resize(dims.area()); + hdf5::lite::SpanRC retval(result.data(), dims); + + // dataset.read() doesn't care about the buffer type ... that's because H5Dread() also + // uses void*. However, the LT API has H5LTread_dataset_double() and H5LTread_dataset_float(), + read(dataset, result); // data.read(result.data(), mem_type); return retval; } -inline types::RowCol readDataset_(const H5::DataSet& dataset, std::vector& result) +inline hdf5::lite::SpanRC readDataset_(const H5::DataSet& dataset, std::vector& result) { - static_assert(sizeof(float) * 8 == 32, "'float' should be 32-bits"); // IEEE_F32LE - return readDatasetT(dataset, H5T_FLOAT, H5::PredType::IEEE_F32LE, result); + return readDatasetT(dataset, result); } - -inline types::RowCol readDataset_(const H5::DataSet& dataset, std::vector& result) +inline hdf5::lite::SpanRC readDataset_(const H5::DataSet& dataset, std::vector& result) { - static_assert(sizeof(double) * 8 == 64, "'double' should be 64-bits"); // IEEE_F64LE - return readDatasetT(dataset, H5T_FLOAT, H5::PredType::IEEE_F64LE, result); + return readDatasetT(dataset, result); } - -static types::RowCol readFile_(const coda_oss::filesystem::path& fileName, const std::string& datasetName, - std::vector& result) +template +static hdf5::lite::SpanRC readFile_(const coda_oss::filesystem::path& fileName, const std::string& datasetName, + std::vector& result) { /* * Open the specified file and the specified dataset in the file. @@ -68,8 +94,14 @@ static types::RowCol readFile_(const coda_oss::filesystem::path& fileNam const auto dataset = file.openDataSet(datasetName); return readDataset_(dataset, result); } -types::RowCol hdf5::lite::readFile(coda_oss::filesystem::path fileName, std::string datasetName, + +hdf5::lite::SpanRC hdf5::lite::readFile(const coda_oss::filesystem::path& fileName, const std::string& loc, std::vector& result) { - return details::try_catch_H5Exceptions(readFile_, fileName, datasetName, result); + return details::try_catch_H5Exceptions(readFile_, __FILE__, __LINE__, fileName, loc, result); +} +hdf5::lite::SpanRC hdf5::lite::readFile(const coda_oss::filesystem::path& fileName, const std::string& loc, + std::vector& result) +{ + return details::try_catch_H5Exceptions(readFile_, __FILE__, __LINE__, fileName, loc, result); } diff --git a/externals/coda-oss/modules/c++/hdf5.lite/source/Write.cpp b/externals/coda-oss/modules/c++/hdf5.lite/source/Write.cpp new file mode 100644 index 0000000000..ce140935aa --- /dev/null +++ b/externals/coda-oss/modules/c++/hdf5.lite/source/Write.cpp @@ -0,0 +1,115 @@ +/* ========================================================================= + * This file is part of hd5.lite-c++ + * ========================================================================= + * + * (C) Copyright 2023, Maxar Technologies, Inc. + * + * hd5.lite-c++ is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; If not, + * see . + * + */ + +#include "hdf5/lite/Write.h" + +#include // std::ignore +#include + +#include "coda_oss/cstddef.h" // byte + +#include "hdf5/lite/HDF5Exception.h" +#include "H5.h" +#include "hdf5.lite.h" + +// https://raw.githubusercontent.com/HDFGroup/hdf5/develop/c++/examples/h5tutr_rdwt.cpp + +template static H5::PredType getPredType(); +template <> +inline H5::PredType getPredType() +{ + static_assert(sizeof(float) * 8 == 32, "'float' should be 32-bits"); // IEEE_F32LE + return H5::PredType::IEEE_F32LE; +} +template <> +inline H5::PredType getPredType() +{ + static_assert(sizeof(double) * 8 == 64, "'double' should be 64-bits"); // IEEE_F64LE + return H5::PredType::IEEE_F64LE; +} + +template +static void createFile_(const coda_oss::filesystem::path& fileName, const std::string& ds, const types::RowCol& sz) +{ + // https://raw.githubusercontent.com/HDFGroup/hdf5/develop/c++/examples/h5tutr_crtdat.cpp + // + // Create a new file using the default property lists. + H5::H5File file(fileName.string(), H5F_ACC_TRUNC); + + // Create the data space for the dataset. + constexpr int RANK = 2; + const hsize_t dims[]{sz.row, sz.col}; // dataset dimensions + H5::DataSpace dataspace(RANK, dims); + + // Create the dataset. + const auto data_type = getPredType(); + std::ignore = file.createDataSet(ds, data_type, dataspace); +} +template<> +void hdf5::lite::createFile(const coda_oss::filesystem::path& fileName, const std::string& ds, const types::RowCol& sz) +{ + details::try_catch_H5ExceptionsV(createFile_, __FILE__, __LINE__, fileName, ds, sz); +} +template<> +void hdf5::lite::createFile(const coda_oss::filesystem::path& fileName, const std::string& ds, const types::RowCol& sz) +{ + details::try_catch_H5ExceptionsV(createFile_, __FILE__, __LINE__, fileName, ds, sz); +} +void hdf5::lite::createFile(const coda_oss::filesystem::path& fileName, const std::string& ds, hdf5::lite::SpanRC data) +{ + createFile(fileName, ds, data.dims()); +} +void hdf5::lite::createFile(const coda_oss::filesystem::path& fileName, const std::string& ds, hdf5::lite::SpanRC data) +{ + createFile(fileName, ds, data.dims()); +} + + +template +static void writeFile_(const coda_oss::filesystem::path& fileName, const std::string& ds, hdf5::lite::SpanRC data) +{ + // https://raw.githubusercontent.com/HDFGroup/hdf5/develop/c++/examples/h5tutr_rdwt.cpp + + // Open an existing file and dataset. + H5::H5File file(fileName.string(), H5F_ACC_RDWR); + auto dataset = file.openDataSet(ds); + + const auto dims = hdf5::lite::details::getSimpleExtentSize(dataset); + if (data.dims() != dims) + { + const except::Context ctx("dataSet dimensions do not match data dimensions", __FILE__, __LINE__, "writeFile"); + throw hdf5::lite::DataSetException(ctx); + } + + // Write the data to the dataset using default memory space, file + // space, and transfer properties. + const auto data_type = getPredType(); + dataset.write(data.data(), data_type); +} +void hdf5::lite::writeFile(const coda_oss::filesystem::path& fileName, const std::string& ds, SpanRC data) +{ + details::try_catch_H5ExceptionsV(writeFile_, __FILE__, __LINE__, fileName, ds, data); +} +void hdf5::lite::writeFile(const coda_oss::filesystem::path& fileName, const std::string& ds, SpanRC data) +{ + details::try_catch_H5ExceptionsV(writeFile_, __FILE__, __LINE__, fileName, ds, data); +} diff --git a/externals/coda-oss/modules/c++/hdf5.lite/source/hdf5.lite.cpp b/externals/coda-oss/modules/c++/hdf5.lite/source/hdf5.lite.cpp index 5757ac3860..609e6da30d 100644 --- a/externals/coda-oss/modules/c++/hdf5.lite/source/hdf5.lite.cpp +++ b/externals/coda-oss/modules/c++/hdf5.lite/source/hdf5.lite.cpp @@ -22,7 +22,12 @@ #include "hdf5.lite.h" -void hdf5::lite::details::try_catch_H5Exceptions_(std::function f, void* context) +inline except::Context make_Context(const H5::Exception& error, const char* file, int line) +{ + return except::Context(error.getDetailMsg(), file, line, error.getFuncName()); +} + +void hdf5::lite::details::try_catch_H5Exceptions_(std::function f, const char* file, int line, void* context) { try { @@ -34,28 +39,28 @@ void hdf5::lite::details::try_catch_H5Exceptions_(std::function f, f(context); } + // catch failure caused by the H5File operations catch (const H5::FileIException& error) { - const except::Context ctx(error.getDetailMsg(), __FILE__, __LINE__, error.getFuncName()); - throw except::IOException(ctx); + throw except::IOException(make_Context(error, file, line)); } + // catch failure caused by the DataSet operations catch (const H5::DataSetIException& error) { - const except::Context ctx(error.getDetailMsg(), __FILE__, __LINE__, error.getFuncName()); - throw hdf5::lite::DataSetException(ctx); + throw hdf5::lite::DataSetException(make_Context(error, file, line)); } + // catch failure caused by the DataSpace operations catch (const H5::DataSpaceIException& error) { - const except::Context ctx(error.getDetailMsg(), __FILE__, __LINE__, error.getFuncName()); - throw hdf5::lite::DataSpaceException(ctx); + throw hdf5::lite::DataSpaceException(make_Context(error, file, line)); } + // catch failure caused by the DataType operations catch (const H5::DataTypeIException& error) { - const except::Context ctx(error.getDetailMsg(), __FILE__, __LINE__, error.getFuncName()); - throw hdf5::lite::DataTypeException(ctx); + throw hdf5::lite::DataTypeException(make_Context(error, file, line)); } } diff --git a/externals/coda-oss/modules/c++/hdf5.lite/source/hdf5.lite.h b/externals/coda-oss/modules/c++/hdf5.lite/source/hdf5.lite.h index c348ade78e..fce6fb7c0d 100644 --- a/externals/coda-oss/modules/c++/hdf5.lite/source/hdf5.lite.h +++ b/externals/coda-oss/modules/c++/hdf5.lite/source/hdf5.lite.h @@ -20,6 +20,10 @@ * */ +#ifndef CODA_OSS_hdf5_lite_hdf5_lite_h_INCLUDED_ +#define CODA_OSS_hdf5_lite_hdf5_lite_h_INCLUDED_ +#pragma once + #include #include #include @@ -39,13 +43,13 @@ namespace lite namespace details { // Call the given function, converting H5 exceptions to our own. -void try_catch_H5Exceptions_(std::function f, void* context = nullptr); +void try_catch_H5Exceptions_(std::function f, const char* file, int line, void* context = nullptr); template R return_type_of(R (*)(Args...)); template -auto try_catch_H5Exceptions(TFunc f, TArgs&&... args) +auto try_catch_H5Exceptions(TFunc f, const char* file, int line, TArgs&&... args) { // Figure out return type by "calling" the function at compile-time // https://stackoverflow.com/a/53673522/8877 @@ -53,10 +57,18 @@ auto try_catch_H5Exceptions(TFunc f, TArgs&&... args) // "Hide" the arguments inside of a lambda auto call_f = [&](void*) { retval = f(std::forward(args)...); }; - details::try_catch_H5Exceptions_(call_f); + details::try_catch_H5Exceptions_(call_f, file, line, &retval /*context*/); return retval; } +template +auto try_catch_H5ExceptionsV(TFunc f, const char* file, int line, TArgs&&... args) +{ + // "Hide" the arguments inside of a lambda + auto call_f = [&](void*) { f(std::forward(args)...); }; + details::try_catch_H5Exceptions_(call_f, file, line, nullptr /*context*/); +} } } } +#endif // CODA_OSS_hdf5_lite_hdf5_lite_h_INCLUDED_ diff --git a/externals/coda-oss/modules/c++/hdf5.lite/unittests/123_barfoo_catdog_cx.h5 b/externals/coda-oss/modules/c++/hdf5.lite/unittests/123_barfoo_catdog_cx.h5 new file mode 100644 index 0000000000000000000000000000000000000000..3ede040cf902d4e152b55c65701fa4f172a87fbc GIT binary patch literal 31248 zcmeI5O>7%Q6vxL21-Dg2QYe^G2_q;N5G9lV1_HZ)Q5YAAY+KYIQz_N;Ey$22wD)^^V z3eWfB^|{@Pqa!0~)sn7HC4Nn{w!slyht9{P3lxw@U`)a?Zb1ElkJkY z^~qq9<;mkGh7+n+CGmS{IVL`955O15u8H-<2jM*Re_^!KPMw5$`Xwm0%BRi` z2ADBjd=qeNA@3arkOrCF-G!K0;*klQQpl8hw zWRP3BF6Wr|Ozwpnk=+2+^ZPd0fh}UL^8Eh0}mj14NF^8+); z4_)SUJbdinE3Q>f;*923G3B8o9)5YuurJ#;aQ*{36*IN zEYSleNGDiW|MT3a-n+UY4s80<9{OZo4enHf*DycZwt6;b@9BXHCegk(G2IUe=AppP z-FTJYJNHz+nNX_K(f)5&I9J&l!|zC3wQw}y)^b|+Ul{n~w@Bv*xp1SJ&`q0$S_Mt1@a%SIWr;q;R{W-SW zpDq3F`5#rjy88Jg&mN~syWy$1#i@CHyYFvt{}`1I^xX<-(Y%mDd_2-X0bM>&XYti^ zK48y36mSc{E&ssdn7SpLPnxfF+7Jmh7t?Cq&)Ukj=5B+B<`$>s_3a+V_-Zf&en=bBc^J<-n#gUi zo)7*w$K+oZ?uK@l)V#jk^I7g6qw;||Z0oYOqU3NdeWbd4z-RH*bUt7&jxF5>&)hBlz~k5q)1Pxn zam>G;x5%!W_p`R*SRUU*`gV_F{C%vbIF`m2BWYg9o(1wouZv^J1D#r!e*aLn zFH^<))(7DJQT%2e1-qEv&gUhirsKDX{E!Z&_Z4~GQABQOzlC#5eENr=M`TyRdi6Q# zsjO1x2c{2#4zq($M)`rM$H9(tmZf4mTAd%5M}9~l)9W$r2TI5-&2P>z@mYBidPH_L ztT%?Jr?N_W>)K`(l+Jeu?%I2E<;Oa@x2{55rJh*VB>IH;b(gJmZ3aDrTb!ELxBI%5 z`^Tt!AomPlPxC_bBoH`wT|Ura@zr!bU@wkMd+?au@((;e%03+qBhA+qjwak%POEu8 zYb%Z|`S8@-;?%sp-QyTv??=V4#$iy4=7k*Mu4aD4@#+ zDlER5&IjzpvCIqb)Sn!@!uzlierTW zs73QaD*sZ)t&3wm`+d9r>bbs?hg4A<)BB2i{XB!* z(tZo)nEY!6f3}G1YFKYvkogpK`?JkcpvU5AD5Lzq+^b+mI?Gg3?x=NsAc^sTlrg;? z<9?uq+|vB!921|jVPtilB79LvYvLo2$Rl(YJ3qOm9BZC~k-6m` zcz#r7`gcAJwe~v%sq?%=cHO+6wH3!QxZ-t-Q}g*838 z?H8He-_q^N6yJd7Foj%3@tZHl{K_O3My=zwhWwB=rt>hKcVv-U+Hc_;lYh;<4Lu^e zGS;WxrJl+v?d7vGZ-LToIGS*4Ij!dXtgSfK L_`pR@P3!wNCK$|R literal 0 HcmV?d00001 diff --git a/externals/coda-oss/modules/c++/hdf5.lite/unittests/H5_creation_dummy.ipynb b/externals/coda-oss/modules/c++/hdf5.lite/unittests/H5_creation_dummy.ipynb new file mode 100644 index 0000000000..fa6be7e3db --- /dev/null +++ b/externals/coda-oss/modules/c++/hdf5.lite/unittests/H5_creation_dummy.ipynb @@ -0,0 +1,3851 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "import itertools\n", + "import h5py\n", + "from pathlib import Path\n", + "from datetime import datetime\n", + "\n", + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Parameters" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "NUM_PTS = 400\n", + "bin1 = ['foo', 'bar']\n", + "bin2 = ['dog', 'cat']\n", + "bin3 = ['a', 'b', 'c', 'd']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Creates nested dictionary" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'1/foo/dog/a/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '1/foo/dog/a/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '1/foo/dog/b/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '1/foo/dog/b/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '1/foo/dog/c/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '1/foo/dog/c/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '1/foo/dog/d/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '1/foo/dog/d/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '1/foo/cat/a/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '1/foo/cat/a/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '1/foo/cat/b/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '1/foo/cat/b/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '1/foo/cat/c/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '1/foo/cat/c/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '1/foo/cat/d/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '1/foo/cat/d/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '1/bar/dog/a/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '1/bar/dog/a/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '1/bar/dog/b/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '1/bar/dog/b/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '1/bar/dog/c/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '1/bar/dog/c/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '1/bar/dog/d/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '1/bar/dog/d/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '1/bar/cat/a/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '1/bar/cat/a/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '1/bar/cat/b/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '1/bar/cat/b/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '1/bar/cat/c/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '1/bar/cat/c/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '1/bar/cat/d/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '1/bar/cat/d/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '2/foo/dog/a/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '2/foo/dog/a/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '2/foo/dog/b/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '2/foo/dog/b/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '2/foo/dog/c/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '2/foo/dog/c/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '2/foo/dog/d/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '2/foo/dog/d/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '2/foo/cat/a/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '2/foo/cat/a/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '2/foo/cat/b/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '2/foo/cat/b/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '2/foo/cat/c/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '2/foo/cat/c/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '2/foo/cat/d/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '2/foo/cat/d/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '2/bar/dog/a/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '2/bar/dog/a/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '2/bar/dog/b/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '2/bar/dog/b/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '2/bar/dog/c/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '2/bar/dog/c/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '2/bar/dog/d/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '2/bar/dog/d/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '2/bar/cat/a/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '2/bar/cat/a/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '2/bar/cat/b/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '2/bar/cat/b/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '2/bar/cat/c/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '2/bar/cat/c/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '2/bar/cat/d/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '2/bar/cat/d/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '3/foo/dog/a/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '3/foo/dog/a/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '3/foo/dog/b/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '3/foo/dog/b/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '3/foo/dog/c/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '3/foo/dog/c/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '3/foo/dog/d/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '3/foo/dog/d/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '3/foo/cat/a/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '3/foo/cat/a/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '3/foo/cat/b/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '3/foo/cat/b/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '3/foo/cat/c/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '3/foo/cat/c/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '3/foo/cat/d/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '3/foo/cat/d/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '3/bar/dog/a/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '3/bar/dog/a/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '3/bar/dog/b/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '3/bar/dog/b/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '3/bar/dog/c/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '3/bar/dog/c/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '3/bar/dog/d/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '3/bar/dog/d/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '3/bar/cat/a/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '3/bar/cat/a/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '3/bar/cat/b/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '3/bar/cat/b/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '3/bar/cat/c/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '3/bar/cat/c/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '3/bar/cat/d/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '3/bar/cat/d/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '4/foo/dog/a/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '4/foo/dog/a/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '4/foo/dog/b/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '4/foo/dog/b/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '4/foo/dog/c/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '4/foo/dog/c/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '4/foo/dog/d/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '4/foo/dog/d/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '4/foo/cat/a/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '4/foo/cat/a/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '4/foo/cat/b/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '4/foo/cat/b/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '4/foo/cat/c/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '4/foo/cat/c/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '4/foo/cat/d/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '4/foo/cat/d/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '4/bar/dog/a/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '4/bar/dog/a/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '4/bar/dog/b/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '4/bar/dog/b/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '4/bar/dog/c/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '4/bar/dog/c/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '4/bar/dog/d/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '4/bar/dog/d/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '4/bar/cat/a/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '4/bar/cat/a/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '4/bar/cat/b/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '4/bar/cat/b/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '4/bar/cat/c/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '4/bar/cat/c/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '4/bar/cat/d/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '4/bar/cat/d/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '5/foo/dog/a/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '5/foo/dog/a/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '5/foo/dog/b/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '5/foo/dog/b/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '5/foo/dog/c/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '5/foo/dog/c/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '5/foo/dog/d/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '5/foo/dog/d/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '5/foo/cat/a/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '5/foo/cat/a/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '5/foo/cat/b/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '5/foo/cat/b/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '5/foo/cat/c/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '5/foo/cat/c/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '5/foo/cat/d/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '5/foo/cat/d/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '5/bar/dog/a/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '5/bar/dog/a/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '5/bar/dog/b/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '5/bar/dog/b/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '5/bar/dog/c/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '5/bar/dog/c/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '5/bar/dog/d/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '5/bar/dog/d/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '5/bar/cat/a/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '5/bar/cat/a/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '5/bar/cat/b/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '5/bar/cat/b/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '5/bar/cat/c/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '5/bar/cat/c/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32), '5/bar/cat/d/r': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n", + " 1., 1., 1., 1., 1., 1., 1., 1., 1.], dtype=float32), '5/bar/cat/d/i': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32)}\n" + ] + } + ], + "source": [ + "file_dict = {}\n", + "dummy_arr_real = np.ones((NUM_PTS,), dtype=np.float32)\n", + "dummy_arr_imag = np.zeros((NUM_PTS,), dtype=np.float32)\n", + "\n", + "for idx in range(5):\n", + " for jdx in range(len(bin1)):\n", + " for kdx in range(len(bin2)):\n", + " for ldx in range(len(bin3)):\n", + " key = f'{idx + 1}/{bin1[jdx]}/{bin2[kdx]}/{bin3[ldx]}'\n", + " file_dict[key + '/r'] = dummy_arr_real\n", + " file_dict[key + '/i'] = dummy_arr_imag\n", + "print(file_dict)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Creates H5 file" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'nested_complex_float32_data_large.h5'" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "out_path = 'nested_complex_float32_data_large.h5'\n", + "out_path" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "def add_data(key, data_dict, handle):\n", + " data = handle.create_group(key)\n", + " for key, val in data_dict.items():\n", + " grp = data\n", + " sub_keys = key.split('/')\n", + " for sub_key in sub_keys:\n", + " if sub_key == sub_keys[-1]:\n", + " grp.create_dataset(\n", + " sub_key,\n", + " data=val,\n", + " dtype=val.dtype\n", + " )\n", + " continue\n", + " if sub_key not in grp:\n", + " grp.create_group(sub_key)\n", + " grp = grp[sub_key]" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "with h5py.File(out_path, 'w') as handle:\n", + " add_data('Data', file_dict, handle)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/externals/coda-oss/modules/c++/hdf5.lite/unittests/create_123_barfoo_catdog_cx.m b/externals/coda-oss/modules/c++/hdf5.lite/unittests/create_123_barfoo_catdog_cx.m new file mode 100644 index 0000000000..58fcef2405 --- /dev/null +++ b/externals/coda-oss/modules/c++/hdf5.lite/unittests/create_123_barfoo_catdog_cx.m @@ -0,0 +1,55 @@ +% https://www.mathworks.com/help/matlab/ref/h5write.html +mydata = rand(10, 1); + +h5create('123_barfoo_catdog_cx.h5', '/1/bar/cat/i', [10, 1]) +h5write('123_barfoo_catdog_cx.h5', '/1/bar/cat/i', mydata) +h5create('123_barfoo_catdog_cx.h5', '/1/bar/cat/r', [10, 1]) +h5write('123_barfoo_catdog_cx.h5', '/1/bar/cat/r', mydata) +h5create('123_barfoo_catdog_cx.h5', '/1/bar/dog/i', [10, 1]) +h5write('123_barfoo_catdog_cx.h5', '/1/bar/dog/i', mydata) +h5create('123_barfoo_catdog_cx.h5', '/1/bar/dog/r', [10, 1]) +h5write('123_barfoo_catdog_cx.h5', '/1/bar/dog/r', mydata) +h5create('123_barfoo_catdog_cx.h5', '/1/foo/cat/i', [10, 1]) +h5write('123_barfoo_catdog_cx.h5', '/1/foo/cat/i', mydata) +h5create('123_barfoo_catdog_cx.h5', '/1/foo/cat/r', [10, 1]) +h5write('123_barfoo_catdog_cx.h5', '/1/foo/cat/r', mydata) +h5create('123_barfoo_catdog_cx.h5', '/1/foo/dog/i', [10, 1]) +h5write('123_barfoo_catdog_cx.h5', '/1/foo/dog/i', mydata) +h5create('123_barfoo_catdog_cx.h5', '/1/foo/dog/r', [10, 1]) +h5write('123_barfoo_catdog_cx.h5', '/1/foo/dog/r', mydata) + +h5create('123_barfoo_catdog_cx.h5', '/2/bar/cat/i', [10, 1]) +h5write('123_barfoo_catdog_cx.h5', '/2/bar/cat/i', mydata) +h5create('123_barfoo_catdog_cx.h5', '/2/bar/cat/r', [10, 1]) +h5write('123_barfoo_catdog_cx.h5', '/2/bar/cat/r', mydata) +h5create('123_barfoo_catdog_cx.h5', '/2/bar/dog/i', [10, 1]) +h5write('123_barfoo_catdog_cx.h5', '/2/bar/dog/i', mydata) +h5create('123_barfoo_catdog_cx.h5', '/2/bar/dog/r', [10, 1]) +h5write('123_barfoo_catdog_cx.h5', '/2/bar/dog/r', mydata) +h5create('123_barfoo_catdog_cx.h5', '/2/foo/cat/i', [10, 1]) +h5write('123_barfoo_catdog_cx.h5', '/2/foo/cat/i', mydata) +h5create('123_barfoo_catdog_cx.h5', '/2/foo/cat/r', [10, 1]) +h5write('123_barfoo_catdog_cx.h5', '/2/foo/cat/r', mydata) +h5create('123_barfoo_catdog_cx.h5', '/2/foo/dog/i', [10, 1]) +h5write('123_barfoo_catdog_cx.h5', '/2/foo/dog/i', mydata) +h5create('123_barfoo_catdog_cx.h5', '/2/foo/dog/r', [10, 1]) +h5write('123_barfoo_catdog_cx.h5', '/2/foo/dog/r', mydata) + +h5create('123_barfoo_catdog_cx.h5', '/3/bar/cat/i', [10, 1]) +h5write('123_barfoo_catdog_cx.h5', '/3/bar/cat/i', mydata) +h5create('123_barfoo_catdog_cx.h5', '/3/bar/cat/r', [10, 1]) +h5write('123_barfoo_catdog_cx.h5', '/3/bar/cat/r', mydata) +h5create('123_barfoo_catdog_cx.h5', '/3/bar/dog/i', [10, 1]) +h5write('123_barfoo_catdog_cx.h5', '/3/bar/dog/i', mydata) +h5create('123_barfoo_catdog_cx.h5', '/3/bar/dog/r', [10, 1]) +h5write('123_barfoo_catdog_cx.h5', '/3/bar/dog/r', mydata) +h5create('123_barfoo_catdog_cx.h5', '/3/foo/cat/i', [10, 1]) +h5write('123_barfoo_catdog_cx.h5', '/3/foo/cat/i', mydata) +h5create('123_barfoo_catdog_cx.h5', '/3/foo/cat/r', [10, 1]) +h5write('123_barfoo_catdog_cx.h5', '/3/foo/cat/r', mydata) +h5create('123_barfoo_catdog_cx.h5', '/3/foo/dog/i', [10, 1]) +h5write('123_barfoo_catdog_cx.h5', '/3/foo/dog/i', mydata) +h5create('123_barfoo_catdog_cx.h5', '/3/foo/dog/r', [10, 1]) +h5write('123_barfoo_catdog_cx.h5', '/3/foo/dog/r', mydata) + +h5disp('123_barfoo_catdog_cx.h5') diff --git a/externals/coda-oss/modules/c++/hdf5.lite/unittests/nested_complex_float32_data_small.h5 b/externals/coda-oss/modules/c++/hdf5.lite/unittests/nested_complex_float32_data_small.h5 new file mode 100644 index 0000000000000000000000000000000000000000..3dfccd7ed79095b61645531fe5dcff7aaacdcb91 GIT binary patch literal 172552 zcmeHQ3)pknbUy!#AudxHw@GJQPSxeqrM?+TC?=R8s1ZzwOEup=V+7@ob`aMIb%|0k z42?^Pdr(hPS`BKRcz8UaMQV!F?MX}PQ$Zps|ES}OZ@m>{+D~}N&8)BBQ5oml=FOW<3Fr-z;Y;B%K4M%@e`0s9b{-8=T*|Ixs(#^brs7 z7~kA-56C)zc~OV)1M@FFa%BJV@b2&KOXO<_3MVM34xDnd4n&Mw+*jfl{2INI9&}WX z+l|YpALF0hkTjr|yAfSQ1(G3;w|jY9Z^Z4{YgwQ5DrXY0Q*RJ7x!t{qAbi$0B~*2w zdTkm(lk;0w2NtK1zOMtOBA2b_sOmtM@q^J`bmZ~-mly6{vM-SjB`BPrq&jfY(N*5$ zA#?-Wcfsw#1=J6G?l8WgC-HuQ!?0dmRR?OpkKP_*pz4>p;Xe z=`ntA&t1Ma%<@8(7qLWMVqL-AN+Ih�v}Dr^4;VUFa6514YI+^d#Pu58ToZRCS52zr9l*T0&-j5KXf+T7Pv8#ZVF?N+D5(xy?dZCo#JI(M zC62K!7~Gs51idM@7q_5(jDN}n4SK<^(C6W8S&|5XJJ1F6B5s$@fJQ4mP zc{PeTH*5RUDxQ$%4?3QhoK0o|cQK=VW9vPj;)%LAzp|Gn%2wpFh?|kObVhhAY?YRq^eJ`3wF@n{UnK^PUy?EP0}FEUg4Ze=-xeiy7@3TkioCPwesf1rD&6CyG|& zv*d~H1K|1968Tyxum0TCUUNKAvjSJD^@QAi(D6j`!GtK_&Q*N5YPX6f^5@4rVlPj$ zt;lD|6QfGp|FVUAt&2EGJ=faicw%4$u2eiB|E`CQCn}F1BmsA>;mUP;RXkDTzY7EZ zr2Y44RQMh8bEgldC+qNAeKhHX7^s&{c|hVfV(S--A2?%|FVZ?^m%QHMiPX_^MQ)ET zp$DVBb{OB#lX%B?U6HCfFshOVW{)DNs{@1IB0c!o75{lV$pf+u;JiOzet@6SUhhyH zICx*7%eX~;OB~~Ug5|H@vT7+aCgk|!EZO-3g2wQwX^&$Um@@x7j1&FuicZ z0}{VD=j$_m;D)s4ImGJ+=aePJEzTb$j&V*ocn*ySdQ)yMo=5!{|MUfMz2Nt$9lnSq zi6D4sTrc8w`DIYZwlv4-MVnwt)Ww9(GXLd}}VB>sI8m__ z+mp{zKk&K7c?CU*cZ}B+sj35o*OCW{oZq@SFnlBFhpsrz+ZpqKtOF5$T4nq|d6zHJ zdf!IYf!PP>0m$#%pHn;fAW77L`D@~O67Te>J3m!*AbdUfpv3vDs{{ErlRo_Hjt9M^ zOAp98fcJiCj30O@?R^ib0|)OdEnY`YLLHDe#(PWkx5V{2+#bA*`Z4~_yW)C7ZcpD$ z{UM29_`bN_jN8G06*4Z&t@Eo^tn($mRC~z*JX-hOl&t64r{-|gvI18szLoVy$G63I z5R#7K&NW~;Zm)`OC(K`PPuhHIE}#2WuG+2Qi3P7;;1_#&Vqrx-OP=We2|T}AB3~=-S^c@Iz2VS=Lhe84c%uDhWF~MIGuk({-UBM02*v)Dy*yF2BA+EsOx~XiJ>+Xs#3}h( z+yALKo@iKsD-}=3b21%I)ILPm3AZ0Y-oh0gkUW9eQJK$K@s(Y^Nb9^;h2JqhcW+1! z)Zusd5z<55#CW}Q!vhk(IOof8U4s|Wp63v+ADmP67`Hg5lsLvYW&R2p5%h}Ou8yc5 z<1c<9u2yy+Uk_c*_j_b9#-Txa_$ha`a>s>2&UCtMSk0u8Yb+7;7WIfkDHHWK_ z6}VFIt*k#fzMXxHkObVhhAY?YRq<_e6!%Qpd}}VB_pHcg$rI7X2jwfj2LChm0TiDed(R)q#We6)KEd52zbd>b);!4GNk zt+{-TLb4&-`7C*2`VDw~wM4$QM4VP@yVGk9S9{+iuVx!p>qowIP7ti~-@12P=Uz*l zb^rPMt&WfP-)awdym-9$`m#DVmc2edR{KEhvG^xh_aBW`wJ$68pLFZQ;hgS=d1u@g zzP0ThP^}XyynhM%?OiA4|A}nK_IzHh6N4YX^Q$HDwJ+kdTHBpobL+&S6}VFIggk%H z@x<&$gdyP09YlFcmmW~@L{pq!*~=3(EAmFG=!*Bl3q5UtQZeqM% zy5RwdU%cm2WBkAiY0qNCd^V=Hi_;)&di2wzcwq>d+QXL_D+DUYPBDxN4aexQHxkt6$;hj)oFP{m46 zI64V!_XJ(PRq87I=D4oG*tGvHkmU8!BM67ci#oU4kBsB9$M}Yx z#5>08id5Bs$&JZF^P7^?@mS-RNiTH8ao*0D2V@<?C#Wq`F)@94Lyl>jMo*Zssq!IJhZquNnITn-!krJSN!MgBoD|sfcJh1%n$HW z+WQ_<2M*p_8Zd5=-x9}oZz+sO1A1j{*Kb2T7=QU!<9ZElcXp^hWWySFitBZ`J-jpZ z!~U#FbL;%M73+M-FZo+1#}WK8yhXBJR^z{^ahbza;ag+_W+2qc+ItQvzLoVy$G7v_ z63&3TO~udOH=7<%@ok&=3!_e(Z_VX%$%=fIJW;%Ta{WiX&P1FLFIS~GT-B|>m5L|i z{8Pshg|j_RxSCT-yHz|f;Pnf9V=qs1tjK4{6SX_8#}m1;lJyWjSEMH2$)Qzts(4~5_OI;aiJ2AoEP0}R*W~(-^~BCylJ!=_e4G2s@kDNq{20aD zY0JKoJSWrfM4?1D3uD&$hASSBJaH8D_lVb@U3N%X=e??VPK%%0JBOaH!*Ao>q=&lc zO5D7iLDp`;Z4oEL%T;L(SA8pRrQ!)W|J3os=zPx;uIALzZWT{ddHn+4*vk_WEAm{qZ&Q4uSeTDJPs+mn zfaHmthp)#IQxT__kq$P@@kH4QT&Z|M{$8(+Cq|F)JmFwE9W`0S6Mg=@a44qz`{^qD zMvo#qmKm2i{Elm+A7Y?hI^_Y0U(5#Tj2}2-moL&fXP3M_e+J=@eg;9INms>Zk<4Kr zjBn^kyhF_usj34zk0lRPIKOpuAiPlc*%b$RJNG>x>j2LC8;l>gDed(R)q#We6>^MQ zO2xOb{^&bm&ypuPPfV`=$k$>$Sr74ZMViCao)x%K@r0az>Ug4Y#PftJIkd`76;I@z z60bk@@e1 zjy$IvFm4HrK_GFAbIR}qqyfD$x9cyY9-LE_+i|@Hw>y78{UICHctu>V%k5!@`eA=o zr8!<7Si$RZzL^IpJpZ zT9P`RD7>EZfV*wRkhkr452$z|_@j9JG4=mj-{R-?Ubh~8!#8>S9v@YAdQ|uwF@E5Q zwEr%E4mO1&f6LD zfUE;JWf(JlpuEc$X}xbF>p?9x5#gaW4yOCeJ5!^FL)PS zh3_Vb@dxjV>qXoy|0(OUVbKTTdKGRr{(|~pe^#Zrb^hFnb-v`6@jH^^2!3h2Em<$C z@!!Q>-N#S?P=spE;s!1IKwIkmJ~#S?X2zrZ*4@>c>j7lF%oe?yj+#$cw%S;u2eiB_aAgTvADwXgsVBVv|Gg!9kG99FHbB!NC?mN z{y-44&ROrjbA-`t@^wPa3ev6+V zJXRT(I{ZeTB7L00V7y+s;Q@(Xyyw$o{J;xo?{g5ZAH1iOXWSARgFxaK?JQnl$(Q1K3vL&_O#QGwtI`~=m#yG+IbUpiIysK0dxdeb zURLA3sd1UZRl^EgsrXjbA06LTK1VnM?lu)af8T6+K*hIv%wHIF+I(v+pSxD%v*d~H zB)R@0UrV1&)+qUvI18so{;lT9ZxjB;CaH899m_kiYM}a7q36|^2DAM`7C*2 z^u@UUW$eHcbrC12=UUqwPvnObp(y5JTYm3B?my^wqW2Zg6R|)$)==?8QS4vY%M(Q_ z@>%l4-dES-iH?YqWAHuBTys28vjSJD^@RMp9y*?Ae#7&`abR<(L&Xy{{<|=6McRL# zMup!Qp3At@;kWfI!f%Lydg+u0Bz`fw4;epj#x7r^bEtZhqgk zVtz0ACHziu9KkQ+y=1+t#(z`eGKZ^y6}VFIt*k#fz76JtGvIDh@$>i1rUz7f+hzX3 zsMF?KbNM{ABA+Esl>aTc{v%)KB2I{xtI`~`@R^+qfiP9PC@x-2plgn6M+HQ^~W>(-z#S_gl318it zkks+SB=kJta&D=3V#xS`Z!SJ^WdHK;E-?nqSxQhiL8-!T@uq~wD&taz-{~zpeoxT# zTcxhTZuhuf8VQ$NlN3XE^) zNxbWxyKSGV>OlEcQH=rI2xp z{FXSzdrO_$$LqzA+tWKxKgK`2V_a{>?cmPTAF^SyyT*eJTWOI*MIOtQ^X1Ja#fn+iHQ}sQt^b`f6(#7;2xeQT+OMa z-720ai~TEmd17HjK1-fh+;csi=!rPFjOC^6=6E9fD;xGRRXnjH&dGE<(LRsx7`hHH zN9~t95wRZ{e9j8D?DEB7mOt-#uL{3&er}#|sl)H=etw>V7`Z4VesRvX!}x(u(w^tY zbILK}7Uz@_$2g}fK7jBFy&AV$zd`*Nf2|VNYjeB*Q0foau=c~_dIN4xs?-nrvntK; zdf5tIm-EHw{>gE~zQW|b$$D9h|E9)e4p$8;aHZl~S$}kVn>(Ly2Hb5be*V7M^ni+Q zd(2-Lb=rJuE}y$r#*zrZ*4^2DAM`7C*&`J3zUMEI~|J;cuyX^toIAGLY^S?)jRc%u3!&l9fX&?-As zJTVvhSN8Hm(TaSQJkfh}a{b48qWs8Yy;U*a=00;gQL_S9s`Z5Yy>TzyvCVm- zvrWYlh2M_XpR|8JU4`E+KXETj>Fb--xZ8GJarm+UM+&*K5xu z9OC@3&F%iB)DK>7FutKD@s9DjB2{&ucOm(0^f;2bI?$=d{p^bWyq)9$SqE_5KV$sB zPie1rs16+bUUidki~N>2#`_9;Pb9oTFaIQJ?>w0##-D#`T(8LO>hDp1$c7c45!b76 zyY)=!hy7WV=H~ZpE9Uo-U#3q;jwAS`_4s7Htj2#+<1&YsI=&q~g>VMk zZ7P2LzS;DEif=2-Ul?`Td}}VBr&i>%T>p`;eGwle7gUY>}o$Y;qD(bL!CiHV34;^nF|#}gGRaHZl2 zx&NT!iQKb2Pq>;>OS@G((G&Yu_VPs2ihPzlQF+dKJh2dQav94@+s*Mr&k9_rctW0& z>3CxH0>WeHI=~#YU-AT2(PKVmg4pa+ zesRv%X8gblY0q`)PT6@S;T3vAZci_xevE(knz-JK+d-H5LpE&o zhPYntjnt0bL=yIARhr}Vu@$^7=ZmcuC&v+WFM46JURLA3sd1UZRp%v~aWPY}w*MR( zTw!6u1IsZnpuG> z6;H_hCmm0;U*~zkl^j}Sr-~;+-oM0m?B$7En-Ctslzo}CeILmalh-HLfAB<8#3^Q^ zgAH>$v10|UR6HTiA9Or1c(dmT2h-`O$ts>Gi}Ndcd7^4XK1-fh^w#5vo`}=Yz&d(i Ljwf1H;OhSX&PV2( literal 0 HcmV?d00001 diff --git a/externals/coda-oss/modules/c++/hdf5.lite/unittests/test_hdf5info.cpp b/externals/coda-oss/modules/c++/hdf5.lite/unittests/test_hdf5info.cpp index 4706c5e567..8516c4655b 100644 --- a/externals/coda-oss/modules/c++/hdf5.lite/unittests/test_hdf5info.cpp +++ b/externals/coda-oss/modules/c++/hdf5.lite/unittests/test_hdf5info.cpp @@ -34,6 +34,7 @@ static std::filesystem::path find_unittest_file(const std::filesystem::path& nam static const auto unittests = std::filesystem::path("modules") / "c++" / "hdf5.lite" / "unittests"; return sys::test::findGITModuleFile("coda-oss", unittests, name); } + TEST_CASE(test_hdf5Info_IOException) { static const std::filesystem::path path = "does not exist . h5"; @@ -55,12 +56,22 @@ TEST_CASE(test_hdf5FileInfo) static const auto path = find_unittest_file("example.h5"); // https://www.mathworks.com/help/matlab/ref/h5info.html + /* + info = struct with fields: + Filename: '/mathworks/devel/bat/Bdoc22b/build/matlab/toolbox/matlab/demos/example.h5' + Name: '/' + Groups: [4x1 struct] + Datasets: [] + Datatypes: [] + Links: [] + Attributes: [2x1 struct] + */ const auto info = hdf5::lite::fileInfo(path); TEST_ASSERT_EQ(path.string(), info.filename); TEST_ASSERT_EQ("/", info.name); TEST_ASSERT_EQ(info.groups.size(), 4); - TEST_ASSERT_TRUE(info.datasets.empty()); - TEST_ASSERT_TRUE(info.datatypes.empty()); + TEST_ASSERT_TRUE(info.dataSets.empty()); + TEST_ASSERT_TRUE(info.dataTypes.empty()); //TEST_ASSERT_TRUE(info.links.empty()); //TEST_ASSERT_EQ(info.attributes.size(), 2); } @@ -71,12 +82,21 @@ TEST_CASE(test_hdf5GroupInfo) // https://www.mathworks.com/help/matlab/ref/h5info.html const auto info = hdf5::lite::groupInfo(path, "/g4"); - + /* + info = struct with fields: + Filename: '/mathworks/devel/bat/Bdoc22b/build/matlab/toolbox/matlab/demos/example.h5' + Name: '/g4' + Groups: [] + Datasets: [4x1 struct] + Datatypes: [] + Links: [] + Attributes: [] + */ TEST_ASSERT_EQ(path.string(), info.filename); TEST_ASSERT_EQ("/g4", info.name); TEST_ASSERT_TRUE(info.groups.empty()); - TEST_ASSERT_EQ(info.datasets.size(), 4); - TEST_ASSERT_TRUE(info.datatypes.empty()); + TEST_ASSERT_EQ(info.dataSets.size(), 4); + TEST_ASSERT_TRUE(info.dataTypes.empty()); //TEST_ASSERT_TRUE(info.links.empty()); //TEST_ASSERT_TRUE(info.attributes.empty()); } @@ -86,22 +106,172 @@ TEST_CASE(test_hdf5DatasetInfo) static const auto path = find_unittest_file("example.h5"); // https://www.mathworks.com/help/matlab/ref/h5info.html - const auto info = hdf5::lite::datasetInfo(path, "/g4/time"); - + const auto info = hdf5::lite::dataSetInfo(path, "/g4/time"); + /* + info = struct with fields: + Filename: '/mathworks/devel/bat/Bdoc22b/build/matlab/toolbox/matlab/demos/example.h5' + Name: 'time' + Datatype: [1x1 struct] + Dataspace: [1x1 struct] + ChunkSize: 10 + FillValue: 0 + Filters: [] + Attributes: [2x1 struct] + */ TEST_ASSERT_EQ(path.string(), info.filename); TEST_ASSERT_EQ("time", info.name); - TEST_ASSERT(info.datatype.h5Class == hdf5::lite::Class::Float); + TEST_ASSERT(info.dataType.h5Class == hdf5::lite::Class::Float); //TEST_ASSERT(info.dataspace == hdf5::lite::Class::Float); - // TEST_ASSERT(info.chunkSize == hdf5::lite::Class::Float); - // TEST_ASSERT(info.fillValue == hdf5::lite::Class::Float); + //TEST_ASSERT_EQ(info.chunkSize, 10); + //TEST_ASSERT_EQ(info.fillValue, 0); //TEST_ASSERT_TRUE(info.filters.empty()); //TEST_ASSERT_EQ(info.attributes.size(), 2); } +static void read_complex(const std::string& testName, + const std::filesystem::path& path, const std::string& datasetPath) +{ + const auto i_info = hdf5::lite::dataSetInfo(path, datasetPath + "/i"); + TEST_ASSERT(i_info.dataType.h5Class == hdf5::lite::Class::Float); + + const auto r_info = hdf5::lite::dataSetInfo(path, datasetPath + "/r"); + TEST_ASSERT(r_info.dataType.h5Class == hdf5::lite::Class::Float); +} + +TEST_CASE(test_hdf5Info_nested) +{ + /* + Group '/' + Group '/1' + Group '/1/bar' + Group '/1/bar/cat' + Dataset 'i' + Size: 10x1 + MaxSize: 10x1 + Datatype: H5T_IEEE_F64LE (double) + ChunkSize: [] + Filters: none + FillValue: 0.000000 + */ + + static const auto path = find_unittest_file("123_barfoo_catdog_cx.h5"); + + // https://www.mathworks.com/help/matlab/ref/h5info.html + const auto info = hdf5::lite::fileInfo(path); + TEST_ASSERT_EQ(path.string(), info.filename); + TEST_ASSERT_EQ("/", info.name); + TEST_ASSERT_TRUE(info.dataSets.empty()); + TEST_ASSERT_TRUE(info.dataTypes.empty()); + + const std::vector expectedOuterGroupNames{"1" , "2", "3"}; + TEST_ASSERT_EQ(info.groups.size(), expectedOuterGroupNames.size()); + for (size_t outer = 0; outer < info.groups.size(); outer++) + { + const auto groupName = info.groups[outer].name; + TEST_ASSERT_EQ(groupName, expectedOuterGroupNames[outer]); + + const auto subGroupInfo = hdf5::lite::groupInfo(path, "/" + groupName); + + const std::vector expectedSubGroupNames{"bar", "foo"}; + TEST_ASSERT_EQ(subGroupInfo.groups.size(), expectedSubGroupNames.size()); + for (size_t sub = 0; sub < subGroupInfo.groups.size(); sub++) + { + const auto subGroupName = subGroupInfo.groups[sub].name; + TEST_ASSERT_EQ(subGroupName, expectedSubGroupNames[sub]); + + const auto subSubGroupInfo = hdf5::lite::groupInfo(path, "/" + groupName + "/" + subGroupName); + + const std::vector expectedSubSubGroupNames{"cat", "dog"}; + TEST_ASSERT_EQ(subSubGroupInfo.groups.size(), expectedSubSubGroupNames.size()); + for (size_t subsub = 0; subsub < subSubGroupInfo.groups.size(); subsub++) + { + const auto subSubGroupName = subSubGroupInfo.groups[subsub].name; + TEST_ASSERT_EQ(subSubGroupName, expectedSubSubGroupNames[subsub]); + + const auto datasetPath = "/" + groupName + "/" + subGroupName + "/" + subSubGroupName; + read_complex(testName, path, datasetPath); + } + } + } +} + +TEST_CASE(test_hdf5Info_nested_small) +{ + // top group: Data + // outer groups: 1, 2, 3, 4, 5 + // sub groups: bar, foo + // sub-sub groups: cat, dog + // sub-sub-sub groups: a, b, c, d + // data: i (float array), r (float array) + static const auto path = find_unittest_file("nested_complex_float32_data_small.h5"); + + // https://www.mathworks.com/help/matlab/ref/h5info.html + const auto info = hdf5::lite::fileInfo(path); + TEST_ASSERT_EQ(path.string(), info.filename); + TEST_ASSERT_EQ("/", info.name); + TEST_ASSERT_TRUE(info.dataSets.empty()); + TEST_ASSERT_TRUE(info.dataTypes.empty()); + + const std::vector expectedDataGroupNames{"Data"}; + TEST_ASSERT_EQ(info.groups.size(), expectedDataGroupNames.size()); + TEST_ASSERT_EQ(info.groups.size(), 1); + const auto dataGroupName = info.groups[0].name; + TEST_ASSERT_EQ(dataGroupName, expectedDataGroupNames[0]); + const auto dataRootPath = "/" + dataGroupName; + + const auto dataGroupInfo = hdf5::lite::groupInfo(path, dataRootPath); + const std::vector expectedOuterGroupNames{"1", "2", "3", "4", "5"}; + TEST_ASSERT_EQ(dataGroupInfo.groups.size(), expectedOuterGroupNames.size()); + for (size_t outer = 0; outer < dataGroupInfo.groups.size(); outer++) + { + const auto groupName = dataGroupInfo.groups[outer].name; + TEST_ASSERT_EQ(groupName, expectedOuterGroupNames[outer]); + + const auto subGroupRoot = dataRootPath + "/" + groupName; + const auto subGroupInfo = hdf5::lite::groupInfo(path, subGroupRoot); + + const std::vector expectedSubGroupNames{"bar", "foo"}; + TEST_ASSERT_EQ(subGroupInfo.groups.size(), expectedSubGroupNames.size()); + for (size_t sub = 0; sub < subGroupInfo.groups.size(); sub++) + { + const auto subGroupName = subGroupInfo.groups[sub].name; + TEST_ASSERT_EQ(subGroupName, expectedSubGroupNames[sub]); + + const auto subSubGroupRoot = subGroupRoot + "/" + subGroupName; + const auto subSubGroupInfo = hdf5::lite::groupInfo(path, subSubGroupRoot); + + const std::vector expectedSubSubGroupNames{"cat", "dog"}; + TEST_ASSERT_EQ(subSubGroupInfo.groups.size(), expectedSubSubGroupNames.size()); + for (size_t subsub = 0; subsub < subSubGroupInfo.groups.size(); subsub++) + { + const auto subSubGroupName = subSubGroupInfo.groups[subsub].name; + TEST_ASSERT_EQ(subSubGroupName, expectedSubSubGroupNames[subsub]); + + const auto abcdGroupRoot = subSubGroupRoot + "/" + subSubGroupName; + const auto abcdGroupInfo = hdf5::lite::groupInfo(path, abcdGroupRoot); + + const std::vector expected_abcd_names { "a", "b", "c", "d"}; + TEST_ASSERT_EQ(abcdGroupInfo.groups.size(), expected_abcd_names.size()); + for (size_t abcd = 0; abcd < abcdGroupInfo.groups.size(); abcd++) + { + const auto abcdGroupName = abcdGroupInfo.groups[abcd].name; + TEST_ASSERT_EQ(abcdGroupName, expected_abcd_names[abcd]); + + const auto datasetPath = abcdGroupRoot + "/" + abcdGroupName; + read_complex(testName, path, datasetPath); + } + } + } + } +} + TEST_MAIN( TEST_CHECK(test_hdf5Info_IOException); TEST_CHECK(test_hdf5FileInfo); TEST_CHECK(test_hdf5GroupInfo); TEST_CHECK(test_hdf5DatasetInfo); + + TEST_CHECK(test_hdf5Info_nested); + TEST_CHECK(test_hdf5Info_nested_small); ) diff --git a/externals/coda-oss/modules/c++/hdf5.lite/unittests/test_hdf5read.cpp b/externals/coda-oss/modules/c++/hdf5.lite/unittests/test_hdf5read.cpp index e8bd096a92..9abc451e3f 100644 --- a/externals/coda-oss/modules/c++/hdf5.lite/unittests/test_hdf5read.cpp +++ b/externals/coda-oss/modules/c++/hdf5.lite/unittests/test_hdf5read.cpp @@ -22,12 +22,15 @@ #include #include +#include +#include #include #include "sys/FileFinder.h" #include "hdf5/lite/Read.h" +#include "hdf5/lite/HDF5Exception.h" static std::filesystem::path find_unittest_file(const std::filesystem::path& name) { @@ -50,19 +53,79 @@ TEST_CASE(test_hdf5Read) TEST_CASE(test_hdf5Read_IOException) { static const std::filesystem::path path = "does not exist . h5"; - try - { - std::vector data; - hdf5::lite::readFile(path, "/g4/lat", data); - TEST_FAIL; - } - catch (const except::IOException&) - { - TEST_SUCCESS; - } + std::vector data; + TEST_SPECIFIC_EXCEPTION( + hdf5::lite::readFile(path, "/g4/lat", data), + except::IOException); +} + +TEST_CASE(test_hdf5Read_nested) +{ + /* + Group '/' + Group '/1' + Group '/1/bar' + Group '/1/bar/cat' + Dataset 'i' + Size: 10x1 + MaxSize: 10x1 + Datatype: H5T_IEEE_F64LE (double) + ChunkSize: [] + Filters: none + FillValue: 0.000000 + */ + static const auto path = find_unittest_file("123_barfoo_catdog_cx.h5"); + + // https://www.mathworks.com/help/matlab/ref/h5read.html + std::vector data; + auto rc = hdf5::lite::readFile(path, "/1/bar/cat/i", data); + TEST_ASSERT_EQ(rc.area(), 10); + TEST_ASSERT_EQ(rc.area(), data.size()); + + rc = hdf5::lite::readFile(path, "/3/foo/dog/r", data); + TEST_ASSERT_EQ(rc.area(), 10); + TEST_ASSERT_EQ(rc.area(), data.size()); +} + +TEST_CASE(test_hdf5Read_nested_small) +{ + // top group: Data + // outer groups: 1, 2, 3, 4, 5 + // sub groups: bar, foo + // sub-sub groups: cat, dog + // sub-sub-sub groups: a, b, c, d + // data: i (float array), r (float array) + static const auto path = find_unittest_file("nested_complex_float32_data_small.h5"); + + // https://www.mathworks.com/help/matlab/ref/h5read.html + std::vector data; + auto rc = hdf5::lite::readFile(path, "/Data/1/bar/cat/a/i", data); + TEST_ASSERT_EQ(rc.area(), 10); + TEST_ASSERT_EQ(rc.area(), data.size()); + auto actual = std::accumulate(data.cbegin(), data.cend(), 0.0); + TEST_ASSERT_EQ(actual, 0.0); + + rc = hdf5::lite::readFile(path, "/Data/5/foo/dog/d/r", data); + TEST_ASSERT_EQ(rc.area(), 10); + TEST_ASSERT_EQ(rc.area(), data.size()); + actual = std::accumulate(data.cbegin(), data.cend(), 0.0); + TEST_ASSERT_EQ(actual, 10.0); +} + +TEST_CASE(test_hdf5Read_nested_small_wrongType) +{ + static const auto path = find_unittest_file("nested_complex_float32_data_small.h5"); + + std::vector data; + TEST_SPECIFIC_EXCEPTION( + hdf5::lite::readFile(path, "/Data/1/bar/cat/a/r", data), + hdf5::lite::DataSetException); } TEST_MAIN( TEST_CHECK(test_hdf5Read); TEST_CHECK(test_hdf5Read_IOException); + TEST_CHECK(test_hdf5Read_nested); + TEST_CHECK(test_hdf5Read_nested_small); + TEST_CHECK(test_hdf5Read_nested_small_wrongType); ) diff --git a/externals/coda-oss/modules/c++/hdf5.lite/unittests/test_hdf5write.cpp b/externals/coda-oss/modules/c++/hdf5.lite/unittests/test_hdf5write.cpp new file mode 100644 index 0000000000..7a4412fe05 --- /dev/null +++ b/externals/coda-oss/modules/c++/hdf5.lite/unittests/test_hdf5write.cpp @@ -0,0 +1,95 @@ +/* ========================================================================= + * This file is part of hdf5.lite-c++ + * ========================================================================= + * + * (C) Copyright 2023, Maxar Technologies, Inc. + * + * hdf5.lite-c++ is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; If not, + * see . + * + */ + +#include +#include +#include +#include + +#include + +#include "sys/FileFinder.h" + +#include "hdf5/lite/Write.h" +#include "hdf5/lite/HDF5Exception.h" +#include "hdf5/lite/Info.h" +#include "hdf5/lite/Read.h" + +static std::filesystem::path find_unittest_file(const std::filesystem::path& name) +{ + static const auto unittests = std::filesystem::path("modules") / "c++" / "hdf5.lite" / "unittests"; + return sys::test::findGITModuleFile("coda-oss", unittests, name); +} + +TEST_CASE(test_hdf5Create) +{ + static const auto path_ = find_unittest_file("example.h5"); + static const auto path = path_.parent_path() / "TEST_hdf5Create_TMP.h5"; + + // https://www.mathworks.com/help/matlab/ref/h5write.html + hdf5::lite::createFile(path, "/DS1", {10, 20}); + + TEST_ASSERT_TRUE(true); // need to use hidden "testName" parameter +} + +TEST_CASE(test_hdf5Write) +{ + static const auto path_ = find_unittest_file("example.h5"); + static const auto path = path_.parent_path() / "TEST_hdf5Write_TMP.h5"; + + const types::RowCol dims{10, 20}; + std::vector data_(dims.area()); + const hdf5::lite::SpanRC data(data_.data(), dims); + double d = 0.0; + for (size_t r = 0; r result; + const auto rc = hdf5::lite::readFile(path, "/DS1", result); + TEST_ASSERT(rc.dims() == dims); + TEST_ASSERT_EQ(dims.area(), result.size()); + for (size_t i = 0; i < result.size(); i++) + { + const auto expected = static_cast(i); + TEST_ASSERT_EQ(result[i], expected); + } +} + +TEST_MAIN( + TEST_CHECK(test_hdf5Create); + TEST_CHECK(test_hdf5Write); +) diff --git a/externals/coda-oss/modules/c++/hdf5.lite/unittests/test_highfive.cpp b/externals/coda-oss/modules/c++/hdf5.lite/unittests/test_highfive.cpp new file mode 100644 index 0000000000..1b6ee28626 --- /dev/null +++ b/externals/coda-oss/modules/c++/hdf5.lite/unittests/test_highfive.cpp @@ -0,0 +1,396 @@ +/* ========================================================================= + * This file is part of hdf5.lite-c++ + * ========================================================================= + * + * (C) Copyright 2022, Maxar Technologies, Inc. + * + * hdf5.lite-c++ is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; If not, + * see . + * + */ + +#include "import/std.h" +#include + +#include + +#include "sys/FileFinder.h" +#include "types/RowCol.h" + +#include "highfive/H5Easy.hpp" +#include "highfive/H5DataSet.hpp" +#include "highfive/H5File.hpp" + +#include "hdf5/lite/SpanRC.h" +#include "hdf5/lite/highfive.h" + +static std::filesystem::path find_unittest_file(const std::filesystem::path& name) +{ + static const auto unittests = std::filesystem::path("modules") / "c++" / "hdf5.lite" / "unittests"; + return sys::test::findGITModuleFile("coda-oss", unittests, name); +} + +TEST_CASE(test_highfive_load) +{ + static const auto path = find_unittest_file("example.h5"); + + const H5Easy::File file(path.string()); + const auto lat = H5Easy::load>(file, "/g4/lat"); + TEST_ASSERT_EQ(lat.size(), 19); + TEST_ASSERT_ALMOST_EQ(lat[0], -90.0); + TEST_ASSERT_ALMOST_EQ(lat[0], -lat[18]); +} + +TEST_CASE(test_highfive_FileException) +{ + static const std::filesystem::path path = "does not exist . h5"; + HighFive::SilenceHDF5 silencer; // no need for diagnostics, we're expecting a failure + TEST_SPECIFIC_EXCEPTION(H5Easy::File(path.string()), HighFive::FileException); +} + +TEST_CASE(test_highfive_nested) +{ + /* + Group '/' + Group '/1' + Group '/1/bar' + Group '/1/bar/cat' + Dataset 'i' + Size: 10x1 + MaxSize: 10x1 + Datatype: H5T_IEEE_F64LE (double) + ChunkSize: [] + Filters: none + FillValue: 0.000000 + */ + static const auto path = find_unittest_file("123_barfoo_catdog_cx.h5"); + + const H5Easy::File file(path.string()); + const auto i = H5Easy::load>>(file, "/1/bar/cat/i"); + TEST_ASSERT_EQ(i.size(), 1); + TEST_ASSERT_EQ(i[0].size(), 10); + + const auto r = H5Easy::load>>(file, "/1/bar/dog/r"); + TEST_ASSERT_EQ(r.size(), 1); + TEST_ASSERT_EQ(r[0].size(), 10); + + TEST_ASSERT_EQ(i.size(), r.size()); + TEST_ASSERT_EQ(i[0].size(), r[0].size()); +} + +TEST_CASE(test_highfive_nested_small) +{ + // top group: Data + // outer groups: 1, 2, 3, 4, 5 + // sub groups: bar, foo + // sub-sub groups: cat, dog + // sub-sub-sub groups: a, b, c, d + // data: i (float array), r (float array) + static const auto path = find_unittest_file("nested_complex_float32_data_small.h5"); + + const H5Easy::File file(path.string()); + const auto i = H5Easy::load>(file, "/Data/1/bar/cat/a/i"); + TEST_ASSERT_EQ(i.size(), 10); + auto actual = std::accumulate(i.cbegin(), i.cend(), 0.0); + TEST_ASSERT_EQ(actual, 0.0); + + const auto r = H5Easy::load>(file, "/Data/5/foo/dog/d/r"); + TEST_ASSERT_EQ(r.size(), 10); + actual = std::accumulate(r.cbegin(), r.cend(), 0.0); + TEST_ASSERT_EQ(actual, 10.0); +} + +TEST_CASE(test_highfive_nested_small_wrongType) +{ + static const auto path = find_unittest_file("nested_complex_float32_data_small.h5"); + + const H5Easy::File file(path.string()); + HighFive::SilenceHDF5 silencer; // no need for diagnostics, we're expecting a failure + TEST_SPECIFIC_EXCEPTION( + H5Easy::load>>(file, "/Data/1/bar/cat/a/i"), + HighFive::DataSetException); +} + + +//******************************************************************************* + +TEST_CASE(test_highfive_info) +{ + static const auto path = find_unittest_file("example.h5"); + const H5Easy::File file(path.string()); + + // https://www.mathworks.com/help/matlab/ref/h5info.html + /* + info = struct with fields: + Filename: '/mathworks/devel/bat/Bdoc22b/build/matlab/toolbox/matlab/demos/example.h5' + Name: '/' + Groups: [4x1 struct] + Datasets: [] + Datatypes: [] + Links: [] + Attributes: [2x1 struct] + */ + + TEST_ASSERT_EQ(path.string(), file.getName()); + TEST_ASSERT_EQ("/", file.getPath()); + TEST_ASSERT_EQ(file.getNumberObjects(), 4); // 4 groups + const auto objectNames = file.listObjectNames(); + TEST_ASSERT_EQ(objectNames.size(), 4); // 4 groups + for (auto&& name : objectNames) + { + const auto type = file.getObjectType(name); + TEST_ASSERT(type == HighFive::ObjectType::Group); + + const auto group = file.getGroup(name); + TEST_ASSERT_EQ(group.getPath(), "/" + name); + } + TEST_ASSERT_EQ(file.getNumberAttributes(), 2); +} + +TEST_CASE(test_highfive_groupinfo) +{ + static const auto path = find_unittest_file("example.h5"); + const H5Easy::File file(path.string()); + + // https://www.mathworks.com/help/matlab/ref/h5info.html + const auto g4 = file.getGroup("g4"); + /* + info = struct with fields: + Filename: '/mathworks/devel/bat/Bdoc22b/build/matlab/toolbox/matlab/demos/example.h5' + Name: '/g4' + Groups: [] + Datasets: [4x1 struct] + Datatypes: [] + Links: [] + Attributes: [] + */ + TEST_ASSERT_EQ(path.string(), g4.getFile().getName()); + const std::string groupPath("/g4"); + TEST_ASSERT_EQ(groupPath, g4.getPath()); + TEST_ASSERT_EQ(g4.getNumberObjects(), 4); // 4 dataSets + const auto objectNames = g4.listObjectNames(); + TEST_ASSERT_EQ(objectNames.size(), 4); // 4 dataSets + for (auto&& name : objectNames) + { + const auto type = g4.getObjectType(name); + TEST_ASSERT(type == HighFive::ObjectType::Dataset); + + const auto dataset = g4.getDataSet(name); + TEST_ASSERT_EQ(dataset.getPath(), groupPath + "/" + name); + } +} + +TEST_CASE(test_highfive_datasetinfo) +{ + static const auto path = find_unittest_file("example.h5"); + const H5Easy::File file(path.string()); + + // https://www.mathworks.com/help/matlab/ref/h5info.html + const auto time = file.getDataSet("/g4/time"); + /* + info = struct with fields: + Filename: '/mathworks/devel/bat/Bdoc22b/build/matlab/toolbox/matlab/demos/example.h5' + Name: 'time' + Datatype: [1x1 struct] + Dataspace: [1x1 struct] + ChunkSize: 10 + FillValue: 0 + Filters: [] + Attributes: [2x1 struct] + */ + TEST_ASSERT_EQ(path.string(), time.getFile().getName()); + const std::string dsPath("/g4/time"); + TEST_ASSERT_EQ(dsPath, time.getPath()); + + const auto dataType = time.getDataType(); + TEST_ASSERT(dataType.getClass() == HighFive::DataTypeClass::Float); + + auto dims = time.getDimensions(); + TEST_ASSERT_EQ(dims.size(), 1); + TEST_ASSERT_EQ(10, dims[0]); // ChunkSize ??? + + const auto dataSpace = time.getSpace(); + dims = dataSpace.getDimensions(); + TEST_ASSERT_EQ(dims.size(), 1); + TEST_ASSERT_EQ(10, dims[0]); // ChunkSize ??? + + TEST_ASSERT_EQ(time.listAttributeNames().size(), 2); +} + +static void read_complex(const std::string& testName, const HighFive::Group& group) +{ + const auto i = group.getDataSet("i"); + TEST_ASSERT(i.getDataType().getClass() == HighFive::DataTypeClass::Float); + TEST_ASSERT_EQ(i.getElementCount(), 10); + + const auto r = group.getDataSet("r"); + TEST_ASSERT(r.getDataType().getClass() == HighFive::DataTypeClass::Float); + TEST_ASSERT_EQ(r.getElementCount(), 10); +} +TEST_CASE(test_highfive_info_nested) +{ + /* + Group '/' + Group '/1' + Group '/1/bar' + Group '/1/bar/cat' + Dataset 'i' + Size: 10x1 + MaxSize: 10x1 + Datatype: H5T_IEEE_F64LE (double) + ChunkSize: [] + Filters: none + FillValue: 0.000000 + */ + + static const auto path = find_unittest_file("123_barfoo_catdog_cx.h5"); + const H5Easy::File file(path.string()); + + TEST_ASSERT_EQ(path.string(), file.getName()); + TEST_ASSERT_EQ("/", file.getPath()); + + TEST_ASSERT_EQ(file.getNumberObjects(), 3); // 3 groups + auto objectNames = file.listObjectNames(); + const std::vector expectedOuterGroupNames{"1", "2", "3"}; + TEST_ASSERT_EQ(objectNames.size(), expectedOuterGroupNames.size()); + for (auto&& outer : expectedOuterGroupNames) + { + const auto groupPath = "/" + outer; + const auto group = file.getGroup(groupPath); + TEST_ASSERT_EQ(group.getPath(), groupPath); + + TEST_ASSERT_EQ(group.getNumberObjects(), 2); // 2 groups + objectNames = group.listObjectNames(); + const std::vector expectedSubGroupNames{"bar", "foo"}; + TEST_ASSERT_EQ(objectNames.size(), expectedSubGroupNames.size()); + for (auto&& subGroupName : expectedSubGroupNames) + { + const auto subGroup = group.getGroup(subGroupName); + const auto subGroupPath = groupPath + "/" + subGroupName; + TEST_ASSERT_EQ(subGroup.getPath(), subGroupPath); + + + TEST_ASSERT_EQ(subGroup.getNumberObjects(), 2); // 2 groups + objectNames = subGroup.listObjectNames(); + const std::vector expectedSubSubGroupNames{"cat", "dog"}; + TEST_ASSERT_EQ(objectNames.size(), expectedSubSubGroupNames.size()); + for (auto&& subSubGroupName : expectedSubSubGroupNames) + { + const auto subSubGroup = subGroup.getGroup(subSubGroupName); + const auto subSubGroupPath = subGroupPath + "/" + subSubGroupName; + TEST_ASSERT_EQ(subSubGroup.getPath(), subSubGroupPath); + + read_complex(testName, subSubGroup); + } + } + } +} + +//******************************************************************************* + +TEST_CASE(test_highfive_create) +{ + static const auto path_ = find_unittest_file("example.h5"); + static const auto path = path_.parent_path() / "TEST_highfive_create_TMP.h5"; + H5Easy::File file(path.string(), H5Easy::File::Overwrite); + + const types::RowCol dims{10, 20}; + std::vector> DS1(dims.row); + float d = 0.0f; + for (auto&& r : DS1) + { + r.resize(dims.col); + for (size_t c = 0; c < r.size(); c++) + { + r[c] = d++; + } + } + + H5Easy::dump(file, "/DS1", DS1); + TEST_SUCCESS; +} + +TEST_CASE(test_highfive_write) +{ + static const auto path_ = find_unittest_file("example.h5"); + static const auto path = path_.parent_path() / "TEST_highfive_write_TMP.h5"; + + const types::RowCol dims{10, 20}; + std::vector data_(dims.area()); + const hdf5::lite::SpanRC data(data_.data(), dims); + double d = 0.0; + for (size_t r = 0; r>>(file, "/DS1"); + TEST_ASSERT_EQ(DS1.size(), dims.row); + TEST_ASSERT_EQ(DS1[0].size(), dims.col); + + for (size_t r = 0; r < DS1.size(); r++) + { + for (size_t c = 0; c < DS1[r].size(); c++) + { + const auto expected = data(r, c); + const auto actual = DS1[r][c]; + TEST_ASSERT_EQ(actual, expected); + } + } + } + { + H5Easy::File file(path.string()); + + std::vector result; + const auto rc = hdf5::lite::load(file, "/DS1", result); + TEST_ASSERT(rc.dims() == dims); + TEST_ASSERT_EQ(dims.area(), result.size()); + for (size_t i = 0; i < result.size(); i++) + { + const auto expected = static_cast(i); + TEST_ASSERT_EQ(result[i], expected); + } + } +} + +TEST_MAIN( + TEST_CHECK(test_highfive_load); + TEST_CHECK(test_highfive_FileException); + TEST_CHECK(test_highfive_nested); + TEST_CHECK(test_highfive_nested_small); + TEST_CHECK(test_highfive_nested_small_wrongType); + + TEST_CHECK(test_highfive_info); + TEST_CHECK(test_highfive_groupinfo); + TEST_CHECK(test_highfive_datasetinfo); + TEST_CHECK(test_highfive_info_nested); + + //TEST_CHECK(test_highfive_create); + //TEST_CHECK(test_highfive_write); +) diff --git a/externals/coda-oss/modules/c++/hdf5.lite/wscript b/externals/coda-oss/modules/c++/hdf5.lite/wscript index 3d7b54f3a1..32be36054d 100644 --- a/externals/coda-oss/modules/c++/hdf5.lite/wscript +++ b/externals/coda-oss/modules/c++/hdf5.lite/wscript @@ -1,6 +1,6 @@ NAME = 'hdf5.lite' VERSION = '1.0' -MODULE_DEPS = 'hdf5 hdf5cpp str except io logging sys coda_oss config gsl' +MODULE_DEPS = 'highfive hdf5 hdf5cpp except types io coda_oss' USELIB_LOCAL = 'hdf5-c hdf5cpp-c' options = configure = distclean = lambda p: None diff --git a/externals/coda-oss/modules/c++/include/TestCase.h b/externals/coda-oss/modules/c++/include/TestCase.h index 592dc105cc..a068260e0d 100644 --- a/externals/coda-oss/modules/c++/include/TestCase.h +++ b/externals/coda-oss/modules/c++/include/TestCase.h @@ -135,10 +135,12 @@ inline void specific_exception(TFunc f, diePrintf(format, testName, file, func, line); } catch (const TException&) { } + #if !CODA_OSS_except_Throwable_ISA_std_exception catch (const except::Throwable&) { diePrintf(format, testName, file, func, line); } + #endif catch (const std::exception&) { diePrintf(format, testName, file, func, line); diff --git a/externals/coda-oss/modules/c++/io/include/io/BufferViewStream.h b/externals/coda-oss/modules/c++/io/include/io/BufferViewStream.h index 45bc468189..beb00d23a2 100644 --- a/externals/coda-oss/modules/c++/io/include/io/BufferViewStream.h +++ b/externals/coda-oss/modules/c++/io/include/io/BufferViewStream.h @@ -61,7 +61,7 @@ struct BufferViewStream: public SeekableInputStream, public SeekableOutputStream BufferViewStream& operator=(BufferViewStream&&) = delete; //! Returns current location in buffer in bytes - virtual sys::Off_T tell() + virtual sys::Off_T tell() override { return gsl::narrow(mPosition * sizeof(T)); } @@ -73,12 +73,12 @@ struct BufferViewStream: public SeekableInputStream, public SeekableOutputStream * \param whence Location to seek from * \return new position */ - virtual sys::Off_T seek(sys::Off_T offset, Whence whence); + virtual sys::Off_T seek(sys::Off_T offset, Whence whence) override; /* * \return The available bytes to read from the stream */ - virtual sys::Off_T available() + virtual sys::Off_T available() override { return gsl::narrow((mBufferView.size - mPosition) * sizeof(T)); } @@ -92,7 +92,7 @@ struct BufferViewStream: public SeekableInputStream, public SeekableOutputStream * \param buffer The data to write to the stream * \param size The number of bytes to write to the stream */ - virtual void write(const void* buffer, size_t size); + virtual void write(const void* buffer, size_t size) override; /*! * Get a pointer to the internal buffer. @@ -139,7 +139,7 @@ struct BufferViewStream: public SeekableInputStream, public SeekableOutputStream * \param len The length to read * \return The number of bytes read */ - virtual sys::SSize_T readImpl(void* buffer, size_t len); + virtual sys::SSize_T readImpl(void* buffer, size_t len) override; private: diff --git a/externals/coda-oss/modules/c++/io/include/io/ByteStream.h b/externals/coda-oss/modules/c++/io/include/io/ByteStream.h index fe2efe1844..a64b7efc82 100644 --- a/externals/coda-oss/modules/c++/io/include/io/ByteStream.h +++ b/externals/coda-oss/modules/c++/io/include/io/ByteStream.h @@ -68,20 +68,20 @@ struct CODA_OSS_API ByteStream : public SeekableInputStream, public SeekableOutp } virtual - sys::Off_T tell() + sys::Off_T tell() override { return mPosition; } virtual - sys::Off_T seek(sys::Off_T offset, Whence whence); + sys::Off_T seek(sys::Off_T offset, Whence whence) override; /*! * Returns the available bytes to read from the stream * \return the available bytes to read */ virtual - sys::Off_T available(); + sys::Off_T available() override; using OutputStream::write; using InputStream::streamTo; @@ -92,7 +92,7 @@ struct CODA_OSS_API ByteStream : public SeekableInputStream, public SeekableOutp * \param size the number of bytes to write to the stream */ virtual - void write(const void* buffer, size_t size); + void write(const void* buffer, size_t size) override; void reset() { @@ -132,7 +132,7 @@ struct CODA_OSS_API ByteStream : public SeekableInputStream, public SeekableOutp * \throw IoException * \return The number of bytes read */ - virtual sys::SSize_T readImpl(void* buffer, size_t len); + virtual sys::SSize_T readImpl(void* buffer, size_t len) override; private: std::vector mData; diff --git a/externals/coda-oss/modules/c++/io/include/io/CountingStreams.h b/externals/coda-oss/modules/c++/io/include/io/CountingStreams.h index bebca3a5f5..9e7707f378 100644 --- a/externals/coda-oss/modules/c++/io/include/io/CountingStreams.h +++ b/externals/coda-oss/modules/c++/io/include/io/CountingStreams.h @@ -48,7 +48,7 @@ struct CODA_OSS_API CountingOutputStream : public ProxyOutputStream * \param buffer The byte array to write to the stream * \param len The length of the byte array to write to the stream */ - virtual void write(const void* buffer, size_t len) + virtual void write(const void* buffer, size_t len) override { ProxyOutputStream::write(buffer, len); mByteCount += len; diff --git a/externals/coda-oss/modules/c++/io/include/io/DataStream.h b/externals/coda-oss/modules/c++/io/include/io/DataStream.h index 599a609e17..ec42d215eb 100644 --- a/externals/coda-oss/modules/c++/io/include/io/DataStream.h +++ b/externals/coda-oss/modules/c++/io/include/io/DataStream.h @@ -76,7 +76,7 @@ struct DataStream: public io::Serializable * Outputs this object into an output stream. * \param os the OutputStream to write to */ - virtual void serialize(io::OutputStream& os) + virtual void serialize(io::OutputStream& os) override { mStringStream.streamTo(os); } @@ -85,7 +85,7 @@ struct DataStream: public io::Serializable * Unpack this input stream to the object * \param is Stream to read object from */ - virtual void deserialize(io::InputStream& is) + virtual void deserialize(io::InputStream& is) override { is.streamTo(mStringStream); } diff --git a/externals/coda-oss/modules/c++/io/include/io/DbgStream.h b/externals/coda-oss/modules/c++/io/include/io/DbgStream.h index b582104099..0750f84566 100644 --- a/externals/coda-oss/modules/c++/io/include/io/DbgStream.h +++ b/externals/coda-oss/modules/c++/io/include/io/DbgStream.h @@ -89,7 +89,7 @@ struct DbgStream : public OutputStream * \param len The length * \throw IOException */ - virtual void write(const void* buffer, sys::Size_T len) + virtual void write(const void* buffer, sys::Size_T len) override { if (mOn) { diff --git a/externals/coda-oss/modules/c++/io/include/io/FileInputStreamOS.h b/externals/coda-oss/modules/c++/io/include/io/FileInputStreamOS.h index ec445fea1e..6c16641b7d 100644 --- a/externals/coda-oss/modules/c++/io/include/io/FileInputStreamOS.h +++ b/externals/coda-oss/modules/c++/io/include/io/FileInputStreamOS.h @@ -23,6 +23,8 @@ #ifndef __IO_FILE_INPUT_STREAM_OS_H__ #define __IO_FILE_INPUT_STREAM_OS_H__ +#include "config/Exports.h" + #if !defined(USE_IO_STREAMS) #include "except/Exception.h" @@ -51,7 +53,7 @@ namespace io * method is based on the pos in the file, and the streamTo() and read() * are file operations */ -struct FileInputStreamOS : public SeekableInputStream +struct CODA_OSS_API FileInputStreamOS : public SeekableInputStream { protected: sys::File mFile; @@ -97,7 +99,7 @@ struct FileInputStreamOS : public SeekableInputStream * \return number of bytes which are readable * */ - virtual sys::Off_T available(); + virtual sys::Off_T available() override; /*! * Report whether or not the file is open @@ -128,7 +130,7 @@ struct FileInputStreamOS : public SeekableInputStream * Go to the offset at the location specified. * \return The number of bytes between off and our origin. */ - virtual sys::Off_T seek(sys::Off_T off, Whence whence) + virtual sys::Off_T seek(sys::Off_T off, Whence whence) override { int from = sys::File::FROM_CURRENT; switch (whence) @@ -152,7 +154,7 @@ struct FileInputStreamOS : public SeekableInputStream * Tell the current offset * \return The byte offset */ - virtual sys::Off_T tell() + virtual sys::Off_T tell() override { return mFile.getCurrentOffset(); } @@ -173,7 +175,7 @@ struct FileInputStreamOS : public SeekableInputStream * \return The number of bytes read * */ - virtual sys::SSize_T readImpl(void* buffer, size_t len); + virtual sys::SSize_T readImpl(void* buffer, size_t len) override; }; } diff --git a/externals/coda-oss/modules/c++/io/include/io/FileOutputStreamOS.h b/externals/coda-oss/modules/c++/io/include/io/FileOutputStreamOS.h index b2091d7904..5347f4c43d 100644 --- a/externals/coda-oss/modules/c++/io/include/io/FileOutputStreamOS.h +++ b/externals/coda-oss/modules/c++/io/include/io/FileOutputStreamOS.h @@ -103,16 +103,16 @@ class FileOutputStreamOS : public SeekableOutputStream int creationFlags = sys::File::CREATE | sys::File::TRUNCATE); //! Close the file - void close() + void close() override { mFile.close(); } - virtual void flush(); + virtual void flush() override; - sys::Off_T seek(sys::Off_T offset, io::Seekable::Whence whence); + sys::Off_T seek(sys::Off_T offset, io::Seekable::Whence whence) override; - sys::Off_T tell(); + sys::Off_T tell() override; using OutputStream::write; @@ -124,7 +124,7 @@ class FileOutputStreamOS : public SeekableOutputStream * \param len the length of bytes to write * \throw IoException */ - virtual void write(const void* buffer, size_t len); + virtual void write(const void* buffer, size_t len) override; }; } diff --git a/externals/coda-oss/modules/c++/io/include/io/NullStreams.h b/externals/coda-oss/modules/c++/io/include/io/NullStreams.h index 40f7ed37fd..3243185305 100644 --- a/externals/coda-oss/modules/c++/io/include/io/NullStreams.h +++ b/externals/coda-oss/modules/c++/io/include/io/NullStreams.h @@ -41,19 +41,19 @@ struct NullInputStream : public InputStream { } - virtual sys::Off_T available() + virtual sys::Off_T available() override { return mAvailable; } virtual sys::SSize_T readln(sys::byte *cStr, - const sys::Size_T strLenPlusNullByte) + const sys::Size_T strLenPlusNullByte) override { return read(cStr, strLenPlusNullByte); } virtual sys::SSize_T streamTo(OutputStream& soi, - sys::SSize_T numBytes = IS_END) + sys::SSize_T numBytes = IS_END) override { const sys::SSize_T toProcess = (numBytes == IS_END) ? numBytes : (mAvailable >= numBytes ? numBytes : mAvailable); @@ -77,7 +77,7 @@ struct NullInputStream : public InputStream memset(buffer, 0, len); } - virtual sys::SSize_T readImpl(void* buffer, size_t len) + virtual sys::SSize_T readImpl(void* buffer, size_t len) override { const auto numToRead = mAvailable >= gsl::narrow(len) ? len : gsl::narrow(mAvailable); @@ -108,11 +108,11 @@ struct NullOutputStream : public OutputStream { } - virtual void write(const void* , size_t ) + virtual void write(const void* , size_t ) override { } - virtual void flush() + virtual void flush() override { } }; diff --git a/externals/coda-oss/modules/c++/io/include/io/PipeStream.h b/externals/coda-oss/modules/c++/io/include/io/PipeStream.h index 480b61cd2b..0a6b910355 100644 --- a/externals/coda-oss/modules/c++/io/include/io/PipeStream.h +++ b/externals/coda-oss/modules/c++/io/include/io/PipeStream.h @@ -23,7 +23,7 @@ #ifndef __IO_PIPE_STREAM_H__ #define __IO_PIPE_STREAM_H__ -#include +#include #include #include @@ -76,7 +76,7 @@ struct PipeStream : InputStream * (default 0 means read until max or newline) */ virtual sys::SSize_T readln(sys::byte *cStr, - const sys::Size_T strLenPlusNullByte = 0); + const sys::Size_T strLenPlusNullByte = 0) override; /*! * The streaming occurs as follows: If the numBytes is IS_END, @@ -90,7 +90,7 @@ struct PipeStream : InputStream * input stream to the output stream */ virtual sys::SSize_T streamTo(OutputStream& soi, - sys::SSize_T numBytes = IS_END); + sys::SSize_T numBytes = IS_END) override; PipeStream(const PipeStream&) = delete; PipeStream& operator=(const PipeStream&) = delete; @@ -99,7 +99,7 @@ struct PipeStream : InputStream /*! * \brief returns the requested size in bytes from the stream */ - virtual sys::SSize_T readImpl(void* buffer, size_t len); + virtual sys::SSize_T readImpl(void* buffer, size_t len) override; sys::ExecPipe mExecPipe; diff --git a/externals/coda-oss/modules/c++/io/include/io/ProxyStreams.h b/externals/coda-oss/modules/c++/io/include/io/ProxyStreams.h index 806149ddea..7ec3c11c7c 100644 --- a/externals/coda-oss/modules/c++/io/include/io/ProxyStreams.h +++ b/externals/coda-oss/modules/c++/io/include/io/ProxyStreams.h @@ -47,7 +47,7 @@ struct CODA_OSS_API ProxyInputStream : public InputStream mProxy.release(); } - virtual sys::Off_T available() + virtual sys::Off_T available() override { return mProxy->available(); } @@ -61,7 +61,7 @@ struct CODA_OSS_API ProxyInputStream : public InputStream } protected: - virtual sys::SSize_T readImpl(void* buffer, size_t len) + virtual sys::SSize_T readImpl(void* buffer, size_t len) override { return mProxy->read(buffer, len); } @@ -93,17 +93,17 @@ struct CODA_OSS_API ProxyOutputStream : public OutputStream using OutputStream::write; - virtual void write(const void* buffer, size_t len) + virtual void write(const void* buffer, size_t len) override { mProxy->write(buffer, len); } - virtual void flush() + virtual void flush() override { mProxy->flush(); } - virtual void close() + virtual void close() override { mProxy->close(); } @@ -152,7 +152,7 @@ struct CODA_OSS_API ToggleOutputStream : public io::ProxyOutputStream return mEnabled; } - void close() + void close() override { if (mEnabled && mPtr) mPtr->close(); diff --git a/externals/coda-oss/modules/c++/io/include/io/RotatingFileOutputStream.h b/externals/coda-oss/modules/c++/io/include/io/RotatingFileOutputStream.h index c1c30dcefb..c766bfdb68 100644 --- a/externals/coda-oss/modules/c++/io/include/io/RotatingFileOutputStream.h +++ b/externals/coda-oss/modules/c++/io/include/io/RotatingFileOutputStream.h @@ -46,7 +46,7 @@ struct CODA_OSS_API RotatingFileOutputStream : public CountingOutputStream using CountingOutputStream::write; - virtual void write(const void* buffer, size_t len); + virtual void write(const void* buffer, size_t len) override; protected: std::string mFilename; diff --git a/externals/coda-oss/modules/c++/io/include/io/SerializableFile.h b/externals/coda-oss/modules/c++/io/include/io/SerializableFile.h index 7895bf1c45..f4244586b6 100644 --- a/externals/coda-oss/modules/c++/io/include/io/SerializableFile.h +++ b/externals/coda-oss/modules/c++/io/include/io/SerializableFile.h @@ -55,13 +55,13 @@ class SerializableFile: public Serializable /*! * Transfer this object into a byte stream */ - void serialize(io::OutputStream& os); + void serialize(io::OutputStream& os) override; /*! * Unpack this input stream to the object * \param is Stream to read object from */ - void deserialize(io::InputStream& is); + void deserialize(io::InputStream& is) override; protected: std::string mFilename; diff --git a/externals/coda-oss/modules/c++/io/include/io/StandardStreams.h b/externals/coda-oss/modules/c++/io/include/io/StandardStreams.h index 633fd7a8de..791ffded7c 100644 --- a/externals/coda-oss/modules/c++/io/include/io/StandardStreams.h +++ b/externals/coda-oss/modules/c++/io/include/io/StandardStreams.h @@ -62,12 +62,12 @@ struct StandardOutStream final : public OutputStream * \param len the length of bytes to read * \throw except::IOException */ - virtual void write(const void* buffer, size_t len); + virtual void write(const void* buffer, size_t len) override; /*! * Flushes stdout */ - virtual void flush(); + virtual void flush() override; using OutputStream::write; using OutputStream::writeln; @@ -91,12 +91,12 @@ struct StandardErrStream final : public OutputStream * \param len the length of bytes to read * \throw except::IOException */ - virtual void write(const void* buffer, sys::Size_T len); + virtual void write(const void* buffer, sys::Size_T len) override; /*! * Flushes stderr */ - virtual void flush(); + virtual void flush() override; protected: _STDSTREAM_DECLARE_MUTEX_SEMICOLON_ diff --git a/externals/coda-oss/modules/c++/io/include/io/StringStream.h b/externals/coda-oss/modules/c++/io/include/io/StringStream.h index d8a03ddb9c..80e147d51b 100644 --- a/externals/coda-oss/modules/c++/io/include/io/StringStream.h +++ b/externals/coda-oss/modules/c++/io/include/io/StringStream.h @@ -63,12 +63,12 @@ struct StringStreamT final : public SeekableBidirectionalStream return mData; } - sys::Off_T tell() + sys::Off_T tell() override { return mData.tellg(); } - sys::Off_T seek(sys::Off_T offset, Whence whence) + sys::Off_T seek(sys::Off_T offset, Whence whence) override { std::ios::seekdir flags = std::ios::cur; switch (whence) @@ -94,7 +94,7 @@ struct StringStreamT final : public SeekableBidirectionalStream * Returns the available bytes to read from the stream * \return the available bytes to read */ - sys::Off_T available() + sys::Off_T available() override { const auto where = tell(); @@ -112,7 +112,7 @@ struct StringStreamT final : public SeekableBidirectionalStream * \param buffer the data to write to the stream * \param size the number of bytes to write to the stream */ - void write(const void* buffer, sys::Size_T size) + void write(const void* buffer, sys::Size_T size) override { auto buffer_ = static_cast(buffer); mData.write(buffer_, gsl::narrow(size)); diff --git a/externals/coda-oss/modules/c++/io/include/io/TempFile.h b/externals/coda-oss/modules/c++/io/include/io/TempFile.h index 8e80e054be..b997bc948b 100644 --- a/externals/coda-oss/modules/c++/io/include/io/TempFile.h +++ b/externals/coda-oss/modules/c++/io/include/io/TempFile.h @@ -33,7 +33,7 @@ namespace io * RAII object for a temporary file that gets deleted * upon object destruction */ -struct CODA_OSS_API TempFile +struct CODA_OSS_API TempFile final { /*! * Constructor for TempFile object. Provided a directory, @@ -49,7 +49,7 @@ struct CODA_OSS_API TempFile * * \return The pathname of the created file */ - inline std::string pathname() const + const std::string& pathname() const { return mPathname; } @@ -58,7 +58,6 @@ struct CODA_OSS_API TempFile TempFile& operator=(const TempFile&) = delete; private: - const sys::OS mOS; const std::string mPathname; }; } diff --git a/externals/coda-oss/modules/c++/io/source/FileInputStreamIOS.cpp b/externals/coda-oss/modules/c++/io/source/FileInputStreamIOS.cpp index 5358e61d36..e1585d16ba 100644 --- a/externals/coda-oss/modules/c++/io/source/FileInputStreamIOS.cpp +++ b/externals/coda-oss/modules/c++/io/source/FileInputStreamIOS.cpp @@ -115,18 +115,8 @@ sys::SSize_T io::FileInputStreamIOS::readImpl(void* buffer, size_t len) if (avail > 0) { sys::SSize_T bytesRead(0); - // There is a 'huge-gantic' bug in Forte 6.2 - // in which 'read()' reads the first character twice -#if defined(__SUNPRO_CC) && (__SUNPRO_CC == 0x530) - - while (bytesRead < avail && mFStream.good()) - { - bufferPtr[bytesRead++] = mFStream.get(); - } -#else mFStream.read(bufferPtr, avail); bytesRead = mFStream.gcount(); -#endif return bytesRead; } diff --git a/externals/coda-oss/modules/c++/io/source/FileUtils.cpp b/externals/coda-oss/modules/c++/io/source/FileUtils.cpp index cdcd1e7c0f..9de78af1f1 100644 --- a/externals/coda-oss/modules/c++/io/source/FileUtils.cpp +++ b/externals/coda-oss/modules/c++/io/source/FileUtils.cpp @@ -40,7 +40,7 @@ void copyPermissions(const std::string& src, const std::string& dest) { -#if !(defined(WIN32) || defined(_WIN32)) +#ifndef _WIN32 // set up permissions on unix -- // copy the source's permissions struct stat statBuf; diff --git a/externals/coda-oss/modules/c++/io/source/InputStream.cpp b/externals/coda-oss/modules/c++/io/source/InputStream.cpp index a6e8c01523..3fd81e2f6c 100644 --- a/externals/coda-oss/modules/c++/io/source/InputStream.cpp +++ b/externals/coda-oss/modules/c++/io/source/InputStream.cpp @@ -65,7 +65,9 @@ sys::SSize_T InputStream::streamTo(OutputStream& soi, sys::SSize_T bytesToPipe) sys::SSize_T bytesRead = 0; sys::SSize_T totalBytesTransferred = 0; - sys::SSize_T sizeOfVec = (bytesToPipe <= DEFAULT_CHUNK_SIZE) ? (bytesToPipe) : (DEFAULT_CHUNK_SIZE); + constexpr auto defaultChunkSize = static_cast(DEFAULT_CHUNK_SIZE); + + sys::SSize_T sizeOfVec = (bytesToPipe <= defaultChunkSize) ? bytesToPipe : defaultChunkSize; sys::byte vec[DEFAULT_CHUNK_SIZE]; memset(vec, 0, DEFAULT_CHUNK_SIZE); @@ -79,8 +81,8 @@ sys::SSize_T InputStream::streamTo(OutputStream& soi, sys::SSize_T bytesToPipe) soi.write(vec, bytesRead); totalBytesTransferred += bytesRead; memset(vec, 0, DEFAULT_CHUNK_SIZE); - sizeOfVec = (bytesToPipe - totalBytesTransferred <= DEFAULT_CHUNK_SIZE) ? - (bytesToPipe - totalBytesTransferred) : (DEFAULT_CHUNK_SIZE); + sizeOfVec = (bytesToPipe - totalBytesTransferred <= defaultChunkSize) ? + (bytesToPipe - totalBytesTransferred) : defaultChunkSize; } // Return the number of bytes we piped return totalBytesTransferred; diff --git a/externals/coda-oss/modules/c++/io/source/StringStream.cpp b/externals/coda-oss/modules/c++/io/source/StringStream.cpp index e65b3fcdbc..1530070c5d 100644 --- a/externals/coda-oss/modules/c++/io/source/StringStream.cpp +++ b/externals/coda-oss/modules/c++/io/source/StringStream.cpp @@ -32,16 +32,7 @@ // // if (len <= 0) return 0; // -//#if defined(__SUNPRO_CC) && (__SUNPRO_CC == 0x530) -// sys::SSize_T bytesRead(0); -// while (bytesRead < len && mData.good()) -// { -// b[bytesRead++] = mData.get(); -// } -// len = bytesRead; -//#else // mData.read((char *)buffer, len); -//#endif // // Could be problem if streams are broken // // alternately could return gcount in else // // case above diff --git a/externals/coda-oss/modules/c++/io/source/TempFile.cpp b/externals/coda-oss/modules/c++/io/source/TempFile.cpp index e23bc29c37..1424aac29b 100644 --- a/externals/coda-oss/modules/c++/io/source/TempFile.cpp +++ b/externals/coda-oss/modules/c++/io/source/TempFile.cpp @@ -22,8 +22,8 @@ #include + static const sys::OS mOS; io::TempFile::TempFile(const std::string& dirname) : - mOS(sys::OS()), mPathname(mOS.getTempName(dirname)) { } diff --git a/externals/coda-oss/modules/c++/io/tests/serializeTest1.cpp b/externals/coda-oss/modules/c++/io/tests/serializeTest1.cpp index c3c37d2527..2037899aee 100644 --- a/externals/coda-oss/modules/c++/io/tests/serializeTest1.cpp +++ b/externals/coda-oss/modules/c++/io/tests/serializeTest1.cpp @@ -44,7 +44,7 @@ class A : public Serializable vec[2] = 0.0; } virtual ~A() {} - virtual void serialize(OutputStream& os) + virtual void serialize(OutputStream& os) override { os.writeln("Class A"); os.writeln(FmtX("%f", vec[0])); @@ -52,7 +52,7 @@ class A : public Serializable os.writeln(FmtX("%f", vec[2])); } - virtual void deserialize(InputStream& is) + virtual void deserialize(InputStream& is) override { string classType = fillString(is); string vec_0 = fillString(is); diff --git a/externals/coda-oss/modules/c++/io/unittests/test_tempfile.cpp b/externals/coda-oss/modules/c++/io/unittests/test_tempfile.cpp index ae391a26d6..60e5398c29 100644 --- a/externals/coda-oss/modules/c++/io/unittests/test_tempfile.cpp +++ b/externals/coda-oss/modules/c++/io/unittests/test_tempfile.cpp @@ -41,7 +41,8 @@ TEST_CASE(testFileDestroyed) { const io::TempFile tempFile; pathname = tempFile.pathname(); - std::ofstream out(pathname.c_str()); + std::ofstream out(pathname); + TEST_ASSERT_TRUE(static_cast(out)); out << "Test text"; } // File should be destroyed on destruction diff --git a/externals/coda-oss/modules/c++/logging/include/logging/Enums.h b/externals/coda-oss/modules/c++/logging/include/logging/Enums.h index 9dd89b63ef..95d7edeae7 100644 --- a/externals/coda-oss/modules/c++/logging/include/logging/Enums.h +++ b/externals/coda-oss/modules/c++/logging/include/logging/Enums.h @@ -40,7 +40,7 @@ namespace logging * * Enumeration used to represent LogLevels */ -struct LogLevel +struct LogLevel final { //! The enumerations allowed enum @@ -124,7 +124,7 @@ struct LogLevel } //! destructor - ~LogLevel(){} + ~LogLevel() = default; //! Returns string representation of the value std::string toString() const @@ -149,14 +149,10 @@ struct LogLevel } //! assignment operator - LogLevel& operator=(const LogLevel& o) - { - if (&o != this) - { - value = o.value; - } - return *this; - } + LogLevel& operator=(const LogLevel&) = default; + LogLevel(const LogLevel&) = default; + LogLevel& operator=(LogLevel&&) = default; + LogLevel(LogLevel&&) = default; bool operator==(const LogLevel& o) const { return value == o.value; } bool operator!=(const LogLevel& o) const { return value != o.value; } diff --git a/externals/coda-oss/modules/c++/logging/include/logging/FileHandler.h b/externals/coda-oss/modules/c++/logging/include/logging/FileHandler.h index 98adac5785..c87f28cdc0 100644 --- a/externals/coda-oss/modules/c++/logging/include/logging/FileHandler.h +++ b/externals/coda-oss/modules/c++/logging/include/logging/FileHandler.h @@ -29,6 +29,8 @@ #include #include +#include + #include "logging/LogRecord.h" #include "logging/StreamHandler.h" #include diff --git a/externals/coda-oss/modules/c++/logging/include/logging/LogRecord.h b/externals/coda-oss/modules/c++/logging/include/logging/LogRecord.h index 9423dc7468..df81ba04b8 100644 --- a/externals/coda-oss/modules/c++/logging/include/logging/LogRecord.h +++ b/externals/coda-oss/modules/c++/logging/include/logging/LogRecord.h @@ -50,7 +50,7 @@ class LogRecord std::string file, std::string function, int lineNum, std::string timestamp) : mName(name), mMsg(msg), mLevel(level), mFile(file), mFunction(function), mLineNum(lineNum), mTimestamp(timestamp){} - virtual ~LogRecord(){} + virtual ~LogRecord() = default; LogLevel getLevel() const { return mLevel; } std::string getLevelName() const; diff --git a/externals/coda-oss/modules/c++/logging/include/logging/MemoryHandler.h b/externals/coda-oss/modules/c++/logging/include/logging/MemoryHandler.h index 0bd91982d0..6654333183 100644 --- a/externals/coda-oss/modules/c++/logging/include/logging/MemoryHandler.h +++ b/externals/coda-oss/modules/c++/logging/include/logging/MemoryHandler.h @@ -52,7 +52,7 @@ struct MemoryHandler : public Handler getLogs(LogLevel level = LogLevel::LOG_NOTSET) const; protected: - virtual void write(const std::string& str); + virtual void write(const std::string& str) override; void emitRecord(const LogRecord* record) override; diff --git a/externals/coda-oss/modules/c++/logging/include/logging/StandardFormatter.h b/externals/coda-oss/modules/c++/logging/include/logging/StandardFormatter.h index 0e11d3d30c..798082e819 100644 --- a/externals/coda-oss/modules/c++/logging/include/logging/StandardFormatter.h +++ b/externals/coda-oss/modules/c++/logging/include/logging/StandardFormatter.h @@ -67,7 +67,7 @@ class CODA_OSS_API StandardFormatter : public Formatter StandardFormatter& operator=(const StandardFormatter&) = delete; - virtual void format(const LogRecord* record, io::OutputStream& os) const; + virtual void format(const LogRecord* record, io::OutputStream& os) const override; }; diff --git a/externals/coda-oss/modules/c++/logging/include/logging/StreamHandler.h b/externals/coda-oss/modules/c++/logging/include/logging/StreamHandler.h index fa66e54b5a..49d12f1aff 100644 --- a/externals/coda-oss/modules/c++/logging/include/logging/StreamHandler.h +++ b/externals/coda-oss/modules/c++/logging/include/logging/StreamHandler.h @@ -57,10 +57,10 @@ struct CODA_OSS_API StreamHandler : public Handler //! adds the need to write epilogue before deleting formatter // and then writing the prologue with the new formatter - virtual void setFormatter(Formatter* formatter); - virtual void setFormatter(std::unique_ptr&&); + virtual void setFormatter(Formatter* formatter) override; + virtual void setFormatter(std::unique_ptr&&) override; - virtual void close(); + virtual void close() override; protected: // This is necessary so this class and an inherited class can call a @@ -68,7 +68,7 @@ struct CODA_OSS_API StreamHandler : public Handler void closeImpl(); //! for general string write - virtual void write(const std::string&); + virtual void write(const std::string&) override; //! for writing directly to stream, // used for the bulk of the logging for speed diff --git a/externals/coda-oss/modules/c++/logging/include/logging/XMLFormatter.h b/externals/coda-oss/modules/c++/logging/include/logging/XMLFormatter.h index 7eb6556152..b6d8e8e834 100644 --- a/externals/coda-oss/modules/c++/logging/include/logging/XMLFormatter.h +++ b/externals/coda-oss/modules/c++/logging/include/logging/XMLFormatter.h @@ -63,7 +63,7 @@ struct XMLFormatter : public logging::Formatter XMLFormatter& operator=(const XMLFormatter&) = delete; - virtual void format(const logging::LogRecord* record, io::OutputStream& os) const; + virtual void format(const logging::LogRecord* record, io::OutputStream& os) const override; }; diff --git a/externals/coda-oss/modules/c++/logging/source/LogRecord.cpp b/externals/coda-oss/modules/c++/logging/source/LogRecord.cpp index a8e7f58e59..1919c30b79 100644 --- a/externals/coda-oss/modules/c++/logging/source/LogRecord.cpp +++ b/externals/coda-oss/modules/c++/logging/source/LogRecord.cpp @@ -34,5 +34,4 @@ logging::LogRecord::LogRecord(std::string name, std::string msg, logging::LogLev } -std::string logging::LogRecord::getLevelName() const { return mLevel.toString(); }; - +std::string logging::LogRecord::getLevelName() const { return mLevel.toString(); } diff --git a/externals/coda-oss/modules/c++/logging/source/Setup.cpp b/externals/coda-oss/modules/c++/logging/source/Setup.cpp index 8981ebb9be..3c1c363638 100644 --- a/externals/coda-oss/modules/c++/logging/source/Setup.cpp +++ b/externals/coda-oss/modules/c++/logging/source/Setup.cpp @@ -19,6 +19,10 @@ * see . * */ +#include "logging/Setup.h" + +#include +#include #include @@ -28,8 +32,6 @@ #include "logging/StandardFormatter.h" #include "logging/XMLFormatter.h" -#include "logging/Setup.h" - std::unique_ptr logging::setupLogger(const path& program_, const std::string& logLevel, @@ -69,9 +71,14 @@ logging::setupLogger(const path& program_, logHandler.reset(new logging::StreamHandler()); else { + // Existing code was checking whether a 'size_t' was <0; that of course can't + // ever happen because 'size_t' is an unsigned type. But, in the spirit of + // the existing code, assume that somebody thought such a check was meaningful + // ... using the value of a 32-bit integer (we now only build on 64-bit platforms). + // create a rotating logger - logCount = (logCount < 0) ? 0 : logCount; - logBytes = (logBytes < 0) ? 0 : logBytes; + logCount = logCount > std::numeric_limits::max() ? 0 : logCount; // logCount = (logCount < 0) ? 0 : logCount; + logBytes = logBytes > std::numeric_limits::max() ? 0 : logBytes; // logBytes = (logBytes < 0) ? 0 : logBytes; if (logBytes > 0) { logHandler.reset(new logging::RotatingFileHandler(logFile, diff --git a/externals/coda-oss/modules/c++/logging/unittests/test_exception_logger.cpp b/externals/coda-oss/modules/c++/logging/unittests/test_exception_logger.cpp index 55250b3607..f85d8cc54a 100644 --- a/externals/coda-oss/modules/c++/logging/unittests/test_exception_logger.cpp +++ b/externals/coda-oss/modules/c++/logging/unittests/test_exception_logger.cpp @@ -45,7 +45,7 @@ class RunNothing final : public sys::Runnable public: RunNothing(size_t& c, logging::ExceptionLogger* el, bool getBacktrace=false) : counter(c), exLog(el), getBacktrace(getBacktrace) {} - virtual void run() + virtual void run() override { if(exLog->hasLogged()) return; @@ -121,7 +121,8 @@ TEST_CASE(testExceptionWithBacktrace) } catch (const except::Throwable& t) { - TEST_ASSERT_GREATER(t.getBacktrace().size(), static_cast(0)); + const auto backtraceSize = static_cast(t.getBacktrace().size()); + TEST_ASSERT_GREATER(backtraceSize, 0); s = t.toString(true /*includeBacktrace*/); what = t.what(); } diff --git a/externals/coda-oss/modules/c++/logging/unittests/test_rotating_log.cpp b/externals/coda-oss/modules/c++/logging/unittests/test_rotating_log.cpp index dff0bc97d3..6f0c4f7251 100644 --- a/externals/coda-oss/modules/c++/logging/unittests/test_rotating_log.cpp +++ b/externals/coda-oss/modules/c++/logging/unittests/test_rotating_log.cpp @@ -60,10 +60,11 @@ TEST_CASE(testRotate) log.debug("0123456789"); TEST_ASSERT(os.exists(outFile)); - TEST_ASSERT_FALSE(os.isFile(outFile + ".1")); + const auto outFile1 = outFile + ".1"; + TEST_ASSERT_FALSE(os.isFile(outFile1)); log.debug("1"); - TEST_ASSERT(os.isFile(outFile + ".1")); + TEST_ASSERT(os.isFile(outFile1)); } cleanupFiles( outFile); diff --git a/externals/coda-oss/modules/c++/math.linear/include/math/linear/Matrix2D.h b/externals/coda-oss/modules/c++/math.linear/include/math/linear/Matrix2D.h index 29ceaf742b..49c4bc0289 100644 --- a/externals/coda-oss/modules/c++/math.linear/include/math/linear/Matrix2D.h +++ b/externals/coda-oss/modules/c++/math.linear/include/math/linear/Matrix2D.h @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include #include diff --git a/externals/coda-oss/modules/c++/math.linear/include/math/linear/MatrixMxN.h b/externals/coda-oss/modules/c++/math.linear/include/math/linear/MatrixMxN.h index e7ee84deec..39006e1348 100644 --- a/externals/coda-oss/modules/c++/math.linear/include/math/linear/MatrixMxN.h +++ b/externals/coda-oss/modules/c++/math.linear/include/math/linear/MatrixMxN.h @@ -19,8 +19,9 @@ * see . * */ -#ifndef __MATH_LINEAR_MATRIX_M_X_N_H__ -#define __MATH_LINEAR_MATRIX_M_X_N_H__ +#ifndef CODA_OSS_math_linear_MatrixMxN_h_INCLUDED_ +#define CODA_OSS_math_linear_MatrixMxN_h_INCLUDED_ +#pragma once #include #include @@ -35,7 +36,7 @@ namespace linear { // Create a safe comparison -template bool equals(const _T& e1, const _T& e2) +template inline bool equals(const _T& e1, const _T& e2) { return e1 == e2; } @@ -121,19 +122,8 @@ class MatrixMxN typedef MatrixMxN<_MD, _ND, _T> Like_T; //! Public but really should be avoided - #if _MSC_VER - __pragma(warning(push)) - __pragma(warning(disable: 26495)) // 26495: Variable '...' is uninitialized. Always initialize a member variable (type.6). - #endif - _T mRaw[_MD][_ND]; - #if _MSC_VER - __pragma(warning(pop)) - #endif + _T mRaw[_MD][_ND]{}; - /*! - * No initialization here! - * - */ MatrixMxN() = default; /*! @@ -149,9 +139,9 @@ class MatrixMxN */ MatrixMxN(_T cv) { - for (size_t i = 0; i < _MD; i++) + for (size_t i = 0; i < rows(); i++) { - for (size_t j = 0; j < _ND; j++) + for (size_t j = 0; j < cols(); j++) { mRaw[i][j] = cv; } @@ -175,16 +165,23 @@ class MatrixMxN * * \param raw A raw pointer to copy internally */ - MatrixMxN(const _T* raw) +private: + template + void assign_from_raw(const TVectorLike& raw) { - for (size_t i = 0; i < _MD; i++) + for (size_t i = 0; i < rows(); i++) { - for (size_t j = 0; j < _ND; j++) + for (size_t j = 0; j < cols(); j++) { - mRaw[i][j] = raw[i * _ND + j]; + mRaw[i][j] = raw[i * cols() + j]; } } } +public: + MatrixMxN(const _T* raw) + { + assign_from_raw(raw); + } /*! * Construct a matrix from a 1D M*N vector. @@ -200,14 +197,7 @@ class MatrixMxN { if (raw.size() < size()) throw except::Exception(Ctxt("Invalid size exception")); - - for (size_t i = 0; i < _MD; ++i) - { - for (size_t j = 0; j < _ND; ++j) - { - mRaw[i][j] = raw[i * _ND + j]; - } - } + assign_from_raw(raw); } /*! @@ -223,9 +213,9 @@ class MatrixMxN */ MatrixMxN(const MatrixMxN& mx) { - for (size_t i = 0; i < _MD; i++) + for (size_t i = 0; i < rows(); i++) { - for (size_t j = 0; j < _ND; j++) + for (size_t j = 0; j < cols(); j++) { mRaw[i][j] = mx.mRaw[i][j]; } @@ -249,13 +239,7 @@ class MatrixMxN */ MatrixMxN& operator=(const _T* raw) { - for (size_t i = 0; i < _MD; i++) - { - for (size_t j = 0; j < _ND; j++) - { - mRaw[i][j] = raw[i * _ND + j]; - } - } + assign_from_raw(raw); return *this; } @@ -273,13 +257,7 @@ class MatrixMxN { if (raw.size() < size()) throw except::Exception(Ctxt("Invalid size exception")); - for (size_t i = 0; i < _MD; i++) - { - for (size_t j = 0; j < _ND; j++) - { - mRaw[i][j] = raw[i * _ND + j]; - } - } + assign_from_raw(raw); return *this; } @@ -297,9 +275,9 @@ class MatrixMxN MatrixMxN& operator=(const MatrixMxN& mx) { if (this != &mx) - for (size_t i = 0; i < _MD; i++) + for (size_t i = 0; i < rows(); i++) { - for (size_t j = 0; j < _ND; j++) + for (size_t j = 0; j < cols(); j++) { mRaw[i][j] = mx.mRaw[i][j]; } @@ -322,9 +300,9 @@ class MatrixMxN */ MatrixMxN& operator=(const _T& sv) { - for (size_t i = 0; i < _MD; i++) + for (size_t i = 0; i < rows(); i++) { - for (size_t j = 0; j < _ND; j++) + for (size_t j = 0; j < cols(); j++) { mRaw[i][0] = sv; } @@ -347,7 +325,7 @@ class MatrixMxN inline const _T& operator()(size_t i, size_t j) const noexcept { #if defined(MATH_LINEAR_BOUNDS) - assert( i < _MD && j < _ND ); + assert( i < rows() && j < cols() ); #endif return mRaw[i][j]; } @@ -365,7 +343,7 @@ class MatrixMxN inline _T& operator()(size_t i, size_t j) noexcept { #if defined(MATH_LINEAR_BOUNDS) - assert( i < _MD && j < _ND ); + assert( i < rows() && j < cols() ); #endif return mRaw[i][j]; } @@ -407,7 +385,7 @@ class MatrixMxN inline const _T* row(size_t i) const noexcept { #if defined(MATH_LINEAR_BOUNDS) - assert( i < _MD); + assert( i < rows()); #endif return mRaw[i]; } @@ -420,7 +398,7 @@ class MatrixMxN inline _T* row(size_t i) noexcept { #if defined(MATH_LINEAR_BOUNDS) - assert( i < _MD); + assert( i < rows()); #endif return mRaw[i]; } @@ -440,7 +418,7 @@ class MatrixMxN */ inline void row(size_t i, const _T* vec) { - for (size_t j = 0; j < _ND; j++) + for (size_t j = 0; j < cols(); j++) { mRaw[i][j] = vec[j]; } @@ -480,8 +458,8 @@ class MatrixMxN */ std::vector<_T> col(size_t j) const { - std::vector<_T> jth(_MD); - for (size_t i = 0; i < _MD; ++i) + std::vector<_T> jth(rows()); + for (size_t i = 0; i < rows(); ++i) { jth[i] = mRaw[i][j]; } @@ -503,7 +481,7 @@ class MatrixMxN */ void col(size_t j, const _T* vec) { - for (size_t i = 0; i < _MD; ++i) + for (size_t i = 0; i < rows(); ++i) { mRaw[i][j] = vec[i]; } @@ -543,7 +521,7 @@ class MatrixMxN */ void col(size_t colIdx, const MatrixMxN<_MD, 1, _T>& vec) { - for (size_t row = 0; row < _MD; ++row) + for (size_t row = 0; row < rows(); ++row) { mRaw[row][colIdx] = vec(row, 0); } @@ -562,7 +540,7 @@ class MatrixMxN * * \return _MD */ - inline size_t rows() const noexcept { return _MD; } + constexpr size_t rows() const noexcept { return _MD; } /*! * This function is not really necessary, but @@ -574,14 +552,14 @@ class MatrixMxN * * \return _ND */ - inline size_t cols() const noexcept { return _ND; } + constexpr size_t cols() const noexcept { return _ND; } /*! * Gives back the value full size of the matrix * - * \return _MD * _ND + * \return _MD * cols() */ - inline size_t size() const noexcept { return rows() * cols(); } + constexpr size_t size() const noexcept { return rows() * cols(); } @@ -606,12 +584,12 @@ class MatrixMxN template inline bool operator==(const Matrix_T& mx) const { - if (_MD != mx.rows() || _ND != mx.cols()) + if (rows() != mx.rows() || cols() != mx.cols()) return false; - for (size_t i = 0; i < _MD; ++i) + for (size_t i = 0; i < rows(); ++i) { - for (size_t j = 0; j < _ND; ++j) + for (size_t j = 0; j < cols(); ++j) { if (! equals(mRaw[i][j], mx(i, j))) return false; @@ -664,9 +642,9 @@ class MatrixMxN */ MatrixMxN& scale(_T scalar) { - for (size_t i = 0; i < _MD; i++) + for (size_t i = 0; i < rows(); i++) { - for (size_t j = 0; j < _ND; j++) + for (size_t j = 0; j < cols(); j++) { mRaw[i][j] *= scalar; } @@ -694,9 +672,9 @@ class MatrixMxN MatrixMxN<_MD, _ND> multiply(_T scalar) const { MatrixMxN<_MD, _ND> mx = *this; - for (size_t i = 0; i < _MD; i++) + for (size_t i = 0; i < rows(); i++) { - for (size_t j = 0; j < _ND; j++) + for (size_t j = 0; j < cols(); j++) { mx[i][j] *= scalar; } @@ -733,12 +711,12 @@ class MatrixMxN { MatrixMxN<_MD, _PD, _T> newM{}; - for (size_t i = 0; i < _MD; i++) + for (size_t i = 0; i < rows(); i++) { for (size_t j = 0; j < _PD; j++) { newM.mRaw[i][j] = 0; - for (size_t k = 0; k < _ND; k++) + for (size_t k = 0; k < cols(); k++) { newM.mRaw[i][j] += mRaw[i][k] * mx.mRaw[k][j]; } @@ -769,9 +747,9 @@ class MatrixMxN MatrixMxN& scaleDiagonal(const MatrixMxN<_ND, _ND, _T>& mx) { size_t i, j; - for (i = 0; i < _MD; i++) + for (i = 0; i < rows(); i++) { - for (j = 0; j < _ND; j++) + for (j = 0; j < cols(); j++) { mRaw[i][j] *= mx.mRaw[j][j]; } @@ -821,9 +799,9 @@ class MatrixMxN Like_T& operator+=(const Like_T& mx) { - for (size_t i = 0; i < _MD; i++) + for (size_t i = 0; i < rows(); i++) { - for (size_t j = 0; j < _ND; j++) + for (size_t j = 0; j < cols(); j++) { mRaw[i][j] += mx.mRaw[i][j]; } @@ -850,9 +828,9 @@ class MatrixMxN Like_T& operator-=(const Like_T& mx) { - for (size_t i = 0; i < _MD; i++) + for (size_t i = 0; i < rows(); i++) { - for (size_t j = 0; j < _ND; j++) + for (size_t j = 0; j < cols(); j++) { mRaw[i][j] -= mx(i, j); } @@ -956,8 +934,8 @@ class MatrixMxN { MatrixMxN<_ND, _MD, _T> x{}; - for (size_t i = 0; i < _MD; i++) - for (size_t j = 0; j < _ND; j++) + for (size_t i = 0; i < rows(); i++) + for (size_t j = 0; j < cols(); j++) x.mRaw[j][i] = mRaw[i][j]; return x; @@ -982,11 +960,11 @@ class MatrixMxN Like_T lu; - for (size_t i = 0; i < _MD; i++) + for (size_t i = 0; i < rows(); i++) { // Start by making our pivots unpermuted pivotsM[i] = i; - for (size_t j = 0; j < _ND; j++) + for (size_t j = 0; j < cols(); j++) { // And copying elements lu(i, j) = mRaw[i][j]; @@ -996,14 +974,14 @@ class MatrixMxN std::vector<_T> colj(_MD); _T* rowi; - for (size_t j = 0; j < _ND; j++) + for (size_t j = 0; j < cols(); j++) { - for (size_t i = 0; i < _MD; i++) + for (size_t i = 0; i < rows(); i++) { colj[i] = lu(i, j); } - for (size_t i = 0; i < _MD; i++) + for (size_t i = 0; i < rows(); i++) { rowi = lu[i]; @@ -1018,7 +996,7 @@ class MatrixMxN } size_t p = j; - for (size_t i = j + 1; i < _MD; i++) + for (size_t i = j + 1; i < rows(); i++) { if (std::abs(colj[i]) > std::abs(colj[p])) p = i; @@ -1027,7 +1005,7 @@ class MatrixMxN if (p != j) { size_t k = 0; - for (; k < _ND; k++) + for (; k < cols(); k++) { // We are swapping _T t = lu(p, k); @@ -1038,9 +1016,9 @@ class MatrixMxN pivotsM[p] = pivotsM[j]; pivotsM[j] = k; } - if (j < _MD && std::abs( lu(j, j) )) + if (j < rows() && std::abs( lu(j, j) )) { - for (size_t i = j + 1; i < _MD; i++) + for (size_t i = j + 1; i < rows(); i++) { // Divide out our rows lu(i, j) /= lu(j, j); @@ -1069,7 +1047,7 @@ class MatrixMxN Like_T permute(const std::vector& pivotsM, size_t n = _ND) const { Like_T perm; - for (size_t i = 0; i < _MD; i++) + for (size_t i = 0; i < rows(); i++) { for (size_t j = 0; j < n; j++) { @@ -1086,9 +1064,9 @@ class MatrixMxN _T normSq() const { _T acc(0); - for (size_t i = 0; i < _MD; ++i) + for (size_t i = 0; i < rows(); ++i) { - for (size_t j = 0; j < _ND; ++j) + for (size_t j = 0; j < cols(); ++j) { acc += mRaw[i][j] * mRaw[i][j]; } @@ -1204,9 +1182,9 @@ class MatrixMxN Like_T operator-() const { Like_T neg{}; - for (size_t ii = 0; ii < _MD; ++ii) + for (size_t ii = 0; ii < rows(); ++ii) { - for (size_t jj = 0; jj < _ND; ++jj) + for (size_t jj = 0; jj < cols(); ++jj) { neg.mRaw[ii][jj] = -mRaw[ii][jj]; } @@ -1566,4 +1544,4 @@ template Matrix_T tidy(const Matrix_T& constMatrix, return mx; } -#endif +#endif // CODA_OSS_math_linear_MatrixMxN_h_INCLUDED_ diff --git a/externals/coda-oss/modules/c++/math.linear/include/math/linear/VectorN.h b/externals/coda-oss/modules/c++/math.linear/include/math/linear/VectorN.h index 6e9b7c177f..4c1539f122 100644 --- a/externals/coda-oss/modules/c++/math.linear/include/math/linear/VectorN.h +++ b/externals/coda-oss/modules/c++/math.linear/include/math/linear/VectorN.h @@ -19,12 +19,14 @@ * see . * */ -#ifndef __MATH_LINEAR_VECTOR_N_H__ -#define __MATH_LINEAR_VECTOR_N_H__ +#ifndef CODA_OSS_math_linear_VectorN_h_INCLUDED_ +#define CODA_OSS_math_linear_VectorN_h_INCLUDED_ +#pragma once -#include #include +#include + namespace math { namespace linear @@ -33,19 +35,11 @@ namespace linear template class VectorN { - #if _MSC_VER - __pragma(warning(push)) - __pragma(warning(disable: 26495)) // 26495: Variable '...' is uninitialized. Always initialize a member variable (type.6). - #endif - MatrixMxN<_ND, 1, _T> mRaw; - #if _MSC_VER - __pragma(warning(pop)) - #endif + MatrixMxN<_ND, 1, _T> mRaw{}; public: typedef VectorN<_ND, _T> Like_T; - //! Default constructor (no initialization) VectorN() = default; /*! @@ -96,10 +90,7 @@ template class VectorN */ VectorN(const std::vector<_T>& raw) { - if (raw.size() < _ND) - throw except::Exception(Ctxt("Not enough elements")); - - mRaw = raw; + *this = raw; } /*! @@ -111,7 +102,7 @@ template class VectorN */ VectorN& operator=(const std::vector<_T>& raw) { - if (raw.size() < _ND) + if (raw.size() < size()) throw except::Exception(Ctxt("Not enough elements")); mRaw = raw; @@ -171,25 +162,25 @@ template class VectorN inline _T operator[](size_t i) const noexcept { #if defined(MATH_LINEAR_BOUNDS) - assert( i < _ND ); + assert( i < size() ); #endif return mRaw[i][0]; } inline _T& operator[](size_t i) noexcept { #if defined(MATH_LINEAR_BOUNDS) - assert( i < _ND ); + assert( i < size() ); #endif return mRaw[i][0]; } - inline size_t size() const noexcept { return _ND; } + constexpr size_t size() const noexcept { return _ND; } _T dot(const VectorN<_ND>& vec) const { _T acc(0); - for (size_t i = 0; i < _ND; ++i) + for (size_t i = 0; i < size(); ++i) { acc += (*this)[i] * vec[i]; } @@ -294,7 +285,7 @@ template class VectorN Like_T& operator *=(const Like_T& v) { - for (size_t i = 0; i < _ND; i++) + for (size_t i = 0; i < size(); i++) { mRaw(i, 0) *= v[i]; } @@ -321,7 +312,7 @@ template class VectorN Like_T& operator /=(const Like_T& v) { - for (size_t i = 0; i < _ND; i++) + for (size_t i = 0; i < size(); i++) { mRaw(i, 0) /= v[i]; } @@ -412,4 +403,4 @@ inline bool operator!=(const VectorN& lhs, const Vector_T& rhs) } // linear } // math -#endif +#endif // CODA_OSS_math_linear_VectorN_h_INCLUDED_ diff --git a/externals/coda-oss/modules/c++/math.linear/unittests/test_lin.cpp b/externals/coda-oss/modules/c++/math.linear/unittests/test_lin.cpp index 3dc706ea9e..cc46d74a5d 100644 --- a/externals/coda-oss/modules/c++/math.linear/unittests/test_lin.cpp +++ b/externals/coda-oss/modules/c++/math.linear/unittests/test_lin.cpp @@ -81,6 +81,7 @@ TEST_CASE(testSTLVectorAssign) TEST_CASE(testEmptyDim) { math::linear::Matrix2D AScale(3, 0); + TEST_ASSERT_TRUE(true); // need to use hidden "testName" parameter } TEST_CASE(testPtrDecorator) @@ -100,6 +101,7 @@ TEST_CASE(testPtrAdopt) { // valgrind to ensure that we don't have a leak math::linear::Matrix2D AScale(3, 3, new double[9], true); + TEST_ASSERT_TRUE(true); // need to use hidden "testName" parameter } TEST_CASE(testArithmetic) @@ -216,4 +218,4 @@ TEST_MAIN( std::cout << cross(v3, y) << std::endl; */ -) \ No newline at end of file +) diff --git a/externals/coda-oss/modules/c++/math/include/math/ConvexHull.h b/externals/coda-oss/modules/c++/math/include/math/ConvexHull.h index 9c178bf1fa..787e231195 100644 --- a/externals/coda-oss/modules/c++/math/include/math/ConvexHull.h +++ b/externals/coda-oss/modules/c++/math/include/math/ConvexHull.h @@ -146,7 +146,7 @@ class ConvexHull static sys::SSize_T direction(const RowCol& p0, const RowCol& p1, - const RowCol& p2) + const RowCol& p2) noexcept { const T firstTerm = (p0.col - p1.col) * (p2.row - p1.row); const T secondTerm = (p2.col - p1.col) * (p0.row - p1.row); diff --git a/externals/coda-oss/modules/c++/mem/CMakeLists.txt b/externals/coda-oss/modules/c++/mem/CMakeLists.txt index 174ea256aa..297850c3ba 100644 --- a/externals/coda-oss/modules/c++/mem/CMakeLists.txt +++ b/externals/coda-oss/modules/c++/mem/CMakeLists.txt @@ -3,7 +3,7 @@ set(MODULE_NAME mem) coda_add_module( ${MODULE_NAME} VERSION 1.0 - DEPS sys-c++ gsl-c++) + DEPS sys-c++ gsl-c++ coda_oss-c++ std-c++) coda_add_tests( MODULE_NAME ${MODULE_NAME} diff --git a/externals/coda-oss/modules/c++/mem/include/mem/AutoPtr.h b/externals/coda-oss/modules/c++/mem/include/mem/AutoPtr.h index e19a7e1c07..0061b47262 100644 --- a/externals/coda-oss/modules/c++/mem/include/mem/AutoPtr.h +++ b/externals/coda-oss/modules/c++/mem/include/mem/AutoPtr.h @@ -25,7 +25,7 @@ #define CODA_OSS_mem_AutoPtr_h_INCLUDED_ #pragma once -#include +#include #include "coda_oss/memory.h" #include "mem/SharedPtr.h" diff --git a/externals/coda-oss/modules/c++/mem/include/mem/ComplexView.h b/externals/coda-oss/modules/c++/mem/include/mem/ComplexView.h new file mode 100644 index 0000000000..6b8a60c0dc --- /dev/null +++ b/externals/coda-oss/modules/c++/mem/include/mem/ComplexView.h @@ -0,0 +1,367 @@ +/* ========================================================================= + * This file is part of mem-c++ + * ========================================================================= + * + * (C) Copyright 2013 - 2014, MDA Information Systems LLC + * (C) Copyright 2023, Maxar Technologies, Inc. + * + * mem-c++ is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; If not, + * see . + * + */ + +#ifndef CODA_OSS_mem_ComplexView_h_INCLUDED_ +#define CODA_OSS_mem_ComplexView_h_INCLUDED_ +#pragma once + +#include +#include + +#include +#include +#include +#include +#include + +#include "coda_oss/span.h" +#include "config/disable_compiler_warnings.h" + +namespace mem +{ + + /*! + * \class ComplexViewConstIterator + * \brief Iterate over a ComplexView class only needing to know the + * "axis" of the std::complex<>, i.e., "float" or "double". + * + * This allows view-independent code to be written without having to use + * a TView-template; instead ComplexViewConstIterator can be used. + * And often such code is dependent on T (i.e., "float", but not "double") + * which means implementation can be in a CPP file. + */ +template +struct ComplexViewConstIterator final +{ + // https://stackoverflow.com/questions/8054273/how-to-implement-an-stl-style-iterator-and-avoid-common-pitfalls + using iterator_category = std::random_access_iterator_tag; + using value_type = std::complex; + using difference_type = ptrdiff_t; + using size_type = size_t; + using pointer = const value_type*; + using reference = const value_type&; + + template + explicit ComplexViewConstIterator(TView view) : + size_(view.size()) // Saving the size avoids the need for another constructor. + { + index_f_ = [view](size_type i) { return view[i]; }; + } + // Help ensure the iterators use the same view + auto end_() const + { + auto retval = *this; + retval.index_ = size_; + return retval; + } + + ComplexViewConstIterator() = default; + ~ComplexViewConstIterator() = default; + ComplexViewConstIterator(const ComplexViewConstIterator&) = default; + ComplexViewConstIterator& operator=(const ComplexViewConstIterator&) = default; + ComplexViewConstIterator(ComplexViewConstIterator&&) = default; + ComplexViewConstIterator& operator=(ComplexViewConstIterator&&) = default; + + bool operator==(const ComplexViewConstIterator& rhs) const + { + // Checking the target() helps ensure the same type of view is used. + return (index_ == rhs.index_) && (size_ == rhs.size_) && + (index_f_.target_type() == rhs.index_f_.target_type()); + } + bool operator!=(const ComplexViewConstIterator& rhs) const + { + return !(*this == rhs); + } + + ComplexViewConstIterator& operator++() + { + ++index_; + return *this; + } + ComplexViewConstIterator operator++(int) + { + auto retval = *this; + ++(*this); + return retval; + } + ComplexViewConstIterator& operator+=(size_type i) + { + index_ += i; + return *this; + } + + difference_type operator-(const ComplexViewConstIterator& other) const + { + return index_ - other.index_; + } + + reference operator*() const + { + return *(current()); + } + + pointer operator->() const + { + return current(); + } + +private: + // Need to store the current value because ->() returns a pointer + mutable value_type current_value_; + pointer current() const + { + current_value_ = index_f_(index_); + return ¤t_value_; + } + + size_type index_ = 0; + std::function index_f_; + size_type size_; // used to create the end_() iterator +}; + + /*! + * \class ComplexView + * \brief These classes class provide read-only views onto a collection of complex + * numbers. For the simple case, it's roughtly std::span>. However, + * sometimes the data is in two parallel arrays: + * const float* reals; + * const float* imags; + * This classes have (almost) the same access routines regardless of how the underlying data is actually stored. + * + * Thing are intentinally kept very simple (for now), because it's not yet clear + * what functionality will be needed; YAGNI. + */ + +template +struct ComplexSpanView final +{ + using size_type = size_t; + using value_type = std::complex; + using cxvalue_t_ = value_type; + using span_t_ = coda_oss::span; + using axis_t_ = typename cxvalue_t_::value_type; // i.e., float + using const_iterator = ComplexViewConstIterator; + using iterator = const_iterator; + + ComplexSpanView() = delete; + ~ComplexSpanView() = default; + explicit ComplexSpanView(span_t_ data) : data_(data) + { + } + ComplexSpanView(const ComplexSpanView&) = default; + ComplexSpanView& operator=(const ComplexSpanView&) = default; + ComplexSpanView(ComplexSpanView&&) = default; + ComplexSpanView& operator=(ComplexSpanView&&) = default; + + // This class is almost the same as std::span> ... but + // don't provide data() as ComplexSpansView stores complex numbers in two + // parallel arrays. Also see reals(), imags() and values(); below. + // const value_type* data() const noexcept = delete; + + constexpr auto real(size_type idx) const noexcept + { + return data_[idx].real(); + } + constexpr auto imag(size_type idx) const noexcept + { + return data_[idx].imag(); + } + + // const& vs. value makes little difference here as cxvalue_type is + // std::complex<> (copying one pointer vs. two doubles). But this + // provides a (subtle) way for clients to know what "view style" they're + // using, should that be needed; it also more closely matches std::span<>. + constexpr const cxvalue_t_& index(size_type idx) const noexcept // i.e., std::complex + { + return data_[idx]; + } + constexpr const auto& operator[](size_type idx) const noexcept + { + return index(idx); + } + + constexpr size_type size() const noexcept + { + return data_.size(); + } + + const_iterator begin() const + { + // not data_.begin(), we want our "generic" ComplexViewConstIterator iterator + return ComplexViewConstIterator(data_); + } + const_iterator end() const + { + return begin().end_(); + } + +private: + template + auto copy_axis(TAxisFunc axis) const + { + std::vector retval(size()); + for (size_t i = 0; i < size(); i++) + { + retval[i] = (this->*axis)(i); // call via pointer to member function + } + return retval; + } + +public: + auto reals() const + { + return copy_axis(&ComplexSpanView::real); + } + auto imags() const + { + return copy_axis(&ComplexSpanView::imag); + } + auto values() const + { + return std::vector(data_.begin(), data_.end()); + } + +private: + span_t_ data_; // i.e., std::span> +}; +template +inline ComplexSpanView make_ComplexSpanView(coda_oss::span> s) +{ + return ComplexSpanView(s); +} +template +inline auto make_ComplexSpanView(const TVectorLike& v) +{ + using cxvalue_t = typename TVectorLike::value_type; // i.e., std::complex + using span_t = coda_oss::span; + + return make_ComplexSpanView(span_t(v.data(), v.size())); +} + +template +struct ComplexSpansView final // "Span_s_,", i.e., two spans. Avoiding "parallel" because that can conjure up multi-threading thoughts. +{ + using size_type = size_t; + using value_type = T; + using cxvalue_t_ = std::complex; + using axis_t_ = typename cxvalue_t_::value_type; // i.e., float + using span_t_ = coda_oss::span; + using const_iterator = ComplexViewConstIterator; + using iterator = const_iterator; + + ComplexSpansView() = delete; + ~ComplexSpansView() = default; + ComplexSpansView(span_t_ reals, span_t_ imags) : reals_(reals), imags_(imags) + { + if (reals_.size() != imags_.size()) + { + throw std::invalid_argument("real and imag must be the same size."); + } + } + ComplexSpansView(const T* reals, const T* imags, size_t sz) : + ComplexSpansView(span_t_(reals, sz), span_t_(imags, sz)) + { + } + ComplexSpansView(const ComplexSpansView&) = default; + ComplexSpansView& operator=(const ComplexSpansView&) = default; + ComplexSpansView(ComplexSpansView&&) = default; + ComplexSpansView& operator=(ComplexSpansView&&) = default; + + constexpr auto real(size_type idx) const noexcept + { + return reals_[idx]; + } + constexpr auto imag(size_type idx) const noexcept + { + return imags_[idx]; + } + + constexpr cxvalue_t_ index(size_type idx) const noexcept // i.e., std::complex + { + // Note that this is a COPY because the "real" and "imag" parts MUST be + // next to each other. https://en.cppreference.com/w/cpp/numeric/complex + return cxvalue_t_(real(idx), imag(idx)); + } + constexpr auto operator[](size_type idx) const noexcept + { + return index(idx); + } + + constexpr size_type size() const noexcept + { + return reals_.size(); + } + + iterator begin() const + { + return iterator(*this); + } + iterator end() const + { + return begin().end_(); + } + + auto reals() const + { + return std::vector(reals_.begin(), reals_.end()); + } + auto imags() const + { + return std::vector(imags_.begin(), imags_.end()); + } + auto values() const + { + std::vector retval(size()); + for (size_t i = 0; i < size(); i++) + { + retval[i] = (*this)[i]; + } + return retval; + } + +private: + span_t_ reals_; // i.e., std::span + span_t_ imags_; +}; +template +inline ComplexSpansView make_ComplexSpansView( + coda_oss::span reals, coda_oss::span imags) +{ + return ComplexSpansView(reals, imags); +} +template +inline auto make_ComplexSpansView(const TVectorLike& reals_, const TVectorLike& imags_) +{ + using value_type = typename TVectorLike::value_type; // i.e., float + using cxvalue_t = std::complex; // i.e., std::complex + using axis_t = typename cxvalue_t::value_type; // i.e., float + using span_t = coda_oss::span; + + const span_t reals(reals_.data(), reals_.size()); + const span_t imags(imags_.data(), imags_.size()); + return make_ComplexSpansView(reals, imags); +} + +} + +#endif // CODA_OSS_mem_ComplexView_h_INCLUDED_ diff --git a/externals/coda-oss/modules/c++/mem/include/mem/ScopedPtr.h b/externals/coda-oss/modules/c++/mem/include/mem/ScopedPtr.h index 5a6e4c6607..11a57072b6 100644 --- a/externals/coda-oss/modules/c++/mem/include/mem/ScopedPtr.h +++ b/externals/coda-oss/modules/c++/mem/include/mem/ScopedPtr.h @@ -26,7 +26,7 @@ #pragma once #include -#include +#include #include #include "sys/Conf.h" diff --git a/externals/coda-oss/modules/c++/mem/tests/ScratchVisualization.cpp b/externals/coda-oss/modules/c++/mem/tests/ScratchVisualization.cpp index d9058e0f75..2585f7473f 100644 --- a/externals/coda-oss/modules/c++/mem/tests/ScratchVisualization.cpp +++ b/externals/coda-oss/modules/c++/mem/tests/ScratchVisualization.cpp @@ -329,7 +329,7 @@ int main(int argc, char** argv) const cli::Results* options(parser.parse(argc, argv)); const std::string testType(options->get("test")); - srand((unsigned)time(0)); + srand((unsigned)time(nullptr)); std::ofstream htmlFile; htmlFile.open("scratch_release.html"); diff --git a/externals/coda-oss/modules/c++/mem/unittests/test_scratch_memory.cpp b/externals/coda-oss/modules/c++/mem/unittests/test_scratch_memory.cpp index 421f4eb052..8ef51ee4fd 100644 --- a/externals/coda-oss/modules/c++/mem/unittests/test_scratch_memory.cpp +++ b/externals/coda-oss/modules/c++/mem/unittests/test_scratch_memory.cpp @@ -254,7 +254,7 @@ struct Operation TEST_CASE(testReleaseConcurrentKeys) { - srand((unsigned)time(0)); + srand((unsigned)time(nullptr)); mem::ScratchMemory scratch; std::vector operations; @@ -344,7 +344,7 @@ TEST_CASE(testReleaseConcurrentKeys) TEST_CASE(testReleaseConnectedKeys) { - srand((unsigned)time(0)); + srand((unsigned)time(nullptr)); mem::ScratchMemory scratch; std::vector operations; @@ -434,7 +434,7 @@ TEST_CASE(testReleaseConnectedKeys) TEST_CASE(testGenerateBuffersForRelease) { - srand((unsigned)time(0)); + srand((unsigned)time(nullptr)); for (unsigned int run = 0; run < 50; ++run) { diff --git a/externals/coda-oss/modules/c++/mem/unittests/test_vector_pointers.cpp b/externals/coda-oss/modules/c++/mem/unittests/test_vector_pointers.cpp index a4d5da5d11..74c11f1a7b 100644 --- a/externals/coda-oss/modules/c++/mem/unittests/test_vector_pointers.cpp +++ b/externals/coda-oss/modules/c++/mem/unittests/test_vector_pointers.cpp @@ -20,7 +20,13 @@ * */ +#include +#include +#include +#include + #include +#include #include "TestCase.h" @@ -112,10 +118,144 @@ TEST_CASE(testVecOfSharedPointers) { std::vector> myVec2 = std_vector_shared_ptr_int(); // copy } +} + +template +static void test_cx_view(const std::string& testName, const TView& view) +{ + TEST_ASSERT_EQ(4, view.size()); + TEST_ASSERT_EQ(view[0].real(), 1.0f); + TEST_ASSERT_EQ(view[0].imag(), 2.0f); + TEST_ASSERT_EQ(view[1].real(), 3.0f); + TEST_ASSERT_EQ(view[1].imag(), 4.0f); + TEST_ASSERT_EQ(view[2].real(), 5.0f); + TEST_ASSERT_EQ(view[2].imag(), 6.0f); + TEST_ASSERT_EQ(view[3].real(), 7.0f); + TEST_ASSERT_EQ(view[3].imag(), 8.0f); +} +template +static void test_mem_ComplexView(const std::string& testName, const TView& view) +{ + test_cx_view(testName, view); + + TEST_ASSERT_EQ(view.real(0), 1.0f); + TEST_ASSERT_EQ(view.imag(0), 2.0f); + TEST_ASSERT_EQ(view.real(1), 3.0f); + TEST_ASSERT_EQ(view.imag(1), 4.0f); + TEST_ASSERT_EQ(view.real(2), 5.0f); + TEST_ASSERT_EQ(view.imag(2), 6.0f); + TEST_ASSERT_EQ(view.real(3), 7.0f); + TEST_ASSERT_EQ(view.imag(3), 8.0f); + + const auto reals_ = view.reals(); + const auto imags_ = view.imags(); + TEST_ASSERT_EQ(reals_.size(), imags_.size()); + TEST_ASSERT_EQ(reals_[0], 1.0f); + TEST_ASSERT_EQ(reals_[1], 3.0f); + TEST_ASSERT_EQ(reals_[2], 5.0f); + TEST_ASSERT_EQ(reals_[3], 7.0f); + + TEST_ASSERT_EQ(imags_[0], 2.0f); + TEST_ASSERT_EQ(imags_[1], 4.0f); + TEST_ASSERT_EQ(imags_[2], 6.0f); + TEST_ASSERT_EQ(imags_[3], 8.0f); +} + +using cx_float = std::complex; +static const std::vector& cx_data() +{ + static const std::vector retval {{1, 2}, {3, 4}, {5, 6}, {7, 8}}; + return retval; +} + +TEST_CASE(testSpanCxFloat) +{ + const std::span view(cx_data().data(), cx_data().size()); + TEST_ASSERT_EQ(cx_data().size(), view.size()); + test_cx_view(testName, view); +} + +TEST_CASE(testComplexViewFloat) +{ + { + const auto view = mem::make_ComplexSpanView(cx_data()); + TEST_ASSERT_EQ(cx_data().size(), view.size()); + test_mem_ComplexView(testName, view); + test_cx_view(testName, view.values()); + } + + const std::vector reals{1, 3, 5, 7}; + const std::vector imags{2, 4, 6, 8}; + TEST_ASSERT_EQ(imags.size(), reals.size()); + { + const auto view = mem::make_ComplexSpansView(reals, imags); + TEST_ASSERT_EQ(reals.size(), view.size()); + test_mem_ComplexView(testName, view); + test_cx_view(testName, view.values()); + } +} + +static void test_mem_ComplexViewConstIterator(const std::string& testName, + mem::ComplexViewConstIterator begin, mem::ComplexViewConstIterator end) +{ + TEST_ASSERT(begin != end); + + const auto distance = std::distance(begin, end); + TEST_ASSERT_EQ(4, distance); + + auto it = begin; + TEST_ASSERT_EQ((*it).real(), 1.0f); + TEST_ASSERT_EQ((*it).imag(), 2.0f); + ++it; + TEST_ASSERT_EQ((*it).real(), 3.0f); + TEST_ASSERT_EQ((*it).imag(), 4.0f); + + it++; + TEST_ASSERT_EQ((*it).real(), 5.0f); + TEST_ASSERT_EQ((*it).imag(), 6.0f); + + it += 1; + TEST_ASSERT_EQ(it->real(), 7.0f); + TEST_ASSERT_EQ(it->imag(), 8.0f); +} +template +static void test_mem_ComplexViewConstIterator(const std::string& testName, TView view) +{ + test_mem_ComplexViewConstIterator(testName, view.begin(), view.end()); + + using cxvalue_t = typename decltype(view.begin())::value_type; // i.e., std::complex + cxvalue_t cx{1.0f, 2.0f}; + for (auto&& v : view) + { + TEST_ASSERT_EQ(v.real(), cx.real()); + TEST_ASSERT_EQ(v.imag(), cx.imag()); + + cx = cxvalue_t{cx.real() + 2.0f, cx.imag() + 2.0f}; + } +} + +TEST_CASE(testComplexViewFloatIterator) +{ + { + const auto view = mem::make_ComplexSpanView(cx_data()); + test_mem_ComplexViewConstIterator(testName, view); + } + + const std::vector reals{1, 3, 5, 7}; + const std::vector imags{2, 4, 6, 8}; + TEST_ASSERT_EQ(imags.size(), reals.size()); + { + const auto view = mem::make_ComplexSpansView(reals, imags); + test_mem_ComplexViewConstIterator(testName, view); + } } TEST_MAIN( TEST_CHECK(testVecOfRawPointers); TEST_CHECK(testVecOfSharedPointers); + + TEST_CHECK(testSpanCxFloat); + TEST_CHECK(testComplexViewFloat); + TEST_CHECK(testComplexViewFloatIterator); ) diff --git a/externals/coda-oss/modules/c++/mem/wscript b/externals/coda-oss/modules/c++/mem/wscript index 112f2eddef..044f80abb3 100644 --- a/externals/coda-oss/modules/c++/mem/wscript +++ b/externals/coda-oss/modules/c++/mem/wscript @@ -1,6 +1,6 @@ NAME = 'mem' VERSION = '1.0' -MODULE_DEPS = 'sys gsl std' +MODULE_DEPS = 'sys gsl coda_oss std' TEST_DEPS = 'cli std' UNITTEST_DEPS = 'std' diff --git a/externals/coda-oss/modules/c++/mt/CMakeLists.txt b/externals/coda-oss/modules/c++/mt/CMakeLists.txt index 4d2864f989..540c222472 100644 --- a/externals/coda-oss/modules/c++/mt/CMakeLists.txt +++ b/externals/coda-oss/modules/c++/mt/CMakeLists.txt @@ -7,7 +7,7 @@ coda_generate_module_config_header(${MODULE_NAME}) coda_add_module( ${MODULE_NAME} VERSION 1.1 - DEPS sys-c++ except-c++ math-c++ mem-c++ types-c++) + DEPS sys-c++ except-c++ math-c++ mem-c++ types-c++ std-c++) coda_add_tests( MODULE_NAME ${MODULE_NAME} diff --git a/externals/coda-oss/modules/c++/mt/include/mt/BalancedRunnable1D.h b/externals/coda-oss/modules/c++/mt/include/mt/BalancedRunnable1D.h index dc2248df01..c7af782fb7 100644 --- a/externals/coda-oss/modules/c++/mt/include/mt/BalancedRunnable1D.h +++ b/externals/coda-oss/modules/c++/mt/include/mt/BalancedRunnable1D.h @@ -74,7 +74,7 @@ class BalancedRunnable1D : public sys::Runnable { } - virtual void run() + virtual void run() override { while (true) { diff --git a/externals/coda-oss/modules/c++/mt/include/mt/BasicThreadPool.h b/externals/coda-oss/modules/c++/mt/include/mt/BasicThreadPool.h index 57365d9cb6..112a113c8a 100644 --- a/externals/coda-oss/modules/c++/mt/include/mt/BasicThreadPool.h +++ b/externals/coda-oss/modules/c++/mt/include/mt/BasicThreadPool.h @@ -24,7 +24,7 @@ #define __MT_BASIC_THREAD_POOL_H__ #include -#include +#include #include "except/Exception.h" #include "sys/Mutex.h" diff --git a/externals/coda-oss/modules/c++/mt/include/mt/CPUAffinityInitializer.h b/externals/coda-oss/modules/c++/mt/include/mt/CPUAffinityInitializer.h index 2fe3eb3b63..88737cd9a5 100644 --- a/externals/coda-oss/modules/c++/mt/include/mt/CPUAffinityInitializer.h +++ b/externals/coda-oss/modules/c++/mt/include/mt/CPUAffinityInitializer.h @@ -26,7 +26,7 @@ #include -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 #include namespace mt { diff --git a/externals/coda-oss/modules/c++/mt/include/mt/CPUAffinityInitializerWin32.h b/externals/coda-oss/modules/c++/mt/include/mt/CPUAffinityInitializerWin32.h index 5431f5af0f..be84e15e8e 100644 --- a/externals/coda-oss/modules/c++/mt/include/mt/CPUAffinityInitializerWin32.h +++ b/externals/coda-oss/modules/c++/mt/include/mt/CPUAffinityInitializerWin32.h @@ -24,7 +24,7 @@ #ifndef __MT_CPU_AFFINITY_INITIALIZER_WIN32_H__ #define __MT_CPU_AFFINITY_INITIALIZER_WIN32_H__ -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 #include #include diff --git a/externals/coda-oss/modules/c++/mt/include/mt/CPUAffinityThreadInitializer.h b/externals/coda-oss/modules/c++/mt/include/mt/CPUAffinityThreadInitializer.h index fa69259736..4ffb36e081 100644 --- a/externals/coda-oss/modules/c++/mt/include/mt/CPUAffinityThreadInitializer.h +++ b/externals/coda-oss/modules/c++/mt/include/mt/CPUAffinityThreadInitializer.h @@ -26,7 +26,7 @@ #include -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 #include namespace mt { diff --git a/externals/coda-oss/modules/c++/mt/include/mt/CPUAffinityThreadInitializerLinux.h b/externals/coda-oss/modules/c++/mt/include/mt/CPUAffinityThreadInitializerLinux.h index 8fb26d8bab..ea3349939a 100644 --- a/externals/coda-oss/modules/c++/mt/include/mt/CPUAffinityThreadInitializerLinux.h +++ b/externals/coda-oss/modules/c++/mt/include/mt/CPUAffinityThreadInitializerLinux.h @@ -58,7 +58,7 @@ class CPUAffinityThreadInitializerLinux : * * \throws if setting the thread affinity fails */ - virtual void initialize(); + virtual void initialize() override; private: std::unique_ptr mCPU; diff --git a/externals/coda-oss/modules/c++/mt/include/mt/CPUAffinityThreadInitializerWin32.h b/externals/coda-oss/modules/c++/mt/include/mt/CPUAffinityThreadInitializerWin32.h index ef45f42deb..132f31cf8b 100644 --- a/externals/coda-oss/modules/c++/mt/include/mt/CPUAffinityThreadInitializerWin32.h +++ b/externals/coda-oss/modules/c++/mt/include/mt/CPUAffinityThreadInitializerWin32.h @@ -24,7 +24,7 @@ #ifndef __MT_CPU_AFFINITY_THREAD_INITIALIZER_WIN32_H__ #define __MT_CPU_AFFINITY_THREAD_INITIALIZER_WIN32_H__ -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 #include diff --git a/externals/coda-oss/modules/c++/mt/include/mt/GenerationThreadPool.h b/externals/coda-oss/modules/c++/mt/include/mt/GenerationThreadPool.h index f22b6be4b0..6a2e53d2fb 100644 --- a/externals/coda-oss/modules/c++/mt/include/mt/GenerationThreadPool.h +++ b/externals/coda-oss/modules/c++/mt/include/mt/GenerationThreadPool.h @@ -63,7 +63,7 @@ namespace mt // If we have a thread initializer, tie down our handler to a CPU virtual void initialize(); - virtual void run(); + virtual void run() override; }; class CODA_OSS_API GenerationThreadPool : public BasicThreadPool @@ -83,7 +83,7 @@ namespace mt GenerationThreadPool(const GenerationThreadPool&) = delete; GenerationThreadPool& operator=(const GenerationThreadPool&) = delete; - virtual TiedRequestHandler *newRequestHandler() + virtual TiedRequestHandler *newRequestHandler() override { TiedRequestHandler* handler = BasicThreadPool::newRequestHandler(); assert(handler != nullptr); diff --git a/externals/coda-oss/modules/c++/mt/include/mt/GenericRequestHandler.h b/externals/coda-oss/modules/c++/mt/include/mt/GenericRequestHandler.h index 0382594de5..5483cc4cd7 100644 --- a/externals/coda-oss/modules/c++/mt/include/mt/GenericRequestHandler.h +++ b/externals/coda-oss/modules/c++/mt/include/mt/GenericRequestHandler.h @@ -55,7 +55,7 @@ class GenericRequestHandler : public sys::Runnable /*! * Dequeue and run requests in a non-terminating loop */ - virtual void run(); + virtual void run() override; protected: RunnableRequestQueue *mRequest; diff --git a/externals/coda-oss/modules/c++/mt/include/mt/Runnable1D.h b/externals/coda-oss/modules/c++/mt/include/mt/Runnable1D.h index bb73e94bfc..406f9903f1 100644 --- a/externals/coda-oss/modules/c++/mt/include/mt/Runnable1D.h +++ b/externals/coda-oss/modules/c++/mt/include/mt/Runnable1D.h @@ -25,7 +25,7 @@ class Runnable1D : public sys::Runnable { } - virtual void run() + virtual void run() override { for (size_t ii = mStartElement; ii < mEndElement; ++ii) { diff --git a/externals/coda-oss/modules/c++/mt/include/mt/Singleton.h b/externals/coda-oss/modules/c++/mt/include/mt/Singleton.h index ba6265af44..2e8d5ec26a 100644 --- a/externals/coda-oss/modules/c++/mt/include/mt/Singleton.h +++ b/externals/coda-oss/modules/c++/mt/include/mt/Singleton.h @@ -25,6 +25,7 @@ #define __MT_SINGLETON_H__ #include +#include #include #include diff --git a/externals/coda-oss/modules/c++/mt/include/mt/ThreadGroup.h b/externals/coda-oss/modules/c++/mt/include/mt/ThreadGroup.h index dfc2b89014..e12cbf8a9b 100644 --- a/externals/coda-oss/modules/c++/mt/include/mt/ThreadGroup.h +++ b/externals/coda-oss/modules/c++/mt/include/mt/ThreadGroup.h @@ -168,7 +168,7 @@ struct CODA_OSS_API ThreadGroup /*! * Call run() on the Runnable passed to createThread */ - virtual void run(); + virtual void run() override; private: std::unique_ptr mRunnable; diff --git a/externals/coda-oss/modules/c++/mt/include/mt/WorkSharingBalancedRunnable1D.h b/externals/coda-oss/modules/c++/mt/include/mt/WorkSharingBalancedRunnable1D.h index 48a83e48f9..dd8e4553de 100644 --- a/externals/coda-oss/modules/c++/mt/include/mt/WorkSharingBalancedRunnable1D.h +++ b/externals/coda-oss/modules/c++/mt/include/mt/WorkSharingBalancedRunnable1D.h @@ -99,7 +99,7 @@ struct WorkSharingBalancedRunnable1D : public sys::Runnable WorkSharingBalancedRunnable1D(WorkSharingBalancedRunnable1D&&) = default; WorkSharingBalancedRunnable1D& operator=(WorkSharingBalancedRunnable1D&&) = delete; - virtual void run() + virtual void run() override { // Operate over this thread's range processElements(mCounter, mEndElement); diff --git a/externals/coda-oss/modules/c++/mt/include/mt/WorkerThread.h b/externals/coda-oss/modules/c++/mt/include/mt/WorkerThread.h index 0cf0ce2dd4..4e865d0fff 100644 --- a/externals/coda-oss/modules/c++/mt/include/mt/WorkerThread.h +++ b/externals/coda-oss/modules/c++/mt/include/mt/WorkerThread.h @@ -60,7 +60,7 @@ template class WorkerThread : public sys::Thread /*! * Run this request */ - virtual void run() + virtual void run() override { initialize(); while (!isDone()) diff --git a/externals/coda-oss/modules/c++/mt/source/CPUAffinityInitializerLinux.cpp b/externals/coda-oss/modules/c++/mt/source/CPUAffinityInitializerLinux.cpp index bc5cbdd8a8..01181be6b7 100644 --- a/externals/coda-oss/modules/c++/mt/source/CPUAffinityInitializerLinux.cpp +++ b/externals/coda-oss/modules/c++/mt/source/CPUAffinityInitializerLinux.cpp @@ -60,7 +60,7 @@ class AvailableCPUProvider : public AbstractNextCPUProviderLinux { } - virtual std::unique_ptr nextCPU() + virtual std::unique_ptr nextCPU() override { if (mNextCPUIndex >= mCPUs.size()) { @@ -87,7 +87,7 @@ class OffsetCPUProvider : public AbstractNextCPUProviderLinux { } - virtual std::unique_ptr nextCPU() + virtual std::unique_ptr nextCPU() override { std::unique_ptr mask(new sys::ScopedCPUMaskUnix()); CPU_SET_S(mNextCPU++, mask->getSize(), mask->getMask()); diff --git a/externals/coda-oss/modules/c++/mt/tests/BasicThreadPoolTest.cpp b/externals/coda-oss/modules/c++/mt/tests/BasicThreadPoolTest.cpp index aece0cd81b..56b9903012 100644 --- a/externals/coda-oss/modules/c++/mt/tests/BasicThreadPoolTest.cpp +++ b/externals/coda-oss/modules/c++/mt/tests/BasicThreadPoolTest.cpp @@ -51,7 +51,7 @@ class MyRunTask : public Runnable { } - virtual void run() + virtual void run() override { sleep(TO_SLEEP); mSem.signal(); diff --git a/externals/coda-oss/modules/c++/mt/tests/GenerationThreadPoolTest.cpp b/externals/coda-oss/modules/c++/mt/tests/GenerationThreadPoolTest.cpp index 26b873c5de..498ab6f25a 100644 --- a/externals/coda-oss/modules/c++/mt/tests/GenerationThreadPoolTest.cpp +++ b/externals/coda-oss/modules/c++/mt/tests/GenerationThreadPoolTest.cpp @@ -50,7 +50,7 @@ class MyRunTask : public sys::Runnable { } - void run() + void run() override { sleep(TO_SLEEP); diff --git a/externals/coda-oss/modules/c++/mt/tests/MTSingletonTest.cpp b/externals/coda-oss/modules/c++/mt/tests/MTSingletonTest.cpp index 86405f3a03..beb1719e35 100644 --- a/externals/coda-oss/modules/c++/mt/tests/MTSingletonTest.cpp +++ b/externals/coda-oss/modules/c++/mt/tests/MTSingletonTest.cpp @@ -51,7 +51,7 @@ class StopsWhenEmpty : public GenericRequestHandler { } - void run() + void run() override { while (true) { @@ -101,7 +101,7 @@ class Thespian : public Runnable virtual ~Thespian() { } - void run() + void run() override { //__debugln__(FmtX("[%s]:", mName.c_str())); doLines(); @@ -122,7 +122,7 @@ class Soothsayer : public Thespian { } - void doLines() + void doLines() override { //__warning__("Beware the ides of March."); } @@ -138,7 +138,7 @@ class Calpurnia : public Thespian ~Calpurnia() { } - void doLines() + void doLines() override { //__warning__("Caesar, I never stood on ceremonies, Yet now they fright me. There is one within, 15 Besides the things that we have heard and seen, Recounts most horrid sights seen by the watch. A lioness hath whelped in the streets; And graves have yawn'd, and yielded up their dead; Fierce fiery warriors fought upon the clouds, 20 In ranks and squadrons and right form of war, Which drizzled blood upon the Capitol; The noise of battle hurtled in the air, Horses did neigh, and dying men did groan, And ghosts did shriek and squeal about the streets. 25 O Caesar! these things are beyond all use, And I do fear them."); } @@ -154,7 +154,7 @@ class Caesar : public Thespian ~Caesar() { } - void doLines() + void doLines() override { //__status__("Cowards die many times before their deaths; The valiant never taste of death but once. 35 Of all the wonders that I yet have heard. It seems to me most strange that men should fear; Seeing that death, a necessary end, Will come when it will come."); } @@ -172,7 +172,7 @@ class Brutus : public Thespian { } - virtual void doLines() + virtual void doLines() override { //__status__("Be patient till the last. Romans, countrymen, and lovers! hear me for my 15 cause, and be silent, that you may hear: believe me for mine honour, and have respect to mine honour, that you may believe: censure me in your wisdom, and awake your senses, that you may the better judge. If there be any in this assembly, any dear friend of 20 Caesar's, to him I say, that Brutus' love to Caesar was no less than his. If then that friend demand why Brutus rose against Caesar, this is my answer: --Not that I loved Caesar less, but that I loved Rome more. Had you rather Caesar were living and 25 die all slaves, than that Caesar were dead, to live all free men? As Caesar loved me, I weep for him; as he was fortunate, I rejoice at it; as he was valiant, I honour him: but, as he was ambitious, I slew him. There is tears for his love; joy for his 30 fortune; honour for his valour; and death for his ambition. Who is here so base that would be a bondman? If any, speak; for him have I offended. Who is here so rude that would not be a Roman? If any, speak; for him have I offended. Who is here so 35 vile that will not love his country? If any, speak; for him have I offended. I pause for a reply."); @@ -190,7 +190,7 @@ class Antony : public Thespian { } - void doLines() + void doLines() override { //__status__("Villains, you did not so, when your vile daggers Hack'd one another in the sides of Caesar: You show'd your teeth like apes, and fawn'd like hounds, 45 And bow'd like bondmen, kissing Caesar's feet; Whilst damned Casca, like a cur, behind Struck Caesar on the neck. O you flatterers!"); } @@ -207,7 +207,7 @@ class Octavius : public Thespian { } - void doLines() + void doLines() override { //__status__("According to his virtue let us use him, With all respect and rites of burial. Within my tent his bones to-night shall lie, 85 Most like a soldier, order'd honourably. So call the field to rest; and let's away, To part the glories of this happy day."); } diff --git a/externals/coda-oss/modules/c++/mt/tests/ThreadExceptionTest.cpp b/externals/coda-oss/modules/c++/mt/tests/ThreadExceptionTest.cpp index 189f12f275..381171aa78 100644 --- a/externals/coda-oss/modules/c++/mt/tests/ThreadExceptionTest.cpp +++ b/externals/coda-oss/modules/c++/mt/tests/ThreadExceptionTest.cpp @@ -29,7 +29,7 @@ class PrintChar : public sys::Runnable { } - virtual void run() + virtual void run() override { print(a); } @@ -38,7 +38,7 @@ class PrintChar : public sys::Runnable /*-- std::exception --*/ struct stdExcept: std::exception { - const char* what() const noexcept { return "std::exception in add"; } + const char* what() const noexcept override { return "std::exception in add"; } }; void add(sys::Uint32_T x, sys::Uint32_T y) @@ -61,7 +61,7 @@ class AddInts : public sys::Runnable { } - virtual void run() + virtual void run() override { add(x,y); } @@ -88,7 +88,7 @@ class ConcatStr: public sys::Runnable { } - virtual void run() + virtual void run() override { printConcat(x,y); } diff --git a/externals/coda-oss/modules/c++/mt/tests/ThreadGroupAffinityTest.cpp b/externals/coda-oss/modules/c++/mt/tests/ThreadGroupAffinityTest.cpp index 9d47da780b..32d3c63c01 100644 --- a/externals/coda-oss/modules/c++/mt/tests/ThreadGroupAffinityTest.cpp +++ b/externals/coda-oss/modules/c++/mt/tests/ThreadGroupAffinityTest.cpp @@ -43,7 +43,7 @@ class MyRunTask : public Runnable { } - virtual void run() + virtual void run() override { // Print diagnostics from inside the thread while(true) diff --git a/externals/coda-oss/modules/c++/mt/unittests/Runnable1DTest.cpp b/externals/coda-oss/modules/c++/mt/unittests/Runnable1DTest.cpp index 61ad49ae8f..14a419d782 100644 --- a/externals/coda-oss/modules/c++/mt/unittests/Runnable1DTest.cpp +++ b/externals/coda-oss/modules/c++/mt/unittests/Runnable1DTest.cpp @@ -69,6 +69,7 @@ TEST_CASE(DoRunnable1DTest) const AddOp op; std::cout << "Calling run1D\n"; mt::run1D(10, 16, op); + TEST_ASSERT_TRUE(true); // need to use hidden "testName" parameter } TEST_CASE(Runnable1DWithCopiesTest) @@ -79,6 +80,7 @@ TEST_CASE(Runnable1DWithCopiesTest) const LocalStorage op; std::cout << "Calling run1D\n"; mt::run1DWithCopies(47, 16, op); + TEST_ASSERT_TRUE(true); // need to use hidden "testName" parameter } TEST_CASE(transform_async_test) diff --git a/externals/coda-oss/modules/c++/mt/unittests/ThreadGroupTest.cpp b/externals/coda-oss/modules/c++/mt/unittests/ThreadGroupTest.cpp index 9622600560..09641ef551 100644 --- a/externals/coda-oss/modules/c++/mt/unittests/ThreadGroupTest.cpp +++ b/externals/coda-oss/modules/c++/mt/unittests/ThreadGroupTest.cpp @@ -41,7 +41,7 @@ struct MyRunTask final : public sys::Runnable (*num_deleted)++; } - virtual void run() + virtual void run() override { while (result == 1) result = *state; diff --git a/externals/coda-oss/modules/c++/mt/wscript b/externals/coda-oss/modules/c++/mt/wscript index 271271a42a..42d2a241b5 100644 --- a/externals/coda-oss/modules/c++/mt/wscript +++ b/externals/coda-oss/modules/c++/mt/wscript @@ -1,7 +1,6 @@ NAME = 'mt' -MAINTAINER = 'jmrandol@users.sourceforge.net' VERSION = '1.1' -MODULE_DEPS = 'sys except math mem types' +MODULE_DEPS = 'sys except math mem types std' TEST_DEPS = 'cli' distclean = lambda p: None diff --git a/externals/coda-oss/modules/c++/net.ssl/include/net/ssl/SSLConnectionClientFactory.h b/externals/coda-oss/modules/c++/net.ssl/include/net/ssl/SSLConnectionClientFactory.h index eb5bfb72e8..698d14e3ad 100644 --- a/externals/coda-oss/modules/c++/net.ssl/include/net/ssl/SSLConnectionClientFactory.h +++ b/externals/coda-oss/modules/c++/net.ssl/include/net/ssl/SSLConnectionClientFactory.h @@ -100,7 +100,7 @@ class SSLConnectionClientFactory : public NetConnectionClientFactory * \param toServer The socket for the new connection * \return A new SSLConnection */ - virtual NetConnection* newConnection(std::unique_ptr&& toServer); + virtual NetConnection* newConnection(std::unique_ptr&& toServer) override; private: # if defined(USE_OPENSSL) diff --git a/externals/coda-oss/modules/c++/net/include/net/ClientSocketFactory.h b/externals/coda-oss/modules/c++/net/include/net/ClientSocketFactory.h index d4b59ab9ac..237d86c764 100644 --- a/externals/coda-oss/modules/c++/net/include/net/ClientSocketFactory.h +++ b/externals/coda-oss/modules/c++/net/include/net/ClientSocketFactory.h @@ -134,7 +134,7 @@ class UDPClientSocketFactory : public ClientSocketFactory * Sets SO_BROADCAST socket option. * \param s The socket */ - virtual void setOptions(Socket& s) + virtual void setOptions(Socket& s) override { // Make sure we're set up for broadcasting if necessary int on = 1; diff --git a/externals/coda-oss/modules/c++/net/include/net/Daemon.h b/externals/coda-oss/modules/c++/net/include/net/Daemon.h index 61f3ef53ec..8c27d3ebf4 100644 --- a/externals/coda-oss/modules/c++/net/include/net/Daemon.h +++ b/externals/coda-oss/modules/c++/net/include/net/Daemon.h @@ -1,7 +1,7 @@ #ifndef __NET_DAEMON_H__ #define __NET_DAEMON_H__ -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 # include "net/DaemonWin32.h" namespace net { diff --git a/externals/coda-oss/modules/c++/net/include/net/DaemonUnix.h b/externals/coda-oss/modules/c++/net/include/net/DaemonUnix.h index 2e584c4693..94039fa9cb 100644 --- a/externals/coda-oss/modules/c++/net/include/net/DaemonUnix.h +++ b/externals/coda-oss/modules/c++/net/include/net/DaemonUnix.h @@ -1,7 +1,7 @@ #ifndef __NET_DAEMON_UNIX_H__ #define __NET_DAEMON_UNIX_H__ -#if !(defined(WIN32) || defined(_WIN32)) +#ifndef _WIN32 #include "net/DaemonInterface.h" #include @@ -21,29 +21,29 @@ class DaemonUnix : public DaemonInterface virtual ~DaemonUnix(); //! Start the daemon - void start(); + void start() override; //! Stop the daemon specified in pidfile - void stop(); + void stop() override; //! Stop the daemon specified in pidfile and start a new one - void restart(); + void restart() override; //! Parse and execute command line option (start/stop/restart) - void daemonize(int& argc, char**& argv); + void daemonize(int& argc, char**& argv) override; //! Set pidfile (file for locking application to single occurance). - void setPidfile(const std::string& pidfile); + void setPidfile(const std::string& pidfile) override; //! Get pidfile. - std::string getPidfile() const { return mPidfile; } + std::string getPidfile() const override { return mPidfile; } //! Set tracefile (file to redirect stdout and stderr). - void setTracefile(const std::string& tracefile); + void setTracefile(const std::string& tracefile) override; //! Get tracefile. - std::string getTracefile() const { return mTracefile; } + std::string getTracefile() const override { return mTracefile; } protected: std::string mPidfile; diff --git a/externals/coda-oss/modules/c++/net/include/net/DaemonWin32.h b/externals/coda-oss/modules/c++/net/include/net/DaemonWin32.h index d4273d71f1..27b1ff768b 100644 --- a/externals/coda-oss/modules/c++/net/include/net/DaemonWin32.h +++ b/externals/coda-oss/modules/c++/net/include/net/DaemonWin32.h @@ -1,7 +1,7 @@ #ifndef __NET_DAEMON_WIN32_H__ #define __NET_DAEMON_WIN32_H__ -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 #include "net/DaemonInterface.h" #include diff --git a/externals/coda-oss/modules/c++/net/include/net/NetConnection.h b/externals/coda-oss/modules/c++/net/include/net/NetConnection.h index bf42a8a8da..3cdf6b535d 100644 --- a/externals/coda-oss/modules/c++/net/include/net/NetConnection.h +++ b/externals/coda-oss/modules/c++/net/include/net/NetConnection.h @@ -116,7 +116,7 @@ class NetConnection : public io::BidirectionalStream * Close a connection. This releases the writers/readers and closes * the handle. */ - void close() + void close() override { mSocket->close(); } @@ -138,7 +138,7 @@ class NetConnection : public io::BidirectionalStream * \param len The length of the byte array to write to the stream * \throw IOException */ - virtual void write(const void* buffer, size_t len); + virtual void write(const void* buffer, size_t len) override; using io::BidirectionalStream::read; using io::BidirectionalStream::write; @@ -151,7 +151,7 @@ class NetConnection : public io::BidirectionalStream * \throw IOException * \return The number of bytes read, or -1 if eof */ - virtual sys::SSize_T readImpl(void* buffer, size_t len); + virtual sys::SSize_T readImpl(void* buffer, size_t len) override; //! The socket std::shared_ptr mSocket; diff --git a/externals/coda-oss/modules/c++/net/include/net/PerRequestThreadAllocStrategy.h b/externals/coda-oss/modules/c++/net/include/net/PerRequestThreadAllocStrategy.h index f555d6e3b8..c02cb530bb 100644 --- a/externals/coda-oss/modules/c++/net/include/net/PerRequestThreadAllocStrategy.h +++ b/externals/coda-oss/modules/c++/net/include/net/PerRequestThreadAllocStrategy.h @@ -68,7 +68,7 @@ class RequestHandlerThread : public sys::Thread * Overloaded run method for handling a connection. * */ - void run() + void run() override { (*mRequestHandler)(mConnection); delete mRequestHandler; @@ -94,7 +94,7 @@ class PerRequestThreadAllocStrategy : public AllocStrategy ~PerRequestThreadAllocStrategy() {} - void initialize() + void initialize() override { } @@ -103,7 +103,7 @@ class PerRequestThreadAllocStrategy : public AllocStrategy * * \param conn The network connection */ - void handleConnection(NetConnection* conn); + void handleConnection(NetConnection* conn) override; }; /* class ThreadPoolAllocStrategy : public AllocStrategy */ diff --git a/externals/coda-oss/modules/c++/net/include/net/RequestHandler.h b/externals/coda-oss/modules/c++/net/include/net/RequestHandler.h index 3ef3795962..8859f5d98a 100644 --- a/externals/coda-oss/modules/c++/net/include/net/RequestHandler.h +++ b/externals/coda-oss/modules/c++/net/include/net/RequestHandler.h @@ -79,7 +79,7 @@ template class DefaultRequestHandlerFactory: public Reque virtual ~DefaultRequestHandlerFactory() { } - net::RequestHandler* create() + net::RequestHandler* create() override { return new ReqHandler_T(); } diff --git a/externals/coda-oss/modules/c++/net/include/net/ServerSocketFactory.h b/externals/coda-oss/modules/c++/net/include/net/ServerSocketFactory.h index 7b6393a0bc..3074d37647 100644 --- a/externals/coda-oss/modules/c++/net/include/net/ServerSocketFactory.h +++ b/externals/coda-oss/modules/c++/net/include/net/ServerSocketFactory.h @@ -127,7 +127,7 @@ class UDPServerSocketFactory : public ServerSocketFactory * * \return The produced socket */ - virtual std::unique_ptr create(const SocketAddress& address) + virtual std::unique_ptr create(const SocketAddress& address) override { std::unique_ptr s(new Socket(mProto)); @@ -185,7 +185,7 @@ class TCPServerSocketFactory : ServerSocketFactory * listen(). * */ - virtual std::unique_ptr create(const SocketAddress& address) + virtual std::unique_ptr create(const SocketAddress& address) override { std::unique_ptr s(new Socket(mProto)); diff --git a/externals/coda-oss/modules/c++/net/include/net/SingleThreadedAllocStrategy.h b/externals/coda-oss/modules/c++/net/include/net/SingleThreadedAllocStrategy.h index ac16fafb75..4a1314f129 100644 --- a/externals/coda-oss/modules/c++/net/include/net/SingleThreadedAllocStrategy.h +++ b/externals/coda-oss/modules/c++/net/include/net/SingleThreadedAllocStrategy.h @@ -58,7 +58,7 @@ class SingleThreadedAllocStrategy: public AllocStrategy * Set the auto ptr. * */ - void initialize() + void initialize() override { mHandler = mRequestHandlerFactory->create(); } @@ -68,7 +68,7 @@ class SingleThreadedAllocStrategy: public AllocStrategy * * \param conn The network connection */ - void handleConnection(net::NetConnection* conn) + void handleConnection(net::NetConnection* conn) override { (*mHandler)(conn); } diff --git a/externals/coda-oss/modules/c++/net/include/net/Socket.h b/externals/coda-oss/modules/c++/net/include/net/Socket.h index a5dea0c2b0..7d75eae466 100644 --- a/externals/coda-oss/modules/c++/net/include/net/Socket.h +++ b/externals/coda-oss/modules/c++/net/include/net/Socket.h @@ -141,7 +141,7 @@ class Socket // capture the error sys::SocketErr err; -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 /* Wrapper for setsockopt dealing with Windows specific issues :- * diff --git a/externals/coda-oss/modules/c++/net/include/net/SocketAddress.h b/externals/coda-oss/modules/c++/net/include/net/SocketAddress.h index 2af4695ef3..283dd43319 100644 --- a/externals/coda-oss/modules/c++/net/include/net/SocketAddress.h +++ b/externals/coda-oss/modules/c++/net/include/net/SocketAddress.h @@ -25,7 +25,7 @@ #include "net/Sockets.h" -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 # include #else # include diff --git a/externals/coda-oss/modules/c++/net/include/net/Sockets.h b/externals/coda-oss/modules/c++/net/include/net/Sockets.h index 7b7222b941..fb9e56032a 100644 --- a/externals/coda-oss/modules/c++/net/include/net/Sockets.h +++ b/externals/coda-oss/modules/c++/net/include/net/Sockets.h @@ -25,7 +25,7 @@ # include "sys/Conf.h" -# if defined(WIN32) || defined(_WIN32) +# ifdef _WIN32 # include "net/SocketsWin32.h" # else # include "net/SocketsUnix.h" diff --git a/externals/coda-oss/modules/c++/net/include/net/SocketsUnix.h b/externals/coda-oss/modules/c++/net/include/net/SocketsUnix.h index 967a47d0b5..58f0d2ed6d 100644 --- a/externals/coda-oss/modules/c++/net/include/net/SocketsUnix.h +++ b/externals/coda-oss/modules/c++/net/include/net/SocketsUnix.h @@ -56,31 +56,10 @@ typedef struct hostent HostEnt_T; typedef int Socket_T; typedef struct sockaddr SockAddr_T; typedef struct sockaddr_in SockAddrIn_T; -#if defined(__sun) || defined(__sun__) || defined(__sparc) || defined(__sparc__) -typedef SockAddr_T ConnParam2_T; -#else typedef const SockAddr_T ConnParam2_T; -#endif #if defined(__linux) || defined(__linux__) typedef socklen_t SockLen_T; -#elif defined(__sun) || defined(__sun__) || defined(__sparc) || defined(__sparc__) -# if defined(__SunOS_5_6) -typedef int SockLen_T; -# elif defined(__sparcv9) && defined(__arch64__) && defined(__GNUC__) -typedef socklen_t SockLen_T; -# else -typedef size_t SockLen_T; -# endif -#elif defined(_AIX) || defined(__aix) || defined(__aix__) -# if defined(__GNUC__) -typedef socklen_t SockLen_T; -# else -// 64-bit AIX uses socklen_t but I don't know the flags -// typedef unsigned int SockLen_T; -// The new(er) AIX machine uses socklen_t... -typedef socklen_t SockLen_T; -# endif #elif defined(__APPLE_CC__) typedef socklen_t SockLen_T; #else diff --git a/externals/coda-oss/modules/c++/net/include/net/ThreadPoolAllocStrategy.h b/externals/coda-oss/modules/c++/net/include/net/ThreadPoolAllocStrategy.h index ce7fc740e9..767e024503 100644 --- a/externals/coda-oss/modules/c++/net/include/net/ThreadPoolAllocStrategy.h +++ b/externals/coda-oss/modules/c++/net/include/net/ThreadPoolAllocStrategy.h @@ -44,7 +44,7 @@ class ConnectionThread: public mt::WorkerThread /*! * Do this in a loop forever. */ - void performTask(net::NetConnection*& request) + void performTask(net::NetConnection*& request) override { (*mHandler)(request); } @@ -78,7 +78,7 @@ class ConnectionThreadPool: public mt::AbstractThreadPool delete mFactory; } - mt::WorkerThread* newWorker() + mt::WorkerThread* newWorker() override { return new ConnectionThread(&mRequestQueue, mFactory->create()); } @@ -127,9 +127,9 @@ class ThreadPoolAllocStrategy: public AllocStrategy // AllocStrategy guarantees that mRequestHandlerFactory is initialized // by the time this function is called - void initialize(); + void initialize() override; - void handleConnection(net::NetConnection* conn); + void handleConnection(net::NetConnection* conn) override; }; } diff --git a/externals/coda-oss/modules/c++/net/include/net/URL.h b/externals/coda-oss/modules/c++/net/include/net/URL.h index 55fa55b52e..ea9b4f8fe7 100644 --- a/externals/coda-oss/modules/c++/net/include/net/URL.h +++ b/externals/coda-oss/modules/c++/net/include/net/URL.h @@ -46,7 +46,7 @@ class URLParams typedef std::list ParamValues; typedef std::map Params; - URLParams(const std::string paramString = ""); + URLParams(std::string paramString = ""); bool contains(std::string key) const; ParamValues& get(std::string key); @@ -68,17 +68,18 @@ class URL { public: - URL(const std::string url = ""); + URL(std::string url = ""); /*! * Copy constructor. * \param url A right-hand-side URL */ - URL(const URL& url); + URL(const URL&); + URL& operator=(const URL&); + URL(URL&&) = default; + URL& operator=(URL&&) = default; - virtual ~URL() - { - } + virtual ~URL() = default; void set(std::string url); @@ -106,7 +107,7 @@ class URL friend class URLBuilder; std::string mProtocol; std::string mHost; - int mPort; + int mPort = -1; std::string mPath; URLParams mParams; std::string mFragment; diff --git a/externals/coda-oss/modules/c++/net/source/DaemonUnix.cpp b/externals/coda-oss/modules/c++/net/source/DaemonUnix.cpp index 5fcee2a6ee..8683816f95 100644 --- a/externals/coda-oss/modules/c++/net/source/DaemonUnix.cpp +++ b/externals/coda-oss/modules/c++/net/source/DaemonUnix.cpp @@ -1,4 +1,4 @@ -#if !(defined(WIN32) || defined(_WIN32)) +#ifndef _WIN32 #include "net/DaemonUnix.h" #include diff --git a/externals/coda-oss/modules/c++/net/source/SocketAddress.cpp b/externals/coda-oss/modules/c++/net/source/SocketAddress.cpp index 65106e5ce0..e5dcf0494c 100644 --- a/externals/coda-oss/modules/c++/net/source/SocketAddress.cpp +++ b/externals/coda-oss/modules/c++/net/source/SocketAddress.cpp @@ -65,7 +65,7 @@ void SocketAddress::setHost(const std::string& host) } else { -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 struct sockaddr saddr; int slen = sizeof(saddr); struct sockaddr_in *paddr = (struct sockaddr_in *)&saddr; diff --git a/externals/coda-oss/modules/c++/net/source/URL.cpp b/externals/coda-oss/modules/c++/net/source/URL.cpp index a14219f7e6..881a4b8547 100644 --- a/externals/coda-oss/modules/c++/net/source/URL.cpp +++ b/externals/coda-oss/modules/c++/net/source/URL.cpp @@ -24,21 +24,28 @@ #include #include -net::URL::URL(const std::string url) : - mPort(-1) +net::URL::URL(std::string url) { if (!url.empty()) set(url); } -net::URL::URL(const net::URL& url) +net::URL& net::URL::operator=(const URL& url) { + if (this != &url) + { mProtocol = url.getProtocol(); mHost = url.getHost(); setPort(url.getPort()); mPath = url.getPath(); mFragment = url.getFragment(); mParams = net::URLParams(url.getParams().toString()); + } + return *this; +} +net::URL::URL(const URL& url) +{ + *this = url; } void net::URL::set(std::string url) @@ -122,7 +129,7 @@ bool net::URL::operator==(const net::URL& url) const return toString() == url.toString(); } -net::URLParams::URLParams(const std::string paramString) +net::URLParams::URLParams(std::string paramString) { if (!paramString.empty()) { diff --git a/externals/coda-oss/modules/c++/net/tests/NetConnectionServerTest.cpp b/externals/coda-oss/modules/c++/net/tests/NetConnectionServerTest.cpp index 545bc10d06..bcbb46ac10 100644 --- a/externals/coda-oss/modules/c++/net/tests/NetConnectionServerTest.cpp +++ b/externals/coda-oss/modules/c++/net/tests/NetConnectionServerTest.cpp @@ -50,7 +50,7 @@ class EchoHandler : public net::RequestHandler ~EchoHandler() { } - void operator()(net::NetConnection* conn) + void operator()(net::NetConnection* conn) override { char buf[MAX_BUF_SIZE]; unsigned int length; diff --git a/externals/coda-oss/modules/c++/numpyutils/include/numpyutils/numpyutils.h b/externals/coda-oss/modules/c++/numpyutils/include/numpyutils/numpyutils.h index 4471906f78..fec9e9e64a 100644 --- a/externals/coda-oss/modules/c++/numpyutils/include/numpyutils/numpyutils.h +++ b/externals/coda-oss/modules/c++/numpyutils/include/numpyutils/numpyutils.h @@ -63,7 +63,7 @@ void verifyArrayType(PyObject *pyObject, int typeNum); * \returns read only pointer to the dimensions of array * \throws except::Exception if not a 2D array */ -const npy_intp* const getDimensions(PyObject* pyArrayObject); +const npy_intp* getDimensions(PyObject* pyArrayObject); /*! Variant returning types::RowCol version of dimensions * \param pyArrayObject array object to inspect diff --git a/externals/coda-oss/modules/c++/numpyutils/source/numpyutils.cpp b/externals/coda-oss/modules/c++/numpyutils/source/numpyutils.cpp index 813d4adc8e..6b8a76a5da 100644 --- a/externals/coda-oss/modules/c++/numpyutils/source/numpyutils.cpp +++ b/externals/coda-oss/modules/c++/numpyutils/source/numpyutils.cpp @@ -110,7 +110,7 @@ void verifyArrayType(PyObject *pyObject, int typeNum) verifyType(pyObject, typeNum); } -const npy_intp* const getDimensions(PyObject* pyArrayObject) +const npy_intp* getDimensions(PyObject* pyArrayObject) { verifyArray(pyArrayObject); int ndims = PyArray_NDIM(reinterpret_cast(pyArrayObject)); diff --git a/externals/coda-oss/modules/c++/pch.h b/externals/coda-oss/modules/c++/pch.h index 4cfebea98a..342ae85267 100644 --- a/externals/coda-oss/modules/c++/pch.h +++ b/externals/coda-oss/modules/c++/pch.h @@ -7,10 +7,15 @@ #ifndef CODA_OSS_pch_h_INCLUDED_ #define CODA_OSS_pch_h_INCLUDED_ +#pragma warning(disable: 4619) // #pragma warning: there is no warning number '...' + #pragma warning(disable: 4820) // '...': '...' bytes padding added after data member '...' -#pragma warning(disable: 4710) // '...': function not inlined -#pragma warning(disable: 5045) // Compiler will insert Spectre mitigation for memory load if / Qspectre switch specified #pragma warning(disable: 4668) // '...' is not defined as a preprocessor macro, replacing with '...' for '...' +#pragma warning(disable: 5045) // Compiler will insert Spectre mitigation for memory load if / Qspectre switch specified +#pragma warning(disable: 4514) // '...': unreferenced inline function has been removed + +#pragma warning(push) +#pragma warning(disable: 4710) // '...': function not inlined #pragma warning(disable: 5027) // '...': move assignment operator was implicitly defined as deleted #pragma warning(disable: 5026) // '...': move constructor was implicitly defined as deleted #pragma warning(disable: 4626) // '...': assignment operator was implicitly defined as deleted @@ -18,7 +23,7 @@ #pragma warning(disable: 4355) // '...': used in base member initializer list #pragma warning(disable: 5220) // '...': a non-static data member with a volatile qualified type no longer implies that compiler generated copy/move constructors and copy/move assignment operators are not trivial #pragma warning(disable: 5204) // '...': class has virtual functions, but its trivial destructor is not virtual; instances of objects derived from this class may not be destructed correctly -#pragma warning(disable : 5264) // '...': '...' variable is not used +#pragma warning(disable: 5264) // '...': '...' variable is not used // add headers that you want to pre-compile here #include "framework.h" @@ -32,27 +37,7 @@ #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "import/std.h" #include #include #include @@ -61,6 +46,9 @@ #include #include -#pragma warning(disable: 4514) // '...': unreferenced inline function has been removed +#pragma warning(pop) + +#pragma warning(disable: 4251) // '...': class '...' needs to have dll-interface to be used by clients of class '...' +#pragma warning(disable: 5105) // macro expansion producing '...' has undefined behavior #endif //CODA_OSS_pch_h_INCLUDED_ diff --git a/externals/coda-oss/modules/c++/plugin/include/plugin/ErrorHandler.h b/externals/coda-oss/modules/c++/plugin/include/plugin/ErrorHandler.h index 727a81584c..be7ca3c8a8 100644 --- a/externals/coda-oss/modules/c++/plugin/include/plugin/ErrorHandler.h +++ b/externals/coda-oss/modules/c++/plugin/include/plugin/ErrorHandler.h @@ -52,15 +52,15 @@ class DefaultErrorHandler : public ErrorHandler public: DefaultErrorHandler(logging::LoggerPtr logger = logging::LoggerPtr()); - void onPluginDirectoryNotFound(const std::string& dir); + void onPluginDirectoryNotFound(const std::string& dir) override; - void onPluginLoadedAlready(const std::string& file); + void onPluginLoadedAlready(const std::string& file) override; - void onPluginLoadFailed(const std::string& file); + void onPluginLoadFailed(const std::string& file) override; - void onPluginVersionUnsupported(const std::string& message); + void onPluginVersionUnsupported(const std::string& message) override; - void onPluginError(except::Context& c); + void onPluginError(except::Context& c) override; protected: logging::LoggerPtr mLogger; diff --git a/externals/coda-oss/modules/c++/plugin/include/plugin/PluginDefines.h b/externals/coda-oss/modules/c++/plugin/include/plugin/PluginDefines.h index 2fcdfc9018..6a821f9db6 100644 --- a/externals/coda-oss/modules/c++/plugin/include/plugin/PluginDefines.h +++ b/externals/coda-oss/modules/c++/plugin/include/plugin/PluginDefines.h @@ -31,7 +31,7 @@ /* #define PLUGIN_DESTRUCTOR_NAME "DestroyPlugin" */ #define GET_PLUGIN_IDENT "GetPluginIdentity" -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 # define PLUGIN_DSO_EXTENSION ".dll" #else # define PLUGIN_DSO_EXTENSION ".so" @@ -48,7 +48,7 @@ #define PLUGIN_API_MINOR_VERSION 0 -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 # if defined(PLUGIN_MODULE_EXPORTS) # define PLUGIN_HOOK extern "C" __declspec(dllexport) # else diff --git a/externals/coda-oss/modules/c++/re/include/re/RegexPredicate.h b/externals/coda-oss/modules/c++/re/include/re/RegexPredicate.h index b34f9cfb3e..ffccf71afc 100644 --- a/externals/coda-oss/modules/c++/re/include/re/RegexPredicate.h +++ b/externals/coda-oss/modules/c++/re/include/re/RegexPredicate.h @@ -37,7 +37,7 @@ struct RegexPredicate : public sys::FilePredicate mRegex.compile(match); } - bool operator()(const std::string& filename) const + bool operator()(const std::string& filename) const override { return mRegex.matches(filename); } diff --git a/externals/coda-oss/modules/c++/sio.lite/include/sio/lite/SioFileReader.h b/externals/coda-oss/modules/c++/sio.lite/include/sio/lite/SioFileReader.h index 8fa5133344..446476dfc7 100644 --- a/externals/coda-oss/modules/c++/sio.lite/include/sio/lite/SioFileReader.h +++ b/externals/coda-oss/modules/c++/sio.lite/include/sio/lite/SioFileReader.h @@ -125,7 +125,7 @@ class FileReader : public StreamReader, public io::Seekable * For simplicity, the final position is reported in the return value relative * to header start (always). This is done by calling tell(). */ - sys::Off_T seek( sys::Off_T offset, Whence whence ); + sys::Off_T seek( sys::Off_T offset, Whence whence ) override; /*! * Overloaded method, only works if this is a FileInputStream. @@ -134,10 +134,10 @@ class FileReader : public StreamReader, public io::Seekable * yield 0 as a return value. * */ - sys::Off_T tell(); + sys::Off_T tell() override; - void killStream(); + void killStream() override; protected: }; } diff --git a/externals/coda-oss/modules/c++/sio.lite/include/sio/lite/StreamReader.h b/externals/coda-oss/modules/c++/sio.lite/include/sio/lite/StreamReader.h index fe0c22b755..982b8900fb 100644 --- a/externals/coda-oss/modules/c++/sio.lite/include/sio/lite/StreamReader.h +++ b/externals/coda-oss/modules/c++/sio.lite/include/sio/lite/StreamReader.h @@ -140,7 +140,7 @@ class StreamReader : public io::InputStream sio::lite::FileHeader* readHeader() { return header; } - sys::Off_T available() + sys::Off_T available() override { return inputStream->available(); } @@ -156,7 +156,7 @@ class StreamReader : public io::InputStream * @param size the Number of bytes to read * @return The number of bytes read */ - virtual sys::SSize_T readImpl(void* buffer, size_t size) + virtual sys::SSize_T readImpl(void* buffer, size_t size) override { return inputStream->read(buffer, size); } diff --git a/externals/coda-oss/modules/c++/std/include/import/cpp14.h b/externals/coda-oss/modules/c++/std/include/import/cpp14.h new file mode 100644 index 0000000000..f91af67f17 --- /dev/null +++ b/externals/coda-oss/modules/c++/std/include/import/cpp14.h @@ -0,0 +1,61 @@ +/* ========================================================================= + * This file is part of std-c++ + * ========================================================================= + * + * (C) Copyright 2004 - 2014, MDA Information Systems LLC + * (C) Copyright 2023, Maxar Technologies, Inc. + * + * std-c++ is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; If not, + * see . + * + */ + + +#ifndef CODA_OSS_import_cpp14_h_INCLUDED_ +#define CODA_OSS_import_cpp14_h_INCLUDED_ +#pragma once + +// Common C++14 headers +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#endif // CODA_OSS_import_cpp14_h_INCLUDED_ + + diff --git a/externals/coda-oss/modules/c++/std/include/import/cpp17.h b/externals/coda-oss/modules/c++/std/include/import/cpp17.h new file mode 100644 index 0000000000..a03b2c5dad --- /dev/null +++ b/externals/coda-oss/modules/c++/std/include/import/cpp17.h @@ -0,0 +1,36 @@ +/* ========================================================================= + * This file is part of std-c++ + * ========================================================================= + * + * (C) Copyright 2004 - 2014, MDA Information Systems LLC + * (C) Copyright 2023, Maxar Technologies, Inc. + * + * std-c++ is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; If not, + * see . + * + */ + +#ifndef CODA_OSS_import_cpp17_h_INCLUDED_ +#define CODA_OSS_import_cpp17_h_INCLUDED_ +#pragma once + +#include "cpp14.h" + +// Common C++17 headers +#include +#include + +#endif // CODA_OSS_import_cpp17_h_INCLUDED_ + + diff --git a/externals/coda-oss/modules/c++/std/include/import/std.h b/externals/coda-oss/modules/c++/std/include/import/std.h new file mode 100644 index 0000000000..426a80f0c4 --- /dev/null +++ b/externals/coda-oss/modules/c++/std/include/import/std.h @@ -0,0 +1,58 @@ +/* ========================================================================= + * This file is part of std-c++ + * ========================================================================= + * + * (C) Copyright 2004 - 2014, MDA Information Systems LLC + * (C) Copyright 2023, Maxar Technologies, Inc. + * + * std-c++ is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; If not, + * see . + * + */ + + +#ifndef CODA_OSS_import_std_h_INCLUDED_ +#define CODA_OSS_import_std_h_INCLUDED_ +#pragma once + +#include "coda_oss/CPlusPlus.h" +#include "config/disable_compiler_warnings.h" + +CODA_OSS_disable_warning_push +#if _MSC_VER +#pragma warning(disable: 4619) // #pragma warning: there is no warning number '...' + +#pragma warning(disable: 4710) // '...': function not inlined +#pragma warning(disable: 5027) // '...': move assignment operator was implicitly defined as deleted +#pragma warning(disable: 5026) // '...': move constructor was implicitly defined as deleted +#pragma warning(disable: 4626) // '...': assignment operator was implicitly defined as deleted +#pragma warning(disable: 4625) // '...': copy constructor was implicitly defined as deleted +#pragma warning(disable: 4355) // '...': used in base member initializer list +#pragma warning(disable: 5220) // '...': a non-static data member with a volatile qualified type no longer implies that compiler generated copy/move constructors and copy/move assignment operators are not trivial +#pragma warning(disable: 5204) // '...': class has virtual functions, but its trivial destructor is not virtual; instances of objects derived from this class may not be destructed correctly +#pragma warning(disable: 5264) // '...': '...' variable is not used +#endif // _MSC_VER + +// Common C++14 headers +#include "cpp14.h" + +#if CODA_OSS_cpp17 +#include "cpp17.h" +#endif + +CODA_OSS_disable_warning_pop + +#endif // CODA_OSS_import_std_h_INCLUDED_ + + diff --git a/externals/coda-oss/modules/c++/std/include/std/bit b/externals/coda-oss/modules/c++/std/include/std/bit index ffe3b76510..d564c00202 100644 --- a/externals/coda-oss/modules/c++/std/include/std/bit +++ b/externals/coda-oss/modules/c++/std/include/std/bit @@ -22,9 +22,11 @@ #define CODA_OSS_std_bit_INCLUDED_ #pragma once +#include "coda_oss/bit.h" +#include "coda_oss/CPlusPlus.h" + // Make it (too?) easy for clients to get our various std:: implementations #ifndef CODA_OSS_NO_std_endian - #include "coda_oss/CPlusPlus.h" #if CODA_OSS_cpp20 // Some implementations cliam to be C++20 w/o #if __has_include() // __has_include is C++17 @@ -34,7 +36,6 @@ #endif // At this point, CODA_OSS_NO_std_endian will be set only if we were able to successfully use (above) #ifndef CODA_OSS_NO_std_endian - #include "coda_oss/bit.h" #define CODA_OSS_NO_std_endian 0 // <= C++17, use our own #endif #endif diff --git a/externals/coda-oss/modules/c++/std/include/std/cstddef b/externals/coda-oss/modules/c++/std/include/std/cstddef index 694a461613..56700ec71a 100644 --- a/externals/coda-oss/modules/c++/std/include/std/cstddef +++ b/externals/coda-oss/modules/c++/std/include/std/cstddef @@ -23,6 +23,8 @@ #pragma once #include +#include "coda_oss/cstddef.h" +#include "coda_oss/CPlusPlus.h" // Make it (too?) easy for clients to get our various std:: implementations #ifndef CODA_OSS_NO_std_byte @@ -30,7 +32,6 @@ #undef CODA_OSS_NO_std_byte #define CODA_OSS_NO_std_byte 1 // provided by implementation, probably C++20 #else - #include "coda_oss/cstddef.h" #define CODA_OSS_NO_std_byte 0 // use our own #endif #endif diff --git a/externals/coda-oss/modules/c++/std/include/std/filesystem b/externals/coda-oss/modules/c++/std/include/std/filesystem index ec66c945fe..4804550ae2 100644 --- a/externals/coda-oss/modules/c++/std/include/std/filesystem +++ b/externals/coda-oss/modules/c++/std/include/std/filesystem @@ -22,9 +22,11 @@ #define CODA_OSS_std_filesystem_INCLUDED_ #pragma once +#include "sys/filesystem.h" +#include "coda_oss/CPlusPlus.h" + // Make it (too?) easy for clients to get our various std:: implementations #ifndef CODA_OSS_NO_std_filesystem - #include "coda_oss/CPlusPlus.h" #if CODA_OSS_cpp17 // Some versions of G++ say they're C++17 but don't have #if __has_include() // __has_include is C++17 @@ -32,7 +34,6 @@ #define CODA_OSS_NO_std_filesystem 1 // part of C++17 #endif #else - #include "sys/filesystem.h" #define CODA_OSS_NO_std_filesystem 0 // use our own #endif #endif diff --git a/externals/coda-oss/modules/c++/std/include/std/memory b/externals/coda-oss/modules/c++/std/include/std/memory index ea7b46cf0e..192f67094b 100644 --- a/externals/coda-oss/modules/c++/std/include/std/memory +++ b/externals/coda-oss/modules/c++/std/include/std/memory @@ -22,7 +22,24 @@ #define CODA_OSS_std_memory_INCLUDED_ #pragma once -#include "coda_oss/CPlusPlus.h" +#include #include "coda_oss/memory.h" +#include "coda_oss/CPlusPlus.h" + +// Make it (too?) easy for clients to get our various std:: implementations +#ifndef CODA_OSS_NO_std_make_unique + #if CODA_OSS_cpp14 + #define CODA_OSS_NO_std_make_unique 1 // part of C++14 + #else + #define CODA_OSS_NO_std_make_unique 0 // use our own + #endif +#endif + +#if !CODA_OSS_NO_std_make_unique +namespace std // This is slightly uncouth: we're not supposed to augment "std". +{ + using coda_oss::make_unique; +} +#endif // !CODA_OSS_NO_std_make_unique #endif // CODA_OSS_std_memory_INCLUDED_ \ No newline at end of file diff --git a/externals/coda-oss/modules/c++/std/include/std/optional b/externals/coda-oss/modules/c++/std/include/std/optional index 276cdee13d..e4a47e6fc3 100644 --- a/externals/coda-oss/modules/c++/std/include/std/optional +++ b/externals/coda-oss/modules/c++/std/include/std/optional @@ -22,14 +22,15 @@ #define CODA_OSS_std_optional_INCLUDED_ #pragma once +#include "coda_oss/optional.h" +#include "coda_oss/CPlusPlus.h" + // Make it (too?) easy for clients to get our various std:: implementations #ifndef CODA_OSS_NO_std_optional - #include "coda_oss/CPlusPlus.h" #if CODA_OSS_cpp17 #include #define CODA_OSS_NO_std_optional 1 // part of C++17 #else - #include "coda_oss/optional.h" #define CODA_OSS_NO_std_optional 0 // use our own #endif #endif diff --git a/externals/coda-oss/modules/c++/std/include/std/span b/externals/coda-oss/modules/c++/std/include/std/span index e85d7f716c..ffa0d1df97 100644 --- a/externals/coda-oss/modules/c++/std/include/std/span +++ b/externals/coda-oss/modules/c++/std/include/std/span @@ -22,14 +22,15 @@ #define CODA_OSS_std_span_INCLUDED_ #pragma once +#include "coda_oss/span.h" +#include "coda_oss/CPlusPlus.h" + // Make it (too?) easy for clients to get our various std:: implementations #ifndef CODA_OSS_NO_std_span - #include "coda_oss/CPlusPlus.h" #if CODA_OSS_cpp20 #include #define CODA_OSS_NO_std_span 1 // part of C++20 #else - #include "coda_oss/span.h" #define CODA_OSS_NO_std_span 0 // use our own #endif #endif diff --git a/externals/coda-oss/modules/c++/std/include/std/string b/externals/coda-oss/modules/c++/std/include/std/string index df11495a60..e740a42f28 100644 --- a/externals/coda-oss/modules/c++/std/include/std/string +++ b/externals/coda-oss/modules/c++/std/include/std/string @@ -23,14 +23,14 @@ #pragma once #include +#include "coda_oss/string.h" +#include "coda_oss/CPlusPlus.h" // Make it (too?) easy for clients to get our various std:: implementations #ifndef CODA_OSS_NO_std_u8string - #include "coda_oss/CPlusPlus.h" #if CODA_OSS_cpp20 #define CODA_OSS_NO_std_u8string 1 // part of C++20 #else - #include "coda_oss/string.h" #define CODA_OSS_NO_std_u8string 0 // use our own #endif #endif diff --git a/externals/coda-oss/modules/c++/std/include/std/type_traits b/externals/coda-oss/modules/c++/std/include/std/type_traits index 2a803bb1ab..1aba653f96 100644 --- a/externals/coda-oss/modules/c++/std/include/std/type_traits +++ b/externals/coda-oss/modules/c++/std/include/std/type_traits @@ -22,8 +22,26 @@ #define CODA_OSS_std_type_traits_INCLUDED_ #pragma once -#include "coda_oss/CPlusPlus.h" +#include #include "coda_oss/type_traits.h" +// Make it (too?) easy for clients to get our various std:: implementations +#ifndef CODA_OSS_NO_is_trivially_copyable + // https://stackoverflow.com/a/31798726/8877 + // workaround missing "is_trivially_copyable" in g++ < 5.0 + #if defined(__GNUC__) && (__GNUC__ < 5) + #define CODA_OSS_NO_is_trivially_copyable 0 // *need* our own + #else + #define CODA_OSS_NO_is_trivially_copyable 1 // *disabled*, unless explicitly enabled + #endif +#endif + +#if !CODA_OSS_NO_is_trivially_copyable +namespace std // This is slightly uncouth: we're not supposed to augment "std". +{ + using coda_oss::is_trivially_copyable; +} +#endif // CODA_OSS_NO_is_trivially_copyable + #endif // CODA_OSS_std_type_traits_INCLUDED_ diff --git a/externals/coda-oss/modules/c++/str/include/str/EncodedStringView.h b/externals/coda-oss/modules/c++/str/include/str/EncodedStringView.h index dc35c9e4ae..1fd1e99ac5 100644 --- a/externals/coda-oss/modules/c++/str/include/str/EncodedStringView.h +++ b/externals/coda-oss/modules/c++/str/include/str/EncodedStringView.h @@ -55,7 +55,7 @@ class CODA_OSS_API EncodedStringView final explicit EncodedStringView(coda_oss::span); explicit EncodedStringView(coda_oss::span); -#if _WIN32 + #ifdef _WIN32 static constexpr bool mNativeIsUtf8 = false; // Windows-1252 #else static constexpr bool mNativeIsUtf8 = true; // !_WIN32, assume Linux @@ -109,12 +109,8 @@ class CODA_OSS_API EncodedStringView final // is WCHAR (char* is converted to UTF-16). std::wstring wstring() const; // UTF-16 on Windows, UTF-32 on Linux - // With some older C++ compilers, uint16_t may be used instead of char16_t :-( - // Using this routine can avoid an extra copy. - str::ui16string ui16string_() const; // use sparingly! - // These are for "advanced" use, most "normal" code should use the routines above. - std::string::const_pointer c_str() const + std::string::const_pointer c_str() const noexcept { return mString.data(); } @@ -126,7 +122,7 @@ class CODA_OSS_API EncodedStringView final { return mIsUtf8 ? nullptr : cast(c_str()); } - size_t size() const + size_t size() const noexcept { return mString.size(); } diff --git a/externals/coda-oss/modules/c++/str/include/str/Encoding.h b/externals/coda-oss/modules/c++/str/include/str/Encoding.h index c063c61d5c..0147306ecf 100644 --- a/externals/coda-oss/modules/c++/str/include/str/Encoding.h +++ b/externals/coda-oss/modules/c++/str/include/str/Encoding.h @@ -62,9 +62,6 @@ inline typename TBasicStringT::const_pointer c_str(const std::basic_string; // https://en.cppreference.com/w/cpp/string -// With some older C++ compilers, uint16_t may be used instead of char16_t :-( -using ui16string = std::basic_string; // ui = UInt16_t - ////////////////////////////////////////////////////////////////////////////////////////// // We'll get strange errors, possibibly at link-time, if wchar_t is not a wchar_t type. @@ -88,9 +85,7 @@ inline coda_oss::u8string to_u8string(coda_oss::u8string::const_pointer s, size_ CODA_OSS_API coda_oss::u8string to_u8string(std::u16string::const_pointer, size_t); CODA_OSS_API std::u16string to_u16string(coda_oss::u8string::const_pointer, size_t); -str::ui16string to_ui16string(coda_oss::u8string::const_pointer, size_t); std::u16string to_u16string(str::W1252string::const_pointer, size_t); -str::ui16string to_ui16string(str::W1252string::const_pointer, size_t); // UTF-32 is convenient because each code-point is a single 32-bit integer. // It's typically std::wstring::value_type on Linux, but NOT Windows. diff --git a/externals/coda-oss/modules/c++/str/include/str/utf8.h b/externals/coda-oss/modules/c++/str/include/str/utf8.h index c4e2666a8d..27baba0859 100644 --- a/externals/coda-oss/modules/c++/str/include/str/utf8.h +++ b/externals/coda-oss/modules/c++/str/include/str/utf8.h @@ -391,7 +391,7 @@ class invalid_code_point final : public exception invalid_code_point(uint32_t cp) : cp(cp) { } - virtual const char* what() const noexcept + virtual const char* what() const noexcept override { return "Invalid code point"; } @@ -409,7 +409,7 @@ class invalid_utf8 final : public exception invalid_utf8(uint8_t u) : u8(u) { } - virtual const char* what() const noexcept + virtual const char* what() const noexcept override { return "Invalid UTF-8"; } @@ -427,7 +427,7 @@ class invalid_utf16 final : public exception invalid_utf16(uint16_t u) : u16(u) { } - virtual const char* what() const noexcept + virtual const char* what() const noexcept override { return "Invalid UTF-16"; } @@ -440,7 +440,7 @@ class invalid_utf16 final : public exception class not_enough_room final : public exception { public: - virtual const char* what() const noexcept + virtual const char* what() const noexcept override { return "Not enough space"; } diff --git a/externals/coda-oss/modules/c++/str/source/EncodedStringView.cpp b/externals/coda-oss/modules/c++/str/source/EncodedStringView.cpp index 2c5bf0150c..90fcf31441 100644 --- a/externals/coda-oss/modules/c++/str/source/EncodedStringView.cpp +++ b/externals/coda-oss/modules/c++/str/source/EncodedStringView.cpp @@ -41,7 +41,7 @@ enum class PlatformType // MacOS }; -#if _WIN32 +#ifdef _WIN32 static auto Platform = PlatformType::Windows; #else static auto Platform = PlatformType::Linux; @@ -55,14 +55,6 @@ inline std::u16string to_u16string(std::string::const_pointer s, size_t sz, bool } return str::to_u16string(str::cast(s), sz); } -inline str::ui16string to_ui16string(std::string::const_pointer s, size_t sz, bool is_utf8 /* is 's' UTF-8? */) -{ - if (is_utf8) - { - return str::to_ui16string(str::cast(s), sz); - } - return str::to_ui16string(str::cast(s), sz); -} static std::string to_native(coda_oss::u8string::const_pointer p, size_t sz) { @@ -155,10 +147,6 @@ std::u16string str::EncodedStringView::u16string() const { return ::to_u16string(mString.data(), mString.size(), mIsUtf8); } -str::ui16string str::EncodedStringView::ui16string_() const -{ - return ::to_ui16string(mString.data(), mString.size(), mIsUtf8); -} inline std::u32string to_u32string(std::string::const_pointer s, size_t sz, bool is_utf8 /* is 's' UTF-8? */) { @@ -179,10 +167,9 @@ std::wstring str::EncodedStringView::wstring() const // UTF-16 on Windows, UTF- const auto sz = mString.size(); const auto s = // Need to use #ifdef's because str::cast() checks to be sure the sizes are correct. - #if _WIN32 + #ifdef _WIN32 ::to_u16string(p, sz, mIsUtf8); // std::wstring is UTF-16 on Windows - #endif - #if !_WIN32 + #else ::to_u32string(p, sz, mIsUtf8); // std::wstring is UTF-32 on Linux #endif return str::c_str(s); // copy @@ -208,11 +195,13 @@ bool str::EncodedStringView::operator_eq(const EncodedStringView& rhs) const if (lhs.mIsUtf8 == rhs.mIsUtf8) // both are UTF-8 or both are Windows-1252 { // But we can avoid that call if the pointers are the same - if ((lhs.mString.data() == rhs.mString.data()) && (rhs.mString.size() == rhs.mString.size())) + const auto pLhs = lhs.mString.data(); + const auto pRhs = rhs.mString.data(); + if ((pLhs == pRhs) && (rhs.mString.size() == rhs.mString.size())) { return true; } - return strcmp(lhs.mString.data(), rhs.mString.data()) == 0; + return strcmp(pLhs, pRhs) == 0; } // LHS and RHS have different encodings, but one must be UTF-8 diff --git a/externals/coda-oss/modules/c++/str/source/Encoding.cpp b/externals/coda-oss/modules/c++/str/source/Encoding.cpp index 4ccf697041..86a879b0c4 100644 --- a/externals/coda-oss/modules/c++/str/source/Encoding.cpp +++ b/externals/coda-oss/modules/c++/str/source/Encoding.cpp @@ -44,7 +44,7 @@ inline coda_oss::u8string utf8_(std::u32string::value_type ch) { return str::to_u8string(std::u32string{ch}); -}; +} static const std::map Windows1252_x80_x9F_to_u8string{ {0x80, utf8_(0x20AC) } // EURO SIGN // , {0x81, replacement_character } // UNDEFINED @@ -198,16 +198,12 @@ std::u16string str::to_u16string(str::W1252string::const_pointer p, size_t sz) { auto retval = to_Tstring(p, sz); #if defined(_WIN32) && (!defined(_NDEBUG) || defined(DEBUG)) - const _bstr_t bstr(str::cast(p)); + const _bstr_t bstr(std::string(str::cast(p), sz).c_str()); // no _bstr_t ctor taking sz const std::wstring wstr(static_cast(bstr)); assert(retval == str::cast(wstr.c_str())); #endif return retval; } -str::ui16string str::to_ui16string(str::W1252string::const_pointer p, size_t sz) -{ - return to_Tstring(p, sz); -} std::u32string str::to_u32string(str::W1252string::const_pointer p, size_t sz) { return to_Tstring(p, sz); @@ -352,13 +348,6 @@ std::u16string str::to_u16string(coda_oss::u8string::const_pointer p_, size_t sz utf8::utf8to16(p, p + sz, std::back_inserter(retval)); return retval; } -str::ui16string str::to_ui16string(coda_oss::u8string::const_pointer p_, size_t sz) -{ - auto p = str::cast(p_); - str::ui16string retval; - utf8::utf8to16(p, p + sz, std::back_inserter(retval)); - return retval; -} std::u32string str::to_u32string(coda_oss::u8string::const_pointer p_, size_t sz) { diff --git a/externals/coda-oss/modules/c++/str/source/Manip.cpp b/externals/coda-oss/modules/c++/str/source/Manip.cpp index 516f43f354..444c897321 100644 --- a/externals/coda-oss/modules/c++/str/source/Manip.cpp +++ b/externals/coda-oss/modules/c++/str/source/Manip.cpp @@ -146,7 +146,8 @@ size_t replace(std::string& str, if (index != std::string::npos) { - str.replace(index, search.length(), replace); + // ASAN error: str.replace(index, search.length(), replace); + str = str.substr(0, index) + replace + str.substr(index + search.length()); start = index; } else diff --git a/externals/coda-oss/modules/c++/str/unittests/test_base_convert.cpp b/externals/coda-oss/modules/c++/str/unittests/test_base_convert.cpp index 26ab0ece7b..358fa6827a 100644 --- a/externals/coda-oss/modules/c++/str/unittests/test_base_convert.cpp +++ b/externals/coda-oss/modules/c++/str/unittests/test_base_convert.cpp @@ -362,6 +362,8 @@ static void test_wide_(const std::string& testName, const char* pStr, std::u16st const std::string std_str(static_cast(wide_str)); // UTF-16 -> Windows-1252 TEST_ASSERT_EQ(encoded.native(), std_str); TEST_ASSERT_EQ(std_str, pStr); + #else + pUtf16 = pUtf16; // avoid unused-parameter warning #endif } @@ -436,6 +438,8 @@ TEST_CASE(test_Windows1252_WIN32) constexpr auto w1252_unassigned = "\x81\x8d\x8f\x90\x9d"; constexpr auto u16_w1252_unassigned = u"\x81\x8d\x8f\x90\x9d"; test_Windows1252_(testName, w1252_unassigned, u16_w1252_unassigned); + #else + TEST_ASSERT_TRUE(true); // need to use hidden "testName" parameter #endif } @@ -613,4 +617,4 @@ TEST_MAIN( TEST_CHECK(test_Windows1252); TEST_CHECK(test_EncodedStringView); TEST_CHECK(test_EncodedString); - ) \ No newline at end of file + ) diff --git a/externals/coda-oss/modules/c++/sys/include/sys/ConditionVarPosix.h b/externals/coda-oss/modules/c++/sys/include/sys/ConditionVarPosix.h index b5aef09461..2144ac63d8 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/ConditionVarPosix.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/ConditionVarPosix.h @@ -66,17 +66,17 @@ class ConditionVarPosix final : public ConditionVarInterface /*! * Acquire the lock */ - virtual void acquireLock(); + virtual void acquireLock() override; /*! * Drop (release) the lock */ - virtual void dropLock(); + virtual void dropLock() override; /*! * Signal using pthread_cond_signal */ - virtual void signal(); + virtual void signal() override; /*! * Wait using pthread_cond_wait @@ -86,7 +86,7 @@ class ConditionVarPosix final : public ConditionVarInterface * certain systems, undefined/unfavorable behavior may * result. */ - virtual void wait(); + virtual void wait() override; /*! * Wait using pthread_cond_timed_wait. I kept this and the above @@ -99,12 +99,12 @@ class ConditionVarPosix final : public ConditionVarInterface * certain systems, undefined/unfavorable behavior may * result. */ - virtual void wait(double seconds); + virtual void wait(double seconds) override; /*! * Broadcast (notify all) */ - virtual void broadcast(); + virtual void broadcast() override; /*! * Returns the native type. diff --git a/externals/coda-oss/modules/c++/sys/include/sys/Conf.h b/externals/coda-oss/modules/c++/sys/include/sys/Conf.h index b0a0533a16..ad5a1e4c99 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/Conf.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/Conf.h @@ -25,6 +25,11 @@ #define CODA_OSS_sys_Conf_h_INCLUDED_ #pragma once +// In case there is still a WIN32 (should be "_WIN32" with a leading '_') someplace. +#if defined(_WIN32) && !defined(WIN32) +#define WIN32 _WIN32 +#endif + // POSIX is more-or-less "Unix" // https://linux.die.net/man/7/feature_test_macros // "If no feature test macros are explicitly defined, then the following feature test macros @@ -33,9 +38,21 @@ #ifndef _WIN32 #include #endif -#define CODA_OSS_POSIX_SOURCE (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 1)) -#define CODA_OSS_POSIX2001_SOURCE CODA_OSS_POSIX_SOURCE && (_POSIX_C_SOURCE >= 200112L) -#define CODA_OSS_POSIX2008_SOURCE CODA_OSS_POSIX2001_SOURCE && (_POSIX_C_SOURCE >= 200809L) + +#undef CODA_OSS_POSIX_SOURCE +#if defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 1) +#define CODA_OSS_POSIX_SOURCE _POSIX_C_SOURCE +#endif + +#undef CODA_OSS_POSIX2001_SOURCE +#if defined(CODA_OSS_POSIX_SOURCE) && (_POSIX_C_SOURCE >= 200112L) +#define CODA_OSS_POSIX2001_SOURCE _POSIX_C_SOURCE +#endif + +#undef CODA_OSS_POSIX2008_SOURCE +#if defined(CODA_OSS_POSIX2001_SOURCE) && (_POSIX_C_SOURCE >= 200809L) +#define CODA_OSS_POSIX2008_SOURCE _POSIX_C_SOURCE +#endif #include #include @@ -47,25 +64,19 @@ #endif #include -#include #include #include -#include - -#if defined(__sgi) || defined(__sgi__) -# include -# include -#else -# include -# include -#endif +#include +#include +#include +#include #include + #include "str/Format.h" #include "sys/TimeStamp.h" - /* Dance around the compiler to figure out */ /* if we have access to function macro... */ @@ -73,7 +84,7 @@ #if defined(__GNUC__) /* We get a really nice function macro */ # define NativeLayer_func__ __PRETTY_FUNCTION__ -#elif (defined(WIN32) || defined(_WIN32)) && (_MSC_VER >= 1300) +#elif defined(_WIN32) && (_MSC_VER >= 1300) # define NativeLayer_func__ __FUNCSIG__ /* Otherwise, lets look for C99 compatibility */ #elif defined (__STDC_VERSION__) @@ -109,7 +120,7 @@ namespace sys typedef int64_t Int64_T; } -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 # include # include # include @@ -131,21 +142,6 @@ namespace sys } #else // !windows # include -# if defined(__sgi) || defined(__sgi__) -# if defined(__GNUC__) -# ifdef _FIX_BROKEN_HEADERS - typedef __int64_t jid_t; -# endif -# endif -# endif -# if defined(__sun) || defined(__sun__) || defined(__sparc) || defined(__sparc) || defined(__sparc__) -# if !defined(__SunOS_5_6) && !defined(__SunOS_5_7) && !defined(__SunOS_5_8) && defined(__GNUC__) -# ifdef _FIX_BROKEN_HEADERS - typedef id_t projid_t; -# endif -# endif -# include -# endif # include # include # include @@ -153,11 +149,7 @@ namespace sys # include # include # include -# if defined(_USE_STDINT) -# include -# else -# include -# endif +# include //# include namespace sys @@ -330,15 +322,15 @@ namespace sys size_t alignment = SSE_INSTRUCTION_ALIGNMENT) { void* p = nullptr; -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 p = _aligned_malloc(size, alignment); -#elif CODA_OSS_POSIX2001_SOURCE +#elif defined(CODA_OSS_POSIX2001_SOURCE) // https://linux.die.net/man/3/posix_memalign if (posix_memalign(&p, alignment, size) != 0) { p = nullptr; } -#elif CODA_OSS_POSIX_SOURCE +#elif defined(CODA_OSS_POSIX_SOURCE) // https://linux.die.net/man/3/posix_memalign // "The functions memalign(), ... have been available in all Linux libc libraries." p = memalign(alignment, size); @@ -362,7 +354,7 @@ namespace sys */ inline void alignedFree(void* p) { -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 _aligned_free(p); #else free(p); diff --git a/externals/coda-oss/modules/c++/sys/include/sys/DLL.h b/externals/coda-oss/modules/c++/sys/include/sys/DLL.h index b9eb3d8c4b..28fbb6be54 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/DLL.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/DLL.h @@ -37,7 +37,7 @@ * */ -# if defined(WIN32) || defined(_WIN32) +# ifdef _WIN32 # include "sys/Conf.h" # define DLL_PUBLIC_FUNCTION extern "C" __declspec (dllexport) typedef HINSTANCE DYNAMIC_LIBRARY; diff --git a/externals/coda-oss/modules/c++/sys/include/sys/DateTime.h b/externals/coda-oss/modules/c++/sys/include/sys/DateTime.h index 38b7424a77..5ca7db4459 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/DateTime.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/DateTime.h @@ -31,6 +31,7 @@ #include #include "config/Exports.h" +#include "config/disable_compiler_warnings.h" namespace sys { diff --git a/externals/coda-oss/modules/c++/sys/include/sys/Dbg.h b/externals/coda-oss/modules/c++/sys/include/sys/Dbg.h index 3a1d1ea771..96bfb098f0 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/Dbg.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/Dbg.h @@ -27,6 +27,7 @@ #pragma once #include "config/Exports.h" +#include "config/disable_compiler_warnings.h" // A "debug" build has debugging symbols, detailed call stacks, minimal optimization, STL validation, etc. // A "release" build is likely to "run fast" and be "shipped;" it might lack much of what is in a "debug" build. @@ -95,12 +96,7 @@ #include #include #include - -#if defined(__sgi) || defined(__sgi__) -# include -#else -# include -#endif +#include namespace sys { diff --git a/externals/coda-oss/modules/c++/sys/include/sys/Err.h b/externals/coda-oss/modules/c++/sys/include/sys/Err.h index 161c27618a..c7163f35bd 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/Err.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/Err.h @@ -168,7 +168,7 @@ struct SocketErr : public Err } //! Redefined for socket errors - virtual int getLast() const; + virtual int getLast() const override; }; diff --git a/externals/coda-oss/modules/c++/sys/include/sys/Exec.h b/externals/coda-oss/modules/c++/sys/include/sys/Exec.h index 27eeaedde6..baee2e581e 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/Exec.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/Exec.h @@ -62,7 +62,7 @@ class Exec : public sys::Runnable /*! * Execute a command */ - virtual void run() + virtual void run() override { if (::system(mCmd.c_str()) == -1) { @@ -96,7 +96,7 @@ struct ExecPipe : Exec } //! start the child process and connect the pipe - virtual void run() + virtual void run() override { mOutStream = openPipe(mCmd, "r"); if (mOutStream == nullptr) diff --git a/externals/coda-oss/modules/c++/sys/include/sys/File.h b/externals/coda-oss/modules/c++/sys/include/sys/File.h index c0ae19f063..0eacf0e320 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/File.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/File.h @@ -20,15 +20,25 @@ * */ -#ifndef __SYS_FILE_H__ -#define __SYS_FILE_H__ +#ifndef CODA_OSS_sys_File_h_INCLUDED_ +#define CODA_OSS_sys_File_h_INCLUDED_ +#pragma once + +#include +#include +#include +#include + +#include +#include #include "sys/Conf.h" #include "sys/SystemException.h" #include "sys/Path.h" #include "sys/filesystem.h" +#include "config/Exports.h" -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 # define _SYS_SEEK_CUR FILE_CURRENT # define _SYS_SEEK_SET FILE_BEGIN # define _SYS_SEEK_END FILE_END @@ -68,7 +78,7 @@ typedef int _SYS_HANDLE_TYPE; namespace sys { -struct File +struct CODA_OSS_API File { enum { @@ -99,12 +109,22 @@ struct File { create(path.getPath(), accessFlags, creationFlags); } + File(std::nothrow_t, const coda_oss::filesystem::path& path, + int accessFlags = READ_ONLY, int creationFlags = EXISTING) noexcept // caller MUST check isOpen() + { + create(std::nothrow, path, accessFlags, creationFlags); + } File(const Path& parent, std::string name, int accessFlags = READ_ONLY, int creationFlags = EXISTING) { create(parent.join(name).getPath(), accessFlags, creationFlags); } + File(std::nothrow_t, const coda_oss::filesystem::path& parent, const coda_oss::filesystem::path& name, + int accessFlags = READ_ONLY, int creationFlags = EXISTING) noexcept // caller MUST check isOpen() + { + create(std::nothrow, parent / name, accessFlags, creationFlags); + } /*! * Constructor. Initializes to a file. @@ -127,6 +147,11 @@ struct File close(); } + File(const File&) = default; + File& operator=(const File&) = default; + File(File&&) = default; + File& operator=(File&&) = default; + /*! * Is the file open? * \return true if open, false if invalid handle @@ -161,8 +186,13 @@ struct File * \param accessFlags File access flags * \param creationFlags File creation flags */ - void create(const std::string& str, int accessFlags, - int creationFlags); + void create(const std::string& str, int accessFlags, int creationFlags); + void create(std::nothrow_t, const coda_oss::filesystem::path& path, + int accessFlags, int creationFlags) // caller MUST check isOpen() + { + mHandle = createFile(path, accessFlags, creationFlags); + mPath = path.string(); + } /*! * Read from the File into a buffer 'size' bytes. @@ -234,10 +264,35 @@ struct File protected: _SYS_HANDLE_TYPE mHandle = SYS_INVALID_HANDLE; std::string mPath; + + static _SYS_HANDLE_TYPE createFile(const coda_oss::filesystem::path&, int accessFlags, int creationFlags) noexcept; }; -} +// These routines use sys::expandEnvironmentVariables() if the initial open attempt fails. +CODA_OSS_API File make_File(const coda_oss::filesystem::path&, int accessFlags = File::READ_ONLY, int creationFlags = File::EXISTING); +CODA_OSS_API File make_File(const coda_oss::filesystem::path& parent, const coda_oss::filesystem::path& name, + int accessFlags = File::READ_ONLY, int creationFlags = File::EXISTING); + + +// Call sys::expandEnvironmentVariables() if the initial fopen() fails. +CODA_OSS_API FILE* fopen(const coda_oss::filesystem::path&, const std::string& mode); +CODA_OSS_API int open(const coda_oss::filesystem::path&, int flags); +CODA_OSS_API int open(const coda_oss::filesystem::path&, int flags, int mode); +CODA_OSS_API int close(int fd); // needed to close a FD from open() +#ifdef _WIN32 +#define CODA_OSS_stat _stat +#else +#define CODA_OSS_stat stat #endif +// Call sys::expandEnvironmentVariables() if the initial stat() attempt fails. +CODA_OSS_API int stat(const coda_oss::filesystem::path&, struct CODA_OSS_stat &buffer); + +// Call sys::expandEnvironmentVariables() if the initial open attempt fails. +CODA_OSS_API std::ifstream make_ifstream(const coda_oss::filesystem::path&, std::ios_base::openmode mode = std::ios_base::in); // https://en.cppreference.com/w/cpp/io/basic_ifstream/basic_ifstream +CODA_OSS_API void open(std::ifstream&, const coda_oss::filesystem::path&, std::ios_base::openmode mode = std::ios_base::in); // https://en.cppreference.com/w/cpp/io/basic_ifstream/open + +} +#endif // CODA_OSS_sys_File_h_INCLUDED_ diff --git a/externals/coda-oss/modules/c++/sys/include/sys/FileFinder.h b/externals/coda-oss/modules/c++/sys/include/sys/FileFinder.h index d3ffd5600b..be9ae0bcf8 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/FileFinder.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/FileFinder.h @@ -51,7 +51,7 @@ struct FilePredicate struct ExistsPredicate : FilePredicate { virtual ~ExistsPredicate() = default; - virtual bool operator()(const std::string& entry) const; + virtual bool operator()(const std::string& entry) const override; }; /** @@ -60,7 +60,7 @@ struct ExistsPredicate : FilePredicate struct FileOnlyPredicate: public FilePredicate { virtual ~FileOnlyPredicate() = default; - virtual bool operator()(const std::string& entry) const; + virtual bool operator()(const std::string& entry) const override; }; /** @@ -69,7 +69,7 @@ struct FileOnlyPredicate: public FilePredicate struct DirectoryOnlyPredicate: public FilePredicate { virtual ~DirectoryOnlyPredicate() = default; - virtual bool operator()(const std::string& entry) const; + virtual bool operator()(const std::string& entry) const override; }; /** @@ -78,7 +78,7 @@ struct DirectoryOnlyPredicate: public FilePredicate struct FragmentPredicate : public FilePredicate { FragmentPredicate(const std::string& fragment, bool ignoreCase = true); - bool operator()(const std::string& entry) const; + bool operator()(const std::string& entry) const override; private: std::string mFragment; @@ -96,7 +96,7 @@ struct FragmentPredicate : public FilePredicate struct ExtensionPredicate: public FileOnlyPredicate { ExtensionPredicate(const std::string& ext, bool ignoreCase = true); - bool operator()(const std::string& filename) const; + bool operator()(const std::string& filename) const override; private: std::string mExt; @@ -111,7 +111,7 @@ struct NotPredicate : public FilePredicate NotPredicate(FilePredicate* filter, bool ownIt = false); virtual ~NotPredicate(); - virtual bool operator()(const std::string& entry) const; + virtual bool operator()(const std::string& entry) const override; protected: typedef std::pair PredicatePair; @@ -132,7 +132,7 @@ struct LogicalPredicate : public FilePredicate sys::LogicalPredicate& addPredicate(FilePredicate* filter, bool ownIt = false); - virtual bool operator()(const std::string& entry) const; + virtual bool operator()(const std::string& entry) const override; protected: bool mOrOperator = true; diff --git a/externals/coda-oss/modules/c++/sys/include/sys/LocalDateTime.h b/externals/coda-oss/modules/c++/sys/include/sys/LocalDateTime.h index 5f36e3c58c..5effbcaa69 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/LocalDateTime.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/LocalDateTime.h @@ -39,15 +39,15 @@ class CODA_OSS_API LocalDateTime : public DateTime int mDST; //! @brief Set members from the tm struct value. - virtual void fromMillis(const tm& t); + virtual void fromMillis(const tm& t) override; /** * @brief Set the millis value from the members */ - virtual void toMillis(); + virtual void toMillis() override; // ! Given seconds since the epoch, provides the local time - virtual void getTime(time_t numSecondsSinceEpoch, tm& t) const; + virtual void getTime(time_t numSecondsSinceEpoch, tm& t) const override; public: /*! diff --git a/externals/coda-oss/modules/c++/sys/include/sys/MutexCpp11.h b/externals/coda-oss/modules/c++/sys/include/sys/MutexCpp11.h index 1a3438a7ec..b95738d349 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/MutexCpp11.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/MutexCpp11.h @@ -50,12 +50,12 @@ struct MutexCpp11 final : public MutexInterface /*! * Lock the mutex. */ - virtual void lock(); + virtual void lock() override; /*! * Unlock the mutex. */ - virtual void unlock(); + virtual void unlock() override; /*! * Returns the native type. diff --git a/externals/coda-oss/modules/c++/sys/include/sys/MutexPosix.h b/externals/coda-oss/modules/c++/sys/include/sys/MutexPosix.h index e954c33129..8ffbaf88f0 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/MutexPosix.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/MutexPosix.h @@ -54,12 +54,12 @@ class MutexPosix : public MutexInterface /*! * Lock the mutex. */ - virtual void lock(); + virtual void lock() override; /*! * Unlock the mutex. */ - virtual void unlock(); + virtual void unlock() override; /*! * Returns the native type. diff --git a/externals/coda-oss/modules/c++/sys/include/sys/MutexWin32.h b/externals/coda-oss/modules/c++/sys/include/sys/MutexWin32.h index a9e9bbce50..adc3ac2d38 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/MutexWin32.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/MutexWin32.h @@ -26,7 +26,7 @@ #include "config/Exports.h" -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 #if !defined(USE_NSPR_THREADS) #include "sys/MutexInterface.h" diff --git a/externals/coda-oss/modules/c++/sys/include/sys/OS.h b/externals/coda-oss/modules/c++/sys/include/sys/OS.h index 32cb75d40e..6ea40c83fb 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/OS.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/OS.h @@ -26,7 +26,7 @@ #include "sys/AbstractOS.h" -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 # include "sys/OSWin32.h" namespace sys { @@ -54,7 +54,7 @@ namespace sys //MacOS }; - #if _WIN32 + #ifdef _WIN32 constexpr auto Platform = PlatformType::Windows; #else constexpr auto Platform = PlatformType::Linux; diff --git a/externals/coda-oss/modules/c++/sys/include/sys/OSUnix.h b/externals/coda-oss/modules/c++/sys/include/sys/OSUnix.h index 4253787537..eb1a52dd36 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/OSUnix.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/OSUnix.h @@ -24,7 +24,7 @@ #ifndef __SYS_OS_UNIX_H__ #define __SYS_OS_UNIX_H__ -#if !(defined(WIN32) || defined(_WIN32)) +#ifndef _WIN32 #include "sys/AbstractOS.h" #include "sys/Conf.h" @@ -38,9 +38,9 @@ struct OSUnix final : public AbstractOS OSUnix() = default; virtual ~OSUnix() = default; - virtual std::string getPlatformName() const; + virtual std::string getPlatformName() const override; - virtual std::string getNodeName() const; + virtual std::string getNodeName() const override; /*! * Get the path delimiter for this operating system. @@ -48,7 +48,7 @@ struct OSUnix final : public AbstractOS * For unix it will be one slash / * \return The path delimiter */ - virtual const char* getDelimiter() const + virtual const char* getDelimiter() const override { return "/"; } @@ -64,64 +64,64 @@ struct OSUnix final : public AbstractOS * \param path The path to check for * \return True if it does, false otherwise */ - virtual bool exists(const std::string& path) const; + virtual bool exists(const std::string& path) const override; /*! * Move file with this path name to the newPath * \return True upon success, false if failure */ virtual bool move(const std::string& path, - const std::string& newPath) const; + const std::string& newPath) const override; /*! * Does this path resolve to a file? * \param path The path * \return True if it does, false if not */ - virtual bool isFile(const std::string& path) const; + virtual bool isFile(const std::string& path) const override; /*! * Does this path resolve to a directory? * \param path The path * \return True if it does, false if not */ - virtual bool isDirectory(const std::string& path) const; + virtual bool isDirectory(const std::string& path) const override; - virtual bool makeDirectory(const std::string& path) const; + virtual bool makeDirectory(const std::string& path) const override; - virtual Pid_T getProcessId() const; + virtual Pid_T getProcessId() const override; /*! * Retrieve the current working directory. * \return The current working directory */ - virtual std::string getCurrentWorkingDirectory() const; + virtual std::string getCurrentWorkingDirectory() const override; /*! * Change the current working directory. * \return true if the directory was changed, otherwise false. */ - virtual bool changeDirectory(const std::string& path) const; + virtual bool changeDirectory(const std::string& path) const override; /*! * Get a suitable temporary file name * \return The file name */ virtual std::string getTempName(const std::string& path = ".", - const std::string& prefix = "TMP") const; + const std::string& prefix = "TMP") const override; /*! * Return the size in bytes of a file * \return The file size */ - virtual sys::Off_T getSize(const std::string& path) const; + virtual sys::Off_T getSize(const std::string& path) const override; /** * Returns the last modified time of the file/directory */ - virtual sys::Off_T getLastModifiedTime(const std::string& path) const; + virtual sys::Off_T getLastModifiedTime(const std::string& path) const override; /*! * This is a system independent sleep function. @@ -130,59 +130,59 @@ struct OSUnix final : public AbstractOS * use nanosleep * \param milliseconds The params */ - virtual void millisleep(int milliseconds) const; + virtual void millisleep(int milliseconds) const override; - virtual std::string operator[](const std::string& s) const; + virtual std::string operator[](const std::string& s) const override; /*! * Get an environment variable */ - virtual std::string getEnv(const std::string& s) const; + virtual std::string getEnv(const std::string& s) const override; /*! * Returns true if environment variable is set, false otherwise */ - virtual bool isEnvSet(const std::string& s) const; + virtual bool isEnvSet(const std::string& s) const override; /*! * Set an environment variable */ virtual void setEnv(const std::string& var, const std::string& val, - bool overwrite); + bool overwrite) override; /*! * Unset an environment variable */ - virtual void unsetEnv(const std::string& var); + virtual void unsetEnv(const std::string& var) override; - virtual std::string getDSOSuffix() const; + virtual std::string getDSOSuffix() const override; /*! * \return the number of logical CPUs present on the machine * (includes hyperthreading) */ - virtual size_t getNumCPUs() const; + virtual size_t getNumCPUs() const override; /*! * \return the number of logical CPUs available. This will be * affected by pinning (e.g. numactl/taskset), and will * always be <= getNumCPUs. */ - virtual size_t getNumCPUsAvailable() const; + virtual size_t getNumCPUsAvailable() const override; /*! * \return the number of physical CPUs present on the machine * (excludes hyperthreading) */ - virtual size_t getNumPhysicalCPUs() const; + virtual size_t getNumPhysicalCPUs() const override; /*! * \return the number of physical CPUs available. This will be * affected by pinning (e.g. numactl/taskset), and will * always be <= getNumPhysicalCPUs. */ - virtual size_t getNumPhysicalCPUsAvailable() const; + virtual size_t getNumPhysicalCPUsAvailable() const override; /*! * Divide the available CPUs (pinned with numactl/taskset) into @@ -199,41 +199,41 @@ struct OSUnix final : public AbstractOS * getNumCPUsAvailable() - getNumPhysicalCPUsAvailable(). */ virtual void getAvailableCPUs(std::vector& physicalCPUs, - std::vector& htCPUs) const; + std::vector& htCPUs) const override; /*! * Create a symlink, pathnames can be either absolute or relative */ virtual void createSymlink(const std::string& origPathname, - const std::string& symlinkPathname) const; + const std::string& symlinkPathname) const override; /*! * Remove a symlink, pathname can be absolute or relative */ - virtual void removeSymlink(const std::string& symlinkPathname) const; + virtual void removeSymlink(const std::string& symlinkPathname) const override; /*! * Get the total RAM and available RAM on the system in megabytes */ - virtual void getMemInfo(size_t& totalPhysMem, size_t& freePhysMem) const; + virtual void getMemInfo(size_t& totalPhysMem, size_t& freePhysMem) const override; /*! * Get the absolute path to the current executable */ virtual std::string getCurrentExecutable( - const std::string& argvPathname="") const; + const std::string& argvPathname="") const override; protected: /*! * Remove file with this pathname */ - virtual void removeFile(const std::string& pathname) const; + virtual void removeFile(const std::string& pathname) const override; /*! * Remove directory with this pathname * NOTE: This will throw if the directory is not empty */ - virtual void removeDirectory(const std::string& pathname) const; + virtual void removeDirectory(const std::string& pathname) const override; }; struct DirectoryUnix final : public AbstractDirectory diff --git a/externals/coda-oss/modules/c++/sys/include/sys/OSWin32.h b/externals/coda-oss/modules/c++/sys/include/sys/OSWin32.h index 3e9c53d914..3b7dcd3ced 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/OSWin32.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/OSWin32.h @@ -26,7 +26,7 @@ #include "sys/AbstractOS.h" -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 /*! * \file OSWin32.h diff --git a/externals/coda-oss/modules/c++/sys/include/sys/Process.h b/externals/coda-oss/modules/c++/sys/include/sys/Process.h index 25d86359a6..45800bf2b1 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/Process.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/Process.h @@ -38,7 +38,7 @@ #include "sys/ProcessInterface.h" -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 # include "sys/ProcessWin32.h" namespace sys { diff --git a/externals/coda-oss/modules/c++/sys/include/sys/ProcessInterface.h b/externals/coda-oss/modules/c++/sys/include/sys/ProcessInterface.h index 930a514f9d..a93d3c749d 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/ProcessInterface.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/ProcessInterface.h @@ -60,7 +60,7 @@ template class ProcessInterface : public sys::Runnable virtual void start() = 0; virtual void waitFor() = 0; - virtual void run() = 0; + virtual void run() override = 0; protected: Pid_T mChildProcessID; diff --git a/externals/coda-oss/modules/c++/sys/include/sys/ProcessUnix.h b/externals/coda-oss/modules/c++/sys/include/sys/ProcessUnix.h index 9ae4ce2b8e..fed0a83044 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/ProcessUnix.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/ProcessUnix.h @@ -24,17 +24,7 @@ #ifndef __SYS_PROCESS_UNIX_H__ #define __SYS_PROCESS_UNIX_H__ - -#if defined(__GNUC__) -# if defined(__sgi) || defined(__sgi__) -# ifdef _FIX_BROKEN_HEADERS - typedef long long __int64_t; - typedef __int64_t jid_t; -# endif -# endif -#endif - -#if !(defined(WIN32) || defined(_WIN32)) +#ifndef _WIN32 #include #include @@ -58,8 +48,8 @@ class ProcessUnix : public ProcessInterface< Pid_T > {} virtual ~ProcessUnix() {} - void start(); - void waitFor(); + void start() override; + void waitFor() override; }; } diff --git a/externals/coda-oss/modules/c++/sys/include/sys/ProcessWin32.h b/externals/coda-oss/modules/c++/sys/include/sys/ProcessWin32.h index 9db5383446..d36e06a711 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/ProcessWin32.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/ProcessWin32.h @@ -24,7 +24,7 @@ #ifndef __SYS_PROCESS_WIN32_H__ #define __SYS_PROCESS_WIN32_H__ -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 #include "sys/ProcessInterface.h" #include "sys/Thread.h" diff --git a/externals/coda-oss/modules/c++/sys/include/sys/ScopedCPUAffinityUnix.h b/externals/coda-oss/modules/c++/sys/include/sys/ScopedCPUAffinityUnix.h index 62e7b0ea38..7a349fa787 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/ScopedCPUAffinityUnix.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/ScopedCPUAffinityUnix.h @@ -25,7 +25,7 @@ #include -#if !(defined(WIN32) || defined(_WIN32)) +#ifndef _WIN32 #include #include diff --git a/externals/coda-oss/modules/c++/sys/include/sys/SemaphorePosix.h b/externals/coda-oss/modules/c++/sys/include/sys/SemaphorePosix.h index fc1731d8f0..6afaf6ada0 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/SemaphorePosix.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/SemaphorePosix.h @@ -44,8 +44,8 @@ class SemaphorePosix : public SemaphoreInterface public: SemaphorePosix(unsigned int count = 0); virtual ~SemaphorePosix(); - void wait(); - void signal(); + void wait() override; + void signal() override; sem_t& getNative(); /*! diff --git a/externals/coda-oss/modules/c++/sys/include/sys/SemaphoreWin32.h b/externals/coda-oss/modules/c++/sys/include/sys/SemaphoreWin32.h index baad6f570e..d180feef54 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/SemaphoreWin32.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/SemaphoreWin32.h @@ -26,7 +26,7 @@ #include "config/Exports.h" -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 #if !defined(USE_NSPR_THREADS) diff --git a/externals/coda-oss/modules/c++/sys/include/sys/StopWatch.h b/externals/coda-oss/modules/c++/sys/include/sys/StopWatch.h index ac71fde2e0..0eab55a12a 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/StopWatch.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/StopWatch.h @@ -66,13 +66,13 @@ class RealTimeStopWatch : public StopWatch ~RealTimeStopWatch(); - double start(); + double start() override; - double stop(); + double stop() override; - double pause(); + double pause() override; - void clear(); + void clear() override; }; class CPUStopWatch : public StopWatch @@ -88,13 +88,13 @@ class CPUStopWatch : public StopWatch ~CPUStopWatch(); - double start(); + double start() override; - double stop(); + double stop() override; - double pause(); + double pause() override; - void clear(); + void clear() override; }; } diff --git a/externals/coda-oss/modules/c++/sys/include/sys/ThreadInterface.h b/externals/coda-oss/modules/c++/sys/include/sys/ThreadInterface.h index 70c8d622f0..576f643471 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/ThreadInterface.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/ThreadInterface.h @@ -212,7 +212,7 @@ struct CODA_OSS_API ThreadInterface : public Runnable * This function is called by start if no target is defined, * allowing the implementor to inherit this class directly */ - virtual void run() + virtual void run() override {} /*! diff --git a/externals/coda-oss/modules/c++/sys/include/sys/ThreadPosix.h b/externals/coda-oss/modules/c++/sys/include/sys/ThreadPosix.h index 596a246fcb..5e5efe8c29 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/ThreadPosix.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/ThreadPosix.h @@ -96,7 +96,7 @@ struct ThreadPosix : public ThreadInterface /*! * The startpoint for thread processing */ - virtual void start(); + virtual void start() override; /*! @@ -110,12 +110,12 @@ struct ThreadPosix : public ThreadInterface /*! * Calls the native destroy stuff */ - virtual void kill(); + virtual void kill() override; /*! * Join the pthread */ - virtual void join(); + virtual void join() override; /*! * Calls sched_yield to yield the thread of control diff --git a/externals/coda-oss/modules/c++/sys/include/sys/ThreadWin32.h b/externals/coda-oss/modules/c++/sys/include/sys/ThreadWin32.h index 0b6118f329..4c8cf11a6e 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/ThreadWin32.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/ThreadWin32.h @@ -30,7 +30,7 @@ #include "config/Exports.h" -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 #if !defined(USE_NSPR_THREADS) diff --git a/externals/coda-oss/modules/c++/sys/include/sys/UTCDateTime.h b/externals/coda-oss/modules/c++/sys/include/sys/UTCDateTime.h index 3f58fdaed7..7d4e712078 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/UTCDateTime.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/UTCDateTime.h @@ -41,10 +41,10 @@ class CODA_OSS_API UTCDateTime : public DateTime /** * @brief Set the millis value from the members */ - virtual void toMillis(); + virtual void toMillis() override; //! Given seconds since the epoch, provides the UTC time - virtual void getTime(time_t numSecondsSinceEpoch, tm& t) const; + virtual void getTime(time_t numSecondsSinceEpoch, tm& t) const override; public: /*! diff --git a/externals/coda-oss/modules/c++/sys/include/sys/sys_filesystem.h b/externals/coda-oss/modules/c++/sys/include/sys/sys_filesystem.h index 0cabb1cd32..59df476a5d 100644 --- a/externals/coda-oss/modules/c++/sys/include/sys/sys_filesystem.h +++ b/externals/coda-oss/modules/c++/sys/include/sys/sys_filesystem.h @@ -76,8 +76,17 @@ struct CODA_OSS_API path final // N.B. this is an INCOMPLETE and NON-STANDARD im path(const string_type&); template path(const TSource& source) + { + *this = source; + } + + path& operator=(const path&) = default; + path& operator=(path&&) = default; + template + path& operator=(const TSource& source) { p_ = to_native(source); + return *this; } path& operator/=(const path&); // http://en.cppreference.com/w/cpp/filesystem/path/append diff --git a/externals/coda-oss/modules/c++/sys/source/AbstractOS.cpp b/externals/coda-oss/modules/c++/sys/source/AbstractOS.cpp index 2304f9261a..5494156802 100644 --- a/externals/coda-oss/modules/c++/sys/source/AbstractOS.cpp +++ b/externals/coda-oss/modules/c++/sys/source/AbstractOS.cpp @@ -415,6 +415,12 @@ std::string AbstractOS::getSpecialEnv(const std::string& envVar) const return str::toString(sys::DateTime::getEpochSeconds()); } + if (envVar == "OSTYPE") + { + // TODO: Mac + return sys::Platform == sys::PlatformType::Linux ? " linux-gnu" : "Windows"; + } + if (envVar == "OSTYPE") { // TODO: Mac diff --git a/externals/coda-oss/modules/c++/sys/source/DLLUnix.cpp b/externals/coda-oss/modules/c++/sys/source/DLLUnix.cpp index 2936e27cbd..a0bb26ecfb 100644 --- a/externals/coda-oss/modules/c++/sys/source/DLLUnix.cpp +++ b/externals/coda-oss/modules/c++/sys/source/DLLUnix.cpp @@ -21,7 +21,7 @@ */ -#if !(defined(WIN32) || defined(_WIN32)) +#ifndef _WIN32 #include "sys/DLL.h" diff --git a/externals/coda-oss/modules/c++/sys/source/DLLWin32.cpp b/externals/coda-oss/modules/c++/sys/source/DLLWin32.cpp index 17e9933aff..d3d6ff48ba 100644 --- a/externals/coda-oss/modules/c++/sys/source/DLLWin32.cpp +++ b/externals/coda-oss/modules/c++/sys/source/DLLWin32.cpp @@ -21,7 +21,7 @@ */ -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 #include "sys/DLL.h" diff --git a/externals/coda-oss/modules/c++/sys/source/DateTime.cpp b/externals/coda-oss/modules/c++/sys/source/DateTime.cpp index 2b701af9f8..9aaa96a7bf 100644 --- a/externals/coda-oss/modules/c++/sys/source/DateTime.cpp +++ b/externals/coda-oss/modules/c++/sys/source/DateTime.cpp @@ -350,7 +350,7 @@ char* strptime(const char *buf, const char *fmt, struct tm& tm, double& millis) // LINTED functional specification return ((char *) bp); -}; +} } void sys::DateTime::fromMillis() diff --git a/externals/coda-oss/modules/c++/sys/source/ErrUnix.cpp b/externals/coda-oss/modules/c++/sys/source/ErrUnix.cpp index 6255385988..f2db39499c 100644 --- a/externals/coda-oss/modules/c++/sys/source/ErrUnix.cpp +++ b/externals/coda-oss/modules/c++/sys/source/ErrUnix.cpp @@ -21,7 +21,7 @@ */ -#if !(defined(WIN32) || defined(_WIN32)) +#ifndef _WIN32 #include "sys/Err.h" diff --git a/externals/coda-oss/modules/c++/sys/source/ErrWin32.cpp b/externals/coda-oss/modules/c++/sys/source/ErrWin32.cpp index 9e1fbad151..bac96d0af3 100644 --- a/externals/coda-oss/modules/c++/sys/source/ErrWin32.cpp +++ b/externals/coda-oss/modules/c++/sys/source/ErrWin32.cpp @@ -21,7 +21,7 @@ */ -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 #include #include "sys/Err.h" diff --git a/externals/coda-oss/modules/c++/sys/source/ExecUnix.cpp b/externals/coda-oss/modules/c++/sys/source/ExecUnix.cpp index 71580aeaa8..6a5f20912f 100644 --- a/externals/coda-oss/modules/c++/sys/source/ExecUnix.cpp +++ b/externals/coda-oss/modules/c++/sys/source/ExecUnix.cpp @@ -21,7 +21,7 @@ */ -#if !(defined(WIN32) || defined(_WIN32)) +#ifndef _WIN32 #include #include diff --git a/externals/coda-oss/modules/c++/sys/source/ExecWin32.cpp b/externals/coda-oss/modules/c++/sys/source/ExecWin32.cpp index 1d1268d392..86bfa17cdc 100644 --- a/externals/coda-oss/modules/c++/sys/source/ExecWin32.cpp +++ b/externals/coda-oss/modules/c++/sys/source/ExecWin32.cpp @@ -21,7 +21,7 @@ */ -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 #include #include diff --git a/externals/coda-oss/modules/c++/sys/source/File.cpp b/externals/coda-oss/modules/c++/sys/source/File.cpp new file mode 100644 index 0000000000..82fe2ab8ab --- /dev/null +++ b/externals/coda-oss/modules/c++/sys/source/File.cpp @@ -0,0 +1,238 @@ +/* ========================================================================= + * This file is part of sys-c++ + * ========================================================================= + * + * (C) Copyright 2004 - 2014, MDA Information Systems LLC + * (C) Copyright 2023, Maxar Technologies, Inc. + * + * sys-c++ is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; If not, + * see . + * + */ + +#include "sys/File.h" + +#include + +#ifdef _WIN32 +#include +#endif + +#include "config/compiler_extensions.h" +#include "sys/Path.h" +#include "str/Manip.h" + +sys::File sys::make_File(const coda_oss::filesystem::path& path, int accessFlags, int creationFlags) +{ + sys::File retval(std::nothrow, path, accessFlags, creationFlags); + if (retval.isOpen()) + { + return retval; + } + + const auto checkIfExists = (creationFlags & sys::File::EXISTING) == sys::File::EXISTING; + auto expanded = sys::Path::expandEnvironmentVariables(path.string(), checkIfExists); + if (expanded.empty()) + { + expanded = path.string(); // Throw exception with non-empty path. + } + return sys::File(expanded, accessFlags, creationFlags); +} + +sys::File sys::make_File(const coda_oss::filesystem::path& parent, const coda_oss::filesystem::path& name, + int accessFlags, int creationFlags) +{ + sys::File retval(std::nothrow, parent, name, accessFlags, creationFlags); + if (retval.isOpen()) + { + return retval; + } + + const auto expanded_parent = sys::Path::expandEnvironmentVariables(parent.string(), coda_oss::filesystem::file_type::directory); + // 'name' probably won't work without 'parent' so no need to checkIfExists + const auto expanded_name = sys::Path::expandEnvironmentVariables(name.string(), false /*checkIfExists*/); + + // let the File constructor deal with combining the expanded paths as well as checking for existence. + return sys::File(expanded_parent, expanded_name, accessFlags, creationFlags); +} + +#ifdef _WIN32 +// '...': This function or variable may be unsafe. Consider using _sopen_s instead. +static FILE* fopen_(const std::string& fname, const std::string& mode) +{ + FILE* retval = nullptr; + const auto result = fopen_s(&retval, fname.c_str(), mode.c_str()); + if (result != 0) // "Zero if successful; ..." + { + return nullptr; + } + return retval; +} +#else +static inline FILE* fopen_(const std::string& fname, const std::string& mode) +{ + return fopen(fname.c_str(), mode.c_str()); +} +#endif + +FILE* sys::fopen(const coda_oss::filesystem::path& fname, const std::string& mode) +{ + // Call sys::expandEnvironmentVariables() if the initial fopen() fails. + auto retval = fopen_(fname.string(), mode); + if (retval != nullptr) + { + return retval; + } + + const auto r_pos = mode.find('r'); + const auto checkIfExists = r_pos != mode.npos; + const auto expanded = sys::Path::expandEnvironmentVariables(fname.string(), checkIfExists); + if (expanded.empty()) + { + return nullptr; // no need to even try fopen() + } + return fopen_(expanded, mode); +} + +#ifdef _WIN32 +#define CODA_OSS_open ::_open +#else +#define CODA_OSS_open ::open +#endif + +static inline int open_(const std::string& pathname, int flags) +{ + const auto p = pathname.c_str(); + CODA_OSS_disable_warning_push + #ifdef _MSC_VER + #pragma warning(disable: 4996) // '...': This function or variable may be unsafe. Consider using _sopen_s instead. + #endif + return CODA_OSS_open(p, flags); + CODA_OSS_disable_warning_pop +} +int sys::open(const coda_oss::filesystem::path& path, int flags) +{ + // Call sys::expandEnvironmentVariables() if the initial open() fails. + const auto retval = open_(path.string(), flags); + if (retval > -1) // "On error, -1 is returned ..." + { + return retval; + } + + constexpr bool checkIfExists = false; // TODO: look for O_CREAT ? + const auto expanded = sys::Path::expandEnvironmentVariables(path.string(), checkIfExists); + if (expanded.empty()) + { + return retval; // no need to even try another open() + } + return open_(expanded, flags); +} + +static inline int open_(const std::string& pathname, int flags, int mode) +{ + const auto p = pathname.c_str(); + CODA_OSS_disable_warning_push + #ifdef _MSC_VER + #pragma warning(disable: 4996) // '...': This function or variable may be unsafe. Consider using _sopen_s instead. + #endif + return CODA_OSS_open(p, flags, mode); + CODA_OSS_disable_warning_pop +} +int sys::open(const coda_oss::filesystem::path& path, int flags, int mode) +{ + // Call sys::expandEnvironmentVariables() if the initial open() fails. + const auto retval = open_(path.string(), flags, mode); + if (retval > -1) // "On error, -1 is returned ..." + { + return retval; + } + + constexpr bool checkIfExists = false; // TODO: look for O_CREAT ? + const auto expanded = sys::Path::expandEnvironmentVariables(path.string(), checkIfExists); + if (expanded.empty()) + { + return retval; // no need to even try another open() + } + return open_(expanded, flags, mode); +} +#undef CODA_OSS_open + +#ifdef _WIN32 +#define CODA_OSS_close ::_close +#else +#define CODA_OSS_close ::close +#endif +int sys::close(int fd) +{ + return CODA_OSS_close(fd); +} +#undef CODA_OSS_close + +#ifdef _WIN32 +#define CODA_OSS_stat_ ::_stat +#else +#define CODA_OSS_stat_ ::stat +#endif +static inline int stat_(const std::string& pathname, struct CODA_OSS_stat &buffer) +{ + const auto p = pathname.c_str(); + CODA_OSS_disable_warning_push + #ifdef _MSC_VER + #pragma warning(disable: 4996) // '...': This function or variable may be unsafe. Consider using _sopen_s instead. + #endif + return CODA_OSS_stat_(p, &buffer); + CODA_OSS_disable_warning_pop +} +#undef CODA_OSS_stat_ +int sys::stat(const coda_oss::filesystem::path& path, struct CODA_OSS_stat &buffer) +{ + // Call sys::expandEnvironmentVariables() if the initial stat() fails. + const auto retval = stat_(path.string(), buffer); + if (retval > -1) // "On error, -1 is returned ..." + { + return retval; + } + + constexpr bool checkIfExists = true; + const auto expanded = sys::Path::expandEnvironmentVariables(path.string(), checkIfExists); + if (expanded.empty()) + { + return retval; // no need to even try another stat() + } + return stat_(expanded, buffer); +} + +void sys::open(std::ifstream& ifs, const coda_oss::filesystem::path& path, std::ios_base::openmode mode) +{ + // Call sys::expandEnvironmentVariables() if the initial open() fails. + ifs.open(path.string(), mode); + if (ifs.is_open()) + { + return; + } + + const auto checkIfExists = (mode & std::ios_base::in) == std::ios_base::in; + auto expanded = sys::Path::expandEnvironmentVariables(path.string(), checkIfExists); + if (expanded.empty()) + { + expanded = path.string(); // Throw exception with non-empty path. + } + ifs.open(expanded, mode); +} +std::ifstream sys::make_ifstream(const coda_oss::filesystem::path& path, std::ios_base::openmode mode) +{ + std::ifstream retval; + open(retval, path, mode); + return retval; +} diff --git a/externals/coda-oss/modules/c++/sys/source/FileUnix.cpp b/externals/coda-oss/modules/c++/sys/source/FileUnix.cpp index ad9d424169..f046f7db3d 100644 --- a/externals/coda-oss/modules/c++/sys/source/FileUnix.cpp +++ b/externals/coda-oss/modules/c++/sys/source/FileUnix.cpp @@ -22,25 +22,29 @@ #include "sys/File.h" -#if !(defined(WIN32) || defined(_WIN32)) +#ifndef _WIN32 #include #include #include -void sys::File::create(const std::string& str, int accessFlags, - int creationFlags) +_SYS_HANDLE_TYPE sys::File::createFile(const coda_oss::filesystem::path& str_, int accessFlags, int creationFlags) noexcept { + const auto str = str_.string(); + if (accessFlags & sys::File::WRITE_ONLY) creationFlags |= sys::File::TRUNCATE; - mHandle = open(str.c_str(), accessFlags | creationFlags, _SYS_DEFAULT_PERM); - + return open(str.c_str(), accessFlags | creationFlags, _SYS_DEFAULT_PERM); +} +void sys::File::create(const std::string& str, int accessFlags, + int creationFlags) +{ + create(std::nothrow, str, accessFlags, creationFlags); if (mHandle < 0) { - throw sys::SystemException(Ctxt(FmtX("Error opening file [%d]: [%s]", - mHandle, str.c_str()))); + throw sys::SystemException(Ctxt( + FmtX("Error opening file [%d]: [%s]", mHandle, str.c_str()))); } - mPath = str; } void sys::File::readInto(void* buffer, Size_T size) diff --git a/externals/coda-oss/modules/c++/sys/source/FileWin32.cpp b/externals/coda-oss/modules/c++/sys/source/FileWin32.cpp index 6e104aef79..1b60a02010 100644 --- a/externals/coda-oss/modules/c++/sys/source/FileWin32.cpp +++ b/externals/coda-oss/modules/c++/sys/source/FileWin32.cpp @@ -20,16 +20,16 @@ * */ -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 #include #include #include "sys/File.h" -void sys::File::create(const std::string& str, - int accessFlags, - int creationFlags) +_SYS_HANDLE_TYPE sys::File::createFile(const coda_oss::filesystem::path& str_, int accessFlags, int creationFlags) noexcept { + const auto str = str_.string(); + // If the truncate bit is on AND the file does exist, // we need to set the mode to TRUNCATE_EXISTING if ((creationFlags & sys::File::TRUNCATE) && sys::OS().exists(str) ) @@ -43,18 +43,24 @@ void sys::File::create(const std::string& str, const auto dwDesiredAccess = static_cast(accessFlags); const auto dwCreationDisposition = static_cast(creationFlags); - mHandle = CreateFile(str.c_str(), + return CreateFile(str.c_str(), dwDesiredAccess, FILE_SHARE_READ, nullptr /*lpSecurityAttributes*/, dwCreationDisposition, FILE_ATTRIBUTE_NORMAL, static_cast(0) /*hTemplateFile*/); +} +void sys::File::create(const std::string& str, + int accessFlags, + int creationFlags) +{ + create(std::nothrow, str, accessFlags, creationFlags); if (mHandle == INVALID_HANDLE_VALUE) { - throw sys::SystemException(Ctxt(FmtX("Error opening file: [%s]", str.c_str()))); + throw sys::SystemException( + Ctxt(FmtX("Error opening file: [%s]", str.c_str()))); } - mPath = str; } void sys::File::readInto(void* buffer, size_t size) diff --git a/externals/coda-oss/modules/c++/sys/source/MutexWin32.cpp b/externals/coda-oss/modules/c++/sys/source/MutexWin32.cpp index 69c7023ae9..62786f0ee0 100644 --- a/externals/coda-oss/modules/c++/sys/source/MutexWin32.cpp +++ b/externals/coda-oss/modules/c++/sys/source/MutexWin32.cpp @@ -21,7 +21,7 @@ */ -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 #if !defined(USE_NSPR_THREADS) diff --git a/externals/coda-oss/modules/c++/sys/source/OSUnix.cpp b/externals/coda-oss/modules/c++/sys/source/OSUnix.cpp index 633c6b4d62..e44d9a3801 100644 --- a/externals/coda-oss/modules/c++/sys/source/OSUnix.cpp +++ b/externals/coda-oss/modules/c++/sys/source/OSUnix.cpp @@ -32,7 +32,7 @@ #include "sys/Conf.h" -#if !(defined(WIN32) || defined(_WIN32)) +#ifndef _WIN32 #include diff --git a/externals/coda-oss/modules/c++/sys/source/OSWin32.cpp b/externals/coda-oss/modules/c++/sys/source/OSWin32.cpp index 2d7f30a2e4..9fe5e7f153 100644 --- a/externals/coda-oss/modules/c++/sys/source/OSWin32.cpp +++ b/externals/coda-oss/modules/c++/sys/source/OSWin32.cpp @@ -26,7 +26,7 @@ #include #include -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 #include "sys/OSWin32.h" #include "sys/File.h" @@ -148,11 +148,15 @@ bool sys::OSWin32::isFile(const std::string& path) const // 2) Not Directory // 3) Not Archive - we aren't doing that... const DWORD what = GetFileAttributes(path.c_str()); - return (what != INVALID_FILE_ATTRIBUTES && - !(what & FILE_ATTRIBUTE_DIRECTORY)); + if (what == INVALID_FILE_ATTRIBUTES) // "if the function fails, the return value is INVALID_FILE_ATTRIBUTES." + { + //const auto dwError = GetLastError(); + return false; + } + const auto fileAttributeDirectory = (what & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY; + return !fileAttributeDirectory; } - bool sys::OSWin32::isDirectory(const std::string& path) const { const DWORD what = GetFileAttributes(path.c_str()); @@ -183,7 +187,7 @@ bool sys::OSWin32::changeDirectory(const std::string& path) const std::string sys::OSWin32::getTempName(const std::string& path, const std::string& prefix) const { - char buffer[MAX_PATH]; + char buffer[MAX_PATH]{}; if (GetTempFileName(path.c_str(), prefix.c_str(), 0, buffer) == 0) diff --git a/externals/coda-oss/modules/c++/sys/source/Path.cpp b/externals/coda-oss/modules/c++/sys/source/Path.cpp index 3393f60e0b..c466438543 100644 --- a/externals/coda-oss/modules/c++/sys/source/Path.cpp +++ b/externals/coda-oss/modules/c++/sys/source/Path.cpp @@ -177,7 +177,7 @@ std::string Path::absolutePath(const std::string& path) bool Path::isAbsolutePath(const std::string& path) { -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 return !Path::splitDrive(path).first.empty(); #else return (!path.empty() && path[0] == Path::delimiter()[0]); @@ -232,7 +232,7 @@ std::string Path::basename(const std::string& path, bool removeExt) Path::StringPair Path::splitDrive(const std::string& path) { -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 std::string::size_type pos = path.find(":"); #else std::string::size_type pos = std::string::npos; @@ -245,7 +245,7 @@ Path::StringPair Path::splitDrive(const std::string& path) const char* Path::delimiter() { -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 return "\\"; #else return "/"; @@ -254,7 +254,7 @@ const char* Path::delimiter() const char* Path::separator() { -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 return ";"; #else return ":"; @@ -663,8 +663,7 @@ static std::vector expand_components(const separated_path& c std::vector retval; for (const auto& component : components.components()) { - expanded_component e{component}; - e.value = expandEnvironmentVariable(component); + expanded_component e{component, expandEnvironmentVariable(component)}; assert(e.value.size() >= 1); // the component itself should always be there retval.push_back(std::move(e)); diff --git a/externals/coda-oss/modules/c++/sys/source/ProcessUnix.cpp b/externals/coda-oss/modules/c++/sys/source/ProcessUnix.cpp index d31c20ae56..25acd65262 100644 --- a/externals/coda-oss/modules/c++/sys/source/ProcessUnix.cpp +++ b/externals/coda-oss/modules/c++/sys/source/ProcessUnix.cpp @@ -21,7 +21,7 @@ */ -#if !(defined(WIN32) || defined(_WIN32)) +#ifndef _WIN32 #include #include "sys/ProcessUnix.h" #include diff --git a/externals/coda-oss/modules/c++/sys/source/ProcessWin32.cpp b/externals/coda-oss/modules/c++/sys/source/ProcessWin32.cpp index 79145791bd..52c57fa17b 100644 --- a/externals/coda-oss/modules/c++/sys/source/ProcessWin32.cpp +++ b/externals/coda-oss/modules/c++/sys/source/ProcessWin32.cpp @@ -21,7 +21,7 @@ */ -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 #include "sys/Process.h" #include "sys/Thread.h" diff --git a/externals/coda-oss/modules/c++/sys/source/ScopedCPUAffinityUnix.cpp b/externals/coda-oss/modules/c++/sys/source/ScopedCPUAffinityUnix.cpp index 1c88df2cc8..f56e45e779 100644 --- a/externals/coda-oss/modules/c++/sys/source/ScopedCPUAffinityUnix.cpp +++ b/externals/coda-oss/modules/c++/sys/source/ScopedCPUAffinityUnix.cpp @@ -20,7 +20,7 @@ * */ -#if !(defined(WIN32) || defined(_WIN32)) +#ifndef _WIN32 #include diff --git a/externals/coda-oss/modules/c++/sys/source/SemaphoreWin32.cpp b/externals/coda-oss/modules/c++/sys/source/SemaphoreWin32.cpp index a4a555752d..fcfd8255bf 100644 --- a/externals/coda-oss/modules/c++/sys/source/SemaphoreWin32.cpp +++ b/externals/coda-oss/modules/c++/sys/source/SemaphoreWin32.cpp @@ -21,7 +21,7 @@ */ -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 #if !defined(USE_NSPR_THREADS) diff --git a/externals/coda-oss/modules/c++/sys/source/ThreadPosix.cpp b/externals/coda-oss/modules/c++/sys/source/ThreadPosix.cpp index 07f7f98676..4892ab3961 100644 --- a/externals/coda-oss/modules/c++/sys/source/ThreadPosix.cpp +++ b/externals/coda-oss/modules/c++/sys/source/ThreadPosix.cpp @@ -24,7 +24,7 @@ #if CODA_OSS_POSIX_SOURCE -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 # define SIGKILL 0 #endif void sys::ThreadPosix::start() diff --git a/externals/coda-oss/modules/c++/sys/source/ThreadWin32.cpp b/externals/coda-oss/modules/c++/sys/source/ThreadWin32.cpp index 347e0b558e..43ee313b65 100644 --- a/externals/coda-oss/modules/c++/sys/source/ThreadWin32.cpp +++ b/externals/coda-oss/modules/c++/sys/source/ThreadWin32.cpp @@ -21,7 +21,7 @@ */ -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 #if !defined(USE_NSPR_THREADS) #include "sys/ThreadWin32.h" diff --git a/externals/coda-oss/modules/c++/sys/tests/MutexTest.cpp b/externals/coda-oss/modules/c++/sys/tests/MutexTest.cpp index a3dc1a0540..b30c51f791 100644 --- a/externals/coda-oss/modules/c++/sys/tests/MutexTest.cpp +++ b/externals/coda-oss/modules/c++/sys/tests/MutexTest.cpp @@ -42,7 +42,7 @@ std::string itos (int arg) { class DemoThread : public Thread { protected: - void run() { + void run() override { for (int i = 0 ; i < THREAD_LOOPS ; i++ ) { mutexCout.lock(); std::cout << getName() + " is running" << std::endl; diff --git a/externals/coda-oss/modules/c++/sys/tests/ReadWriteMutexTest.cpp b/externals/coda-oss/modules/c++/sys/tests/ReadWriteMutexTest.cpp index 1b8227fb68..262d3424cf 100644 --- a/externals/coda-oss/modules/c++/sys/tests/ReadWriteMutexTest.cpp +++ b/externals/coda-oss/modules/c++/sys/tests/ReadWriteMutexTest.cpp @@ -54,7 +54,7 @@ std::string BUFFER[1]; class ReadWriteThread : public Thread { protected: - void run() { + void run() override { for(int i=0; i < 5; ++i) { diff --git a/externals/coda-oss/modules/c++/sys/tests/ReentrantTest.cpp b/externals/coda-oss/modules/c++/sys/tests/ReentrantTest.cpp index f61823ed68..8955914862 100644 --- a/externals/coda-oss/modules/c++/sys/tests/ReentrantTest.cpp +++ b/externals/coda-oss/modules/c++/sys/tests/ReentrantTest.cpp @@ -29,7 +29,7 @@ class NoteThread : public Thread public: NoteThread() { std::cout << "Constructed a thread" << std::endl;} - void run() + void run() override { std::cout << "Running a thread" << std::endl;} ~NoteThread() diff --git a/externals/coda-oss/modules/c++/sys/tests/ThreadFreeTest.cpp b/externals/coda-oss/modules/c++/sys/tests/ThreadFreeTest.cpp index 9593239178..63e54d72a0 100644 --- a/externals/coda-oss/modules/c++/sys/tests/ThreadFreeTest.cpp +++ b/externals/coda-oss/modules/c++/sys/tests/ThreadFreeTest.cpp @@ -38,7 +38,7 @@ class MyRunTask : public Runnable { } - virtual void run() + virtual void run() override { result = 1; } diff --git a/externals/coda-oss/modules/c++/sys/tests/ThreadTest4.cpp b/externals/coda-oss/modules/c++/sys/tests/ThreadTest4.cpp index b33c20055c..f9b91cd1c1 100644 --- a/externals/coda-oss/modules/c++/sys/tests/ThreadTest4.cpp +++ b/externals/coda-oss/modules/c++/sys/tests/ThreadTest4.cpp @@ -35,7 +35,7 @@ class Getter : public sys::Runnable CODA_OSS_disable_warning_push CODA_OSS_DISABLE_UNREACHABLE_CODE - virtual void run() + virtual void run() override { for (int i = 0; i < 250; i++) { @@ -71,7 +71,7 @@ class Putter : public sys::Runnable CODA_OSS_disable_warning_push CODA_OSS_DISABLE_UNREACHABLE_CODE - virtual void run() + virtual void run() override { std::cout << "Putter::run: " << std::endl; @@ -145,4 +145,4 @@ int main() cout << "Unknown exception" << endl; } return 0; -}; +} diff --git a/externals/coda-oss/modules/c++/sys/tests/ThreadTest5.cpp b/externals/coda-oss/modules/c++/sys/tests/ThreadTest5.cpp index 60fd681e2c..664109b0db 100644 --- a/externals/coda-oss/modules/c++/sys/tests/ThreadTest5.cpp +++ b/externals/coda-oss/modules/c++/sys/tests/ThreadTest5.cpp @@ -39,7 +39,7 @@ class TestThread : public Thread delete mVal; } - void run() + void run() override { cout << "mVal: " << *mVal << endl; } @@ -85,4 +85,4 @@ int main() cout << "Unknown exception" << endl; } return 0; -}; +} diff --git a/externals/coda-oss/modules/c++/sys/unittests/test_NaN_testing.cpp b/externals/coda-oss/modules/c++/sys/unittests/test_NaN_testing.cpp index b651af471c..82df405095 100644 --- a/externals/coda-oss/modules/c++/sys/unittests/test_NaN_testing.cpp +++ b/externals/coda-oss/modules/c++/sys/unittests/test_NaN_testing.cpp @@ -47,6 +47,7 @@ TEST_CASE(testNaNIsNotAlmostEqualToNumber) TEST_ASSERT_ALMOST_EQ_EPS(std::numeric_limits::quiet_NaN(), 5, 3); */ + TEST_ASSERT_TRUE(true); // need to use hidden "testName" parameter } TEST_CASE(testIsNaN) diff --git a/externals/coda-oss/modules/c++/sys/unittests/test_atomic_counter.cpp b/externals/coda-oss/modules/c++/sys/unittests/test_atomic_counter.cpp index fa56995992..8420b580fb 100644 --- a/externals/coda-oss/modules/c++/sys/unittests/test_atomic_counter.cpp +++ b/externals/coda-oss/modules/c++/sys/unittests/test_atomic_counter.cpp @@ -123,7 +123,7 @@ struct IncrementAtomicCounterT final : public sys::Runnable { } - virtual void run() + virtual void run() override { for (size_t ii = 0; ii < mNumIncrements; ++ii) { @@ -210,7 +210,7 @@ struct DecrementAtomicCounterT final : public sys::Runnable { } - virtual void run() + virtual void run() override { for (size_t ii = 0; ii < mNumDecrements; ++ii) { diff --git a/externals/coda-oss/modules/c++/sys/unittests/test_os.cpp b/externals/coda-oss/modules/c++/sys/unittests/test_os.cpp index 7579d6be7b..af07859a3f 100644 --- a/externals/coda-oss/modules/c++/sys/unittests/test_os.cpp +++ b/externals/coda-oss/modules/c++/sys/unittests/test_os.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include "TestCase.h" void createFile(const std::string& pathname) @@ -162,7 +163,7 @@ TEST_CASE(testSplitEnv) std::vector paths; bool result = os.splitEnv(pathEnvVar, paths); TEST_ASSERT_TRUE(result); - TEST_ASSERT_GREATER(paths.size(), static_cast(0)); + TEST_ASSERT_FALSE(paths.empty()); for (const auto& path : paths) { TEST_ASSERT_TRUE(std::filesystem::exists(path)); @@ -183,7 +184,7 @@ TEST_CASE(testSplitEnv) paths.clear(); result = os.splitEnv(pathEnvVar, paths, std::filesystem::file_type::directory); TEST_ASSERT_TRUE(result); - TEST_ASSERT_GREATER(paths.size(), static_cast(0)); + TEST_ASSERT_FALSE(paths.empty()); paths.clear(); result = os.splitEnv(pathEnvVar, paths, std::filesystem::file_type::regular); TEST_ASSERT_FALSE(result); @@ -293,7 +294,7 @@ TEST_CASE(testBacktrace) size_t expected = 0; - size_t expected_other = 0; + //size_t expected_other = 0; auto version_sys_backtrace_ = version::sys::backtrace; // "Conditional expression is constant" if (version_sys_backtrace_ >= 20210216L) { @@ -301,19 +302,19 @@ TEST_CASE(testBacktrace) #if _WIN32 constexpr auto frames_size_RELEASE = 2; - constexpr auto frames_size_RELEASE_other = frames_size_RELEASE; + //constexpr auto frames_size_RELEASE_other = frames_size_RELEASE; constexpr auto frames_size_DEBUG = 14; - constexpr auto frames_size_DEBUG_other = frames_size_DEBUG + 1; // 15 + //constexpr auto frames_size_DEBUG_other = frames_size_DEBUG + 1; // 15 #elif defined(__GNUC__) constexpr auto frames_size_RELEASE = 6; - constexpr auto frames_size_RELEASE_other = frames_size_RELEASE + 1; // 7 + //constexpr auto frames_size_RELEASE_other = frames_size_RELEASE + 1; // 7 constexpr auto frames_size_DEBUG = frames_size_RELEASE + 4; // 10 - constexpr auto frames_size_DEBUG_other = frames_size_DEBUG; + //constexpr auto frames_size_DEBUG_other = frames_size_DEBUG; #else #error "CODA_OSS_sys_Backtrace inconsistency." #endif expected = sys::debug_build() ? frames_size_DEBUG : frames_size_RELEASE; - expected_other = sys::debug_build() ? frames_size_DEBUG_other : frames_size_RELEASE_other; + //expected_other = sys::debug_build() ? frames_size_DEBUG_other : frames_size_RELEASE_other; } else { @@ -389,17 +390,127 @@ TEST_CASE(testFsFileSize) const sys::OS os; { const std::filesystem::path argv0(os.getSpecialEnv("ARGV0")); - const auto size = file_size(argv0); - TEST_ASSERT_GREATER(size, static_cast(0)); + const int64_t size = static_cast(file_size(argv0)); + TEST_ASSERT_GREATER(size, 0); } { // We always have sys::filesystem, even if it's not used. const sys::filesystem::path argv0(os.getSpecialEnv("ARGV0")); - const auto size = file_size(argv0); - TEST_ASSERT_GREATER(size, static_cast(0)); + const int64_t size = static_cast(file_size(argv0)); + TEST_ASSERT_GREATER(size, 0); } } +static sys::File makeFile_() +{ +#ifdef _WIN32 + static const std::filesystem::path name("explorer.exe"); + return sys::make_File("%SystemRoot%" / name); + +#else + static const std::filesystem::path dot_cshrc(".cshrc"); + try + { + return sys::make_File("$HOME" / dot_cshrc); + } + catch (const sys::SystemException&) { } // no .cshrc; try .bashrc + + static const std::filesystem::path dot_bashrc(".bashrc"); + return sys::make_File("$HOME" / dot_bashrc); +#endif +} +TEST_CASE(test_makeFile) +{ + auto file = makeFile_(); + TEST_ASSERT_TRUE(file.isOpen()); +} + +static FILE* sys_fopen() +{ + static const std::string mode("r"); + +#ifdef _WIN32 + static const std::filesystem::path name("explorer.exe"); + return sys::fopen("%SystemRoot%" / name, mode); + +#else + static const std::filesystem::path dot_cshrc(".cshrc"); + auto retval = sys::fopen("$HOME" / dot_cshrc, mode); + if (retval != nullptr) + { + return retval; + } + // no .cshrc; try .bashrc + static const std::filesystem::path dot_bashrc(".bashrc"); + return sys::fopen("$HOME" / dot_bashrc, mode); +#endif +} +TEST_CASE(test_sys_fopen) +{ + auto fp = sys_fopen(); + TEST_ASSERT_NOT_NULL(fp); + fclose(fp); +} + +TEST_CASE(test_sys_fopen_failure) +{ + static const std::string mode("r"); + static const std::filesystem::path name("does not exist . txt"); + const auto fp = sys::fopen("$ENV_VAR_NOT_SET" / name, mode); + TEST_ASSERT_NULL(fp); +} + +static int sys_open() +{ + constexpr int flags = 0; + +#ifdef _WIN32 + static const std::filesystem::path name("explorer.exe"); + return sys::open("%SystemRoot%" / name, flags); + +#else + static const std::filesystem::path dot_cshrc(".cshrc"); + auto retval = sys::open("$HOME" / dot_cshrc, flags); + if (retval > -1) + { + return retval; + } + // no .cshrc; try .bashrc + static const std::filesystem::path dot_bashrc(".bashrc"); + return sys::open("$HOME" / dot_bashrc, flags); +#endif +} +TEST_CASE(test_sys_open) +{ + auto fd = sys_open(); + TEST_ASSERT(fd > -1); + sys::close(fd); +} + +static std::ifstream make_ifstream_() +{ +#ifdef _WIN32 + static const std::filesystem::path name("explorer.exe"); + return sys::make_ifstream("%SystemRoot%" / name); + +#else + static const std::filesystem::path dot_cshrc(".cshrc"); + auto retval = sys::make_ifstream("$HOME" / dot_cshrc); + if (retval) + { + return retval; + } + // no .cshrc; try .bashrc + static const std::filesystem::path dot_bashrc(".bashrc"); + return sys::make_ifstream("$HOME" / dot_bashrc); +#endif +} +TEST_CASE(test_make_ifstream) +{ + const auto ifs = make_ifstream_(); + TEST_ASSERT_TRUE(ifs.is_open()); +} + TEST_MAIN( //sys::AbstractOS::setArgvPathname(argv[0]); TEST_CHECK(testRecursiveRemove); @@ -411,4 +522,9 @@ TEST_MAIN( TEST_CHECK(testBacktrace); TEST_CHECK(testSpecialEnvVars); TEST_CHECK(testFsFileSize); -) + TEST_CHECK(test_makeFile); + TEST_CHECK(test_sys_fopen); + TEST_CHECK(test_sys_fopen_failure); + TEST_CHECK(test_sys_open); + TEST_CHECK(test_make_ifstream); + ) diff --git a/externals/coda-oss/modules/c++/sys/unittests/test_path.cpp b/externals/coda-oss/modules/c++/sys/unittests/test_path.cpp index 42e79af8e3..ab838d0275 100644 --- a/externals/coda-oss/modules/c++/sys/unittests/test_path.cpp +++ b/externals/coda-oss/modules/c++/sys/unittests/test_path.cpp @@ -53,7 +53,7 @@ TEST_CASE(testPathMerge) std::vector paths; const auto splitResult = os.splitEnv("PATH", paths); TEST_ASSERT_TRUE(splitResult); - TEST_ASSERT_GREATER(paths.size(), static_cast(0)); + TEST_ASSERT_FALSE(paths.empty()); auto path = find_directory(paths); TEST_ASSERT_TRUE(coda_oss::filesystem::is_directory(path)); @@ -65,7 +65,7 @@ TEST_CASE(testPathMerge) bool isAbsolute; auto components = sys::Path::separate(path, isAbsolute); - TEST_ASSERT_GREATER(components.size(), static_cast(0)); + TEST_ASSERT_FALSE(components.empty()); auto result = sys::Path::merge(components, isAbsolute); TEST_ASSERT_EQ(result, path); TEST_ASSERT_TRUE(coda_oss::filesystem::is_directory(result)); diff --git a/externals/coda-oss/modules/c++/tiff/include/tiff/GenericType.h b/externals/coda-oss/modules/c++/tiff/include/tiff/GenericType.h index 581c06905d..9d5a994ea8 100644 --- a/externals/coda-oss/modules/c++/tiff/include/tiff/GenericType.h +++ b/externals/coda-oss/modules/c++/tiff/include/tiff/GenericType.h @@ -127,7 +127,7 @@ template class Gene * @param output * the output stream to write the member to *****************************************************************/ - virtual void serialize(io::OutputStream& output) + virtual void serialize(io::OutputStream& output) override { output.write((char *)&mData, sizeof(Data_T)); } @@ -139,22 +139,22 @@ template class Gene * @param input * the input stream to read the member from *****************************************************************/ - virtual void deserialize(io::InputStream& input) + virtual void deserialize(io::InputStream& input) override { input.read((char *)&mData, sizeof(Data_T)); } - virtual unsigned char *data() const + virtual unsigned char *data() const override { return (unsigned char *)&mData; } - virtual unsigned short size() const + virtual unsigned short size() const override { return sizeof(mData); } - virtual std::string toString() const + virtual std::string toString() const override { return Strategy_T::toString(mData); } diff --git a/externals/coda-oss/modules/c++/tiff/include/tiff/Header.h b/externals/coda-oss/modules/c++/tiff/include/tiff/Header.h index ee09bc445f..ed9da4f1e9 100644 --- a/externals/coda-oss/modules/c++/tiff/include/tiff/Header.h +++ b/externals/coda-oss/modules/c++/tiff/include/tiff/Header.h @@ -96,7 +96,7 @@ class Header : public io::Serializable * @param output * the stream to write the header to *****************************************************************/ - void serialize(io::OutputStream& output); + void serialize(io::OutputStream& output) override; /** ***************************************************************** @@ -105,7 +105,7 @@ class Header : public io::Serializable * @param input * the stream to read the header from *****************************************************************/ - void deserialize(io::InputStream& input); + void deserialize(io::InputStream& input) override; /** ***************************************************************** diff --git a/externals/coda-oss/modules/c++/tiff/include/tiff/IFD.h b/externals/coda-oss/modules/c++/tiff/include/tiff/IFD.h index bfb8b65556..706309e8f4 100644 --- a/externals/coda-oss/modules/c++/tiff/include/tiff/IFD.h +++ b/externals/coda-oss/modules/c++/tiff/include/tiff/IFD.h @@ -195,7 +195,7 @@ class IFD : public io::Serializable * @param output * the output stream to write the IFD to *****************************************************************/ - void serialize(io::OutputStream& output); + void serialize(io::OutputStream& output) override; /** ***************************************************************** @@ -204,7 +204,7 @@ class IFD : public io::Serializable * @param input * the input stream to read the IFD from *****************************************************************/ - void deserialize(io::InputStream& input); + void deserialize(io::InputStream& input) override; void deserialize(io::InputStream& input, const bool reverseBytes); /** diff --git a/externals/coda-oss/modules/c++/tiff/include/tiff/IFDEntry.h b/externals/coda-oss/modules/c++/tiff/include/tiff/IFDEntry.h index 31ecedddb1..75552676f3 100644 --- a/externals/coda-oss/modules/c++/tiff/include/tiff/IFDEntry.h +++ b/externals/coda-oss/modules/c++/tiff/include/tiff/IFDEntry.h @@ -122,7 +122,7 @@ class IFDEntry : public io::Serializable * @param output * the output stream to write the entry to *****************************************************************/ - void serialize(io::OutputStream& output); + void serialize(io::OutputStream& output) override; /** ***************************************************************** @@ -131,7 +131,7 @@ class IFDEntry : public io::Serializable * @param input * the input stream to read the entry from *****************************************************************/ - void deserialize(io::InputStream& input); + void deserialize(io::InputStream& input) override; void deserialize(io::InputStream& input, const bool reverseBytes); /** diff --git a/externals/coda-oss/modules/c++/tiff/source/ImageWriter.cpp b/externals/coda-oss/modules/c++/tiff/source/ImageWriter.cpp index f4814ec5e5..ed89e6da93 100644 --- a/externals/coda-oss/modules/c++/tiff/source/ImageWriter.cpp +++ b/externals/coda-oss/modules/c++/tiff/source/ImageWriter.cpp @@ -266,7 +266,7 @@ void tiff::ImageWriter::initTiles() void tiff::ImageWriter::initStrips() { - sys::Uint32_T bytesPerLine = mIFD.getImageWidth() * mIFD.getElementSize(); + const sys::Uint32_T bytesPerLine = mIFD.getImageWidth() * mIFD.getElementSize(); sys::Uint32_T stripByteCount = 0; sys::Uint32_T rowsPerStrip = 1; @@ -281,8 +281,8 @@ void tiff::ImageWriter::initStrips() mIFD.addEntry("RowsPerStrip", rowsPerStrip); - sys::Uint32_T length = mIFD.getImageLength(); - sys::Uint32_T stripsPerImage = + const sys::Uint32_T length = mIFD.getImageLength(); + const sys::Uint32_T stripsPerImage = (sys::Uint32_T)floor(static_cast(length + rowsPerStrip - 1) / static_cast(rowsPerStrip)); @@ -314,23 +314,22 @@ void tiff::ImageWriter::initStrips() void tiff::ImageWriter::putTileData(const unsigned char *buffer, sys::Uint32_T numElementsToWrite) { - sys::Uint32_T imageElemWidth = mIFD.getImageWidth(); - sys::Uint32_T imageByteWidth = imageElemWidth * mElementSize; + const sys::Uint32_T imageElemWidth = mIFD.getImageWidth(); + const sys::Uint32_T imageByteWidth = imageElemWidth * mElementSize; - sys::Uint32_T tileElemWidth = *(tiff::GenericType *)(*mTileWidth)[0]; - sys::Uint32_T tileByteWidth = tileElemWidth * mElementSize; + const sys::Uint32_T tileElemWidth = *(tiff::GenericType *)(*mTileWidth)[0]; + const sys::Uint32_T tileByteWidth = tileElemWidth * mElementSize; const auto tileElemLength = *(tiff::GenericType *)(*mTileLength)[0]; // Compute the number of tiles wide the image is. - sys::Uint32_T tilesAcross = (imageElemWidth + tileElemWidth - 1) - / tileElemWidth; + const sys::Uint32_T tilesAcross = (imageElemWidth + tileElemWidth - 1) / tileElemWidth; // Determine how many bytes were used to pad the right edge. - sys::Uint32_T widthPadding = (tileByteWidth * tilesAcross) - imageByteWidth; + const sys::Uint32_T widthPadding = (tileByteWidth * tilesAcross) - imageByteWidth; sys::Uint32_T globalReadOffset = 0; sys::Uint32_T tempBytePosition = mBytePosition; - sys::Uint32_T numBytesToWrite = numElementsToWrite * mElementSize; + const sys::Uint32_T numBytesToWrite = numElementsToWrite * mElementSize; sys::Uint32_T currentNumBytesRead = 0; sys::Uint32_T remainingElementsToWrite = numElementsToWrite; while (remainingElementsToWrite) @@ -344,21 +343,20 @@ void tiff::ImageWriter::putTileData(const unsigned char *buffer, } // Compute the row and tile row. - sys::Uint32_T row = tempBytePosition / imageByteWidth; - sys::Uint32_T tileRow = row / tileElemLength; + const sys::Uint32_T row = tempBytePosition / imageByteWidth; + const sys::Uint32_T tileRow = row / tileElemLength; // Compute the column and tile column. - sys::Uint32_T column = tempBytePosition - (row * imageByteWidth); - sys::Uint32_T tileColumn = column / tileByteWidth; + const sys::Uint32_T column = tempBytePosition - (row * imageByteWidth); + const sys::Uint32_T tileColumn = column / tileByteWidth; // Compute the 1D tile index from the tile row and tile column. - sys::Uint32_T tileIndex = (tileRow * tilesAcross) + tileColumn; + const sys::Uint32_T tileIndex = (tileRow * tilesAcross) + tileColumn; - sys::Uint32_T tileByteCount = *(tiff::GenericType *)(*mTileByteCounts)[tileIndex]; + const sys::Uint32_T tileByteCount = *(tiff::GenericType *)(*mTileByteCounts)[tileIndex]; - sys::Uint32_T rowInTile = row % tileElemLength; - sys::Uint32_T paddedBytes = ((tileColumn + 1) / tilesAcross) - * widthPadding; + const sys::Uint32_T rowInTile = row % tileElemLength; + sys::Uint32_T paddedBytes = ((tileColumn + 1) / tilesAcross) * widthPadding; sys::Uint32_T remainingBytesInTile = tileByteCount - (tileElemLength * paddedBytes) - (rowInTile * (tileByteWidth - paddedBytes) @@ -425,11 +423,11 @@ void tiff::ImageWriter::putTileData(const unsigned char *buffer, sys::Uint32_T imageElemLength = mIFD.getImageLength(); sys::Uint32_T tilesDown = (imageElemLength + tileElemLength - 1) / tileElemLength; - sys::Uint32_T startIndex = (tilesDown - 1) * tilesAcross; - sys::Uint32_T paddingStartLine = imageElemLength % tileElemLength; + const sys::Uint32_T startIndex = (tilesDown - 1) * tilesAcross; + const sys::Uint32_T paddingStartLine = imageElemLength % tileElemLength; if (paddingStartLine) { - sys::Uint32_T paddedLines = tileElemLength - paddingStartLine; + const sys::Uint32_T paddedLines = tileElemLength - paddingStartLine; sys::byte *padBuffer = new sys::byte[paddedLines * tileByteWidth]; memset(padBuffer, 0, paddedLines * tileByteWidth); diff --git a/externals/coda-oss/modules/c++/tiff/source/Utils.cpp b/externals/coda-oss/modules/c++/tiff/source/Utils.cpp index 6e3a5af9cc..9467a08d48 100644 --- a/externals/coda-oss/modules/c++/tiff/source/Utils.cpp +++ b/externals/coda-oss/modules/c++/tiff/source/Utils.cpp @@ -119,7 +119,7 @@ tiff::IFD* tiff::Utils::createGeoTiffIFD(tiff::IFD* ifd) str::toType(geoVals[idx++]->toString()); const std::string valueStr(geoVals[idx++]->toString()); - unsigned short entryType; + unsigned short entryType = tiff::Const::Type::NOTYPE; switch (tiffTagLoc) { case 34736: // GeoDoubleParamsTag diff --git a/externals/coda-oss/modules/c++/types/include/types/RangeList.h b/externals/coda-oss/modules/c++/types/include/types/RangeList.h index 1622124ae3..90c60847d0 100644 --- a/externals/coda-oss/modules/c++/types/include/types/RangeList.h +++ b/externals/coda-oss/modules/c++/types/include/types/RangeList.h @@ -180,7 +180,7 @@ class CODA_OSS_API RangeList /*! * \returns the number ranges in the list */ - size_t getNumRanges() const + size_t getNumRanges() const noexcept { return mRangeList.size(); } @@ -189,12 +189,12 @@ class CODA_OSS_API RangeList * \returns the total number elements as the sum(R.mNumElements) for * all ranges R in the list */ - size_t getTotalNumElements() const; + size_t getTotalNumElements() const noexcept; /*! * \returns true if getTotalNumElements() == 0 */ - bool empty() const + bool empty() const noexcept { return getTotalNumElements() == 0; } @@ -207,7 +207,7 @@ class CODA_OSS_API RangeList * * \return the vector of ranges composing the range list */ - const std::vector& getRanges() const + const std::vector& getRanges() const noexcept { return mRangeList; } diff --git a/externals/coda-oss/modules/c++/types/source/RangeList.cpp b/externals/coda-oss/modules/c++/types/source/RangeList.cpp index 5b258cf2b2..57d741dce9 100644 --- a/externals/coda-oss/modules/c++/types/source/RangeList.cpp +++ b/externals/coda-oss/modules/c++/types/source/RangeList.cpp @@ -73,7 +73,7 @@ RangeList::RangeList(const std::vector& ranges) : } } -size_t RangeList::getTotalNumElements() const +size_t RangeList::getTotalNumElements() const noexcept { size_t count = 0; for (const auto& range : mRangeList) diff --git a/externals/coda-oss/modules/c++/unique/source/UUID.cpp b/externals/coda-oss/modules/c++/unique/source/UUID.cpp index d0d409bd8c..682dac8433 100644 --- a/externals/coda-oss/modules/c++/unique/source/UUID.cpp +++ b/externals/coda-oss/modules/c++/unique/source/UUID.cpp @@ -22,7 +22,7 @@ #include "unique/UUID.hpp" -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 #include #else #include @@ -30,7 +30,7 @@ std::string unique::generateUUID() { -#if defined(WIN32) || defined(_WIN32) +#ifdef _WIN32 GUID uuid; unsigned char *cResult = NULL; diff --git a/externals/coda-oss/modules/c++/xml.lite/CMakeLists.txt b/externals/coda-oss/modules/c++/xml.lite/CMakeLists.txt index 16e64e7184..ad13e57988 100644 --- a/externals/coda-oss/modules/c++/xml.lite/CMakeLists.txt +++ b/externals/coda-oss/modules/c++/xml.lite/CMakeLists.txt @@ -1,6 +1,11 @@ set(MODULE_NAME xml.lite) if(ENABLE_XML) + if (UNIX) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-zero-as-null-pointer-constant") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-suggest-override") + endif() + if(CONAN_PACKAGE_NAME) # import targets from xerces-c conan package find_package(coda-oss_xerces-c REQUIRED) diff --git a/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/Attributes.h b/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/Attributes.h index 17c40e4102..8b354844bc 100644 --- a/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/Attributes.h +++ b/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/Attributes.h @@ -31,6 +31,7 @@ #include "except/Exception.h" #include "xml/lite/QName.h" #include "str/Convert.h" +#include "gsl/gsl.h" /*! * \file Attributes.h @@ -330,7 +331,7 @@ struct Attributes final } std::string operator[](const xml::lite::QName& name) const { - const size_t idx = getIndex(name); + const auto idx = gsl::narrow(getIndex(name)); return mAttributes[idx].getValue(); } @@ -348,7 +349,7 @@ struct Attributes final } std::string operator[](const std::string& s) const { - const size_t idx = getIndex(s); + const auto idx = gsl::narrow(getIndex(s)); return mAttributes[idx].getValue(); } diff --git a/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/Document.h b/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/Document.h index b95204ae6a..1d53fdbab2 100644 --- a/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/Document.h +++ b/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/Document.h @@ -39,6 +39,7 @@ #include #include +#include #include "coda_oss/string.h" #include "coda_oss/memory.h" @@ -103,7 +104,7 @@ struct Document // SOAPDocument derives :-( * \param characterData The character data (if any) * \return A new element */ - Element *createElement(const std::string & qname, const std::string & uri, std::string characterData = ""); + virtual Element *createElement(const std::string & qname, const std::string & uri, std::string characterData = ""); #ifndef SWIG // SWIG doesn't like std::unique_ptr std::unique_ptr createElement(const xml::lite::QName&, const std::string& characterData) const; std::unique_ptr createElement(const xml::lite::QName&, const coda_oss::u8string& characterData) const; diff --git a/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/MinidomHandler.h b/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/MinidomHandler.h index 2b14d9f37c..9ff2089bb9 100644 --- a/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/MinidomHandler.h +++ b/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/MinidomHandler.h @@ -46,7 +46,7 @@ */ #include -#include +#include #include "coda_oss/string.h" #include "coda_oss/memory.h" diff --git a/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/UtilitiesXerces.h b/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/UtilitiesXerces.h index e9df3b4d6d..ba587a91be 100644 --- a/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/UtilitiesXerces.h +++ b/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/UtilitiesXerces.h @@ -29,10 +29,12 @@ #include #include +#include "config/compiler_extensions.h" #include "xml/lite/xml_lite_config.h" #if defined(USE_XERCES) +CODA_OSS_disable_warning_system_header_push #include #include #include @@ -52,11 +54,11 @@ #include #include -#include - #include #include +CODA_OSS_disable_warning_pop + #include #include #include @@ -301,12 +303,12 @@ struct XercesContentHandler : public XercesContentHandlerInterface_T XercesContentHandler& operator=(const XercesContentHandler&) = delete; virtual void ignorableWhitespace(const XMLCh* const /*chars*/, - const XercesSize_T /*length*/) + const XercesSize_T /*length*/) override {} virtual void processingInstruction(const XMLCh* const /*target*/, - const XMLCh* const /*data*/) + const XMLCh* const /*data*/) override {} - virtual void setDocumentLocator(const Locator* const /*locator*/) + virtual void setDocumentLocator(const Locator* const /*locator*/) override {} /*! @@ -317,12 +319,12 @@ struct XercesContentHandler : public XercesContentHandlerInterface_T * \param length The length */ virtual void characters(const XMLCh* const chars, - const XercesSize_T length); + const XercesSize_T length) override; /*! * Fire off the end document notification */ - virtual void endDocument(); + virtual void endDocument() override; /*! * Map input string types to output string types @@ -333,13 +335,13 @@ struct XercesContentHandler : public XercesContentHandlerInterface_T */ virtual void endElement(const XMLCh* const uri, const XMLCh* const localName, - const XMLCh* const qname); + const XMLCh* const qname) override; - virtual void skippedEntity (const XMLCh* const /*name*/) + virtual void skippedEntity (const XMLCh* const /*name*/) override {} //! Fire off the start document notification - virtual void startDocument(); + virtual void startDocument() override; /*! * Map input string types to output string types @@ -353,7 +355,7 @@ struct XercesContentHandler : public XercesContentHandlerInterface_T virtual void startElement(const XMLCh* const uri, const XMLCh* const localName, const XMLCh* const qname, - const XercesAttributesInterface_T &attrs); + const XercesAttributesInterface_T &attrs) override; /*! * Begin prefix mapping. Transfer string types @@ -361,7 +363,7 @@ struct XercesContentHandler : public XercesContentHandlerInterface_T * \param uri The corresponding uri */ virtual void startPrefixMapping (const XMLCh* const /*prefix*/, - const XMLCh* const /*uri*/) + const XMLCh* const /*uri*/) override { } @@ -369,7 +371,7 @@ struct XercesContentHandler : public XercesContentHandlerInterface_T * End prefix mapping. Transfer string types * \param prefix The prefix to stop mapping */ - virtual void endPrefixMapping (const XMLCh* const /*prefix*/) + virtual void endPrefixMapping (const XMLCh* const /*prefix*/) override { } diff --git a/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/ValidatorXerces.h b/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/ValidatorXerces.h index dc2cb39390..8942aaf57f 100644 --- a/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/ValidatorXerces.h +++ b/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/ValidatorXerces.h @@ -120,8 +120,8 @@ class ValidatorXerces : public ValidatorInterface ValidatorXerces(const ValidatorXerces&) = delete; ValidatorXerces& operator=(const ValidatorXerces&) = delete; - ValidatorXerces(ValidatorXerces&&) = delete; - ValidatorXerces& operator=(ValidatorXerces&&) = delete; + ValidatorXerces(ValidatorXerces&&) = default; + ValidatorXerces& operator=(ValidatorXerces&&) = default; using ValidatorInterface::validate; diff --git a/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/XMLException.h b/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/XMLException.h index 0fdf3af2f9..a51a480bc8 100644 --- a/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/XMLException.h +++ b/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/XMLException.h @@ -44,7 +44,7 @@ namespace lite * This is the default XML exception, for when * other, more specialized exception make no sense */ -DECLARE_EXCEPTION(XML) +DECLARE_EXCEPTION(XML); /*! * \class XMLNotRecognizedException @@ -53,7 +53,7 @@ DECLARE_EXCEPTION(XML) * Provides the derived implementation for bad formatting or * for incorrect processing */ -DECLARE_EXTENDED_EXCEPTION(XMLNotRecognized, xml::lite::XMLException) +DECLARE_EXTENDED_EXCEPTION(XMLNotRecognized, xml::lite::XMLException); /*! * \class XMLNotSupportedException @@ -64,7 +64,7 @@ DECLARE_EXTENDED_EXCEPTION(XMLNotRecognized, xml::lite::XMLException) * systems that are not supported by the SAX/DOM standard * */ -DECLARE_EXTENDED_EXCEPTION(XMLNotSupported, xml::lite::XMLException) +DECLARE_EXTENDED_EXCEPTION(XMLNotSupported, xml::lite::XMLException); /*! * \class XMLParseException diff --git a/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/XMLReader.h b/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/XMLReader.h index 8ec74f92d6..94334180df 100644 --- a/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/XMLReader.h +++ b/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/XMLReader.h @@ -38,6 +38,7 @@ #endif # include "xml/lite/XMLReaderXerces.h" + namespace xml { namespace lite diff --git a/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/XMLReaderXerces.h b/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/XMLReaderXerces.h index beca1fa5cd..52b78befbc 100644 --- a/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/XMLReaderXerces.h +++ b/externals/coda-oss/modules/c++/xml.lite/include/xml/lite/XMLReaderXerces.h @@ -82,7 +82,7 @@ class XMLReaderXerces final : public XMLReaderInterface * This method returns a reference to the content handler. * \return content handler */ - xml::lite::ContentHandler *getContentHandler() + xml::lite::ContentHandler *getContentHandler() override { return mDriverContentHandler->retrieveXMLLiteContentHandler(); } @@ -92,7 +92,7 @@ class XMLReaderXerces final : public XMLReaderInterface * It will set this internally. * \param handler The content handler to pass */ - void setContentHandler(xml::lite::ContentHandler* handler) + void setContentHandler(xml::lite::ContentHandler* handler) override { mDriverContentHandler->setXMLLiteContentHandler(handler); } @@ -104,12 +104,12 @@ class XMLReaderXerces final : public XMLReaderInterface int size = io::InputStream::IS_END); //! Method to create an xml reader - void create(); + void create() override; //! Method to destroy an xml reader - void destroy(); + void destroy() override; - std::string getDriverName() const { return "xerces"; } + std::string getDriverName() const override { return "xerces"; } static const void* getWindows1252Encoding(); diff --git a/externals/coda-oss/modules/c++/xml.lite/source/ValidatorXerces.cpp b/externals/coda-oss/modules/c++/xml.lite/source/ValidatorXerces.cpp index b7e7a13bd5..7657e7b8a8 100644 --- a/externals/coda-oss/modules/c++/xml.lite/source/ValidatorXerces.cpp +++ b/externals/coda-oss/modules/c++/xml.lite/source/ValidatorXerces.cpp @@ -179,8 +179,8 @@ ValidatorXerces::ValidatorXerces( // On Windows, this needs to be wchar_t so that various "wide character" Win32 APIs can be called. static_assert(sizeof(XMLCh) == 2, "XMLCh should be two bytes for UTF-16."); -#if _WIN32 -// On other platforms, char16_t/uint16_t is used; only wchar_t on Windows. +#ifdef _WIN32 +// On other platforms, char16_t is used; only wchar_t on Windows. using XMLCh_t = wchar_t; static_assert(std::is_same<::XMLCh, XMLCh_t>::value, "XMLCh should be wchar_t"); inline void reset(str::EncodedStringView xmlView, std::unique_ptr& pWString) @@ -188,23 +188,14 @@ inline void reset(str::EncodedStringView xmlView, std::unique_ptr& pWString = std::make_unique(xmlView.wstring()); } #else -#if defined(__INTEL_COMPILER) && (__INTEL_COMPILER_BUILD_DATE < 20190815) -using XMLCh_t = uint16_t; -static_assert(std::is_same<::XMLCh, XMLCh_t>::value, "XMLCh should be uint16_t"); -#else using XMLCh_t = char16_t; static_assert(std::is_same<::XMLCh, XMLCh_t>::value, "XMLCh should be char16_t"); #endif -#endif inline void reset(str::EncodedStringView xmlView, std::unique_ptr& pWString) { pWString = std::make_unique(xmlView.u16string()); } -inline void reset(str::EncodedStringView xmlView, std::unique_ptr& pWString) -{ - pWString = std::make_unique(xmlView.ui16string_()); -} using XMLCh_string = std::basic_string; static std::unique_ptr setStringData(xercesc::DOMLSInputImpl& input, const std::u8string& xml) diff --git a/externals/coda-oss/modules/c++/xml.lite/tests/NamespaceStackTest.cpp b/externals/coda-oss/modules/c++/xml.lite/tests/NamespaceStackTest.cpp index 934346c385..151e30ca9d 100644 --- a/externals/coda-oss/modules/c++/xml.lite/tests/NamespaceStackTest.cpp +++ b/externals/coda-oss/modules/c++/xml.lite/tests/NamespaceStackTest.cpp @@ -78,4 +78,4 @@ int main() xmlNs.pop(); return 0; -}; +} diff --git a/externals/coda-oss/modules/c++/xml.lite/unittests/test_soapelements.cpp b/externals/coda-oss/modules/c++/xml.lite/unittests/test_soapelements.cpp new file mode 100644 index 0000000000..55de517a95 --- /dev/null +++ b/externals/coda-oss/modules/c++/xml.lite/unittests/test_soapelements.cpp @@ -0,0 +1,66 @@ +/* ========================================================================= + * This file is part of xml.lite-c++ + * ========================================================================= + * + * (C) Copyright 2004 - 2019, MDA Information Systems LLC + * (C) Copyright 2023, Maxar Technologies, Inc. + * + * xml.lite-c++ is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; If not, + * see . + * + */ + +#include +#include "xml/lite/Document.h" +#include "xml/lite/Element.h" +#include "xml/lite/QName.h" +static const std::string test_text = "SOAP Test"; + +struct SOAPBody final : public xml::lite::Element +{ + SOAPBody() = default; + SOAPBody (const xml::lite::QName& qname) + { + setQName(qname); + } +}; + +struct SOAP final : public xml::lite::Document +{ + xml::lite::Element* createElement(const std::string & qname, + const std::string& uri, + std::string characterData = "") override { + const xml::lite::QName asQName(uri, qname); + xml::lite::Element* elem = new SOAPBody(asQName); + elem->setCharacterData(characterData); // avoid unused parameter warning + elem->setCharacterData(test_text); + return elem; + } +}; + +TEST_CASE(test_overrideCreateElement) +{ + SOAP soap_test; + std::unique_ptr a(soap_test.createElement("a","b","Not SOAP Test")); + auto b = dynamic_cast(a.get()); + TEST_ASSERT_NOT_NULL(b); + TEST_ASSERT_EQ(a->getCharacterData(), test_text); + TEST_ASSERT_EQ(b->getCharacterData(), test_text); +} + +TEST_MAIN +( + TEST_CHECK(test_overrideCreateElement); +) + diff --git a/externals/coda-oss/modules/c++/xml.lite/unittests/test_xmlattribute.cpp b/externals/coda-oss/modules/c++/xml.lite/unittests/test_xmlattribute.cpp index f94a136536..011bb79d1c 100644 --- a/externals/coda-oss/modules/c++/xml.lite/unittests/test_xmlattribute.cpp +++ b/externals/coda-oss/modules/c++/xml.lite/unittests/test_xmlattribute.cpp @@ -1,10 +1,10 @@ /* ========================================================================= - * This file is part of io-c++ + * This file is part of xml.lite-c++ * ========================================================================= * * (C) Copyright 2004 - 2019, MDA Information Systems LLC * - * io-c++ is free software; you can redistribute it and/or modify + * xml.lite-c++ is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. diff --git a/externals/coda-oss/modules/c++/xml.lite/unittests/test_xmlelement.cpp b/externals/coda-oss/modules/c++/xml.lite/unittests/test_xmlelement.cpp index ccbdde0a7b..a9890ab004 100644 --- a/externals/coda-oss/modules/c++/xml.lite/unittests/test_xmlelement.cpp +++ b/externals/coda-oss/modules/c++/xml.lite/unittests/test_xmlelement.cpp @@ -1,10 +1,10 @@ /* ========================================================================= - * This file is part of io-c++ + * This file is part of xml.lite-c++ * ========================================================================= * * (C) Copyright 2004 - 2019, MDA Information Systems LLC * - * io-c++ is free software; you can redistribute it and/or modify + * xml.lite-c++ is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. diff --git a/externals/coda-oss/modules/c++/xml.lite/unittests/test_xmlparser.cpp b/externals/coda-oss/modules/c++/xml.lite/unittests/test_xmlparser.cpp index 994ea52d85..6a4ff8bf18 100644 --- a/externals/coda-oss/modules/c++/xml.lite/unittests/test_xmlparser.cpp +++ b/externals/coda-oss/modules/c++/xml.lite/unittests/test_xmlparser.cpp @@ -145,6 +145,7 @@ TEST_CASE(testXml_setCharacterData) xml::lite::MinidomParser xmlParser; auto& a = testXmlUtf8_(xmlParser); a.setCharacterData(utf8Text8); + TEST_ASSERT_TRUE(true); // need to use hidden "testName" parameter } static std::string testXmlPrint_(std::string& expected, const std::string& characterData) diff --git a/externals/coda-oss/modules/c++/zip/include/zip/GZipInputStream.h b/externals/coda-oss/modules/c++/zip/include/zip/GZipInputStream.h index 1994d5467e..783b6241fe 100644 --- a/externals/coda-oss/modules/c++/zip/include/zip/GZipInputStream.h +++ b/externals/coda-oss/modules/c++/zip/include/zip/GZipInputStream.h @@ -58,7 +58,7 @@ class GZipInputStream: public io::InputStream * This is a little tricky since we do not know the * length of the read. */ - virtual sys::SSize_T readImpl(void* buffer, size_t len); + virtual sys::SSize_T readImpl(void* buffer, size_t len) override; }; } diff --git a/externals/coda-oss/modules/c++/zip/include/zip/GZipOutputStream.h b/externals/coda-oss/modules/c++/zip/include/zip/GZipOutputStream.h index a8d471569c..7f137d2cfa 100644 --- a/externals/coda-oss/modules/c++/zip/include/zip/GZipOutputStream.h +++ b/externals/coda-oss/modules/c++/zip/include/zip/GZipOutputStream.h @@ -46,13 +46,13 @@ class GZipOutputStream: public io::OutputStream * the call returns. * */ - virtual void write(const void* buffer, size_t len); + virtual void write(const void* buffer, size_t len) override; /*! * Close the gzip stream. You must call this * afterward (it is not done automatically). */ - virtual void close(); + virtual void close() override; }; } diff --git a/externals/coda-oss/modules/c++/zip/include/zip/ZipOutputStream.h b/externals/coda-oss/modules/c++/zip/include/zip/ZipOutputStream.h index 50ce6a1982..a49c3c4a0b 100644 --- a/externals/coda-oss/modules/c++/zip/include/zip/ZipOutputStream.h +++ b/externals/coda-oss/modules/c++/zip/include/zip/ZipOutputStream.h @@ -76,9 +76,9 @@ class ZipOutputStream: public io::OutputStream void write(const std::string& inputPathname, const std::string& zipPathname); - virtual void write(const void* buffer, size_t len); + virtual void write(const void* buffer, size_t len) override; - virtual void close(); + virtual void close() override; private: zipFile mZip; diff --git a/externals/coda-oss/modules/c++/zip/source/ZipEntry.cpp b/externals/coda-oss/modules/c++/zip/source/ZipEntry.cpp index 2d9595f9ee..9f71cbef32 100644 --- a/externals/coda-oss/modules/c++/zip/source/ZipEntry.cpp +++ b/externals/coda-oss/modules/c++/zip/source/ZipEntry.cpp @@ -21,6 +21,8 @@ */ #include "zip/ZipEntry.h" +#undef Z_NULL +#define Z_NULL nullptr const static char* sZipFileMadeByStr[] = { "MS-DOS and OS/2 (FAT / VFAT / FAT32 file systems)", "Amiga", diff --git a/externals/coda-oss/modules/drivers/CMakeLists.txt b/externals/coda-oss/modules/drivers/CMakeLists.txt index cfe5ef7b07..e9aeba4a1a 100644 --- a/externals/coda-oss/modules/drivers/CMakeLists.txt +++ b/externals/coda-oss/modules/drivers/CMakeLists.txt @@ -1,8 +1,14 @@ +# Turn off all warnings; this is code we don't control. if (MSVC) add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS) - add_compile_options(/W3) - add_compile_options(/wd4267) # '...': conversion from '...' to '...', possible loss of data - add_compile_options(/wd4244) # '...': conversion from '...' to '...', possible loss of data + + # By default, there is a /W3 on the command-line from somewhere (?); adding + # /Wn results in a compiler warning. + #add_compile_options(/W0) + string(REGEX REPLACE "/W[0-4]" "/W0" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + string(REGEX REPLACE "/W[0-4]" "/W0" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") +elseif (UNIX) + add_compile_options(-w) # "Inhibit all warning messages" endif() #add_subdirectory("curl") # this is handled in coda_find_system_dependencies @@ -70,4 +76,5 @@ set(CODA_ENABLE_HDF5 ON CACHE BOOL "enable hdf5") set(CODA_HDF5_HOME "" CACHE PATH "path to pre-existing HDF5 installation, if not provided HDF5 will be built") if (CODA_ENABLE_HDF5 OR CODA_HDF5_HOME) add_subdirectory("hdf5") + add_subdirectory("highfive") endif() diff --git a/externals/coda-oss/modules/drivers/hdf5/CMakeLists.txt b/externals/coda-oss/modules/drivers/hdf5/CMakeLists.txt index 37a9230b54..dd8c01d3f8 100644 --- a/externals/coda-oss/modules/drivers/hdf5/CMakeLists.txt +++ b/externals/coda-oss/modules/drivers/hdf5/CMakeLists.txt @@ -1,6 +1,13 @@ set(MODULE_NAME hdf5) +set(TARGET_LANGUAGE c++) if(CODA_ENABLE_HDF5) + # set up warnings + if (MSVC) + # DO NOT use standard (not legacy) C pre-processor + add_compile_options(/Zc:preprocessor-) + endif() + coda_add_module(${MODULE_NAME} VERSION 1.13.2) else() message("${MODULE_NAME} will not be built since HDF5 is not enabled") diff --git a/externals/coda-oss/modules/drivers/hdf5/source/H5MM.c b/externals/coda-oss/modules/drivers/hdf5/source/H5MM.c index 9c03ceb338..68c8633015 100644 --- a/externals/coda-oss/modules/drivers/hdf5/source/H5MM.c +++ b/externals/coda-oss/modules/drivers/hdf5/source/H5MM.c @@ -658,7 +658,9 @@ H5MM_memcpy(void *dest, const void *src, size_t n) HDassert(src); /* Check for buffer overlap */ - HDassert((char *)dest >= (const char *)src + n || (const char *)src >= (char *)dest + n); + const char* src_n = (const char*)src + n; + const char* dest_n = (const char*)dest + n; + HDassert((const char *)dest >= src_n || (const char *)src >= dest_n); /* Copy */ ret = HDmemcpy(dest, src, n); diff --git a/externals/coda-oss/modules/drivers/highfive/CMakeLists.txt b/externals/coda-oss/modules/drivers/highfive/CMakeLists.txt new file mode 100644 index 0000000000..32f2ba30d8 --- /dev/null +++ b/externals/coda-oss/modules/drivers/highfive/CMakeLists.txt @@ -0,0 +1,19 @@ +set(MODULE_NAME highfive) +set(TARGET_LANGUAGE c++) + +if(CODA_ENABLE_HDF5) + set(MODULE_DEPS config-c++ sys-c++) + list(APPEND MODULE_DEPS hdf5-c++) + + coda_add_module( + ${MODULE_NAME} + VERSION 2.6.2 + DEPS ${MODULE_DEPS}) + + coda_add_tests( + MODULE_NAME ${MODULE_NAME} + DIRECTORY "unittests" + UNITTEST) +else() + message("${MODULE_NAME} will not be built since HDF5 is not enabled") +endif() diff --git a/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2.zip b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2.zip new file mode 100644 index 0000000000000000000000000000000000000000..0668a026bb050bad443d2b1224b9da6d4cfda006 GIT binary patch literal 9815 zcmb7~bzGEd)5jO2LrRcFkY)*K1XQ{~q>+ZDmt0x_L0V8kV(IRdlgF=h`E!|RjldZTg#}Zs7dInN+>*(7g3eC3XB>) z%*EEh%GBD{#SxZ+_IDzu)8%Q71@hGdK@7?QGyM_f4=^OtRta)#s!_*4!;s|=gR-nYKTK#ri%5BgNJ z458zk7jD&iPJLiZiX1XXKWg8)cauh`Ot*)f*WAjllFf9_){RagT!|MXfG5xa`FK1! zS+VtaDQ1G03}@bZYi7QMdgvCxqtJrWgp=#sOy~)IQtPw9X4iI1DN&Mxo{|?n^__A% zJxT*Iw@1?uY#yLSI6*n|ZEwYP#x|ifPPJE>$c~~c>g9xX8IB8~aeV(2&K7TjuBB9~(&$q$ z&b7C_^x2P^_Fb+4=25l-%B>fYhB0N6R(ABjy?Mn^GCjk#KqWiiQSof2CoV4iLl0<8 zvZ=~(^q}8f2RFSk`Ll{Z-wv}I0Y%?)4{Lk zT6-3|TPCGcMa?~1%?$zc7532Lj;99rp&~??Es8>c0@yLhneTrLE*cinu zs1L>NRbM0apn)v3GPA@+6c*NhLHBiXI1@}QH56CO;d^~gdAj2PE2Kqq#w5EouXHHz z6EU^Rct808p1*qpuBZ3?5^$Woyy)WnnB>Q)t8Q)STxOpe90kn?dpVPy3A_eN$Wte4 zSL;xF17XD7JwjR>9M!xV&{NKr61j&|-?2X)S=oKt z4NIe1C>2HRO2+K{-d6W)1S$@5#SeZb-+$yd26(M@>UEJs4Q?+Ikz?b@{=oFlF2vX9%Wz)EUYUR9paifHt zg{(YbANrt@|6*N^>wn{ z(#go{zFTr(TVwXOx2A8uGs&r#HY|{;dI^$eWv9trTw+A5qjo78chgqHQQ9)vJZ)1* zcT<|%qr^8BP{zsgye6j-JSB_QNT8?$!-bSR*=($@>p@g^TBwLnfT0k8nEn(nm%bCwv zYbaO&Na#_6pBlZ779ZZPGrx2Z-k>=9DCoU>lQd? zD`z5yY0$4|3_a4rc`E;JKp%+u8rA?(rj|Q+>xf~%J zDSsxNxjEyA;1fZfeX#o`(v$|jx;l9+33InxrBpMljnz!o*`4#QfgB}W-FA^SAp7J8LbjWr5ul)aDjFzR`wimSrZ?W4}@zY=}#@=1$o+}F%cIsPycgW3#~ zC6au0l+Md)zd4)ePO~?TnN+^ZQmN@2V%}V(sE1ZxU}}22CX33VHQ%RF^XS>kX$pP6 zVj~g5`=X^%d4BG>?HsDXmi7;+k%h_Ew$==kCEFbwKU%Tcx_X}Mt_QpwG5l7QFLQPf z5qfV|$~D^R`jU2+(5TKvr+b!Mh(rTgTI^9Ct5Q&?v{zy#&fRULh`FOW0ul|9feN>A zvt4hJjCT#V;Z27}$5YBoC$oppGQ403pzmSN7tfuK?$%*rZa&EwA_6as-u+c(k{in! zdHSr8PD)LJTCQ;Ny?dWccxV|`6q}(^0EJ90r1AT%xlk;3QARy^cmro;De%+>1l zDirV5ilX)TLYQfSU?5^3B4-a=Mc#hz_JRSNE@eC*zYKKD(~GvlRT)Z1kG2>BsY+V( zsGKzr_UaH!a;)dZBy^wZv>|4Pmuu?WKqK#S7^2+~?_1I}#(B3yC+JBwXZIH~w10dM z%;uokp$(yJyj`(RU}@8&B(>^e)pm_~-i$#fNMhG%O58-Er`t<6H5%xf0F?C`j(0U0 zt0@?;sRLjxdfYSxo(i&;qP-Gh67?x`v5uY;lOiwC<_+?exHFsS_COI+9l-KF>;bmN8j%PFzirfbitpaF!o)X*waQM%?gu_{g60+{8AW;qlcPyfzLkJVaEVi| zo+6fQdoWNf-%zT_Jy9nk%DuravRH+b8Ka>UfSq%lQ0or9i_pd{V@Qh5fdG3rNe4nNW1>q)L}yFv z{N~e{MD#gRKz<<25G(D6d~_~nJBqUgTdSRwI}TROoel@NtEipXzK49R2km6{<)*?4k=#Ais`?XrsnsP*y(SrK{yTP-h^TKZK?ni$?AV(t{b>uqO9V<)xvqUrR@WCQVv*$3rj^9@}qZ)Ew;=9OP9el&P)c^o5g&~wNv zA&@LZ!uNU(FyWF^rN)gyWsWCk;_>WV@U69cJDWE0ZNr`W!v5cVyzAF^Y9G*blq0&z z2U8NGQ-~_)s=Ha24FPKivZ`vozIhQ;vxOzIP~TN2=o|4eFQI-N*n14G5{Xo}|)$qOwBP{w#r6=OD6 zj>%8W!->JIRKn}crKryuF0h`$61krw7_IHRvzMpZCY>`Zp`IBnKi}$o6NuL&3KAH; zL#!&1*t>X_OEvUOYpt%%ejWN!Ee~4(mA`X2&h%k!W)J@&&n}X_&cwW0=QHdR3#2F2 zw|88)E&GA5+tShA?BJ+!VTzUS_PPt#t%u0wTAJzzRb`Jucap3;JOb&9ny-;XQddrR zJn$`Mb*UvM!%0&lOT^0M^0#Fiv(bdEr6SJ^4nEZL6nNnErqzP8Y06)ycElNJE^>xG znJ$g{VJUB%bssrVwnj8Yp)n3b*w}>Rd??tv}ZF#L`_YZ&6L3N}dth zMQFI_a3_7>3nvvZ5H|OqKsIWtbfNG|*@=T}2HDma+3HW_ z_nUf;#+$?m#=*3YXr7rCP-8vLy$5JBU<-XxbfmnhntbYWlGc@La7HBCOt8WjDvJdS z(}Fgju!W<^){)N4P*l}r*?dw88JG-x;$*7LIk|mep2Z<=nl-&W8XPywL7}hVa>z)q z0cE>8J%fbwH1J)OZ^%=uuCFh?%JZ$wrkd_yB?$48e%F+!Niv6|rDVxE)0UrYM|Rq9 zOO<_Bn1k9W%rvO*H}L48^JUX>s^6>FIvJn+GJ2D!o7`*p7RvLS6W(n<;c24JatbPE z-&1?rSNFf1Fg!w@`ryBXTAm?;*Q2(XLlm|7V%@q?N3wnQ@dTo!x;crivQXc;j=S#= zUh@Erh*$`S;|Sc?xWwq;v_#;xwOzM&%>K|GrJh{vmfJNB%opejJ6&>l1?F1XRTEL4 z0f?wJEMUj{p_}+(qLhH(SLm>vc!i+`=VCr_8LlNTDF_ zxwwq(c-by9lrw%+G#TGlQJw(J`}%|PDF!V(4@GxyLyTo55y8v-CzLf8-)q~m@ zWLlk@h&h2=G$`aLM-kl_vI3iaANX5Il1>G=U8vNE?shDEws7SUc*}3b{*{spy9jl~ z&eh4ue(cC{qp&6ljI&ea^u>90PXlHHASv8na$Ev{U z`+}4j(9Jp?G5P(*o#dk)dhxIG&-=kqT4gn5+}(GjgZ^r6G{`TxLCNusP{2S)fv+LL zAQ^?B+t;Va71}Yb!!Q>dsIW$()O2S#-n{wo4%3tS)n1V%UHtKJseQvzn?3X$xRwv4 z@fK*5@Lrlsl?xo(P$l-3fOnBd+I*9XsRj2ES^?3 zO(9SDre3&WUPDNg(}` z8nGmm1cIbi=6w!=Ye$FmDP$qmz(gkAtPxMK2jyf)5&eBt8MY0E_D0`BA(V1%t$9X{ zC(gzJtarW<5p}7GxOj%GDjFM)jT#a5_&6z%HeSDvHLn*IKv3(}av1PNaMpu==16D@ zcxEogsrj8D2hrITeV;bE~Ab{3|;~Ip+GQ>Fc^h36KebFsxqNa2gR-u+GaLN|GkM*rEdi zr;S=4vemg;_V&2t_`!|X#=~e73NU(L)btSTX0O4+N9dd38Nz4bZ&D*%6{yNy%=e<% zoQ(-fv8Ss#;QsaHGqj$s>dqT#x?9=7y7=gvUva_1o+4Ig2|!_S>Y}LWv>Qi)e(wE> z7GYI&Y<}Sfogw|rsrp3uq>^C+Y>Ck81$)@|{c6Gz>+WKI3>rZ%wYo+;hjb(my8M{;hF0F*vCJNvQVL#A*gh z56Jat@cXQ|vU^QMBnNG{xRwCXkxZoe#w-F5^G!R9!!S@O+md4cw?i_IgF2VNrw3o! zLs0wBrC)xA8UPJmwp1IjSS}~1-ZvBeUURJf>%$#vd-4YChdUFH-6fq@SW_}MrpAU4 zWAiJuqX{k{*c!vOL}7h1TyAM%>*{6(vSBrJ0Xf=&L9E7(S6T__lVlV zh`!>jM)R*&I|o}!kTK*cDZQjX{YOfFfv%d!OA6Fanv;#iZ{Z*y0s!y_hCgSAKPF0l zU+~9=@G0ko?&oz*;r;RYgL26@5kBpFpm;%pz^B0pZ1kSRTx%5kBj@G+nTA;jv&xkH3(Y4B2x(KfiKJ7Ba1Rr~@nJ%yd#4xM=734qIKjjX5_W415!PdV58;+ua@8b8H zs|?n~AIBbi(z(XE2zL8&(&dT^KJ;93T|n=Uz-0Fi8TY3GgHQgw(0N==zD$w9NB&-i z8(@(?Pu%~|Ch%FmZ~bR@taIYOD>nEp&NbUbZWTyja{C{016CAXy&|4#xC=j-|D&H@ zkI$8|cCP6zTmi`bw /dev/null 2>&1; + done + modified_files=$(git diff --name-only) + if [ -n "$modified_files" ]; + then + echo "Some files are not well formatted:" + echo $modified_files + exit 1 + fi diff --git a/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.github/workflows/gh-pages.yml b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.github/workflows/gh-pages.yml new file mode 100644 index 0000000000..0f51447c46 --- /dev/null +++ b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.github/workflows/gh-pages.yml @@ -0,0 +1,53 @@ +name: gh-pages + +on: + push: + branches: + - master + pull_request: + branches: + - master + +jobs: + + publish: + + runs-on: ubuntu-latest + + defaults: + run: + shell: bash -l {0} + + steps: + + - uses: actions/checkout@v3 + with: + submodules: 'recursive' + + - uses: mamba-org/provision-with-micromamba@main + with: + environment-file: doc/environment.yaml + environment-name: doc-build + + - name: Run doxygen + run: | + CMAKE_OPTIONS=( + -DHIGHFIVE_UNIT_TESTS=OFF + -DHIGHFIVE_USE_BOOST:BOOL=ON + -DHIGHFIVE_USE_EIGEN:BOOL=ON + -DHIGHFIVE_USE_XTENSOR:BOOL=ON + ) + cmake -B build -S . "${CMAKE_OPTIONS[@]}" + cmake --build build --target doc + cp -r doc/poster build/doc/html/ + + - name: Deploy to GitHub Pages + if: ${{ success() && github.ref == 'refs/heads/master' && github.event_name == 'push' }} + uses: crazy-max/ghaction-github-pages@v2 + with: + target_branch: gh-pages + build_dir: build/doc/html + jekyll: false + keep_history: false + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.github/workflows/integration_trigger.yml b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.github/workflows/integration_trigger.yml new file mode 100644 index 0000000000..3fe65f329f --- /dev/null +++ b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.github/workflows/integration_trigger.yml @@ -0,0 +1,15 @@ +name: Integration Test Trigger +on: + pull_request: + types: [closed] +jobs: + merge-PR: + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + steps: + - name: Trigger integration tests on BlueBrain/HighFive-testing + run: | + curl -X POST https://api.github.com/repos/BlueBrain/HighFive-testing/dispatches \ + -H 'Accept: application/vnd.github.everest-preview+json' \ + -u ${{ secrets.ACCESS_TOKEN }} \ + --data '{"event_type": "merge", "client_payload": { "repository": "'"$GITHUB_REPOSITORY"'" }}' diff --git a/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.gitignore b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.gitignore new file mode 100644 index 0000000000..75c4e044b8 --- /dev/null +++ b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.gitignore @@ -0,0 +1,5 @@ +build +tests/test_project +.idea + +.vs/ diff --git a/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.gitmodules b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.gitmodules new file mode 100644 index 0000000000..615f78fe15 --- /dev/null +++ b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.gitmodules @@ -0,0 +1,3 @@ +[submodule "deps/catch2"] + path = deps/catch2 + url = https://github.com/catchorg/Catch2.git diff --git a/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.travis.yml b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.travis.yml new file mode 100644 index 0000000000..bc5d340810 --- /dev/null +++ b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/.travis.yml @@ -0,0 +1,138 @@ +# Adapted from various sources, including: +# - Louis Dionne's Hana: https://github.com/ldionne/hana +# - Paul Fultz II's FIT: https://github.com/pfultz2/Fit +# - Eric Niebler's range-v3: https://github.com/ericniebler/range-v3 +# - Gabi Melman spdlog: https://github.com/gabime/spdlog + +sudo: required +language: cpp + +addons: &gcc7 + apt: + packages: + - g++-7 + - libboost-all-dev + - libhdf5-openmpi-dev + - libeigen3-dev + - ninja-build + sources: + - ubuntu-toolchain-r-test + +matrix: + include: + # Older linux (trusty) with default gcc + # Install serial hdf5 + build serial + - os: linux + dist: trusty + env: + - HIGHFIVE_USE_XTENSOR=False + - HIGHFIVE_USE_OPENCV=False + - HIGHFIVE_PARALLEL_HDF5=False + - IS_BASE_ENVIRON=1 + addons: + apt: + packages: + - libboost-all-dev + - libeigen3-dev + - libhdf5-serial-dev + - ninja-build + + # Linux gcc-7 + # Install parallel hdf5 + build parallel + - os: linux + dist: xenial + env: + - GCC_VERSION=7 + - HIGHFIVE_USE_XTENSOR=True + - HIGHFIVE_USE_OPENCV=False + - HIGHFIVE_PARALLEL_HDF5=True + addons: *gcc7 + + # Mac OSX XCode 10 + - os: osx + osx_image: xcode10.3 + env: + - HIGHFIVE_USE_XTENSOR=True + - HIGHFIVE_USE_OPENCV=True + - HIGHFIVE_PARALLEL_HDF5=False + + # Windows + - os: windows + env: + - HIGHFIVE_USE_XTENSOR=True + - HIGHFIVE_USE_OPENCV=True + - HIGHFIVE_PARALLEL_HDF5=False + +env: + global: + - MINCONDA_VERSION="latest" + - MINCONDA_LINUX="Linux-x86_64" + - MINCONDA_OSX="MacOSX-x86_64" + +install: + - export HOMEBREW_NO_AUTO_UPDATE=1 # for reproducibility, dont autoupdate + + - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then + MINCONDA_OS=$MINCONDA_LINUX; + elif [[ "$TRAVIS_OS_NAME" == "osx" ]]; then + if [ "$BREW_USE_LATEST" ]; then + brew update; + brew install hdf5; brew upgrade hdf5; + fi; + brew install boost hdf5 eigen ninja; + MINCONDA_OS=$MINCONDA_OSX; + fi + + - if [[ "$TRAVIS_OS_NAME" == "windows" ]]; then + export CMAKE_GENERATOR="Visual Studio 15 2017 Win64" ; + export TESTS_TARGET="RUN_TESTS"; + choco install --yes miniconda3 ; + source C:/Tools/miniconda3/Scripts/activate ; + else + export CMAKE_GENERATOR="Ninja" ; + export TESTS_TARGET="test"; + wget "http://repo.continuum.io/miniconda/Miniconda3-$MINCONDA_VERSION-$MINCONDA_OS.sh" -O miniconda.sh; + bash miniconda.sh -b -p $HOME/miniconda ; + source $HOME/miniconda/bin/activate; + hash -r ; + fi + - conda config --set always_yes yes --set changeps1 no + - conda update -q conda + - conda install -c conda-forge mamba + - if [[ "$HIGHFIVE_USE_XTENSOR" == "True" ]]; then + mamba install -c conda-forge xtl xsimd xtensor; + fi + - if [[ "$HIGHFIVE_USE_OPENCV" == "True" ]]; then + mamba install -c conda-forge libopencv opencv; + fi + - if [[ "$TRAVIS_OS_NAME" == "windows" ]]; then + mamba install -c conda-forge boost-cpp hdf5 eigen; + fi + +before_script: + - if [ -n "$GCC_VERSION" ]; then export CXX="g++-${GCC_VERSION}" CC="gcc-${GCC_VERSION}"; fi + - if [ -n "$CLANG_VERSION" ]; then export CXX="clang++-${CLANG_VERSION}" CC="clang-${CLANG_VERSION}"; fi + - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export CXX="clang++" CC="clang"; fi + - which $CXX + - which $CC + - $CXX --version + - cmake --version + +script: + - cd ${TRAVIS_BUILD_DIR} + - mkdir -p build && pushd build + - > + cmake --warn-uninitialized --debug-output + -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON + -DHIGHFIVE_TEST_SINGLE_INCLUDES:BOOL=ON + -DHIGHFIVE_PARALLEL_HDF5:BOOL=${HIGHFIVE_PARALLEL_HDF5} + -DHIGHFIVE_USE_EIGEN:BOOL=ON + -DHIGHFIVE_USE_XTENSOR:BOOL=${HIGHFIVE_USE_XTENSOR} + -DHIGHFIVE_USE_OPENCV:BOOL=${HIGHFIVE_USE_OPENCV} + -G "${CMAKE_GENERATOR}" ../ + - cmake --build . + - CTEST_OUTPUT_ON_FAILURE=1 cmake --build . --target ${TESTS_TARGET} + - popd + - if [ $IS_BASE_ENVIRON ]; then + bash tests/test_project_integration.sh; + fi diff --git a/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/AUTHORS.txt b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/AUTHORS.txt new file mode 100644 index 0000000000..ed89f76832 --- /dev/null +++ b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/AUTHORS.txt @@ -0,0 +1,52 @@ +Adrien Devresse +Alexandru Săvulescu +Ali Can Demiralp +Angelos Plastropoulos +Chris Byrohl +Chris De Grendele +@contre +Daniel Nachbaur +Dmitri Bichko +@eudoxos +Fernando L. Pereira +@guoxy +Haoran Ni +Henry Schreiner +@JaWSnl +Jia Li +John W. Peterson +Jonas Karlsson +Jorge Blanco Alonso +Kerim Khemraev +Luc Grosheintz +Marian Heil +Mario Emmenlauer +Mark Bicknell +Mathieu Bernard +Matthias Wolf +Maximilian Nöthe +@Mightrider +Mike DePalatis +Mike Gevaert +Nico Jahn +Nicolas Cornu (maintainer) +Omar Awile +Pablo Toharia +Philip Deegan +Philipp Gloor +Pramod Kumbhar +Richard Shaw +Rick Nitsche +Rob Latham +Sergio Botelh +Sergio Rivas-Gomez +@spacescientist +Taiguara Tupinambás +@timocafe +Tino Wagner +Tobias Klauser +Tom de Geus +Tom Vander Aa +Tristan Carel +Wolf Vollprecht +Y. Yang diff --git a/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CHANGELOG.md b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CHANGELOG.md new file mode 100644 index 0000000000..f6bf0bb2fa --- /dev/null +++ b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CHANGELOG.md @@ -0,0 +1,220 @@ +## Version 2.6.2 - 2022-11-10 +### Bug Fix + - Allow CMake to use Config mode to find HDF5. + +## Version 2.6.1 - 2022-11-08 +### Bug Fix + - Version bump in `CMakeLists.txt`. + +## Version 2.6.0 - 2022-11-08 +### New Features + - Enable page buffered reading (#639). + +### Improvements + - Warn when detecting lossy reads or write of floating point data (#636). + +## Version 2.5.1 - 2022-11-07 +### Bug Fix + - Fix missing `inline` for collective metadata properties. + +## Version 2.5.0 - 2022-11-03 +### New Features + - Enable collective MPI IO using the Data Transfer Property (#623). Thanks to Rob Latham. + - Add a support for half-precision (16-bit) floating-point based on the Half library (http://half.sourceforge.net) (#587). Thanks to Sergio Botelh. + - Enable choosing the allocation time of datasets (#627). + - Add possibility to get and set file space strategy. For page allocated files wrap the API to set/retrieve the page size (#618). + - Add API for getting Access and Create property lists of HighFive objects (#629). + - Let users configure metadata reads and writes at file level (#624). Thanks to Rob Latham. + +### Improvements + - MPIOFileDriver is now deprecated. Use FileAccessProps (#622). + - Support of block argument in API (#584). + - Serialization of types is now automagic and so recursive (#586). + - Add an argument to specific File Create Properties in File class construtor (#626). + +### Bug Fixes + - Padding of Compound Types (#581). + - Compilation with Visual Studio with C++17 or later (#578). Thanks to Mark Bicknell. + - Avoid leaking when printing stack for error (#583). + +## Version 2.4.1 - 2022-05-11 +### New Features + - Support `std::complex`. Thanks to Philipp. + +### Improvements + - Improve EnumType/CompoundType + - Revert quirky behaviour of `select(const HyperSlab&)`. + - All `get_name` functions takes `size_t` and not `hsize_t`. + - Remove nix recipes. + +### Bug Fixes + - Computation of padding. + - Related to `0` being an invalid hid but not equal to `H5I_INVALID_HID`. + +## Version 2.4.0 - 2022-04-05 +### New Features + - Construct a compound type from an already existing hid (#469). Thanks to Maximilian Nöthe. + - Add support for long double (#494) + - Add support for H5Pset_libver_bounds and H5Pset_meta_block_size support (#500) + - New interface to select complex hyperslabs, irregular hyperslabs are limited to/from 1D array (#538 and #545) +### Improvements + - Use inline where it is needed, otherwise some code can lead to "multiple definition" (#516). Thanks to Chris Byrohl. + - Use Catch2 instead of boost for tests, reduces dependencies (#521) + - CI reworked to test external libraries more thoroughly (boost, eigen, xtensor) (#536) +### Bug Fixes + - Better support of const types (#460). Thanks to Philip Deegan. + - Vector of size zero was previously lead to UB (#502). Thanks to Haoran Ni. + - Use H5T_NATIVE_SCHAR instead of H5T_NATIVE_CHAR for "signed char" (#518) + +## Version 2.3.1 - 2021-08-04 +### Improvements + - Clean cmake files from old code (#465) + - Adding path to type warning message (#471) + - Adding compound types example, w dataset and attr (#467) + +### Bug Fixes + - Resolve an issue where padding of nested compound types were being calculated incorrectly (#461) (#468) + - GHA: drop previous runs (#462) + +## Version 2.3 - 2021-05-07 +### New Features: + - Add SZIP support (#435) + - Add option *parents* to createDataSet (#425) + - Implementing getting the filename dynamically (#424) + - Ability to create soft and external links (#421) + - Generalizing getPath and adding getFile as PathTraits (#417) + +### Improvements: + - Unified reading/writing attributes and datasets (#450) + - Old compilers have been removed from docker image (#430) + - Cleaning up and improving property lists (#429) + - An example using hdf5 references (#396) (#397) + - Add all property lists alias for completeness (#427) + - Add property CreateIntermediateGroup (#423) + - Add code coverage through codecov.io (#420) + - Introducing GitHub Actions CI (#416) + - Create issue and PR templates (#412) + - Initialize SilenceHDF5 to true in _exist (#411) + - Generalizing xtensor API (#407) + - Minor doc updates (#409) + - Fixing minor error in GH Action (#408) + - Uploading docs to gh-pages using GitHub Actions (#403) + - Various minor documentation updates (#405) + - optional documentation building in cmake (#377) + - From can be automatic now (#384) + - get_dim_vector in inspector (#383) + - Put type_of_array in inspector (#382) + - Move array_dims in the future manipulator (#381) + - Unify interface of H5Attribute with H5Slice_traits (#378) + - Use std::move in NRVO depending of version of GCC (#375) + - Fixed typo '-DD' to '-D' in 'Dependencies'. (#371) + - Changing date format (#364) + +### Bug fixes: + - Fix use before initialization (#414) + - Adding CMake include guard (#389) + +## Version 2.2.2 - 2020-07-30 +### New Features: + - [H5Easy] Adding OpenCV support (#343) + - [H5Easy] Enabling compression & Adding attributes (#337) + - Adding missing function to H5Attribute (#337) + - Add methods to retrieve Node paths or Dataset names and rename objects (#346) + - Add a file with the current version number of HighFive (#349) + +### Improvements + - [H5Easy] Updating error message dump (#335) + - [H5Easy] Switching implementation to partial specialization based on static dispatch (#327) + - Simplifying imports, new policy (#324) + +## Version 2.2.1 - 2020-04-28 +### Improvements + - Add a mechanism to not include target HighFive several times (#336) + - Fix SilenceHDF5 initialization for NodeTraits (#333) + +## Version 2.2 - 2020-03-23 +### New Features: + - Compound Types: API to register and read/write structs (#78). Thanks to Richard Shaw. + - Fixed-length strings. API via char[] and `FixedLenStringArray`(#277) + - Enum data types (#297) + - Datasets of HDF5 References. Support to dereference groups and datasets (#306) + - Objects (hard/soft link) can now be deleted with `unlink` (#284). Thanks to Tom Vander Aa. + - Attributes can be deleted with `deleteAttribute` (#239) + +### Improvements: + - `Attribute`s (metadata) now support additional types (#298) + - H5Easy: Reworked for compatibility with `Eigen::ref` and `Eigen::Map` (#291, #293) + - Hdf5 1.12 compatibility: working `Object::getInfo` and marking getAddress deprecated (#311) + - Strict compatibility with CMake 3.1 and C++11 (#304) + - CMake: Dependencies may be re-detected on FindPackage, fixed export targets and added integration tests (#255, #304, #312, #317) + - Support for array of `Eigen::Matrix` (#258) + - Selection: `ElementSet` working for N-dimensions (#247) + +### Bug Fixes: + - Shortcut syntax with c arrays (#273) + - Compatibility with in MSVC (Exception messages #263 and avoid throwing in `exist` check #308) + +## Version 2.1 - 2019-10-30 +### New Features: + - Inspection: API to get the type of links/objects and datasets data-types (#221) + - H5Easy: API for simple import/export to Eigen and xtensor (#141) + - Support for chunk and deflate configuration at dataset creation/open (#125). Added generic RawPropertyLists. (#157) + - Recursive `createGroup` and `exist` (#152) + - Shortcut syntax: ability to create a filled dataset in a single line (#130) + - DataSet now accepts `std::complex` and `std::array`'s (#128, #129) + +### Improvements: + - Improved compat with MSVC and ICC compilers + - CMake build system: modernized, create exported targets, better messages, etc. + - Building and publishing documentation: https://bluebrain.github.io/HighFive/ + - Several other. See #231 + +### Bug Fixes: + - Fixed header dependencies. They are now all include-able (#225) + - Fixed read/write of N-Dimensional data as nested vectors (#191) + - Fixed data broadcasting for reading (#136) + +## Version 2.0 - 2018-07-19 + - First version with C++11 enforcement + - Support for property list + - Support for Chunking + - Support for Compression / Deflate + - Fix: missing move constructor for properties + - Fix: typo in MPI IO driver + - Fix: several typo fixes + - Fix: Add missing include + +## Version 1.5 - 2018-01-06 + - SliceTraits::read split in two overloads, the first one for plain C arrays + and the second one for other types. + - Add support for complex number + - Add exist() method to the API + - Will be last release before 2.0 and enforcement of C++11 + +## Version 1.4 - 2017-08-25 + - Support id selection for the `select` function + - Suport STL containers of const elements + - Support scalar values and strings management + - Fix attribute assignment issue #40 + - Fix Object assignment operator missing unref (possible memory leak ) + - Introduce SilenceHDF5 for HDF5 error report + - Fix a unit test issue with SilenceHDF5 + +## Version 1.3 - 2017-06-21 + - Minor fixes + +## Version 1.2 - 2017-04-03 + - Add Attribute support for Dataset + - Extend testing of Attribute support + - Fix issue related to multiple definitions in default driver + - Add more examples about attribute support + +## Version 1.1 - 2017-03-23 + - Add support and examples for Parallel HDF5 + - Initial implementation for H5 Properties + - Support for Attributes + - Improve documentation + - Add example for boost.Ublas matrix support + +## Version 1.0 - Init + - Initial release diff --git a/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMake/HighFiveConfig.cmake.in b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMake/HighFiveConfig.cmake.in new file mode 100644 index 0000000000..c37fffdf34 --- /dev/null +++ b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMake/HighFiveConfig.cmake.in @@ -0,0 +1,67 @@ +function(copy_interface_properties target source) + foreach(prop + INTERFACE_COMPILE_DEFINITIONS + INTERFACE_COMPILE_FEATURES + INTERFACE_COMPILE_OPTIONS + INTERFACE_INCLUDE_DIRECTORIES + INTERFACE_LINK_LIBRARIES + INTERFACE_SOURCES + INTERFACE_SYSTEM_INCLUDE_DIRECTORIES) + set_property(TARGET ${target} APPEND PROPERTY ${prop} $) + endforeach() +endfunction() + +if(TARGET HighFive) + return() +endif() + +# Get HighFive targets +include("${CMAKE_CURRENT_LIST_DIR}/HighFiveTargets.cmake") + +# Recreate combined HighFive +add_library(HighFive INTERFACE IMPORTED) +set_property(TARGET HighFive APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS MPI_NO_CPPBIND) # No c++ bindings + +# Ensure we activate required C++ std +if(NOT DEFINED CMAKE_CXX_STANDARD) + if(CMAKE_VERSION VERSION_LESS 3.8) + message(WARNING "HighFive requires minimum C++11. (C++14 for XTensor) \ + You may need to set CMAKE_CXX_STANDARD in you project") + else() + # A client request for a higher std overrides this + target_compile_features(HighFive INTERFACE cxx_std_11) + endif() +endif() + +# If the user sets this flag, all dependencies are preserved. +# Useful in central deployments where dependencies are not prepared later +set(HIGHFIVE_USE_INSTALL_DEPS @HIGHFIVE_USE_INSTALL_DEPS@ CACHE BOOL "Use original Highfive dependencies") +if(HIGHFIVE_USE_INSTALL_DEPS) + # If enabled in the deploy config, request c++14 + if(@HIGHFIVE_USE_XTENSOR@ AND NOT CMAKE_VERSION VERSION_LESS 3.8) + set_property(TARGET HighFive APPEND PROPERTY INTERFACE_COMPILE_FEATURES cxx_std_14) + endif() + message(STATUS "HIGHFIVE @PROJECT_VERSION@: Using original dependencies (HIGHFIVE_USE_INSTALL_DEPS=YES)") + copy_interface_properties(HighFive HighFive_HighFive) + return() +endif() + +# When not using the pre-built dependencies, give user options +if(DEFINED HIGHFIVE_USE_BOOST) + set(HIGHFIVE_USE_BOOST ${HIGHFIVE_USE_BOOST} CACHE BOOL "Enable Boost Support") +else() + set(HIGHFIVE_USE_BOOST @HIGHFIVE_USE_BOOST@ CACHE BOOL "Enable Boost Support") +endif() +set(HIGHFIVE_USE_EIGEN "${HIGHFIVE_USE_EIGEN}" CACHE BOOL "Enable Eigen testing") +set(HIGHFIVE_USE_XTENSOR "${HIGHFIVE_USE_XTENSOR}" CACHE BOOL "Enable xtensor testing") +set(HIGHFIVE_PARALLEL_HDF5 @HIGHFIVE_PARALLEL_HDF5@ CACHE BOOL "Enable Parallel HDF5 support") + +if(HIGHFIVE_USE_XTENSOR AND NOT CMAKE_VERSION VERSION_LESS 3.8) + set_property(TARGET HighFive APPEND PROPERTY INTERFACE_COMPILE_FEATURES cxx_std_14) +endif() + +message(STATUS "HIGHFIVE @PROJECT_VERSION@: (Re)Detecting Highfive dependencies (HIGHFIVE_USE_INSTALL_DEPS=NO)") +include("${CMAKE_CURRENT_LIST_DIR}/HighFiveTargetDeps.cmake") +foreach(dependency HighFive_libheaders libdeps) + copy_interface_properties(HighFive ${dependency}) +endforeach() diff --git a/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMake/HighFiveTargetDeps.cmake b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMake/HighFiveTargetDeps.cmake new file mode 100644 index 0000000000..6f8dbaec56 --- /dev/null +++ b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMake/HighFiveTargetDeps.cmake @@ -0,0 +1,93 @@ +# Link against target system libs +# ------------------------------- + +if(NOT TARGET libdeps) + + # Independent target to make it possible to have new dependencies each build + add_library(libdeps INTERFACE) + + # HDF5 + if(NOT DEFINED HDF5_C_LIBRARIES) + set(HDF5_PREFER_PARALLEL ${HIGHFIVE_PARALLEL_HDF5}) + find_package(HDF5 REQUIRED) + endif() + + if(HIGHFIVE_PARALLEL_HDF5 AND NOT HDF5_IS_PARALLEL) + message(WARNING "Parallel HDF5 requested but libhdf5 doesnt support it") + endif() + + target_include_directories(libdeps SYSTEM INTERFACE ${HDF5_INCLUDE_DIRS}) + target_link_libraries(libdeps INTERFACE ${HDF5_LIBRARIES}) + target_compile_definitions(libdeps INTERFACE ${HDF5_DEFINITIONS}) + + # Boost + if(HIGHFIVE_USE_BOOST) + set(Boost_NO_BOOST_CMAKE TRUE) # Consistency + find_package(Boost REQUIRED COMPONENTS system serialization) + # Dont use imported targets yet, not avail before cmake 3.5 + target_include_directories(libdeps SYSTEM INTERFACE ${Boost_INCLUDE_DIR}) + target_compile_definitions(libdeps INTERFACE BOOST_ALL_NO_LIB H5_USE_BOOST) + endif() + + # Half + if(HIGHFIVE_USE_HALF_FLOAT) + find_file(FOUND_HALF half.hpp) + if (NOT FOUND_HALF) + message(FATAL_ERROR "Half-precision floating-point support requested but file half.hpp not found") + endif() + target_compile_definitions(libdeps INTERFACE H5_USE_HALF_FLOAT) + endif() + + # Eigen + if(HIGHFIVE_USE_EIGEN) + if (NOT EIGEN3_INCLUDE_DIRS) + find_package(Eigen3 NO_MODULE) + if(Eigen3_FOUND) + message(STATUS "Found Eigen ${Eigen3_VERSION}: ${EIGEN3_INCLUDE_DIRS}") + else() + find_package(PkgConfig) + pkg_check_modules(EIGEN3 REQUIRED eigen3) + endif() + endif() + if (NOT EIGEN3_INCLUDE_DIRS) + message(FATAL_ERROR "Eigen was requested but could not be found") + endif() + target_include_directories(libdeps SYSTEM INTERFACE ${EIGEN3_INCLUDE_DIRS}) + target_compile_definitions(libdeps INTERFACE H5_USE_EIGEN) + endif() + + # xtensor + if(HIGHFIVE_USE_XTENSOR) + if (NOT xtensor_INCLUDE_DIRS) + find_package(xtensor REQUIRED) + endif() + if (NOT xtl_INCLUDE_DIRS) + find_package(xtl REQUIRED) + endif() + target_include_directories(libdeps SYSTEM INTERFACE ${xtensor_INCLUDE_DIRS} ${xtl_INCLUDE_DIRS}) + target_compile_definitions(libdeps INTERFACE H5_USE_XTENSOR) + endif() + + # OpenCV + if(HIGHFIVE_USE_OPENCV) + if (NOT OpenCV_INCLUDE_DIRS) + find_package(OpenCV REQUIRED) + endif() + target_include_directories(libdeps SYSTEM INTERFACE ${OpenCV_INCLUDE_DIRS}) + target_link_libraries(libdeps INTERFACE ${OpenCV_LIBS}) + target_compile_definitions(libdeps INTERFACE H5_USE_OPENCV) + endif() + + # MPI + if(HIGHFIVE_PARALLEL_HDF5 OR HDF5_IS_PARALLEL) + find_package(MPI REQUIRED) + target_include_directories(libdeps SYSTEM INTERFACE ${MPI_CXX_INCLUDE_PATH}) + target_link_libraries(libdeps INTERFACE ${MPI_CXX_LIBRARIES}) + if(CMAKE_VERSION VERSION_LESS 3.13) + target_link_libraries(libdeps INTERFACE ${MPI_CXX_LINK_FLAGS}) + else() + target_link_options(libdeps INTERFACE "SHELL:${MPI_CXX_LINK_FLAGS}") + endif() + endif() + +endif() diff --git a/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMake/HighFiveTargetExport.cmake b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMake/HighFiveTargetExport.cmake new file mode 100644 index 0000000000..9906f39513 --- /dev/null +++ b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMake/HighFiveTargetExport.cmake @@ -0,0 +1,48 @@ + +# Define the HighFive INTERFACE library +add_library(libheaders INTERFACE) + +target_include_directories(libheaders INTERFACE + "$" + "$") + +# Combined HighFive +add_library(HighFive INTERFACE) +target_compile_definitions(HighFive INTERFACE MPI_NO_CPPBIND) # No c++ bindings +target_link_libraries(HighFive INTERFACE libheaders libdeps) + + +# Generate ${PROJECT_NAME}Config.cmake + +include(CMakePackageConfigHelpers) +configure_package_config_file(${CMAKE_CURRENT_LIST_DIR}/HighFiveConfig.cmake.in + ${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake + INSTALL_DESTINATION share/${PROJECT_NAME}/CMake) + +write_basic_package_version_file( + ${PROJECT_NAME}ConfigVersion.cmake + VERSION ${PROJECT_VERSION} + COMPATIBILITY AnyNewerVersion) + +install(FILES + CMake/HighFiveTargetDeps.cmake + ${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake + ${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake + DESTINATION share/${PROJECT_NAME}/CMake) + + +# Provides IMPORTED targets when using this project from build/install trees. + +# Specify targets to include in the HighFive Exports +install(TARGETS HighFive libheaders libdeps + EXPORT HighFiveTargets) + +# Generate & install the Export for the INSTALL_INTERFACE +install(EXPORT HighFiveTargets + NAMESPACE HighFive_ + FILE HighFiveTargets.cmake + DESTINATION share/${PROJECT_NAME}/CMake) + +# Generate the Export for the BUILD_INTERACE (hardly used) +export(EXPORT HighFiveTargets + FILE "${PROJECT_BINARY_DIR}/HighFiveTargets.cmake") diff --git a/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMake/config/CompilerFlagsHelpers.cmake b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMake/config/CompilerFlagsHelpers.cmake new file mode 100644 index 0000000000..e3755ad8c6 --- /dev/null +++ b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMake/config/CompilerFlagsHelpers.cmake @@ -0,0 +1,59 @@ +# CompilerFlagsHelpers.cmake +# +# set of Convenience functions for portable compiler flags +# +# License: BSD 3 +# +# Copyright (c) 2016, Adrien Devresse +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +set(SUPPORTED_COMPILER_LANGUAGE_LIST "C;CXX") + +foreach(COMPILER_LANGUAGE ${SUPPORTED_COMPILER_LANGUAGE_LIST}) + + # XLC compiler + if(CMAKE_${COMPILER_LANGUAGE}_COMPILER_ID MATCHES "XL") + + # XLC -qinfo=all is awfully verbose on any platforms that use the GNU STL + # Enable by default only the relevant one + set(CMAKE_${COMPILER_LANGUAGE}_WARNING_ALL "-qformat=all -qinfo=lan:trx:ret:zea:cmp:ret") + + ## GCC, CLANG, rest of the world + elseif(CMAKE_${COMPILER_LANGUAGE}_COMPILER_ID MATCHES "Clang" + OR CMAKE_${COMPILER_LANGUAGE}_COMPILER_ID MATCHES "GNU" + OR CMAKE_${COMPILER_LANGUAGE}_COMPILER_ID MATCHES "Intel") + set(CMAKE_${COMPILER_LANGUAGE}_WARNING_ALL " -Wall -Wextra") + string(CONCAT CMAKE_${COMPILER_LANGUAGE}_WARNING_DEBUG + " -Werror -Wshadow -Wnon-virtual-dtor -Wunused -Woverloaded-virtual" + " -Wformat=2 -Wconversion -Wsign-conversion -Wno-error=deprecated-declarations" + ) + if(NOT CMAKE_${COMPILER_LANGUAGE}_COMPILER_IS_ICC) + string(CONCAT CMAKE_${COMPILER_LANGUAGE}_WARNING_DEBUG + ${CMAKE_${COMPILER_LANGUAGE}_WARNING_DEBUG} + " -Wpedantic -Wcast-align -Wdouble-promotion" + ) + endif() + endif() + + if(CMAKE_${COMPILER_LANGUAGE}_COMPILER_ID MATCHES "GNU" + AND (CMAKE_${COMPILER_LANGUAGE}_COMPILER_VERSION VERSION_GREATER "4.7.0")) + set(CMAKE_${COMPILER_LANGUAGE}_WARNING_ALL + "${CMAKE_${COMPILER_LANGUAGE}_WARNING_ALL} -Wno-unused-parameter") + endif() + +endforeach() + + + diff --git a/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMake/config/ReleaseDebugAutoFlags.cmake b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMake/config/ReleaseDebugAutoFlags.cmake new file mode 100644 index 0000000000..2b980698eb --- /dev/null +++ b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMake/config/ReleaseDebugAutoFlags.cmake @@ -0,0 +1,45 @@ +# ReleaseDebugAutoFlags.cmake +# +# Release / Debug configuration helper +# +# License: BSD 3 +# +# Copyright (c) 2016, Adrien Devresse +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +## default configuration +if(NOT CMAKE_BUILD_TYPE AND (NOT CMAKE_CONFIGURATION_TYPES)) + set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build." FORCE) + message(STATUS "Setting build type to '${CMAKE_BUILD_TYPE}' as none was specified.") +endif() + + +# Different configuration types: +# +# Debug : Optimized for debugging, include symbols +# Release : Release mode, no debuginfo +# RelWithDebInfo : Distribution mode, basic optimizations for potable code with debuginfos + +include(CompilerFlagsHelpers) + + +string(APPEND CMAKE_C_FLAGS_RELEASE "${CMAKE_C_WARNING_ALL}") +string(APPEND CMAKE_C_FLAGS_DEBUG "${CMAKE_C_WARNING_ALL}" "${CMAKE_C_WARNING_DEBUG}") +string(APPEND CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_WARNING_ALL}" "${CMAKE_C_WARNING_DEBUG}") + + +string(APPEND CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_WARNING_ALL}") +string(APPEND CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_WARNING_ALL}" "${CMAKE_CXX_WARNING_DEBUG}") +string(APPEND CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_WARNING_ALL}" "${CMAKE_C_WARNING_DEBUG}") diff --git a/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMake/config/TestHelpers.cmake b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMake/config/TestHelpers.cmake new file mode 100644 index 0000000000..f3ca1cb741 --- /dev/null +++ b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMake/config/TestHelpers.cmake @@ -0,0 +1,113 @@ +# TestHelpers.cmake +# +# set of Convenience functions for unit testing with cmake +# +# License: BSD 3 +# +# Copyright (c) 2016, Adrien Devresse +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +## +# enable or disable detection of SLURM and MPIEXEC +option(AUTO_TEST_WITH_SLURM "automatically add srun as test prefix in a SLURM environment" TRUE) +option(AUTO_TEST_WITH_MPIEXEC "automatically add mpiexec as test prefix in a MPICH2/OpenMPI environment" TRUE) + +### +## +## Basic SLURM support +## the prefix "srun" is added to any test in the environment +## For a slurm test execution, simply run "salloc [your_exec_parameters] ctest" +## +## +if(AUTO_TEST_WITH_SLURM) + if(NOT DEFINED SLURM_SRUN_COMMAND) + find_program(SLURM_SRUN_COMMAND + NAMES "srun" + HINTS "${SLURM_ROOT}/bin") + endif() + + if(SLURM_SRUN_COMMAND) + set(TEST_EXEC_PREFIX_DEFAULT "${SLURM_SRUN_COMMAND}") + set(TEST_MPI_EXEC_PREFIX_DEFAULT "${SLURM_SRUN_COMMAND}") + set(TEST_MPI_EXEC_BIN_DEFAULT "${SLURM_SRUN_COMMAND}") + set(TEST_WITH_SLURM ON) + message(STATUS " - AUTO_TEST_WITH_SLURM with slurm cmd ${TEST_EXEC_PREFIX_DEFAULT} ") + message(STATUS " -- set test execution prefix to ${TEST_EXEC_PREFIX_DEFAULT} ") + message(STATUS " -- set MPI test execution prefix to ${TEST_MPI_EXEC_PREFIX_DEFAULT} ") + endif() + +endif() + +### +## Basic MPIExec support, will just forward mpiexec as prefix +## +if(AUTO_TEST_WITH_MPIEXEC AND NOT TEST_WITH_SLURM) + + if(NOT DEFINED MPIEXEC) + find_program(MPIEXEC + NAMES "mpiexec" + HINTS "${MPI_ROOT}/bin") + endif() + + + if(MPIEXEC) + set(TEST_MPI_EXEC_PREFIX_DEFAULT "${MPIEXEC}") + set(TEST_MPI_EXEC_BIN_DEFAULT "${MPIEXEC}") + set(TEST_WITH_MPIEXEC ON) + message(STATUS " - AUTO_TEST_WITH_MPIEXEC cmd ${MPIEXEC} ") + message(STATUS " -- set MPI test execution prefix to ${TEST_MPI_EXEC_PREFIX_DEFAULT} ") + + endif() + +endif() + + + +### +## MPI executor program path without arguments used for testing. +## default: srun or mpiexec if found +## +set(TEST_MPI_EXEC_BIN "${TEST_MPI_EXEC_BIN_DEFAULT}" CACHE STRING "path of the MPI executor (mpiexec, mpirun) for test execution") + + + +### +## Test execution prefix. Override this variable for any execution prefix required in clustered environment +## +## To specify manually a command with argument, e.g -DTEST_EXEC_PREFIX="/var/empty/bin/srun;-n;-4" for a srun execution +## with 4 nodes +## +## default: srun if found +## +set(TEST_EXEC_PREFIX "${TEST_EXEC_PREFIX_DEFAULT}" CACHE STRING "prefix command for the test executions") + + + +### +## Test execution prefix specific for MPI programs. +## +## To specify manually a command with argument, use the cmake list syntax. e.g -DTEST_EXEC_PREFIX="/var/empty/bin/mpiexec;-n;-4" for an MPI execution +## with 4 nodes +## +## default: srun or mpiexec if found +## +set(TEST_MPI_EXEC_PREFIX "${TEST_MPI_EXEC_PREFIX_DEFAULT}" CACHE STRING "prefix command for the MPI test executions") + + + + + + + diff --git a/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMakeLists.txt b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMakeLists.txt new file mode 100644 index 0000000000..27746c2ff6 --- /dev/null +++ b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/CMakeLists.txt @@ -0,0 +1,124 @@ +cmake_minimum_required(VERSION 3.1) +if(${CMAKE_VERSION} VERSION_LESS 3.13) + cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}) +else() + cmake_policy(VERSION 3.13) +endif() + +project(HighFive VERSION 2.6.2) + +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/include/highfive/H5Version.hpp.in + ${CMAKE_CURRENT_BINARY_DIR}/include/highfive/H5Version.hpp) +# INCLUDES +list(APPEND CMAKE_MODULE_PATH + ${PROJECT_SOURCE_DIR}/CMake + ${PROJECT_SOURCE_DIR}/CMake/portability + ${PROJECT_SOURCE_DIR}/CMake/config) + +# OPTIONS +# Compatibility within Highfive 2.x series +set(USE_BOOST ON CACHE BOOL "Enable Boost Support") +set(USE_EIGEN OFF CACHE BOOL "Enable Eigen testing") +set(USE_XTENSOR OFF CACHE BOOL "Enable xtensor testing") +set(USE_OPENCV OFF CACHE BOOL "Enable OpenCV testing") +mark_as_advanced(USE_BOOST USE_EIGEN USE_XTENSOR) + +set(HIGHFIVE_UNIT_TESTS AUTO CACHE STRING "Enable unit tests (requires Catch2 to be present)") +set_property(CACHE HIGHFIVE_UNIT_TESTS PROPERTY STRINGS AUTO ON OFF) + +option(HIGHFIVE_USE_BOOST "Enable Boost Support" ${USE_BOOST}) +option(HIGHFIVE_USE_HALF_FLOAT "Enable half-precision floats" ${USE_HALF_FLOAT}) +option(HIGHFIVE_USE_EIGEN "Enable Eigen testing" ${USE_EIGEN}) +option(HIGHFIVE_USE_OPENCV "Enable OpenCV testing" ${USE_OPENCV}) +option(HIGHFIVE_USE_XTENSOR "Enable xtensor testing" ${USE_XTENSOR}) +option(HIGHFIVE_EXAMPLES "Compile examples" ON) +option(HIGHFIVE_PARALLEL_HDF5 "Enable Parallel HDF5 support" OFF) +option(HIGHFIVE_BUILD_DOCS "Enable documentation building" ON) + +# In deployments we probably don't want/cant have dynamic dependencies +option(HIGHFIVE_USE_INSTALL_DEPS "End applications by default use detected dependencies here" OFF) +mark_as_advanced(HIGHFIVE_USE_INSTALL_DEPS) + + +# Check compiler cxx_std requirements +# ----------------------------------- + +if(CMAKE_CXX_STANDARD EQUAL 98) + message(FATAL_ERROR "HighFive needs to be compiled with at least C++11") +endif() + +if(NOT DEFINED CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 11) + set(CMAKE_CXX_STANDARD_REQUIRED ON) + set(CMAKE_CXX_EXTENSIONS OFF) +endif() + +if(HIGHFIVE_USE_XTENSOR) + set(CMAKE_CXX_STANDARD 14) + set(CMAKE_CXX_STANDARD_REQUIRED ON) +endif() + + +# Search dependencies (hdf5, boost, eigen, xtensor, mpi) and build target highfive_deps +include(${PROJECT_SOURCE_DIR}/CMake/HighFiveTargetDeps.cmake) + +# Set-up HighFive to be used in 3rd party project using exports. Create a HighFive target +include(${PROJECT_SOURCE_DIR}/CMake/HighFiveTargetExport.cmake) + +# Installation of headers (HighFive is only interface) +install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/ + DESTINATION "include" + PATTERN "*.in" EXCLUDE) + +# Installation of configured headers +install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/ + DESTINATION "include") + + +# Preparing local building (tests, examples) +# ------------------------------------------ + +# Disable test if Boost was expressly disabled, or if HighFive is a sub-project +if (NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) + if(HIGHFIVE_UNIT_TESTS) + message(WARNING "Unit tests have been DISABLED.") + endif() + set(HIGHFIVE_UNIT_TESTS FALSE) +endif() + +if(HIGHFIVE_UNIT_TESTS) + if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/deps/catch2/CMakeLists.txt) + add_subdirectory(deps/catch2 EXCLUDE_FROM_ALL) + list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/deps/catch2/contrib) + else() + find_package(Catch2) + if(NOT HIGHFIVE_UNIT_TESTS STREQUAL "AUTO" AND HIGHFIVE_UNIT_TESTS AND NOT Catch2_FOUND) + message(FATAL_ERROR "Please provide a Catch2 installation or clone the submodule") + elseif(NOT Catch2_FOUND) + message(WARNING "No Catch2 installation was found; Disabling unit tests.") + set(HIGHFIVE_UNIT_TESTS OFF) + endif() + endif() +endif() + + +if(CMAKE_CXX_COMPILER_ID MATCHES "Intel") + # ICC gets mad if we shorten "int"s + add_definitions("-wd1682") +endif() + +# Set compile time flags _after_ including required dependencies +include(ReleaseDebugAutoFlags) + +if(HIGHFIVE_EXAMPLES) + add_subdirectory(src/examples) +endif() + +if(HIGHFIVE_UNIT_TESTS) + enable_testing() + add_subdirectory(tests/unit) +endif() + +if(HIGHFIVE_BUILD_DOCS) + add_subdirectory(doc) +endif() diff --git a/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/LICENSE b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/LICENSE new file mode 100644 index 0000000000..bc1edcab2e --- /dev/null +++ b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/LICENSE @@ -0,0 +1,25 @@ +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + + diff --git a/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/README.md b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/README.md new file mode 100644 index 0000000000..953f534a0c --- /dev/null +++ b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/README.md @@ -0,0 +1,225 @@ +# HighFive - HDF5 header-only C++ Library + +[![Build Status](https://travis-ci.org/BlueBrain/HighFive.svg?branch=master)](https://travis-ci.org/BlueBrain/HighFive) +[![Coverity Statys](https://scan.coverity.com/projects/13635/badge.svg)](https://scan.coverity.com/projects/highfive) +[![Doxygen -> gh-pages](https://github.com/BlueBrain/HighFive/workflows/gh-pages/badge.svg)](https://BlueBrain.github.io/HighFive) +[![codecov](https://codecov.io/gh/BlueBrain/HighFive/branch/master/graph/badge.svg?token=UBKxHEn7RS)](https://codecov.io/gh/BlueBrain/HighFive) +[![HighFive_Integration_tests](https://github.com/BlueBrain/HighFive-testing/actions/workflows/integration.yml/badge.svg)](https://github.com/BlueBrain/HighFive-testing/actions/workflows/integration.yml) + +Documentation: https://bluebrain.github.io/HighFive/ + +## Brief + +HighFive is a modern header-only C++11 friendly interface for libhdf5. + +HighFive supports STL vector/string, Boost::UBLAS, Boost::Multi-array, Eigen and Xtensor. It handles C++ from/to HDF5 with automatic type mapping. +HighFive does not require additional libraries (see dependencies) and supports both HDF5 thread safety and Parallel HDF5 (contrary to the official hdf5 cpp) + +It integrates nicely with other CMake projects by defining (and exporting) a HighFive target. + + +### Design +- Simple C++-ish minimalist interface +- No other dependency than libhdf5 +- Zero overhead +- Support C++11 + +### Feature support +- create/read/write files, datasets, attributes, groups, dataspaces. +- automatic memory management / ref counting +- automatic conversion of `std::vector` and nested `std::vector` from/to any dataset with basic types +- automatic conversion of `std::string` to/from variable length string dataset +- selection() / slice support +- parallel Read/Write operations from several nodes with Parallel HDF5 +- Advanced types: Compound, Enum, Arrays of Fixed-length strings, References +- half-precision (16-bit) floating-point datasets +- etc... (see [ChangeLog](./CHANGELOG.md)) + +### Dependencies +- hdf5 (dev) +- hdf5-mpi (optional, opt-in with -D*HIGHFIVE_PARALLEL_HDF5*=ON) +- boost >= 1.41 (recommended, opt-out with -D*HIGHFIVE_USE_BOOST*=OFF) +- eigen3 (optional, opt-in with -D*HIGHFIVE_USE_EIGEN*=ON) +- xtensor (optional, opt-in with -D*HIGHFIVE_USE_XTENSOR*=ON) +- half (optional, opt-in with -D*HIGHFIVE_USE_HALF_FLOAT*=ON) + + +## Examples + +#### Write a std::vector to 1D HDF5 dataset and read it back + +```c++ +#include + +using namespace HighFive; + +std::string filename = "/tmp/new_file.h5"; + +{ + // We create an empty HDF55 file, by truncating an existing + // file if required: + File file(filename, File::Truncate); + + std::vector data(50, 1); + file.createDataSet("grp/data", data); +} + +{ + // We open the file as read-only: + File file(filename, File::ReadOnly); + auto dataset = file.getDataSet("grp/data"); + + // Read back, with allocating: + auto data = dataset.read>(); + + // Because `data` has the correct size, this will + // not cause `data` to be reallocated: + dataset.read(data); +} +``` + +**Note:** `H5File.hpp` is the top-level header of HighFive core which should be always included. + +**Note:** For advanced usecases the dataset can be created without immediately +writing to it. This is common in MPI-IO related patterns, or when growing a +dataset over the course of a simulation. + +#### Write a 2 dimensional C double float array to a 2D HDF5 dataset + +See [create_dataset_double.cpp](src/examples/create_dataset_double.cpp) + +#### Write and read a matrix of double float (boost::ublas) to a 2D HDF5 dataset + +See [boost_ublas_double.cpp](src/examples/boost_ublas_double.cpp) + +#### Write and read a subset of a 2D double dataset + +See [select_partial_dataset_cpp11.cpp](src/examples/select_partial_dataset_cpp11.cpp) + +#### Create, write and list HDF5 attributes + +See [create_attribute_string_integer.cpp](src/examples/create_attribute_string_integer.cpp) + +#### And others + +See [src/examples/](src/examples/) subdirectory for more info. + + +### Compiling with HighFive + +```bash +c++ -o program -I/path/to/highfive/include source.cpp -lhdf5 +``` + +### H5Easy + +For several 'standard' use cases the [highfive/H5Easy.hpp](include/highfive/H5Easy.hpp) interface is available. It allows: + +* Reading/writing in a single line of: + + - scalars (to/from an extendible DataSet), + - strings, + - vectors (of standard types), + - [Eigen::Matrix](http://eigen.tuxfamily.org) (optional, enable CMake option `HIGHFIVE_USE_EIGEN`), + - [xt::xarray](https://github.com/QuantStack/xtensor) and [xt::xtensor](https://github.com/QuantStack/xtensor) + (optional, enable CMake option `HIGHFIVE_USE_XTENSOR`). + - [cv::Mat_](https://docs.opencv.org/master/df/dfc/classcv_1_1Mat__.html) + (optional, enable CMake option `HIGHFIVE_USE_OPENCV`). + +* Getting in a single line: + + - the size of a DataSet, + - the shape of a DataSet. + +#### Example + +```cpp +#include + +int main() { + H5Easy::File file("example.h5", H5Easy::File::Overwrite); + + int A = ...; + H5Easy::dump(file, "/path/to/A", A); + + A = H5Easy::load(file, "/path/to/A"); +} +``` + +whereby the `int` type of this example can be replaced by any of the above types. See [easy_load_dump.cpp](src/examples/easy_load_dump.cpp) for more details. + +**Note:** Classes such as `H5Easy::File` are just short for the regular `HighFive` classes (in this case `HighFive::File`). They can thus be used interchangeably. + + +## CMake integration + +HighFive can easily be used by other C++ CMake projects. + +You may use HighFive from a folder in your project (typically a git submodule). +```cmake +cmake_minimum_required(VERSION 3.1 FATAL_ERROR) +project(foo) +set(CMAKE_CXX_STANDARD 11) + +add_subdirectory(highfive_folder) +add_executable(bar bar.cpp) +target_link_libraries(bar HighFive) +``` + +Alternativelly you can install HighFive once and use it in several projects via `find_package()`. + +A HighFive target will bring the compilation settings to find HighFive headers and all chosen dependencies. + +```cmake +# ... +find_package(HighFive REQUIRED) +add_executable(bar bar.cpp) +target_link_libraries(bar HighFive) +``` +**Note:** Like with other libraries you may need to provide CMake the location to find highfive: `CMAKE_PREFIX_PATH=` + +**Note:** `find_package(HighFive)` will search dependencies as well (e.g. Boost if requested). In order to use the same dependencies found at HighFive install time (e.g. for system deployments) you may set `HIGHFIVE_USE_INSTALL_DEPS=YES` + +### Installing +When installing via CMake, besides the headers, a HighFiveConfig.cmake is generated which provides the HighFive target, as seen before. Note: You may need to set `CMAKE_INSTALL_PREFIX`: +```bash +mkdir build && cd build +# Look up HighFive CMake options, consider inspecting with `ccmake` +cmake .. -DHIGHFIVE_EXAMPLES=OFF -DCMAKE_INSTALL_PREFIX="" +make install +``` + +### Test Compilation +As a header-only library, HighFive doesn't require compilation. You may however build tests and examples. + +```bash +mkdir build && cd build +cmake ../ +make # build tests and examples +make test # build and run unit tests +``` + +**Note:** Unit tests require Boost. In case it's unavailable you may use `-DHIGHFIVE_USE_BOOST=OFF`. +HighFive with disable support for Boost types as well as unit tests (though most examples will build). + +### Code formatting +If you want to propose pull requests to this project, do not forget to format code with +clang-format version 12. +The .clang-format is at the root of the git repository. + +# Questions? + +Do you have questions on how to use HighFive? Would you like to share an interesting example or +discuss HighFive features? Head over to the [Discussions](https://github.com/BlueBrain/HighFive/discussions) +forum and join the community. + +# Funding & Acknowledgment + +The development of this software was supported by funding to the Blue Brain Project, a research center of the École polytechnique fédérale de Lausanne (EPFL), from the Swiss government's ETH Board of the Swiss Federal Institutes of Technology. + +Copyright © 2015-2022 Blue Brain Project/EPFL + + +### License + +Boost Software License 1.0 diff --git a/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/VERSION b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/VERSION new file mode 100644 index 0000000000..b1b25a5ffa --- /dev/null +++ b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/VERSION @@ -0,0 +1 @@ +2.2.2 diff --git a/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/doc/CMakeLists.txt b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/doc/CMakeLists.txt new file mode 100644 index 0000000000..2538af62d2 --- /dev/null +++ b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/doc/CMakeLists.txt @@ -0,0 +1,7 @@ +find_package(Doxygen) +if(Doxygen_FOUND) + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY) + add_custom_target(doc COMMAND Doxygen::doxygen ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile) +else() + message(STATUS " Documentation (doc) cannot be built since Doxygen is not available.") +endif() diff --git a/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/doc/Doxyfile b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/doc/Doxyfile new file mode 100644 index 0000000000..52638f15ca --- /dev/null +++ b/externals/coda-oss/modules/drivers/highfive/HighFive-2.6.2/doc/Doxyfile @@ -0,0 +1,2618 @@ +# Doxyfile 1.9.1 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the configuration +# file that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# https://www.gnu.org/software/libiconv/ for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = HighFive + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = @PROJECT_VERSION@ + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "HighFive - Header-only C++ HDF5 interface" + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all generated output in the proper direction. +# Possible values are: None, LTR, RTL and Context. +# The default value is: None. + +OUTPUT_TEXT_DIRECTION = None + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = @CMAKE_CURRENT_SOURCE_DIR@/../include + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line +# such as +# /*************** +# as being the beginning of a Javadoc-style comment "banner". If set to NO, the +# Javadoc-style will behave just like regular comments and it will not be +# interpreted by doxygen. +# The default value is: NO. + +JAVADOC_BANNER = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# By default Python docstrings are displayed as preformatted text and doxygen's +# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the +# doxygen's special commands can be used and the contents of the docstring +# documentation blocks is shown as doxygen documentation. +# The default value is: YES. + +PYTHON_DOCSTRING = YES + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines (in the resulting output). You can put ^^ in the value part of an +# alias to insert a newline as if a physical newline was in the original file. +# When you need a literal { or } or , in the value part of an alias you have to +# escape them by means of a backslash (\), this can lead to conflicts with the +# commands \{ and \} for these it is advised to use the version @{ and @} or use +# a double escape (\\{ and \\}) + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice +# sources only. Doxygen will then generate output that is more tailored for that +# language. For instance, namespaces will be presented as modules, types will be +# separated into more groups, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_SLICE = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, +# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, VHDL, +# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser +# tries to guess whether the code is fixed or free formatted code, this is the +# default for Fortran type files). For instance to make doxygen treat .inc files +# as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. When specifying no_extension you should add +# * to the FILE_PATTERNS. +# +# Note see also the list of default file extension mappings. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See https://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 5. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 0 + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +# The NUM_PROC_THREADS specifies the number threads doxygen is allowed to use +# during processing. When set to 0 doxygen will based this on the number of +# cores available in the system. You can set it explicitly to a value larger +# than 0 to get more control over the balance between CPU load and processing +# speed. At this moment only the input processing can be done using multiple +# threads. Since this is still an experimental feature the default is set to 1, +# which efficively disables parallel processing. Please report any issues you +# encounter. Generating dot graphs in parallel is controlled by the +# DOT_NUM_THREADS setting. +# Minimum value: 0, maximum value: 32, default value: 1. + +NUM_PROC_THREADS = 1 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual +# methods of a class will be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIV_VIRTUAL = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If this flag is set to YES, the name of an unnamed parameter in a declaration +# will be determined by the corresponding definition. By default unnamed +# parameters remain unnamed in the output. +# The default value is: YES. + +RESOLVE_UNNAMED_PARAMS = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# declarations. If set to NO, these declarations will be included in the +# documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# With the correct setting of option CASE_SENSE_NAMES doxygen will better be +# able to match the capabilities of the underlying filesystem. In case the +# filesystem is case sensitive (i.e. it supports files in the same directory +# whose names only differ in casing), the option must be set to YES to properly +# deal with such files in case they appear in the input. For filesystems that +# are not case sensitive the option should be be set to NO to properly deal with +# output files written for symbols that only differ in casing, such as for two +# classes, one named CLASS and the other named Class, and to also support +# references to files without having to specify the exact matching casing. On +# Windows (including Cygwin) and MacOS, users should typically set this option +# to NO, whereas on Linux or other Unix flavors it should typically be set to +# YES. +# The default value is: system dependent. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = @CMAKE_CURRENT_SOURCE_DIR@/DoxygenLayout.xml + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = YES + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. If +# EXTRACT_ALL is set to YES then this flag will automatically be disabled. +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS +# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but +# at the end of the doxygen process doxygen will return with a non-zero status. +# Possible values are: NO, YES and FAIL_ON_WARNINGS. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = @CMAKE_CURRENT_SOURCE_DIR@/../include \ + @CMAKE_CURRENT_SOURCE_DIR@/mainpage.md + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: +# https://www.gnu.org/software/libiconv/) for the list of possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# Note the list of default checked file patterns might differ from the list of +# default file extension mappings. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment), +# *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, *.vhdl, +# *.ucf, *.qsf and *.ice. + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.idl \ + *.ddl \ + *.odl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.cs \ + *.d \ + *.php \ + *.php4 \ + *.php5 \ + *.phtml \ + *.inc \ + *.m \ + *.markdown \ + *.md \ + *.mm \ + *.dox \ + *.py \ + *.pyw \ + *.f90 \ + *.f95 \ + *.f03 \ + *.f08 \ + *.f \ + *.for \ + *.tcl \ + *.vhd \ + *.vhdl \ + *.ucf \ + *.qsf + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = *detail* + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# entity all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see https://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = @CMAKE_CURRENT_SOURCE_DIR@/doxygen-awesome-css/doxygen-awesome.css + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# https://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML +# documentation will contain a main index with vertical navigation menus that +# are dynamically created via JavaScript. If disabled, the navigation index will +# consists of multiple levels of tabs that are statically embedded in every HTML +# page. Disable this option to support browsers that do not have JavaScript, +# like the Qt help browser. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_MENUS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: +# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To +# create a documentation set, doxygen will generate a Makefile in the HTML +# output directory. Running make will produce the docset in that directory and +# running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy +# genXcode/_index.html for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: +# https://www.microsoft.com/en-us/download/details.aspx?id=21138) on Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the main .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location (absolute path +# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to +# run qhelpgenerator on the generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = YES + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg +# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see +# https://inkscape.org) to generate formulas as SVG images instead of PNGs for +# the HTML output. These images will generally look nicer at scaled resolutions. +# Possible values are: png (the default) and svg (looks nicer but requires the +# pdf2svg or inkscape tool). +# The default value is: png. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FORMULA_FORMAT = png + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANSPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands +# to create new LaTeX commands to be used in formulas as building blocks. See +# the section "Including formulas" for details. + +FORMULA_MACROFILE = + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# https://www.mathjax.org) which uses client side JavaScript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from https://www.mathjax.org before deployment. +# The default value is: https://cdn.jsdelivr.net/npm/mathjax@2. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /