Compare commits

..

No commits in common. "f65c58d95c22b3818f9c23e8f0a75ab4fbf5d821" and "5371c6f201d63196ebfb56fc5a42dc0c91eca432" have entirely different histories.

7 changed files with 33 additions and 100 deletions

View File

@ -14,19 +14,12 @@
__device__ constexpr const size_t M = 5; //log2(NB_THREADS_2D_Y)); __device__ constexpr const size_t M = 5; //log2(NB_THREADS_2D_Y));
#endif #endif
// Save state to avoid recalculation on restart // Save state to avoid recalulation on restart
#define SAVE_STATE true #define SAVE_STATE true
// Redo the state even if it's already saved // Redo the state even if it's already saved
#define FORCE_REDO false #define FORCE_REDO false
// Use GPU to greatly accelerate runtime // Use GPU to greatly accelerate runtime
#define GPU_BOOSTED true #define GPU_BOOSTED true
// Depending on what you set, the output label will be as follow :
// | GPU_BOOSTED | LABEL |
// |-------------|-------|
// | true | GPU |
// | false | CPU |
// Number of weak classifiers // Number of weak classifiers
// const size_t TS[] = { 1 }; // const size_t TS[] = { 1 };
// const size_t TS[] = { 1, 5, 10 }; // const size_t TS[] = { 1, 5, 10 };

View File

@ -5,7 +5,7 @@
static constexpr uint64_t u64(const double& n) noexcept { return static_cast<uint64_t>(n); } static constexpr uint64_t u64(const double& n) noexcept { return static_cast<uint64_t>(n); }
static const constexpr size_t N_TIMES = 11; static const constexpr size_t N_TIMES = 11;
static const constexpr std::array<const char*, N_TIMES> time_formats = { "ns", "µs", "ms", "s", "m", "h", "j", "w", "M", "y", "c" }; static const constexpr std::array<const char*, N_TIMES> time_formats = { "ns", "us", "ms", "s", "m", "h", "j", "w", "M", "y", "c" };
static const constexpr std::array<uint64_t, N_TIMES> time_numbers = { 1, u64(1e3), u64(1e6), u64(1e9), u64(6e10), u64(36e11), u64(864e11), static const constexpr std::array<uint64_t, N_TIMES> time_numbers = { 1, u64(1e3), u64(1e6), u64(1e9), u64(6e10), u64(36e11), u64(864e11),
u64(6048e11), u64(26784e11), u64(31536e12), u64(31536e14) }; u64(6048e11), u64(26784e11), u64(31536e12), u64(31536e14) };

View File

