Pages

Notes on Linear Algebra

I have been taking Linear Algebra LAFF course from edX and Applications of Linear Algebra (Part 1) also from edX.

This page is for discussing what I learn, links to videos, books, web pages, articles related to linear algebra.

Useful resources for learning linear algebra:
Essence of Linear Algebra (Video playlist from 3Blue1Brown YouTube Channel)
What is the point of linear algebra? (from Reddit)
Coding the Matrix Resources (contains python scripts)
Auto-grading for Coding the Matrix (contains python scripts)
Mathematics for Machine Learning: Linear Algebra (from Coursera)
LAFF - Linear Algebra: Foundations to Frontiers (course from Edx)

Before reading anything related to linear algebra or taking courses, I would recommend you to watch all the videos from 3Blue1Brown channel on the essence of linear algebra. Again, after taking the Coursera and edX courses, if you watch the YouTube videos, you can understand linear algebra completely. 

Now I try to explain what is a simple use (or motivation for LA) of linear algebra.

Suppose, you are going to a shop on some day and by 5 apples and 10 mangoes and you pay 20 dollars and return to home. But you don't know how much each apple and mango costs. On another day (assuming the price is same) and buy 30 apples and 2 mangoes. Now you pay 15 dollars. Now also you don't know the value.  Now, using the number apples and mangoes you bought each time, and knowing how much those costed, you can calculated the cost of each apple and each mango.

You may ask "How"?

The answer is "Using Linear Algebra".

What you have to do is that you consider apple as x (or any alphabet you want) and mango as y you can construct an equation as follow.

"\begin{pmatrix} x & y \\ z & v \end{pmatrix}"

In math mode:
(5 10) (x)
                  =  (20, 15)
(30 2) (y) 

If you solve this linear equation, you will get the price of apple and mango.



How to understand an existing complete (open source) code

Here are some of the good discussions on this topic. See at the end of the tips for more links.
  • If the code is written in a language you are not familiar with, then take a crash course on that particular language. If you are good at any programming language, you can easily learn most of the programming languages easily.
  • Use mind map to learn about the different modules used in main program, where each module is defined, different call functions in each modules, where they are called, where they are defined, what each modules, functions do, what are the external (used defined) functions, what are the user defined data types in this code etc.
  • You should also have a general idea about what the code does actually. What are the inputs, what are the outputs, what the code does, what are the algorithms used, etc.
  • If you think that some portion in the open source may be shortened (for more readability or more efficiency), you may try it and ask for pull request. This will improve the code as well as you have contributed to the code. In some cases, if you are not sure what to do, but you are sure that something can be done, use Code Review (for improvement of the working code). 
  • For a give module, understand what it does. Then, understand what are the inputs for that module. Then, test that module by giving different inputs.
  • Now, do that for functions. What are the functions used in a given module, what are the uses of those functions, what are arguments, what is calculated, what is returned, how it is calculated etc.
SE Software Engineering site has a good collection of questions and fantastic answers. Here are some of the links for answering the question:
Best practices for understanding/resurrecting old technical code?
What is the most effective way to add functionality to unfamiliar, structurally unsound code?
How do you dive into large code bases?
I've inherited 200K lines of spaghetti code — what now?


Working with BLAS library


To install the BLAS and LAPACK library, you can try:

sudo apt-get install libblas-dev liblapack-dev

This will install both BLAS and LAPACK.

Also you should understand that LAPACK uses BLAS libraries in the backend.

Here is the main page of BLAS.

The BLAS (Basic Linear Algebra Subprograms) are routines that provide standard building blocks for performing basic vector and matrix operations. 

  • Level 1 BLAS perform scalar, vector and vector-vector operations
  • Level 2 BLAS perform matrix-vector operations
  • Level 3 BLAS perform matrix-matrix operations. 

Because the BLAS are efficient, portable, and widely available, they are commonly used in the development of high quality linear algebra software, LAPACK for example.





Now, 
How to know whether BLAS library is installed or not?
OR
How to find the location of BLAS library in linux?

type (on the terminal):

locate libblas.so 

This will return the locaiton as follow if BLAS is installed.

/home/username/libblas.so
/home/username/../../../lib/libblas.so
/usr/lib64/libblas.so.3

(for many computational codes (PySCF, etc), BLAS libraries are essential).




List of Scripts (HPC and Research)


To get the output geometry of a *.out file (Q-Chem)

Using rev, column commands

grep "  B  " lda_bnr_2_n_ring_03_geo_restricted_singlet.out | tail -n6 | awk 'BEGIN {OFS=" ";} {print $1, $3, $5}' | rev | column -t | rev

Using AWK 

grep "  B  " lda_bnr_2_n_ring_03_geo_restricted_singlet.out | tail -n6 | awk 'BEGIN {OFS="
 ";} {print $1, $3, $5}'

To extract the geometry from a *.out file ($f) and paste in a ea/ip file (and insert $molecule at the beginning)

#!/usr/bin/env bash
for f in *.out; do
    for g in ea*.in; do
        n=$(((ls $f) | cut -d_ -f6))
        t=$((2 * $n ))
        grep "  B  " $f | tail -${t} | awk 'BEGIN {OFS=" ";} {print $1, $4, $5, $6}' | rev | column -t | rev > xyz.xyz
        sed -i '1i -1 2' xyz.xyz
        sed -i '1i $molecule' xyz.xyz
        echo '$end' >> xyz.xyz
        cat xyz.xyz ./input_ea.in > $g
     done
done
ClusterHOme$ ./script_ea_input.sh
./script_ea_input.sh: line 4: (ls lda_bnr_2_n_ring_05_geo_restricted_singlet.out) | cut -d_ -f6: syntax error: invalid arithmetic operator (error token is ".out) | cut -d_ -f6")

========================================
Using two for loops:

for i in *.out; do 
    for j in *.in; do 
       what/you/want/to/do 
    done
done


You may be interested in these posts

Error in image file conversion: convert-im6.q16: not authorized `test.eps' @ error/constitute.c/WriteImage/1037.

This error is because of the vulnerability. This allows remote execution of code using image formats. So, some Linux distributions by defaul...