1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
//! Divergence pins: `ferrolearn-preprocess` `LabelEncoder` ERROR-MESSAGE parity
//! vs scikit-learn 1.5.2 (audit #2353, R-DEV-2 exception/message parity).
//!
//! The existing `divergence_label_encoder.rs` asserts only that ferrolearn
//! REJECTS unseen-label transform and out-of-range inverse_transform, declaring
//! the message-string difference "cosmetic and not pinned". But R-DEV-2 requires
//! default/exception parity, and the in-module REQ table (REQ-6, label_encoder.rs)
//! itself flags the message gap as an OPEN blocker (#1136). These tests pin the
//! observable message divergence so it cannot be silently shipped.
//!
//! LIVE sklearn 1.5.2 oracle (run from /tmp, NOT copied from ferrolearn):
//! ```text
//! >>> LabelEncoder().fit(['a','b']).transform(['a','c'])
//! ValueError: y contains previously unseen labels: np.str_('c')
//! >>> le=LabelEncoder().fit(['a','b']); le.inverse_transform([0,2,1])
//! ValueError: y contains previously unseen labels: [2]
//! ```
//! sklearn source:
//! - transform unseen: `sklearn/utils/_encode.py:227`
//! `raise ValueError(f"y contains previously unseen labels: {str(e)}")`
//! - inverse OOB: `sklearn/preprocessing/_label.py:160`
//! `raise ValueError("y contains previously unseen labels: %s" % str(diff))`
//!
//! ferrolearn ACTUAL (label_encoder.rs:172-175 / :106-109, FerroError Display
//! `error.rs:87` `"Invalid parameter `{name}`: {reason}"`):
//! - transform unseen -> `Invalid parameter `x[1]`: unknown label "c"`
//! - inverse OOB -> `Invalid parameter `y[1]`: index 2 is out of range (n_classes = 2)`
//!
//! Neither contains the sklearn phrase "y contains previously unseen labels".
use ;
use LabelEncoder;
use ;
/// Divergence: `FittedLabelEncoder::transform` on an unseen label diverges from
/// `sklearn/utils/_encode.py:227` for `fit(['a','b']).transform(['a','c'])`.
/// sklearn raises `ValueError("y contains previously unseen labels: np.str_('c')")`;
/// ferrolearn returns `InvalidParameter{ ... reason: "unknown label \"c\"" }`
/// whose Display lacks the documented sklearn phrase.
/// Tracking: #2354
/// Divergence: `FittedLabelEncoder::inverse_transform` on an out-of-range index
/// diverges from `sklearn/preprocessing/_label.py:160` for
/// `fit(['a','b']).inverse_transform([0,2,1])`.
/// sklearn raises `ValueError("y contains previously unseen labels: [2]")`;
/// ferrolearn returns `InvalidParameter{ ... reason: "index 2 is out of range ..." }`
/// whose Display lacks the documented sklearn phrase.
/// Tracking: #2355