Coverage for mlos_bench/mlos_bench/tests/tunables/test_tunables_size_props.py: 100%

39 statements  

« prev     ^ index     » next       coverage.py v7.6.9, created at 2024-12-20 00:44 +0000

1# 

2# Copyright (c) Microsoft Corporation. 

3# Licensed under the MIT License. 

4# 

5"""Unit tests for checking tunable size properties.""" 

6 

7import pytest 

8 

9from mlos_bench.tunables.tunable import Tunable 

10 

11# Note: these test do *not* check the ConfigSpace conversions for those same Tunables. 

12# That is checked indirectly via grid_search_optimizer_test.py 

13 

14 

15def test_tunable_int_size_props() -> None: 

16 """Test tunable int size properties.""" 

17 tunable = Tunable( 

18 name="test", 

19 config={ 

20 "type": "int", 

21 "range": [1, 5], 

22 "default": 3, 

23 }, 

24 ) 

25 expected = [1, 2, 3, 4, 5] 

26 assert tunable.span == 4 

27 assert tunable.cardinality == len(expected) 

28 assert list(tunable.quantized_values or []) == expected 

29 assert list(tunable.values or []) == expected 

30 

31 

32def test_tunable_float_size_props() -> None: 

33 """Test tunable float size properties.""" 

34 tunable = Tunable( 

35 name="test", 

36 config={ 

37 "type": "float", 

38 "range": [1.5, 5], 

39 "default": 3, 

40 }, 

41 ) 

42 assert tunable.span == 3.5 

43 assert tunable.cardinality is None 

44 assert tunable.quantized_values is None 

45 assert tunable.values is None 

46 

47 

48def test_tunable_categorical_size_props() -> None: 

49 """Test tunable categorical size properties.""" 

50 tunable = Tunable( 

51 name="test", 

52 config={ 

53 "type": "categorical", 

54 "values": ["a", "b", "c"], 

55 "default": "a", 

56 }, 

57 ) 

58 with pytest.raises(AssertionError): 

59 _ = tunable.span 

60 assert tunable.cardinality == 3 

61 assert tunable.values == ["a", "b", "c"] 

62 with pytest.raises(AssertionError): 

63 _ = tunable.quantized_values 

64 

65 

66def test_tunable_quantized_int_size_props() -> None: 

67 """Test quantized tunable int size properties.""" 

68 tunable = Tunable( 

69 name="test", 

70 config={ 

71 "type": "int", 

72 "range": [100, 1000], 

73 "default": 100, 

74 "quantization_bins": 10, 

75 }, 

76 ) 

77 expected = [100, 200, 300, 400, 500, 600, 700, 800, 900, 1000] 

78 assert tunable.span == 900 

79 assert tunable.cardinality == len(expected) 

80 assert tunable.quantization_bins == len(expected) 

81 assert list(tunable.quantized_values or []) == expected 

82 assert list(tunable.values or []) == expected 

83 

84 

85def test_tunable_quantized_float_size_props() -> None: 

86 """Test quantized tunable float size properties.""" 

87 tunable = Tunable( 

88 name="test", 

89 config={ 

90 "type": "float", 

91 "range": [0, 1], 

92 "default": 0, 

93 "quantization_bins": 11, 

94 }, 

95 ) 

96 expected = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] 

97 assert tunable.span == 1 

98 assert tunable.cardinality == len(expected) 

99 assert tunable.quantization_bins == len(expected) 

100 assert pytest.approx(list(tunable.quantized_values or []), 0.0001) == expected 

101 assert pytest.approx(list(tunable.values or []), 0.0001) == expected