// File: /workspace/github_cpp_makefile_star2_O2/xbai0624[P]dnn/src/Matrix.cpp
// Function: Matrix::Normalization()
Matrix Matrix::Normalization()
{
    // includes normalization, centering and standarization per sample
    auto dim = Dimension();
    Matrix m(dim);

    // step 1) normalize
    double min = MinInSection(0, dim.first, 0, dim.second);
    double max = MaxInSection(0, dim.first, 0, dim.second);

    double amp = max - min;

    if(amp > 0)
        for(size_t i=0;i<dim.first;i++)
            for(size_t j=0;j<dim.second;j++)
                m[i][j] = (*this)[i][j] / amp;

    // step 2) cenering
    double average = 0;
    // find min, max, mean
    for(size_t i=0;i<dim.first;i++){
        for(size_t j=0;j<dim.second;j++)
        {
            average += m[i][j];
        }
    }
    double N = dim.first * dim.second;
    average /= N;
    if(average != 0)
        for(size_t i=0;i<dim.first;i++){
            for(size_t j=0;j<dim.second;j++)
            {
                m[i][j] = m[i][j] - average;
            }
        }

    // step 3) standardization
    // find sigma
    double sigma = 0;
    for(size_t i=0;i<dim.first;i++){
        for(size_t j=0;j<dim.second;j++)
        {
            double tmp = m[i][j];
            sigma += tmp*tmp;
        }
    }
    sigma = sqrt(sigma);
    if(sigma > 0)
        for(size_t i=0;i<dim.first;i++){
            for(size_t j=0;j<dim.second;j++)
            {
                m[i][j]/=sigma;
            }
        }

    return m;
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
pushq %rax
movq %rsi, %r12
movq %rdi, %rbx
movq %rsi, %rdi
callq 0x17a6a
movq %rax, %r14
movq %rdx, %r15
movq %rbx, %rdi
movq %rax, %rsi
callq 0x1776a
movq %r12, %rdi
xorl %esi, %esi
movq %r14, %rdx
xorl %ecx, %ecx
movq %r15, %r8
callq 0x18cca
movsd %xmm0, (%rsp)
movq %r12, %rdi
xorl %esi, %esi
movq %r14, %rdx
xorl %ecx, %ecx
movq %r15, %r8
callq 0x18d76
subsd (%rsp), %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jbe 0x18b93
xorl %eax, %eax
cmpq %r14, %rax
je 0x18b93
imulq $0x18, %rax, %rcx
movq (%r12), %rdx
addq %rcx, %rdx
addq (%rbx), %rcx
xorl %esi, %esi
cmpq %rsi, %r15
je 0x18b8e
movq (%rdx), %rdi
movsd (%rdi,%rsi,8), %xmm2
divsd %xmm0, %xmm2
movq (%rcx), %rdi
movsd %xmm2, (%rdi,%rsi,8)
incq %rsi
jmp 0x18b70
incq %rax
jmp 0x18b5b
movq (%rbx), %rax
xorl %ecx, %ecx
cmpq %r14, %rcx
je 0x18bbd
imulq $0x18, %rcx, %rdx
addq %rax, %rdx
xorl %esi, %esi
cmpq %rsi, %r15
je 0x18bb8
movq (%rdx), %rdi
addsd (%rdi,%rsi,8), %xmm1
incq %rsi
jmp 0x18ba6
incq %rcx
jmp 0x18b98
movq %r14, %rcx
imulq %r15, %rcx
movq %rcx, %xmm0
punpckldq 0x844f(%rip), %xmm0 # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
subpd 0x8457(%rip), %xmm0     # 0x21030
movapd %xmm0, %xmm2
unpckhpd %xmm0, %xmm2            # xmm2 = xmm2[1],xmm0[1]
addsd %xmm0, %xmm2
divsd %xmm2, %xmm1
xorpd %xmm0, %xmm0
ucomisd %xmm0, %xmm1
jne 0x18bf5
jnp 0x18c28
xorl %ecx, %ecx
movq (%rbx), %rax
cmpq %r14, %rcx
je 0x18c28
imulq $0x18, %rcx, %rdx
addq %rdx, %rax
xorl %edx, %edx
cmpq %rdx, %r15
je 0x18c23
movq (%rax), %rsi
movsd (%rsi,%rdx,8), %xmm2
subsd %xmm1, %xmm2
movsd %xmm2, (%rsi,%rdx,8)
incq %rdx
jmp 0x18c08
incq %rcx
jmp 0x18bf7
xorl %ecx, %ecx
cmpq %r14, %rcx
je 0x18c57
imulq $0x18, %rcx, %rdx
addq %rax, %rdx
xorl %esi, %esi
cmpq %rsi, %r15
je 0x18c52
movq (%rdx), %rdi
movsd (%rdi,%rsi,8), %xmm1
mulsd %xmm1, %xmm1
addsd %xmm1, %xmm0
incq %rsi
jmp 0x18c38
incq %rcx
jmp 0x18c2a
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jb 0x18c67
sqrtsd %xmm0, %xmm0
jmp 0x18c70
callq 0x43f8
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jbe 0x18ca6
xorl %eax, %eax
cmpq %r14, %rax
je 0x18ca6
imulq $0x18, %rax, %rcx
addq (%rbx), %rcx
xorl %edx, %edx
cmpq %rdx, %r15
je 0x18ca1
movq (%rcx), %rsi
movsd (%rsi,%rdx,8), %xmm1
divsd %xmm0, %xmm1
movsd %xmm1, (%rsi,%rdx,8)
incq %rdx
jmp 0x18c86
incq %rax
jmp 0x18c78
movq %rbx, %rax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
jmp 0x18cb7
movq %rax, %r14
movq %rbx, %rdi
callq 0x17a9a
movq %r14, %rdi
callq 0x43b0