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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
let
f1 = x: x;
f2 = x: x;
inf = let f = n: if n == 0 then 1.0 else 10 * f (n - 1); in f 1000;
nan = inf * 0;
# all of these sets and lists are assumed to have different *addresses* as long as CSE does not occur
sets = rec {
set1 = {
f = f1;
};
set1' = {
f = f2;
};
set2 = {
f = f1;
};
set2' = {
f = f2;
};
bigSet1 = {
f = f1;
meow = true;
};
bigSet1' = {
f = f2;
meow = true;
};
bigSet2 = bigSet1 // {
meow = true;
};
bigSet2' = bigSet1' // {
meow = true;
};
bigSet3 = {
f = f1;
meow = true;
};
bigSet3' = {
f = f2;
meow = true;
};
};
lists = rec {
list1 = [ f1 ];
list1' = [ f2 ];
list2 = [ f1 ];
list2' = [ f2 ];
bigList1 = [ f1 true ];
bigList1' = [ f2 true ];
bigList2 = map (e: if builtins.isBool e then true else e) bigList1;
bigList2'= map (e: if builtins.isBool e then true else e) bigList1';
bigList3 = [ f1 true ];
bigList3' = [ f2 true ];
};
nans = rec {
plain = nan;
list = [ nan ];
set = { inherit nan; };
};
compareAllPairs = cases:
let
names = builtins.attrNames cases;
in
builtins.listToAttrs (map
(n1: {
name = n1;
value = builtins.listToAttrs (map
(n2: { name = n2; value = cases.${n1} == cases.${n2}; })
names);
})
names);
results = {
functionsDirect = [
(f1 == f1)
(f1 == f2)
(f2 == f1)
(f2 == f2)
];
functionsSelected = [
(sets.set1.f == sets.set1.f)
(sets.set1.f == sets.set1'.f)
(sets.set1'.f == sets.set1.f)
(sets.set1'.f == sets.set1'.f)
];
sets = compareAllPairs sets;
lists = compareAllPairs lists;
nans = compareAllPairs nans;
};
in
builtins.deepSeq results results
|