42
42
43
43
sage: N = 3
44
44
sage: A = B = [pi for n in range(N+1) for pi in Permutations(n)]
45
- sage: alpha1 = lambda p: len(p.weak_excedences())
46
- sage: alpha2 = lambda p: len(p.fixed_points())
47
- sage: beta1 = lambda p: len(p.descents(final_descent=True)) if p else 0
48
- sage: beta2 = lambda p: len([e for (e, f) in zip(p, p[1:]+[0]) if e == f+1])
45
+ sage: def alpha1(p): return len(p.weak_excedences())
46
+ sage: def alpha2(p): return len(p.fixed_points())
47
+ sage: def beta1(p): return len(p.descents(final_descent=True)) if p else 0
48
+ sage: def beta2(p): return len([e for (e, f) in zip(p, p[1:]+[0]) if e == f+1])
49
49
sage: tau = Permutation.longest_increasing_subsequence_length
50
50
sage: def rotate_permutation(p):
51
51
....: cycle = Permutation(tuple(range(1, len(p)+1)))
125
125
sage: N = 8;
126
126
sage: A = [SetPartition(d.to_noncrossing_partition()) for n in range(N) for d in DyckWords(n)]
127
127
sage: B = [t for n in range(1, N+1) for t in OrderedTrees(n)]
128
- sage: theta = lambda m: SetPartition([[i % m.size() + 1 for i in b] for b in m])
128
+ sage: def theta(m): return SetPartition([[i % m.size() + 1 for i in b] for b in m])
129
129
130
130
The following code is equivalent to ``tau = findstat(397)``::
131
131
195
195
TESTS::
196
196
197
197
sage: N = 4; A = B = [permutation for n in range(N) for permutation in Permutations(n)]
198
- sage: theta = lambda pi: Permutation([x+1 if x != len(pi) else 1 for x in pi[-1:]+pi[:-1]])
198
+ sage: def theta(pi): return Permutation([x+1 if x != len(pi) else 1 for x in pi[-1:]+pi[:-1]])
199
199
sage: def tau(pi):
200
200
....: n = len(pi)
201
201
....: return sum([1 for i in range(1, n+1) for j in range(1, n+1)
213
213
A test including intertwining relations::
214
214
215
215
sage: N = 2; A = B = [dyck_word for n in range(N+1) for dyck_word in DyckWords(n)]
216
- sage: alpha = lambda D: (D.area(), D.bounce())
217
- sage: beta = lambda D: (D.bounce(), D.area())
218
- sage: tau = lambda D: D.number_of_touch_points()
216
+ sage: def alpha(D): return (D.area(), D.bounce())
217
+ sage: def beta(D): return (D.bounce(), D.area())
218
+ sage: def tau(D): return D.number_of_touch_points()
219
219
220
220
The following looks correct::
221
221
263
263
Repeating some tests, but using the constructor instead of set_XXX() methods:
264
264
265
265
sage: N = 2; A = B = [dyck_word for n in range(N+1) for dyck_word in DyckWords(n)]
266
- sage: alpha = lambda D: (D.area(), D.bounce())
267
- sage: beta = lambda D: (D.bounce(), D.area())
268
- sage: tau = lambda D: D.number_of_touch_points()
266
+ sage: def alpha(D): return (D.area(), D.bounce())
267
+ sage: def beta(D): return (D.bounce(), D.area())
268
+ sage: def tau(D): return D.number_of_touch_points()
269
269
270
270
sage: bij = Bijectionist(A, B, tau, alpha_beta=((lambda d: d.semilength(), lambda d: d.semilength()),))
271
271
sage: for solution in sorted(list(bij.solutions_iterator()), key=lambda d: tuple(sorted(d.items()))):
276
276
Constant blocks::
277
277
278
278
sage: A = B = 'abcd'
279
- sage: pi = lambda p1, p2: 'abcdefgh'[A.index(p1) + A.index(p2)]
280
- sage: rho = lambda s1, s2: (s1 + s2) % 2
279
+ sage: def pi( p1, p2): return 'abcdefgh'[A.index(p1) + A.index(p2)]
280
+ sage: def rho( s1, s2): return (s1 + s2) % 2
281
281
sage: bij = Bijectionist(A, B, lambda x: B.index(x) % 2, P=[['a', 'c']], pi_rho=((2, pi, rho),))
282
282
sage: list(bij.solutions_iterator())
283
283
[{'a': 0, 'b': 1, 'c': 0, 'd': 1}]
298
298
299
299
Intertwining relations::
300
300
301
- sage: concat = lambda p1, p2: Permutation(p1 + [i + len(p1) for i in p2])
301
+ sage: def concat( p1, p2): return Permutation(p1 + [i + len(p1) for i in p2])
302
302
303
303
sage: A = B = [permutation for n in range(4) for permutation in Permutations(n)]
304
304
sage: bij = Bijectionist(A, B, Permutation.number_of_fixed_points, alpha_beta=((len, len),), pi_rho=((2, concat, lambda x, y: x + y),))
311
311
Statistics::
312
312
313
313
sage: N = 4; A = B = [permutation for n in range(N) for permutation in Permutations(n)]
314
- sage: wex = lambda p: len(p.weak_excedences())
315
- sage: fix = lambda p: len(p.fixed_points())
316
- sage: des = lambda p: len(p.descents(final_descent=True)) if p else 0
314
+ sage: def wex(p): return len(p.weak_excedences())
315
+ sage: def fix(p): return len(p.fixed_points())
316
+ sage: def des(p): return len(p.descents(final_descent=True)) if p else 0
317
317
sage: bij = Bijectionist(A, B, fix, alpha_beta=((wex, des), (len, len)))
318
318
sage: for solution in sorted(list(bij.solutions_iterator()), key=lambda d: tuple(sorted(d.items()))):
319
319
....: print(solution)
@@ -567,8 +567,8 @@ def set_constant_blocks(self, P):
567
567
568
568
We now add a map that combines some blocks::
569
569
570
- sage: pi = lambda p1, p2: 'abcdefgh'[A.index(p1) + A.index(p2)]
571
- sage: rho = lambda s1, s2: (s1 + s2) % 2
570
+ sage: def pi( p1, p2): return 'abcdefgh'[A.index(p1) + A.index(p2)]
571
+ sage: def rho( s1, s2): return (s1 + s2) % 2
572
572
sage: bij.set_intertwining_relations((2, pi, rho))
573
573
sage: list(bij.solutions_iterator())
574
574
[{'a': 0, 'b': 1, 'c': 0, 'd': 1}]
@@ -672,10 +672,10 @@ def set_statistics(self, *alpha_beta):
672
672
of fixed points of `S(\pi)` equals `s(\pi)`::
673
673
674
674
sage: N = 4; A = B = [permutation for n in range(N) for permutation in Permutations(n)]
675
- sage: wex = lambda p: len(p.weak_excedences())
676
- sage: fix = lambda p: len(p.fixed_points())
677
- sage: des = lambda p: len(p.descents(final_descent=True)) if p else 0
678
- sage: adj = lambda p: len([e for (e, f) in zip(p, p[1:]+[0]) if e == f+1])
675
+ sage: def wex(p): return len(p.weak_excedences())
676
+ sage: def fix(p): return len(p.fixed_points())
677
+ sage: def des(p): return len(p.descents(final_descent=True)) if p else 0
678
+ sage: def adj(p): return len([e for (e, f) in zip(p, p[1:]+[0]) if e == f+1])
679
679
sage: bij = Bijectionist(A, B, fix)
680
680
sage: bij.set_statistics((wex, des), (len, len))
681
681
sage: for solution in sorted(list(bij.solutions_iterator()), key=lambda d: tuple(sorted(d.items()))):
@@ -708,9 +708,9 @@ def set_statistics(self, *alpha_beta):
708
708
Calling ``set_statistics`` without arguments should restore the previous state::
709
709
710
710
sage: N = 3; A = B = [permutation for n in range(N) for permutation in Permutations(n)]
711
- sage: wex = lambda p: len(p.weak_excedences())
712
- sage: fix = lambda p: len(p.fixed_points())
713
- sage: des = lambda p: len(p.descents(final_descent=True)) if p else 0
711
+ sage: def wex(p): return len(p.weak_excedences())
712
+ sage: def fix(p): return len(p.fixed_points())
713
+ sage: def des(p): return len(p.descents(final_descent=True)) if p else 0
714
714
sage: bij = Bijectionist(A, B, fix)
715
715
sage: bij.set_statistics((wex, des), (len, len))
716
716
sage: for solution in bij.solutions_iterator():
@@ -783,10 +783,10 @@ def statistics_fibers(self):
783
783
784
784
sage: A = B = [permutation for n in range(4) for permutation in Permutations(n)]
785
785
sage: tau = Permutation.longest_increasing_subsequence_length
786
- sage: wex = lambda p: len(p.weak_excedences())
787
- sage: fix = lambda p: len(p.fixed_points())
788
- sage: des = lambda p: len(p.descents(final_descent=True)) if p else 0
789
- sage: adj = lambda p: len([e for (e, f) in zip(p, p[1:]+[0]) if e == f+1])
786
+ sage: def wex(p): return len(p.weak_excedences())
787
+ sage: def fix(p): return len(p.fixed_points())
788
+ sage: def des(p): return len(p.descents(final_descent=True)) if p else 0
789
+ sage: def adj(p): return len([e for (e, f) in zip(p, p[1:]+[0]) if e == f+1])
790
790
sage: bij = Bijectionist(A, B, tau)
791
791
sage: bij.set_statistics((len, len), (wex, des), (fix, adj))
792
792
sage: table([[key, AB[0], AB[1]] for key, AB in bij.statistics_fibers().items()])
@@ -828,10 +828,10 @@ def statistics_table(self, header=True):
828
828
829
829
sage: A = B = [permutation for n in range(4) for permutation in Permutations(n)]
830
830
sage: tau = Permutation.longest_increasing_subsequence_length
831
- sage: wex = lambda p: len(p.weak_excedences())
832
- sage: fix = lambda p: len(p.fixed_points())
833
- sage: des = lambda p: len(p.descents(final_descent=True)) if p else 0
834
- sage: adj = lambda p: len([e for (e, f) in zip(p, p[1:]+[0]) if e == f+1])
831
+ sage: def wex(p): return len(p.weak_excedences())
832
+ sage: def fix(p): return len(p.fixed_points())
833
+ sage: def des(p): return len(p.descents(final_descent=True)) if p else 0
834
+ sage: def adj(p): return len([e for (e, f) in zip(p, p[1:]+[0]) if e == f+1])
835
835
sage: bij = Bijectionist(A, B, tau)
836
836
sage: bij.set_statistics((wex, des), (fix, adj))
837
837
sage: a, b = bij.statistics_table()
@@ -1193,8 +1193,8 @@ def set_distributions(self, *elements_distributions):
1193
1193
Another example with statistics::
1194
1194
1195
1195
sage: bij = Bijectionist(A, B, tau)
1196
- sage: alpha = lambda p: p(1) if len(p) > 0 else 0
1197
- sage: beta = lambda p: p(1) if len(p) > 0 else 0
1196
+ sage: def alpha(p): return p(1) if len(p) > 0 else 0
1197
+ sage: def beta(p): return p(1) if len(p) > 0 else 0
1198
1198
sage: bij.set_statistics((alpha, beta), (len, len))
1199
1199
sage: for sol in sorted(list(bij.solutions_iterator()), key=lambda d: tuple(sorted(d.items()))):
1200
1200
....: print(sol)
@@ -1304,7 +1304,7 @@ def set_intertwining_relations(self, *pi_rho):
1304
1304
of the second permutation by the length of the first
1305
1305
permutation::
1306
1306
1307
- sage: concat = lambda p1, p2: Permutation(p1 + [i + len(p1) for i in p2])
1307
+ sage: def concat( p1, p2): return Permutation(p1 + [i + len(p1) for i in p2])
1308
1308
1309
1309
We may be interested in statistics on permutations which are
1310
1310
equidistributed with the number of fixed points, such that
@@ -1496,7 +1496,7 @@ def _forced_constant_blocks(self):
1496
1496
1497
1497
sage: N = 4
1498
1498
sage: A = B = [permutation for n in range(2, N) for permutation in Permutations(n)]
1499
- sage: tau = lambda p: p[0] if len(p) else 0
1499
+ sage: def tau(p): return p[0] if len(p) else 0
1500
1500
sage: add_n = lambda p1: Permutation(p1 + [1 + len(p1)])
1501
1501
sage: add_1 = lambda p1: Permutation([1] + [1 + i for i in p1])
1502
1502
sage: bij = Bijectionist(A, B, tau)
@@ -1528,8 +1528,8 @@ def _forced_constant_blocks(self):
1528
1528
sage: bij.constant_blocks()
1529
1529
{{[2, 3, 1], [3, 1, 2]}}
1530
1530
1531
- sage: concat = lambda p1, p2: Permutation(p1 + [i + len(p1) for i in p2])
1532
- sage: union = lambda p1, p2: Partition(sorted(list(p1) + list(p2), reverse=True))
1531
+ sage: def concat( p1, p2): return Permutation(p1 + [i + len(p1) for i in p2])
1532
+ sage: def union( p1, p2): return Partition(sorted(list(p1) + list(p2), reverse=True))
1533
1533
sage: bij.set_intertwining_relations((2, concat, union))
1534
1534
1535
1535
In this case we do not discover constant blocks by looking at the intertwining_relations only::
@@ -1546,10 +1546,10 @@ def _forced_constant_blocks(self):
1546
1546
1547
1547
sage: N = 4
1548
1548
sage: A = B = [permutation for n in range(N + 1) for permutation in Permutations(n)]
1549
- sage: alpha1 = lambda p: len(p.weak_excedences())
1550
- sage: alpha2 = lambda p: len(p.fixed_points())
1551
- sage: beta1 = lambda p: len(p.descents(final_descent=True)) if p else 0
1552
- sage: beta2 = lambda p: len([e for (e, f) in zip(p, p[1:] + [0]) if e == f + 1])
1549
+ sage: def alpha1(p): return len(p.weak_excedences())
1550
+ sage: def alpha2(p): return len(p.fixed_points())
1551
+ sage: def beta1(p): return len(p.descents(final_descent=True)) if p else 0
1552
+ sage: def beta2(p): return len([e for (e, f) in zip(p, p[1:] + [0]) if e == f + 1])
1553
1553
sage: tau = Permutation.longest_increasing_subsequence_length
1554
1554
sage: def rotate_permutation(p):
1555
1555
....: cycle = Permutation(tuple(range(1, len(p) + 1)))
@@ -1826,7 +1826,7 @@ def minimal_subdistributions_iterator(self):
1826
1826
Another example::
1827
1827
1828
1828
sage: N = 2; A = B = [dyck_word for n in range(N+1) for dyck_word in DyckWords(n)]
1829
- sage: tau = lambda D: D.number_of_touch_points()
1829
+ sage: def tau(D): return D.number_of_touch_points()
1830
1830
sage: bij = Bijectionist(A, B, tau)
1831
1831
sage: bij.set_statistics((lambda d: d.semilength(), lambda d: d.semilength()))
1832
1832
sage: for solution in sorted(list(bij.solutions_iterator()), key=lambda d: tuple(sorted(d.items()))):
@@ -1974,7 +1974,7 @@ def minimal_subdistributions_blocks_iterator(self):
1974
1974
Another example::
1975
1975
1976
1976
sage: N = 2; A = B = [dyck_word for n in range(N+1) for dyck_word in DyckWords(n)]
1977
- sage: tau = lambda D: D.number_of_touch_points()
1977
+ sage: def tau(D): return D.number_of_touch_points()
1978
1978
sage: bij = Bijectionist(A, B, tau)
1979
1979
sage: bij.set_statistics((lambda d: d.semilength(), lambda d: d.semilength()))
1980
1980
sage: for solution in sorted(list(bij.solutions_iterator()), key=lambda d: tuple(sorted(d.items()))):
@@ -2143,8 +2143,8 @@ def _preprocess_intertwining_relations(self):
2143
2143
2144
2144
sage: A = B = 'abcd'
2145
2145
sage: bij = Bijectionist(A, B, lambda x: B.index(x) % 2)
2146
- sage: pi = lambda p1, p2: 'abcdefgh'[A.index(p1) + A.index(p2)]
2147
- sage: rho = lambda s1, s2: (s1 + s2) % 2
2146
+ sage: def pi( p1, p2): return 'abcdefgh'[A.index(p1) + A.index(p2)]
2147
+ sage: def rho( s1, s2): return (s1 + s2) % 2
2148
2148
sage: bij.set_intertwining_relations((2, pi, rho))
2149
2149
sage: bij._preprocess_intertwining_relations()
2150
2150
sage: bij._P
@@ -2909,8 +2909,8 @@ def add_intertwining_relation_constraints(self):
2909
2909
2910
2910
sage: A = B = 'abcd'
2911
2911
sage: bij = Bijectionist(A, B, lambda x: B.index(x) % 2)
2912
- sage: pi = lambda p1, p2: 'abcdefgh'[A.index(p1) + A.index(p2)]
2913
- sage: rho = lambda s1, s2: (s1 + s2) % 2
2912
+ sage: def pi( p1, p2): return 'abcdefgh'[A.index(p1) + A.index(p2)]
2913
+ sage: def rho( s1, s2): return (s1 + s2) % 2
2914
2914
sage: bij.set_intertwining_relations((2, pi, rho))
2915
2915
sage: from sage.combinat.bijectionist import _BijectionistMILP
2916
2916
sage: bmilp = _BijectionistMILP(bij) # indirect doctest
@@ -3127,8 +3127,8 @@ def _non_copying_intersection(sets):
3127
3127
Note that adding ``[(2,-2,-1), (2,2,-1), (2,-2,1), (2,2,1)]`` makes
3128
3128
it take (seemingly) forever.::
3129
3129
3130
- sage: c1 = lambda a, b: (a[0]+b[0], a[1]*b[1], a[2]*b[2])
3131
- sage: c2 = lambda a: (a[0], -a[1], a[2])
3130
+ sage: def c1( a, b): return (a[0]+b[0], a[1]*b[1], a[2]*b[2])
3131
+ sage: def c2(a): return (a[0], -a[1], a[2])
3132
3132
3133
3133
sage: bij = Bijectionist(sum(As, []), sum(Bs, []))
3134
3134
sage: bij.set_statistics((lambda x: x[0], lambda x: x[0]))
@@ -3168,10 +3168,10 @@ def _non_copying_intersection(sets):
3168
3168
Our benchmark example::
3169
3169
3170
3170
sage: from sage.combinat.cyclic_sieving_phenomenon import orbit_decomposition
3171
- sage: alpha1 = lambda p: len(p.weak_excedences())
3172
- sage: alpha2 = lambda p: len(p.fixed_points())
3173
- sage: beta1 = lambda p: len(p.descents(final_descent=True)) if p else 0
3174
- sage: beta2 = lambda p: len([e for (e, f) in zip(p, p[1:]+[0]) if e == f+1])
3171
+ sage: def alpha1(p): return len(p.weak_excedences())
3172
+ sage: def alpha2(p): return len(p.fixed_points())
3173
+ sage: def beta1(p): return len(p.descents(final_descent=True)) if p else 0
3174
+ sage: def beta2(p): return len([e for (e, f) in zip(p, p[1:]+[0]) if e == f+1])
3175
3175
sage: gamma = Permutation.longest_increasing_subsequence_length
3176
3176
sage: def rotate_permutation(p):
3177
3177
....: cycle = Permutation(tuple(range(1, len(p)+1)))
0 commit comments