// File: kebwi[P]Trifid/src/SteerablePyramid.cpp
// Function: SteerablePyramid::SoftThreshold(std::vector<double, std::allocator<double>>)
void SteerablePyramid::SoftThreshold(vector<Float_t> thresholds)
{
	assert(width_ > 0 && height_ > 0);
	
	assert(thresholds.size() == numLevels_ + 1);
	for (int i = 0; i < thresholds.size(); i++)
		assert(thresholds[0] >= 0);
	
	int totalPixels = width_ * height_;
	if (thresholds[0] > 0)
		for (int i = 0; i < totalPixels; i++)
		{
			if (fabs(h0Coeffs_[i]) < thresholds[0])
				h0Coeffs_[i] = 0;
			else if (h0Coeffs_[i] > 0)
				h0Coeffs_[i] -= thresholds[0];
			else if (h0Coeffs_[i] < 0)
				h0Coeffs_[i] += thresholds[0];
		}
	
	for (int i = 0; i < numLevels_; i++)
	{
		Float_t threshold = thresholds[i + 1];
		
		if (threshold == 0)
			continue;
		
		int totalPixels = (width_ * height_) / (int)(pow(4, i));
		for (int j = 0; j < totalPixels; j++)
		{
			if (fabs(b1Coeffs_[i][j]) < threshold)
				b1Coeffs_[i][j] = 0;
			else if (b1Coeffs_[i][j] > 0)
				b1Coeffs_[i][j] -= threshold;
			else if (b1Coeffs_[i][j] < 0)
				b1Coeffs_[i][j] += threshold;
				
			if (fabs(b2Coeffs_[i][j]) < threshold)
				b2Coeffs_[i][j] = 0;
			else if (b2Coeffs_[i][j] > 0)
				b2Coeffs_[i][j] -= threshold;
			else if (b2Coeffs_[i][j] < 0)
				b2Coeffs_[i][j] += threshold;
				
			if (fabs(b3Coeffs_[i][j]) < threshold)
				b3Coeffs_[i][j] = 0;
			else if (b3Coeffs_[i][j] > 0)
				b3Coeffs_[i][j] -= threshold;
			else if (b3Coeffs_[i][j] < 0)
				b3Coeffs_[i][j] += threshold;
				
			if (fabs(b4Coeffs_[i][j]) < threshold)
				b4Coeffs_[i][j] = 0;
			else if (b4Coeffs_[i][j] > 0)
				b4Coeffs_[i][j] -= threshold;
			else if (b4Coeffs_[i][j] < 0)
				b4Coeffs_[i][j] += threshold;
		}
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movq %rsi, -0x48(%rbp)
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x8(%rbp), %rcx
movq %rcx, -0x40(%rbp)
xorl %eax, %eax
cmpl $0x0, 0x30(%rcx)
movb %al, -0x31(%rbp)
jle 0x2ecb5
movq -0x40(%rbp), %rax
cmpl $0x0, 0x34(%rax)
setg %al
movb %al, -0x31(%rbp)
movb -0x31(%rbp), %al
testb $0x1, %al
jne 0x2ecbe
jmp 0x2ecc0
jmp 0x2ecdf
leaq 0x1e4ca(%rip), %rdi     # 0x4d191
leaq 0x1d688(%rip), %rsi     # 0x4c356
movl $0x635, %edx            # imm = 0x635
leaq 0x1e557(%rip), %rcx     # 0x4d231
callq 0x4240
movq -0x48(%rbp), %rdi
callq 0xe5c0
movq -0x40(%rbp), %rcx
movl 0x38(%rcx), %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
cmpq %rcx, %rax
jne 0x2ecfc
jmp 0x2ed1b
leaq 0x1e564(%rip), %rdi     # 0x4d267
leaq 0x1d64c(%rip), %rsi     # 0x4c356
movl $0x637, %edx            # imm = 0x637
leaq 0x1e51b(%rip), %rcx     # 0x4d231
callq 0x4240
movl $0x0, -0x14(%rbp)
movq -0x48(%rbp), %rdi
movslq -0x14(%rbp), %rax
movq %rax, -0x50(%rbp)
callq 0xe5c0
movq %rax, %rcx
movq -0x50(%rbp), %rax
cmpq %rcx, %rax
jae 0x2ed87
movq -0x48(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0xe670
movsd (%rax), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jb 0x2ed5b
jmp 0x2ed7a
leaq 0x1e529(%rip), %rdi     # 0x4d28b
leaq 0x1d5ed(%rip), %rsi     # 0x4c356
movl $0x639, %edx            # imm = 0x639
leaq 0x1e4bc(%rip), %rcx     # 0x4d231
callq 0x4240
jmp 0x2ed7c
movl -0x14(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x14(%rbp)
jmp 0x2ed22
movq -0x48(%rbp), %rdi
movq -0x40(%rbp), %rcx
movl 0x30(%rcx), %eax
imull 0x34(%rcx), %eax
movl %eax, -0x18(%rbp)
xorl %eax, %eax
movl %eax, %esi
callq 0xe670
movsd (%rax), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jbe 0x2eeb6
movl $0x0, -0x1c(%rbp)
movl -0x1c(%rbp), %eax
cmpl -0x18(%rbp), %eax
jge 0x2eeb4
movq -0x48(%rbp), %rdi
movq -0x40(%rbp), %rax
movq (%rax), %rax
movslq -0x1c(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
movaps 0x1a25f(%rip), %xmm1    # 0x49040
pand %xmm1, %xmm0
movsd %xmm0, -0x58(%rbp)
xorl %eax, %eax
movl %eax, %esi
callq 0xe670
movsd -0x58(%rbp), %xmm1
movsd (%rax), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x2ee1a
movq -0x40(%rbp), %rax
movq (%rax), %rax
movslq -0x1c(%rbp), %rcx
xorps %xmm0, %xmm0
movsd %xmm0, (%rax,%rcx,8)
jmp 0x2eea4
movq -0x40(%rbp), %rax
movq (%rax), %rax
movslq -0x1c(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jbe 0x2ee62
movq -0x48(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0xe670
movq %rax, %rcx
movq -0x40(%rbp), %rax
movsd (%rcx), %xmm1
movq (%rax), %rax
movslq -0x1c(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
subsd %xmm1, %xmm0
movsd %xmm0, (%rax,%rcx,8)
jmp 0x2eea2
movq -0x40(%rbp), %rax
movq (%rax), %rax
movslq -0x1c(%rbp), %rcx
xorps %xmm0, %xmm0
ucomisd (%rax,%rcx,8), %xmm0
jbe 0x2eea0
movq -0x48(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0xe670
movq %rax, %rcx
movq -0x40(%rbp), %rax
movsd (%rcx), %xmm0
movq (%rax), %rax
movslq -0x1c(%rbp), %rcx
addsd (%rax,%rcx,8), %xmm0
movsd %xmm0, (%rax,%rcx,8)
jmp 0x2eea2
jmp 0x2eea4
jmp 0x2eea6
movl -0x1c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x1c(%rbp)
jmp 0x2edba
jmp 0x2eeb6
movl $0x0, -0x20(%rbp)
movq -0x40(%rbp), %rcx
movl -0x20(%rbp), %eax
cmpl 0x38(%rcx), %eax
jge 0x2f2d8
movq -0x48(%rbp), %rdi
movl -0x20(%rbp), %eax
addl $0x1, %eax
movslq %eax, %rsi
callq 0xe670
movsd (%rax), %xmm0
movsd %xmm0, -0x28(%rbp)
movsd -0x28(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jne 0x2eefd
jp 0x2eefd
jmp 0x2f2ca
movq -0x40(%rbp), %rcx
movl 0x30(%rcx), %eax
imull 0x34(%rcx), %eax
movl %eax, -0x5c(%rbp)
movl -0x20(%rbp), %esi
movl $0x4, %edi
callq 0x1d7f0
movl -0x5c(%rbp), %eax
cvttsd2si %xmm0, %ecx
cltd
idivl %ecx
movl %eax, -0x2c(%rbp)
movl $0x0, -0x30(%rbp)
movl -0x30(%rbp), %eax
cmpl -0x2c(%rbp), %eax
jge 0x2f2c8
movq -0x40(%rbp), %rax
movq 0x8(%rax), %rax
movslq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movslq -0x30(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm1
movaps 0x1a0e8(%rip), %xmm0    # 0x49040
pand %xmm0, %xmm1
movsd -0x28(%rbp), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x2ef88
movq -0x40(%rbp), %rax
movq 0x8(%rax), %rax
movslq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movslq -0x30(%rbp), %rcx
xorps %xmm0, %xmm0
movsd %xmm0, (%rax,%rcx,8)
jmp 0x2f018
movq -0x40(%rbp), %rax
movq 0x8(%rax), %rax
movslq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movslq -0x30(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jbe 0x2efd3
movq -0x40(%rbp), %rax
movsd -0x28(%rbp), %xmm1
movq 0x8(%rax), %rax
movslq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movslq -0x30(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
subsd %xmm1, %xmm0
movsd %xmm0, (%rax,%rcx,8)
jmp 0x2f016
movq -0x40(%rbp), %rax
movq 0x8(%rax), %rax
movslq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movslq -0x30(%rbp), %rcx
xorps %xmm0, %xmm0
ucomisd (%rax,%rcx,8), %xmm0
jbe 0x2f014
movq -0x40(%rbp), %rax
movsd -0x28(%rbp), %xmm0
movq 0x8(%rax), %rax
movslq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movslq -0x30(%rbp), %rcx
addsd (%rax,%rcx,8), %xmm0
movsd %xmm0, (%rax,%rcx,8)
jmp 0x2f016
jmp 0x2f018
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rax
movslq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movslq -0x30(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm1
movaps 0x1a008(%rip), %xmm0    # 0x49040
pand %xmm0, %xmm1
movsd -0x28(%rbp), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x2f068
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rax
movslq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movslq -0x30(%rbp), %rcx
xorps %xmm0, %xmm0
movsd %xmm0, (%rax,%rcx,8)
jmp 0x2f0f8
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rax
movslq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movslq -0x30(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jbe 0x2f0b3
movq -0x40(%rbp), %rax
movsd -0x28(%rbp), %xmm1
movq 0x10(%rax), %rax
movslq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movslq -0x30(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
subsd %xmm1, %xmm0
movsd %xmm0, (%rax,%rcx,8)
jmp 0x2f0f6
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rax
movslq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movslq -0x30(%rbp), %rcx
xorps %xmm0, %xmm0
ucomisd (%rax,%rcx,8), %xmm0
jbe 0x2f0f4
movq -0x40(%rbp), %rax
movsd -0x28(%rbp), %xmm0
movq 0x10(%rax), %rax
movslq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movslq -0x30(%rbp), %rcx
addsd (%rax,%rcx,8), %xmm0
movsd %xmm0, (%rax,%rcx,8)
jmp 0x2f0f6
jmp 0x2f0f8
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rax
movslq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movslq -0x30(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm1
movaps 0x19f28(%rip), %xmm0    # 0x49040
pand %xmm0, %xmm1
movsd -0x28(%rbp), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x2f148
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rax
movslq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movslq -0x30(%rbp), %rcx
xorps %xmm0, %xmm0
movsd %xmm0, (%rax,%rcx,8)
jmp 0x2f1d8
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rax
movslq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movslq -0x30(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jbe 0x2f193
movq -0x40(%rbp), %rax
movsd -0x28(%rbp), %xmm1
movq 0x18(%rax), %rax
movslq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movslq -0x30(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
subsd %xmm1, %xmm0
movsd %xmm0, (%rax,%rcx,8)
jmp 0x2f1d6
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rax
movslq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movslq -0x30(%rbp), %rcx
xorps %xmm0, %xmm0
ucomisd (%rax,%rcx,8), %xmm0
jbe 0x2f1d4
movq -0x40(%rbp), %rax
movsd -0x28(%rbp), %xmm0
movq 0x18(%rax), %rax
movslq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movslq -0x30(%rbp), %rcx
addsd (%rax,%rcx,8), %xmm0
movsd %xmm0, (%rax,%rcx,8)
jmp 0x2f1d6
jmp 0x2f1d8
movq -0x40(%rbp), %rax
movq 0x20(%rax), %rax
movslq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movslq -0x30(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm1
movaps 0x19e48(%rip), %xmm0    # 0x49040
pand %xmm0, %xmm1
movsd -0x28(%rbp), %xmm0
ucomisd %xmm1, %xmm0
jbe 0x2f228
movq -0x40(%rbp), %rax
movq 0x20(%rax), %rax
movslq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movslq -0x30(%rbp), %rcx
xorps %xmm0, %xmm0
movsd %xmm0, (%rax,%rcx,8)
jmp 0x2f2b8
movq -0x40(%rbp), %rax
movq 0x20(%rax), %rax
movslq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movslq -0x30(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jbe 0x2f273
movq -0x40(%rbp), %rax
movsd -0x28(%rbp), %xmm1
movq 0x20(%rax), %rax
movslq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movslq -0x30(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
subsd %xmm1, %xmm0
movsd %xmm0, (%rax,%rcx,8)
jmp 0x2f2b6
movq -0x40(%rbp), %rax
movq 0x20(%rax), %rax
movslq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movslq -0x30(%rbp), %rcx
xorps %xmm0, %xmm0
ucomisd (%rax,%rcx,8), %xmm0
jbe 0x2f2b4
movq -0x40(%rbp), %rax
movsd -0x28(%rbp), %xmm0
movq 0x20(%rax), %rax
movslq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movslq -0x30(%rbp), %rcx
addsd (%rax,%rcx,8), %xmm0
movsd %xmm0, (%rax,%rcx,8)
jmp 0x2f2b6
jmp 0x2f2b8
jmp 0x2f2ba
movl -0x30(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x30(%rbp)
jmp 0x2ef2c
jmp 0x2f2ca
movl -0x20(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x20(%rbp)
jmp 0x2eebd
addq $0x60, %rsp
popq %rbp
retq
nop