|
Packit |
562c7a |
# mode: run
|
|
Packit |
562c7a |
# tag: optimisation
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
cimport cython
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
class loud_list(list):
|
|
Packit |
562c7a |
def __len__(self):
|
|
Packit |
562c7a |
print "calling __len__"
|
|
Packit |
562c7a |
return super(loud_list, self).__len__()
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
# min()
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
@cython.test_assert_path_exists("//CondExprNode")
|
|
Packit |
562c7a |
@cython.test_fail_if_path_exists("//SimpleCallNode")
|
|
Packit |
562c7a |
def min3(a,b,c):
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> min3(1,2,3)
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
>>> min3(2,3,1)
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
>>> min3(2,1,3)
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
>>> min3(3,1,2)
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
>>> min3(3,2,1)
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
return min(a,b,c)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
@cython.test_assert_path_exists("//CondExprNode")
|
|
Packit |
562c7a |
@cython.test_fail_if_path_exists("//SimpleCallNode")
|
|
Packit |
562c7a |
def min3_list(a,b,c):
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> min3_list(1,2,3)
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
>>> min3_list(2,3,1)
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
>>> min3_list(2,1,3)
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
>>> min3_list(3,1,2)
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
>>> min3_list(3,2,1)
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
return min([a,b,c])
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
@cython.test_assert_path_exists("//CondExprNode")
|
|
Packit |
562c7a |
@cython.test_fail_if_path_exists("//SimpleCallNode")
|
|
Packit |
562c7a |
def min3_tuple(a,b,c):
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> min3_tuple(1,2,3)
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
>>> min3_tuple(2,3,1)
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
>>> min3_tuple(2,1,3)
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
>>> min3_tuple(3,1,2)
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
>>> min3_tuple(3,2,1)
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
return min((a,b,c))
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
@cython.test_assert_path_exists("//CondExprNode")
|
|
Packit |
562c7a |
@cython.test_fail_if_path_exists("//SimpleCallNode")
|
|
Packit |
562c7a |
def min3_typed(int a, int b, int c):
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> min3_typed(1,2,3)
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
>>> min3_typed(2,3,1)
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
>>> min3_typed(2,1,3)
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
>>> min3_typed(3,1,2)
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
>>> min3_typed(3,2,1)
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
return min(a,b,c)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
@cython.test_assert_path_exists("//CondExprNode")
|
|
Packit |
562c7a |
@cython.test_fail_if_path_exists("//SimpleCallNode")
|
|
Packit |
562c7a |
def literal_min3():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> literal_min3()
|
|
Packit |
562c7a |
(1, 1, 1, 1, 1)
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
return min(1,2,3), min(2,1,3), min(2,3,1), min(3,1,2), min(3,2,1)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
@cython.test_assert_path_exists(
|
|
Packit |
562c7a |
'//PrintStatNode//CondExprNode')
|
|
Packit |
562c7a |
@cython.test_fail_if_path_exists(
|
|
Packit |
562c7a |
'//PrintStatNode//SimpleCallNode//CoerceToPyTypeNode',
|
|
Packit |
562c7a |
'//PrintStatNode//SimpleCallNode//ConstNode')
|
|
Packit |
562c7a |
def test_min2():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> test_min2()
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
calling __len__
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
calling __len__
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
cdef int my_int = 1
|
|
Packit |
562c7a |
cdef object my_pyint = 2
|
|
Packit |
562c7a |
cdef object my_list = loud_list([1,2,3])
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
print min(1, 2)
|
|
Packit |
562c7a |
print min(2, my_int)
|
|
Packit |
562c7a |
print min(my_int, 2)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
print min(my_int, my_pyint)
|
|
Packit |
562c7a |
print min(my_pyint, my_int)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
print min(my_int, len(my_list))
|
|
Packit |
562c7a |
print min(len(my_list), my_int)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
@cython.test_assert_path_exists(
|
|
Packit |
562c7a |
'//PrintStatNode//CondExprNode')
|
|
Packit |
562c7a |
@cython.test_fail_if_path_exists(
|
|
Packit |
562c7a |
'//PrintStatNode//SimpleCallNode//CoerceToPyTypeNode',
|
|
Packit |
562c7a |
'//PrintStatNode//SimpleCallNode//ConstNode')
|
|
Packit |
562c7a |
def test_min3():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> test_min3()
|
|
Packit |
562c7a |
calling __len__
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
calling __len__
|
|
Packit |
562c7a |
calling __len__
|
|
Packit |
562c7a |
2
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
cdef int my_int = 1
|
|
Packit |
562c7a |
cdef object my_pyint = 2
|
|
Packit |
562c7a |
cdef object my_list = loud_list([1,2,3])
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
print min(my_int, my_pyint, len(my_list))
|
|
Packit |
562c7a |
print min(my_pyint, my_list.__len__(), len(my_list))
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
@cython.test_assert_path_exists(
|
|
Packit |
562c7a |
'//PrintStatNode//CondExprNode')
|
|
Packit |
562c7a |
@cython.test_fail_if_path_exists(
|
|
Packit |
562c7a |
'//PrintStatNode//SimpleCallNode//CoerceToPyTypeNode',
|
|
Packit |
562c7a |
'//PrintStatNode//SimpleCallNode//ConstNode')
|
|
Packit |
562c7a |
def test_minN():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> test_minN()
|
|
Packit |
562c7a |
calling __len__
|
|
Packit |
562c7a |
0
|
|
Packit |
562c7a |
calling __len__
|
|
Packit |
562c7a |
0
|
|
Packit |
562c7a |
calling __len__
|
|
Packit |
562c7a |
0
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
cdef int my_int = 1
|
|
Packit |
562c7a |
cdef object my_pyint = 2
|
|
Packit |
562c7a |
cdef object my_list = loud_list([1,2,3])
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
print min(my_int, 2, my_int, 0, my_pyint, my_int, len(my_list))
|
|
Packit |
562c7a |
print min(my_int, my_int, 0, my_pyint, my_int, len(my_list))
|
|
Packit |
562c7a |
print min(my_int, my_int, 2, my_int, 0, my_pyint, my_int, len(my_list))
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
# max()
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
@cython.test_assert_path_exists("//CondExprNode")
|
|
Packit |
562c7a |
@cython.test_fail_if_path_exists("//SimpleCallNode")
|
|
Packit |
562c7a |
def max3(a,b,c):
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> max3(1,2,3)
|
|
Packit |
562c7a |
3
|
|
Packit |
562c7a |
>>> max3(2,3,1)
|
|
Packit |
562c7a |
3
|
|
Packit |
562c7a |
>>> max3(2,1,3)
|
|
Packit |
562c7a |
3
|
|
Packit |
562c7a |
>>> max3(3,1,2)
|
|
Packit |
562c7a |
3
|
|
Packit |
562c7a |
>>> max3(3,2,1)
|
|
Packit |
562c7a |
3
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
return max(a,b,c)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
@cython.test_assert_path_exists("//CondExprNode")
|
|
Packit |
562c7a |
@cython.test_fail_if_path_exists("//SimpleCallNode")
|
|
Packit |
562c7a |
def max3_typed(int a, int b, int c):
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> max3_typed(1,2,3)
|
|
Packit |
562c7a |
3
|
|
Packit |
562c7a |
>>> max3_typed(2,3,1)
|
|
Packit |
562c7a |
3
|
|
Packit |
562c7a |
>>> max3_typed(2,1,3)
|
|
Packit |
562c7a |
3
|
|
Packit |
562c7a |
>>> max3_typed(3,1,2)
|
|
Packit |
562c7a |
3
|
|
Packit |
562c7a |
>>> max3_typed(3,2,1)
|
|
Packit |
562c7a |
3
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
return max(a,b,c)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
@cython.test_assert_path_exists("//CondExprNode")
|
|
Packit |
562c7a |
@cython.test_fail_if_path_exists("//SimpleCallNode")
|
|
Packit |
562c7a |
def literal_max3():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> literal_max3()
|
|
Packit |
562c7a |
(3, 3, 3, 3, 3)
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
return max(1,2,3), max(2,1,3), max(2,3,1), max(3,1,2), max(3,2,1)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def max1(x):
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> max1([1, 2, 3])
|
|
Packit |
562c7a |
3
|
|
Packit |
562c7a |
>>> max1([2])
|
|
Packit |
562c7a |
2
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
return max(x)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
@cython.test_assert_path_exists(
|
|
Packit |
562c7a |
'//PrintStatNode//CondExprNode')
|
|
Packit |
562c7a |
@cython.test_fail_if_path_exists(
|
|
Packit |
562c7a |
'//PrintStatNode//SimpleCallNode//CoerceToPyTypeNode',
|
|
Packit |
562c7a |
'//PrintStatNode//SimpleCallNode//ConstNode')
|
|
Packit |
562c7a |
def test_max2():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> test_max2()
|
|
Packit |
562c7a |
2
|
|
Packit |
562c7a |
2
|
|
Packit |
562c7a |
2
|
|
Packit |
562c7a |
2
|
|
Packit |
562c7a |
2
|
|
Packit |
562c7a |
calling __len__
|
|
Packit |
562c7a |
3
|
|
Packit |
562c7a |
calling __len__
|
|
Packit |
562c7a |
3
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
cdef int my_int = 1
|
|
Packit |
562c7a |
cdef object my_pyint = 2
|
|
Packit |
562c7a |
cdef object my_list = loud_list([1,2,3])
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
print max(1, 2)
|
|
Packit |
562c7a |
print max(2, my_int)
|
|
Packit |
562c7a |
print max(my_int, 2)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
print max(my_int, my_pyint)
|
|
Packit |
562c7a |
print max(my_pyint, my_int)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
print max(my_int, len(my_list))
|
|
Packit |
562c7a |
print max(len(my_list), my_int)
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
@cython.test_assert_path_exists(
|
|
Packit |
562c7a |
'//PrintStatNode//CondExprNode')
|
|
Packit |
562c7a |
@cython.test_fail_if_path_exists(
|
|
Packit |
562c7a |
'//PrintStatNode//SimpleCallNode//CoerceToPyTypeNode',
|
|
Packit |
562c7a |
'//PrintStatNode//SimpleCallNode//ConstNode')
|
|
Packit |
562c7a |
def test_max3():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> test_max3()
|
|
Packit |
562c7a |
calling __len__
|
|
Packit |
562c7a |
3
|
|
Packit |
562c7a |
calling __len__
|
|
Packit |
562c7a |
calling __len__
|
|
Packit |
562c7a |
3
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
cdef int my_int = 1
|
|
Packit |
562c7a |
cdef object my_pyint = 2
|
|
Packit |
562c7a |
cdef object my_list = loud_list([1,2,3])
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
print max(my_int, my_pyint, len(my_list))
|
|
Packit |
562c7a |
print max(my_pyint, my_list.__len__(), len(my_list))
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
@cython.test_assert_path_exists(
|
|
Packit |
562c7a |
'//PrintStatNode//CondExprNode')
|
|
Packit |
562c7a |
@cython.test_fail_if_path_exists(
|
|
Packit |
562c7a |
'//PrintStatNode//SimpleCallNode//CoerceToPyTypeNode',
|
|
Packit |
562c7a |
'//PrintStatNode//SimpleCallNode//ConstNode')
|
|
Packit |
562c7a |
def test_maxN():
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> test_maxN()
|
|
Packit |
562c7a |
calling __len__
|
|
Packit |
562c7a |
3
|
|
Packit |
562c7a |
calling __len__
|
|
Packit |
562c7a |
3
|
|
Packit |
562c7a |
calling __len__
|
|
Packit |
562c7a |
3
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
cdef int my_int = 1
|
|
Packit |
562c7a |
cdef object my_pyint = 2
|
|
Packit |
562c7a |
cdef object my_list = loud_list([1,2,3])
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
print max(my_int, 2, my_int, 0, my_pyint, my_int, len(my_list))
|
|
Packit |
562c7a |
print max(my_int, my_int, 0, my_pyint, my_int, len(my_list))
|
|
Packit |
562c7a |
print max(my_int, my_int, 2, my_int, 0, my_pyint, my_int, len(my_list))
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
'''
|
|
Packit |
562c7a |
# ticket 772
|
|
Packit |
562c7a |
# FIXME: signed vs. unsigned fails to safely handle intermediate results
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
@cython.test_assert_path_exists("//CondExprNode")
|
|
Packit |
562c7a |
@cython.test_fail_if_path_exists("//SimpleCallNode")
|
|
Packit |
562c7a |
def max3_typed_signed_unsigned(int a, unsigned int b, int c):
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> max3_typed_signed_unsigned(1,2,-3)
|
|
Packit |
562c7a |
2
|
|
Packit |
562c7a |
>>> max3_typed_signed_unsigned(-2,3,1)
|
|
Packit |
562c7a |
3
|
|
Packit |
562c7a |
>>> max3_typed_signed_unsigned(-2,1,-3)
|
|
Packit |
562c7a |
1
|
|
Packit |
562c7a |
>>> max3_typed_signed_unsigned(3,-1,2)
|
|
Packit |
562c7a |
3
|
|
Packit |
562c7a |
>>> max3_typed_signed_unsigned(-3,2,1)
|
|
Packit |
562c7a |
2
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
return max(a,b,c)
|
|
Packit |
562c7a |
'''
|