@ -85,7 +85,7 @@ void format_time_ns_test(void) noexcept {
Assert("format_time_ns null", std::string("0ns"), format_time_ns(static_cast<uint64_t>(0))); Assert("format_time_ns null", std::string("0ns"), format_time_ns(static_cast<uint64_t>(0)));
Assert("format_time_ns nanosecond", std::string("1ns"), format_time_ns(static_cast<uint64_t>(1))); Assert("format_time_ns nanosecond", std::string("1ns"), format_time_ns(static_cast<uint64_t>(1)));
Assert("format_time_ns shake", std::string("10ns"), format_time_ns(static_cast<uint64_t>(10))); Assert("format_time_ns shake", std::string("10ns"), format_time_ns(static_cast<uint64_t>(10)));
Assert("format_time_ns microsecond", std::string("1µs"), format_time_ns(static_cast<uint64_t>(1e3))); Assert("format_time_ns microsecond", std::string("1us"), format_time_ns(static_cast<uint64_t>(1e3)));
Assert("format_time_ns millisecond", std::string("1ms"), format_time_ns(static_cast<uint64_t>(1e6))); Assert("format_time_ns millisecond", std::string("1ms"), format_time_ns(static_cast<uint64_t>(1e6)));
Assert("format_time_ns centisecond", std::string("10ms"), format_time_ns(static_cast<uint64_t>(1e7))); Assert("format_time_ns centisecond", std::string("10ms"), format_time_ns(static_cast<uint64_t>(1e7)));
Assert("format_time_ns decisecond", std::string("100ms"), format_time_ns(static_cast<uint64_t>(1e8))); Assert("format_time_ns decisecond", std::string("100ms"), format_time_ns(static_cast<uint64_t>(1e8)));
@ -112,7 +112,7 @@ void format_time_ns_test(void) noexcept {
Assert("format_time_ns year", std::string("1y"), format_time_ns(static_cast<uint64_t>(31536e12))); Assert("format_time_ns year", std::string("1y"), format_time_ns(static_cast<uint64_t>(31536e12)));
Assert("format_time_ns tropical year", std::string("1y 5h 48m 45s 216ms"), format_time_ns(static_cast<uint64_t>(31556925216e6))); Assert("format_time_ns tropical year", std::string("1y 5h 48m 45s 216ms"), format_time_ns(static_cast<uint64_t>(31556925216e6)));
Assert("format_time_ns gregorian year", std::string("1y 5h 49m 12s"), format_time_ns(static_cast<uint64_t>(31556952e9))); Assert("format_time_ns gregorian year", std::string("1y 5h 49m 12s"), format_time_ns(static_cast<uint64_t>(31556952e9)));
Assert("format_time_ns sidereal year", std::string("1y 6h 9m 9s 763ms 545µs 600ns"), format_time_ns(static_cast<uint64_t>(315581497635456e2))); Assert("format_time_ns sidereal year", std::string("1y 6h 9m 9s 763ms 545us 600ns"), format_time_ns(static_cast<uint64_t>(315581497635456e2)));
Assert("format_time_ns leap year", std::string("1y 1j"), format_time_ns(static_cast<uint64_t>(316224e11))); Assert("format_time_ns leap year", std::string("1y 1j"), format_time_ns(static_cast<uint64_t>(316224e11)));
Assert("format_time_ns olympiad", std::string("4y"), format_time_ns(static_cast<uint64_t>(126144e12))); Assert("format_time_ns olympiad", std::string("4y"), format_time_ns(static_cast<uint64_t>(126144e12)));
Assert("format_time_ns lusturm", std::string("5y"), format_time_ns(static_cast<uint64_t>(15768e13))); Assert("format_time_ns lusturm", std::string("5y"), format_time_ns(static_cast<uint64_t>(15768e13)));
@ -137,7 +137,7 @@ void format_time_ns_test(void) noexcept {
//Assert("format_time_ns ronnasecond", std::string(""), format_time_ns(static_cast<uint64_t>(1e36))); //Assert("format_time_ns ronnasecond", std::string(""), format_time_ns(static_cast<uint64_t>(1e36)));
//Assert("format_time_ns quettasecond", std::string(""), format_time_ns(static_cast<uint64_t>(1e39))); //Assert("format_time_ns quettasecond", std::string(""), format_time_ns(static_cast<uint64_t>(1e39)));
// uint64_t_MAX == 2**64 == 18446744073709551615I64u == -1 // uint64_t_MAX == 2**64 == 18446744073709551615I64u == -1
Assert("format_time_ns max", std::string("5c 84y 11M 2j 23h 34m 33s 709ms 551µs 615ns"), format_time_ns(static_cast<uint64_t>(-1))); Assert("format_time_ns max", std::string("5c 84y 11M 2j 23h 34m 33s 709ms 551us 615ns"), format_time_ns(static_cast<uint64_t>(-1)));
} }
void thousand_sep_test(void) noexcept { void thousand_sep_test(void) noexcept {

View File

@ -9,7 +9,7 @@ NB_THREADS_2D = (32, 32)
NB_THREADS_3D = (16, 16, 4) NB_THREADS_3D = (16, 16, 4)
M = int(np.log2(NB_THREADS_2D[1])) M = int(np.log2(NB_THREADS_2D[1]))
# Save state to avoid recalculation on restart # Save state to avoid recalulation on restart
SAVE_STATE = True SAVE_STATE = True
# Redo the state even if it's already saved # Redo the state even if it's already saved
FORCE_REDO = False FORCE_REDO = False
@ -17,14 +17,6 @@ FORCE_REDO = False
COMPILE_WITH_C = True COMPILE_WITH_C = True
# Use GPU to greatly accelerate runtime (as priority over NJIT) # Use GPU to greatly accelerate runtime (as priority over NJIT)
GPU_BOOSTED = True GPU_BOOSTED = True
# Depending on what you set, the output label will be as follow :
# | COMPILE_WITH_C | GPU_BOOSTED | LABEL |
# |----------------|-------------|-------|
# | True | True | GPU |
# | True | False | CPU |
# | False | True | PGPU |
# | False | False | PY |
# Number of weak classifiers # Number of weak classifiers
# TS = [1] # TS = [1]
# TS = [1, 5, 10] # TS = [1, 5, 10]

View File

@ -2,8 +2,7 @@
# Author: @saundersp # Author: @saundersp
from ViolaJones import train_viola_jones, classify_viola_jones from ViolaJones import train_viola_jones, classify_viola_jones
from toolbox import state_saver, picke_multi_loader, format_time_ns, benchmark_function, unit_test_argsort_2d from toolbox import state_saver, picke_multi_loader, format_time_ns, benchmark_function, toolbox_unit_test, unit_test_argsort_2d
from toolbox_unit_test import format_time_ns_test
from sklearn.metrics import accuracy_score, f1_score, confusion_matrix from sklearn.metrics import accuracy_score, f1_score, confusion_matrix
from sklearn.feature_selection import SelectPercentile, f_classif from sklearn.feature_selection import SelectPercentile, f_classif
from common import load_datasets, unit_test from common import load_datasets, unit_test

View File

@ -1,15 +1,13 @@
from typing import Any, Callable, List, Union, Final from typing import Any, Callable, List, Union
from time import perf_counter_ns from time import perf_counter_ns
from numba import njit from numba import njit
import numpy as np import numpy as np
import pickle import pickle
import os import os
from config import MODEL_DIR, OUT_DIR from config import MODEL_DIR, OUT_DIR
from decorators import njit
time_formats: Final = ["ns", "µs", "ms", "s", "m", "h", "j", "w", "M", "y", "c"] formats = ["ns", "µs", "ms", "s", "m", "h", "j", "w", "M", "y"]
time_numbers: Final = np.array([1, 1e3, 1e6, 1e9, 6e10, 36e11, 864e11, 6048e11, 26784e11, 31536e12, 31536e14], dtype = np.uint64) nb = np.array([1, 1000, 1000, 1000, 60, 60, 24, 7, 4, 12], dtype = np.uint16)
@njit('str(uint64)')
def format_time_ns(time: int) -> str: def format_time_ns(time: int) -> str:
"""Format the time in nanoseconds in human readable format. """Format the time in nanoseconds in human readable format.
@ -22,17 +20,35 @@ def format_time_ns(time: int) -> str:
assert time >= 0, "Incorrect time stamp" assert time >= 0, "Incorrect time stamp"
if time == 0: if time == 0:
return "0ns" return "0ns"
prod = nb.prod(dtype = np.uint64)
s = "" s = ""
for i in range(time_numbers.shape[0])[::-1]: for i in range(nb.shape[0])[::-1]:
if time >= time_numbers[i]: if time >= prod:
res = int(time // time_numbers[i]) res = int(time // prod)
time = time % time_numbers[i] time = time % prod
s += f"{res}{time_formats[i]} " s += f"{res}{formats[i]} "
prod = prod // nb[i]
assert time == 0, "Leftover in formatting time !" assert time == 0, "Leftover in formatting time !"
return s.rstrip() return s.rstrip()
def toolbox_unit_test() -> None:
# FIXME Move unit test to different file
assert "0ns" == format_time_ns(0)
assert "1ns" == format_time_ns(1)
assert "1µs" == format_time_ns(int(1e3))
assert "1ms" == format_time_ns(int(1e6))
assert "1s" == format_time_ns(int(1e9))
assert "1m" == format_time_ns(int(6e10))
assert "1h" == format_time_ns(int(36e11))
assert "1j" == format_time_ns(int(864e11))
assert "1w" == format_time_ns(int(6048e11))
assert "1M" == format_time_ns(int(24192e11))
assert "1y" == format_time_ns(int(290304e11))
# UINT64_MAX == 2^64 = 18446744073709551615 == -1
assert "635y 5M 3j 23h 34m 33s 709ms 551µs 616ns" == format_time_ns(2**64)
def picke_multi_loader(filenames: List[str], save_dir: str = MODEL_DIR) -> List[Any]: def picke_multi_loader(filenames: List[str], save_dir: str = MODEL_DIR) -> List[Any]:
"""Load multiple pickle data files. """Load multiple pickle data files.

View File

@ -1,67 +0,0 @@
from typing import Any
from toolbox import format_time_ns
def Assert(name: str, expected: Any, result: Any):
if expected != result:
print(f"For test name {name} Expected '{expected}' but got '{result}' instead")
assert False
def format_time_ns_test() -> None:
# https://en.wikipedia.org/wiki/Unit_of_time
Assert("format_time_ns null", "0ns", format_time_ns(0));
Assert("format_time_ns nanosecond", "1ns", format_time_ns(1));
Assert("format_time_ns shake", "10ns", format_time_ns(10));
Assert("format_time_ns microsecond", "1µs", format_time_ns(int(1e3)));
Assert("format_time_ns millisecond", "1ms", format_time_ns(int(1e6)));
Assert("format_time_ns centisecond", "10ms", format_time_ns(int(1e7)));
Assert("format_time_ns decisecond", "100ms", format_time_ns(int(1e8)));
Assert("format_time_ns second", "1s", format_time_ns(int(1e9)));
Assert("format_time_ns decasecond", "10s", format_time_ns(int(1e10)));
Assert("format_time_ns minute", "1m", format_time_ns(int(6e10)));
Assert("format_time_ns milliday", "1m 26s 400ms", format_time_ns(int(864e8)));
Assert("format_time_ns hectosecond", "1m 40s", format_time_ns(int(1e11)));
Assert("format_time_ns kilosecond", "16m 40s", format_time_ns(int(1e12)));
Assert("format_time_ns hour", "1h", format_time_ns(int(36e11)));
Assert("format_time_ns day", "1j", format_time_ns(int(864e11)));
Assert("format_time_ns week/sennight", "1w", format_time_ns(int(6048e11)));
Assert("format_time_ns megasecond", "1w 4j 13h 46m 40s", format_time_ns(int(1e15)));
Assert("format_time_ns fortnight", "2w", format_time_ns(int(12096e11)));
Assert("format_time_ns lunar month (draconitic)", "3w 6j 5h 5m 35s 800ms", format_time_ns(int(23511358e8)));
Assert("format_time_ns lunar month (tropical)", "3w 6j 7h 43m 4s 700ms", format_time_ns(int(23605847e8)));
Assert("format_time_ns lunar month (sidereal)", "3w 6j 7h 43m 11s 600ms", format_time_ns(int(23605916e8)));
Assert("format_time_ns lunar month (anomalistic)", "3w 6j 13h 18m 33s 200ms", format_time_ns(int(23807132e8)));
Assert("format_time_ns lunar month (synodic)", "4w 1j 12h 44m 2s 900ms", format_time_ns(int(25514429e8)));
Assert("format_time_ns month", "1M", format_time_ns(int(26784e11)));
Assert("format_time_ns quarantine", "1M 1w 2j", format_time_ns(int(3456e12)));
Assert("format_time_ns semester", "4M 2j", format_time_ns(int(108864e11)));
Assert("format_time_ns lunar year", "11M 1w 6j 8h 52m 48s", format_time_ns(int(30617568e9)));
Assert("format_time_ns year", "1y", format_time_ns(int(31536e12)));
Assert("format_time_ns tropical year", "1y 5h 48m 45s 216ms", format_time_ns(int(31556925216e6)));
Assert("format_time_ns gregorian year", "1y 5h 49m 12s", format_time_ns(int(31556952e9)));
Assert("format_time_ns sidereal year", "1y 6h 9m 9s 763ms 545µs 600ns", format_time_ns(int(315581497635456e2)));
Assert("format_time_ns leap year", "1y 1j", format_time_ns(int(316224e11)));
Assert("format_time_ns olympiad", "4y", format_time_ns(int(126144e12)));
Assert("format_time_ns lusturm", "5y", format_time_ns(int(15768e13)));
Assert("format_time_ns decade", "10y", format_time_ns(int(31536e13)));
Assert("format_time_ns indiction", "15y", format_time_ns(int(47304e13)));
Assert("format_time_ns score", "20y", format_time_ns(int(63072e13)));
Assert("format_time_ns gigasecond", "31y 8M 1w 4j 1h 46m 40s", format_time_ns(int(1e18)));
Assert("format_time_ns jubilee", "50y", format_time_ns(int(15768e14)));
Assert("format_time_ns century", "1c", format_time_ns(int(31536e14)));
Assert("format_time_ns millennium", "10c", format_time_ns(int(31536e15)));
Assert("format_time_ns age", "257c 72y", format_time_ns(int(812745792e12)));
Assert("format_time_ns terasecond", "3170c 97y 10M 3w 4j 17h 46m 40s", format_time_ns(int(1e22)));
Assert("format_time_ns megaannum", "10000c", format_time_ns(int(31536e18)));
# Cannot use number bigger than currently supported ISO Python
#Assert("format_time_ns petasecond", "317097c 91y 11M 2w 4j 1h 46m 40s", format_time_ns(int(1e24)));
#Assert("format_time_ns galactic year", "2300000c", format_time_ns(int(725328e19)));
#Assert("format_time_ns eon", "10000000c", format_time_ns(int(31536e21)));
#Assert("format_time_ns kalpa", "43200000c", format_time_ns(int(13623552e19)));
#Assert("format_time_ns exasecond", "317097919c 83y 9M 1h 46m 40s", format_time_ns(int(1e27)));
#Assert("format_time_ns zettasecond", "", format_time_ns(int(1e30)));
#Assert("format_time_ns yottasecond", "", format_time_ns(int(1e33)));
#Assert("format_time_ns ronnasecond", "", format_time_ns(int(1e36)));
#Assert("format_time_ns quettasecond", "", format_time_ns(int(1e39)));
# uint64_t_MAX == 2**64 == 18446744073709551615I64u == -1
Assert("format_time_ns max", "5c 84y 11M 2j 23h 34m 33s 709ms 551µs 615ns", format_time_ns(2**64 - 1))