text:
\section{\bf Introduction}
\label{intros}

In the past few decades there have been numerous approaches to  dualize  gauge theories to obtain their dynamics in
terms of the dual potentials \cite{dualpot,man1,abelianduality}.
Many of these attempts are partly inspired by the success of the dual formulation of abelian lattice gauge theories  where duality transformations
have led to interesting confining and non-confining phases in terms of the magnetic monopoles \cite{abelianduality}.
 It is widely believed that color confinement and non-perturbative vacuum structure
can  also be better understood within the dual framework \cite{dualpot,man1,confinement,involved}.
All these approaches solve the non-abelian Gauss law constraints explicitly to write  the electric fields in terms of the dual potentials. In abelian gauge theories such solutions are simple and lead to interesting dynamics \cite{abelianduality}. However, in non-abelian cases such  duality attempts have not been very successful. Various solutions of non-abelian Gauss laws  lead to  the dual descriptions of dynamics which are  involved \cite{dualpot, man1, involved} and often non-local \cite{nonlocal} with
difficult  physical interpretations making them  computationally unwieldy. Further, many of these duality techniques are tailor-made for the SU(2) gauge group and their generalization to SU(3) and higher SU(N) groups is far from clear \cite{involved}.
\begin{figure}[t]
\label{ncf}
\begin{subfigure}[b]{.5 \textwidth}
\begin{center}
{\begin{tikzpicture}[scale=1.40]
\definecolor{green}{rgb}{0.0,0.502,0.0}
\node[below] (z) at (0,0){$\scriptstyle (0,\;0)$};
\node[below] (z) at (4.6,0){$\scriptstyle (N, \;0)$};
\node[below] (z) at (0,4.65){$\scriptstyle (0, \;N)$};
\node[below] (z) at (5.6,2.9){C. T.};
\node[below] (z) at (5.6,2.5){$\longleftrightarrow$};
\draw[thin,->] (0.1,0)--(.52,0);
\draw[thin] (0.5,0)--(1,0);
\draw[fill] (.1,0) circle (.9pt);
\draw[fill] (1,0) circle (.9pt);
\draw[thin,->] (1.2,0)--(1.52,0);
\draw[thin] (1.5,0)--(2,0);
\draw[fill] (1.2,0) circle (.9pt);
\draw[fill] (2,0) circle (.9pt);
\draw[thin,->] (3.4,0)--(3.7,0);
\draw[thin] (3.7,0)--(4.3,0);
\draw[fill] (3.4,0) circle (.9pt);
\draw[fill] (4.3,0) circle (.9pt);
\draw[dashed, thin] (2.5,0)-- (2.9,0);
\begin{scope}[shift={(0,1.05)}]
\draw[thin,->] (0.1,0)--(.52,0);
\draw[thin] (0.5,0)--(1,0);
\draw[fill] (.1,0) circle (.9pt);
\draw[fill] (1,0) circle (.9pt);
\draw[thin,->] (1.2,0)--(1.52,0);
\draw[thin] (1.5,0)--(2,0);
\draw[fill] (1.2,0) circle (.9pt);
\draw[fill] (2,0) circle (.9pt);
\draw[thin,->] (3.4,0)--(3.7,0);
\draw[thin] (3.7,0)--(4.3,0);
\draw[fill] (3.4,0) circle (.9pt);
\draw[fill] (4.3,0) circle (.9pt);
\draw[dashed ,thin] (2.5,0)-- (2.9,0);
\end{scope}
\begin{scope}[shift={(0,2.1)}]
\draw[thin,->] (0.1,0)--(.52,0);
\draw[thin] (0.5,0)--(1,0);
\draw[fill] (.1,0) circle (.9pt);
\draw[fill] (1,0) circle (.9pt);
\draw[thin,->] (1.2,0)--(1.52,0);
\draw[thin] (1.5,0)--(2,0);
\draw[fill] (1.2,0) circle (.9pt);
\draw[fill] (2,0) circle (.9pt);
\draw[thin,->] (3.4,0)--(3.7,0);
\draw[thin] (3.7,0)--(4.3,0);
\draw[fill] (3.4,0) circle (.9pt);
\draw[fill] (4.3,0) circle (.9pt);
\draw[dashed, thin] (2.5,0)-- (2.9,0);
\end{scope}
\begin{scope}[shift={(0,3.15)}]
\draw[thin,->] (0.1,0)--(.52,0);
\draw[thin] (0.5,0)--(1,0);
\draw[fill] (.1,0) circle (.9pt);
\draw[fill] (1,0) circle (.9pt);
\draw[thin,->] (1.2,0)--(1.52,0);
\draw[thin] (1.5,0)--(2,0);
\draw[fill] (1.2,0) circle (.9pt);
\draw[fill] (2,0) circle (.9pt);
\draw[thin,->] (3.4,0)--(3.7,0);
\draw[thin] (3.7,0)--(4.3,0);
\draw[fill] (3.4,0) circle (.9pt);
\draw[fill] (4.3,0) circle (.9pt);
\draw[dashed, thin] (2.5,0)-- (2.9,0);
\end{scope}
\begin{scope}[shift={(0,4.20)}]
\draw[thin,->] (0.1,0)--(.52,0);
\draw[thin] (0.5,0)--(1,0);
\draw[fill] (.1,0) circle (.9pt);
\draw[fill] (1,0) circle (.9pt);
\draw[thin,->] (1.2,0)--(1.52,0);
\draw[thin] (1.5,0)--(2,0);
\draw[fill] (1.2,0) circle (.9pt);
\draw[fill] (2,0) circle (.9pt);
\draw[thin,->] (3.4,0)--(3.7,0);
\draw[thin] (3.7,0)--(4.3,0);
\draw[fill] (3.4,0) circle (.9pt);
\draw[fill] (4.3,0) circle (.9pt);
\draw[dashed, thin] (2.5,0)-- (2.9,0);
\end{scope}
\draw[thin,->] (0,0.1)--(0,.52);
\draw[thin] (0,0.5)--(0,.9);
\draw[fill] (0,.1) circle (.9pt);
\draw[fill] (0,0.9) circle (.9pt);
\draw[thin,->] (1.1,0.1)--(1.1,.52);
\draw[thin] (1.1,0.5)--(1.1,.9);
\draw[fill] (1.1,.1) circle (.9pt);
\draw[fill] (1.1,0.9) circle (.9pt);
\draw[thin,->] (2.1,0.1)--(2.1,.52);
\draw[thin] (2.1,0.5)--(2.1,.9);
\draw[fill] (2.1,.1) circle (.9pt);
\draw[fill] (2.1,0.9) circle (.9pt);
\draw[thin,->] (3.3,0.1)--(3.3,.52);
\draw[thin] (3.3,0.5)--(3.3,.9);
\draw[fill] (3.3,.1) circle (.9pt);
\draw[fill] (3.3,0.9) circle (.9pt);
\draw[thin,->] (4.4,0.1)--(4.4,.52);
\draw[thin] (4.4,0.5)--(4.4,.9);
\draw[fill] (4.4,.1) circle (.9pt);
\draw[fill] (4.4,0.9) circle (.9pt);
\begin{scope}[shift={(0,1.05)}]
\draw[thin,->] (0,0.1)--(0,.52);
\draw[thin] (0,0.5)--(0,.9);
\draw[fill] (0,.1) circle (.9pt);
\draw[fill] (0,0.9) circle (.9pt);
\draw[thin,->] (1.1,0.1)--(1.1,.52);
\draw[thin] (1.1,0.5)--(1.1,.9);
\draw[fill] (1.1,.1) circle (.9pt);
\draw[fill] (1.1,0.9) circle (.9pt);
\draw[thin,->] (2.1,0.1)--(2.1,.52);
\draw[thin] (2.1,0.5)--(2.1,.9);
\draw[fill] (2.1,.1) circle (.9pt);
\draw[fill] (2.1,0.9) circle (.9pt);
\draw[thin,->] (3.3,0.1)--(3.3,.52);
\draw[thin] (3.3,0.5)--(3.3,.9);
\draw[fill] (3.3,.1) circle (.9pt);
\draw[fill] (3.3,0.9) circle (.9pt);
\draw[thin,->] (4.4,0.1)--(4.4,.52);
\draw[thin] (4.4,0.5)--(4.4,.9);
\draw[fill] (4.4,.1) circle (.9pt);
\draw[fill] (4.4,0.9) circle (.9pt);
\end{scope}
\draw[dashed,thin] (.5,2.4)--(0.5,2.8);
\draw[dashed, thin] (1.5,2.4)--(1.5,2.8);
\draw[dashed, thin] (3.5,2.4)--(3.5,2.8);
\begin{scope}[shift={(0,3.15)}]
\draw[thin,->] (0,0.1)--(0,.52);
\draw[thin] (0,0.5)--(0,.9);
\draw[fill] (0,.1) circle (.9pt);
\draw[fill] (0,0.9) circle (.9pt);
\draw[thin,->] (1.1,0.1)--(1.1,.52);
\draw[thin] (1.1,0.5)--(1.1,.9);
\draw[fill] (1.1,.1) circle (.9pt);
\draw[fill] (1.1,0.9) circle (.9pt);
\draw[thin,->] (2.1,0.1)--(2.1,.52);
\draw[thin] (2.1,0.5)--(2.1,.9);
\draw[fill] (2.1,.1) circle (.9pt);
\draw[fill] (2.1,0.9) circle (.9pt);
\draw[thin,->] (3.3,0.1)--(3.3,.52);
\draw[thin] (3.3,0.5)--(3.3,.9);
\draw[fill] (3.3,.1) circle (.9pt);
\draw[fill] (3.3,0.9) circle (.9pt);
\draw[thin,->] (4.4,0.1)--(4.4,.52);
\draw[thin] (4.4,0.5)--(4.4,.9);
\draw[fill] (4.4,.1) circle (.9pt);
\draw[fill] (4.4,0.9) circle (.9pt);
\end{scope}
\draw[thin,->] (5.2,1.)--(5.8,1.);
\draw[thin,->] (5.2,1.)--(5.2,1.6);
\node[right] at ( 5.8,1) {$\hat x$};
\node[above] at ( 5.2,1.6) {$\hat y$};
\end{tikzpicture}}
\caption{Kogut-Susskind Link Formulation}
\label{abcd}
\end{center}
\end{subfigure}
\begin{subfigure}[b]{.5 \textwidth}
\begin{center}
{\begin{tikzpicture}[scale=1.40]
\node[below] (z) at (0,0){$\scriptstyle (0,\;0)$};
\node[below] (z) at (4.6,0){$\scriptstyle (N,\; 0)$};
\node[below] (z) at (0.3,4.8){$\scriptstyle (0,\; N)$};
\draw[thin,->] (0.1,0)--(.52,0);
\draw[thin] (0.5,0)--(1,0);
\draw[fill] (.1,0) circle (.9pt);
\draw[fill] (1,0) circle (.9pt);
\draw[thin,->] (1.2,0)--(1.52,0);
\draw[thin] (1.5,0)--(2,0);
\draw[fill] (1.2,0) circle (.9pt);
\draw[fill] (2,0) circle (.9pt);
\draw[thin,->] (3.4,0)--(3.7,0);
\draw[thin] (3.7,0)--(4.3,0);
\draw[fill] (3.4,0) circle (.9pt);
\draw[fill] (4.3,0) circle (.9pt);
\draw[thin,->] (4.4,0.1)--(4.4,0.52);
\draw[thin] (4.4,0.5)--(4.4,1);
\draw[fill] (4.4,0.1) circle (.9pt);
\draw[fill] (4.4,1) circle (.9pt);
\draw[thin,->] (4.4,1.2)--(4.4,1.62);
\draw[thin] (4.4,1.6)--(4.4,2.1);
\draw[fill] (4.4,1.2) circle (.9pt);
\draw[fill] (4.4,2.1) circle (.9pt);
\draw[thin,->] (4.4,3.4)--(4.4,3.82);
\draw[thin] (4.4,3.8)--(4.4,4.3);
\draw[fill] (4.4,3.4) circle (.9pt);
\draw[fill] (4.4,4.3) circle (.9pt);
\draw[thin,->] (0,0.1)--(0,0.54);
\draw[thin] (0,0.1)--(0,1);
\draw[fill] (0,.1) circle (.9pt);
\draw[fill] (0,1) circle (.9pt);
\draw[thin,->] (0.15,0.2)--(.15,0.52);
\draw[thin] (0.15,.5)--(.15,.95);
\draw[fill] (.15,.2) circle (.9pt);
\draw[thin,->] (0.15,0.95)--(.54,0.95);
\draw[thin] (0.5,.95)--(.95,.95);
\draw[thin,->] (0.95,0.95)--(.95,0.56);
\draw[thin] (0.95,.65)--(.95,.1);
\draw[thin,->] (0.95,0.1)--(.5,0.1);
\draw[thin] (0.5,.1)--(.2,.1);
\draw[fill] (.2,0.1) circle (.9pt);
\begin{scope}[shift={(1.1,0)}]
\draw[thin,->] (0,0.1)--(0,0.54);
\draw[thin] (0,0.1)--(0,1);
\draw[fill] (0,.1) circle (.9pt);
\draw[fill] (0,1) circle (.9pt);
\draw[thin,->] (0.15,0.2)--(.15,0.52);
\draw[thin] (0.15,.5)--(.15,.95);
\draw[fill] (.15,.2) circle (.9pt);
\draw[thin,->] (0.15,0.95)--(.54,0.95);
\draw[thin] (0.5,.95)--(.95,.95);
\draw[thin,->] (0.95,0.95)--(.95,0.56);
\draw[thin] (0.95,.65)--(.95,.1);
\draw[thin,->] (0.95,0.1)--(.5,0.1);
\draw[thin] (0.5,.1)--(.2,.1);
\draw[fill] (.2,0.1) circle (.9pt);
\end{scope}
\begin{scope}[shift={(3.3,0)}]
\draw[thin,->] (0,0.1)--(0,0.54);
\draw[thin] (0,0.1)--(0,1);
\draw[fill] (0,.1) circle (.9pt);
\draw[fill] (0,1) circle (.9pt);
\draw[thin,->] (0.15,0.2)--(.15,0.52);
\draw[thin] (0.15,.5)--(.15,.95);
\draw[fill] (.15,.2) circle (.9pt);
\draw[thin,->] (0.15,0.95)--(.54,0.95);
\draw[thin] (0.5,.95)--(.95,.95);
\draw[thin,->] (0.95,0.95)--(.95,0.56);
\draw[thin] (0.95,.65)--(.95,.1);
\draw[thin,->] (0.95,0.1)--(.5,0.1);
\draw[thin] (0.5,.1)--(.2,.1);
\draw[fill] (.2,0.1) circle (.9pt);
\end{scope}
\begin{scope}[shift={(0,1.1)}]
\draw[thin,->] (0,0.1)--(0,0.54);
\draw[thin] (0,0.1)--(0,1);
\draw[fill] (0,.1) circle (.9pt);
\draw[fill] (0,1) circle (.9pt);
\draw[thin,->] (0.15,0.2)--(.15,0.52);
\draw[thin] (0.15,.5)--(.15,.95);
\draw[fill] (.15,.2) circle (.9pt);
\draw[thin,->] (0.15,0.95)--(.54,0.95);
\draw[thin] (0.5,.95)--(.95,.95);
\draw[thin,->] (0.95,0.95)--(.95,0.56);
\draw[thin] (0.95,.65)--(.95,.1);
\draw[thin,->] (0.95,0.1)--(.5,0.1);
\draw[thin] (0.5,.1)--(.2,.1);
\draw[fill] (.2,0.1) circle (.9pt);
\end{scope}
\begin{scope}[shift={(1.1,1.1)}]
\draw[thin,->] (0,0.1)--(0,0.54);
\draw[thin] (0,0.1)--(0,1);
\draw[fill] (0,.1) circle (.9pt);
\draw[fill] (0,1) circle (.9pt);
\draw[thin,->] (0.15,0.2)--(.15,0.52);
\draw[thin] (0.15,.5)--(.15,.95);
\draw[fill] (.15,.2) circle (.9pt);
\draw[thin,->] (0.15,0.95)--(.54,0.95);
\draw[thin] (0.5,.95)--(.95,.95);
\draw[thin,->] (0.95,0.95)--(.95,0.56);
\draw[thin] (0.95,.65)--(.95,.1);
\draw[thin,->] (0.95,0.1)--(.5,0.1);
\draw[thin] (0.5,.1)--(.2,.1);
\draw[fill] (.2,0.1) circle (.9pt);
\end{scope}
\begin{scope}[shift={(3.3,1.1)}]
\draw[thin,->] (0,0.1)--(0,0.54);
\draw[thin] (0,0.1)--(0,1);
\draw[fill] (0,.1) circle (.9pt);
\draw[fill] (0,1) circle (.9pt);
\draw[thin,->] (0.15,0.2)--(.15,0.52);
\draw[thin] (0.15,.5)--(.15,.95);
\draw[fill] (.15,.2) circle (.9pt);
\draw[thin,->] (0.15,0.95)--(.54,0.95);
\draw[thin] (0.5,.95)--(.95,.95);
\draw[thin,->] (0.95,0.95)--(.95,0.56);
\draw[thin] (0.95,.65)--(.95,.1);
\draw[thin,->] (0.95,0.1)--(.5,0.1);
\draw[thin] (0.5,.1)--(.2,.1);
\draw[fill] (.2,0.1) circle (.9pt);
\end{scope}
\begin{scope}[shift={(0,3.3)}]
\draw[thin,->] (0,0.1)--(0,0.54);
\draw[thin] (0,0.1)--(0,1);
\draw[fill] (0,.1) circle (.9pt);
\draw[fill] (0,1) circle (.9pt);
\draw[thin,->] (0.15,0.2)--(.15,0.52);
\draw[thin] (0.15,.5)--(.15,.95);
\draw[fill] (.15,.2) circle (.9pt);
\draw[thin,->] (0.15,0.95)--(.54,0.95);
\draw[thin] (0.5,.95)--(.95,.95);
\draw[thin,->] (0.95,0.95)--(.95,0.56);
\draw[thin] (0.95,.65)--(.95,.1);
\draw[thin,->] (0.95,0.1)--(.5,0.1);
\draw[thin] (0.5,.1)--(.2,.1);
\draw[fill] (.2,0.1) circle (.9pt);
\end{scope}
\begin{scope}[shift={(1.1,3.3)}]
\draw[thin,->] (0,0.1)--(0,0.54);
\draw[thin] (0,0.1)--(0,1);
\draw[fill] (0,.1) circle (.9pt);
\draw[fill] (0,1) circle (.9pt);
\draw[thin,->] (0.15,0.2)--(.15,0.52);
\draw[thin] (0.15,.5)--(.15,.95);
\draw[fill] (.15,.2) circle (.9pt);
\draw[thin,->] (0.15,0.95)--(.54,0.95);
\draw[thin] (0.5,.95)--(.95,.95);
\draw[thin,->] (0.95,0.95)--(.95,0.56);
\draw[thin] (0.95,.65)--(.95,.1);
\draw[thin,->] (0.95,0.1)--(.5,0.1);
\draw[thin] (0.5,.1)--(.2,.1);
\draw[fill] (.2,0.1) circle (.9pt);
\end{scope}
\begin{scope}[shift={(3.3,3.3)}]
\draw[thin,->] (0,0.1)--(0,0.54);
\draw[thin] (0,0.1)--(0,1);
\draw[fill] (0,.1) circle (.9pt);
\draw[fill] (0,1) circle (.9pt);
\draw[thin,->] (0.15,0.2)--(.15,0.52);
\draw[thin] (0.15,.5)--(.15,.95);
\draw[fill] (.15,.2) circle (.9pt);
\draw[thin,->] (0.15,0.95)--(.54,0.95);
\draw[thin] (0.5,.95)--(.95,.95);
\draw[thin,->] (0.95,0.95)--(.95,0.56);
\draw[thin] (0.95,.65)--(.95,.1);
\draw[thin,->] (0.95,0.1)--(.5,0.1);
\draw[thin] (0.5,.1)--(.2,.1);
\draw[fill] (.2,0.1) circle (.9pt);
\end{scope}
\draw[thin,dashed] (2.4,0.5)--(3,0.5);
\draw[thin,dashed] (2.4,1.5)--(3,1.5);
\draw[thin,dashed] (2.4,3.5)--(3,3.5);
\draw[thin,dashed] (.5,2.6)--(.5,3);
\draw[thin,dashed] (1.5,2.6)--(1.5,3);
\draw[thin,dashed] (3.5,2.6)--(3.5,3);
\draw[ultra thick,gray,opacity=.3] (0.1,1.05)--(1.,1.05);
\draw[ultra thick,gray,opacity=.3] (1.2,1.05)--(2.1,1.05);
\draw[ultra thick,gray,opacity=.3] (3.4,1.05)--(4.3,1.05);
\begin{scope}[shift={(0,1.1)}]
\draw[ultra thick,gray,opacity=.3] (0.1,1.05)--(1.,1.05);
\draw[ultra thick,gray,opacity=.3] (1.2,1.05)--(2.1,1.05);
\draw[ultra thick,gray,opacity=.3] (3.4,1.05)--(4.3,1.05);
\end{scope}
\begin{scope}[shift={(0,2.25)}]
\draw[ultra thick,gray,opacity=.3] (0.1,1.05)--(1.,1.05);
\draw[ultra thick,gray,opacity=.3] (1.2,1.05)--(2.1,1.05);
\draw[ultra thick,gray,opacity=.3] (3.4,1.05)--(4.3,1.05);
\end{scope}
\begin{scope}[shift={(0,3.3)}]
\draw[ultra thick,gray,opacity=.3] (0.1,1.05)--(1.,1.05);
\draw[ultra thick,gray,opacity=.3] (1.2,1.05)--(2.1,1.05);
\draw[ultra thick,gray,opacity=.3] (3.4,1.05)--(4.3,1.05);
\end{scope}
\end{tikzpicture}}
 \caption{Loop and String Formulation}
\label{efgh}
\end{center}
\end{subfigure}
\caption{The final configurations: $N^2$ plaquette loop holonomies, $N(N+1)$ vertical link holonomies and $N$ horizontal links holonomies at $y=0$. The light gray horizontal links have been converted into plaquettes. The total number  of new configurations ($=N^2+N(N+1)+N = 2N(N+1)$ ) in (b) matches with the total number of initial link configurations in (a).}
	\end{figure}\label{lattice}
In this paper, using Hamiltonian approach in $(2+1)$ dimensions, we illustrate how to evade the above
difficulties and transit from the original Kogut-Susskind (K-S)  electric field description \cite{kogsus} to the the dual magnetic field description keeping the interactions simple as well as local. Unlike previous approaches, the SU(N) Gauss laws are not solved. Instead, we define SU(N)  magnetic fields with their conjugate dual electric scalar potentials \cite{man1} by making a series of iterative canonical transformations on the original electric fields
and their conjugate potential variables \cite{nonlocal}. These canonical transformations are designed to produce plaquette loop holonomies (physical magnetic fields) by gluing together it's 4 link holonomies (gluons). This framework is  pictorially illustrated in Figure \ref{lattice}. As expected, this gluing process, converting horizontal links into plaquettes loops, repeated over the entire lattice produces non-local (loop-loop) interactions.
In this work we show that this non-locality can be easily removed by introducing certain auxiliary SU(N) gauge fields\footnote{These auxiliary gauge fields or lattice link operators are in x direction and do not have any dynamics associated with them.} which are defined by  local constraints on each plaquette. The final dual dynamics picture is easy to understand and interpret as follows (see Figure {\ref{fintt}): In $(2+1)$ dimensions there are $(N^2-1)$ scalar physical magnetic degrees of freedom interacting with equal number of their conjugate scalar dual potential degrees of freedom. As mentioned above, their bare interactions
in the physical Hilbert space ${\cal H}^{\text{phys}}$ are highly complex and non-local \cite{nonlocal}.
However, in the larger Hilbert space ${\cal H} \supset{\cal H}^{\text{phys}}$, with independent SU(N) gauge fields, the $(N^2-1)$ dual   electric potential degrees of freedom, describing loops, behave like charged matter fields and couple to the above SU(N) gauge fields via minimal coupling. In other words,  loop-loop interactions are now described by simple minimal couplings.
They are the dual description of the K-S non-interacting pure electric field $E^2$ terms. On the other hand,   the ${1/ g^2}$ K-S magnetic field  terms,  describing interactions
of 4 links over a plaquette, become non-interacting pure magnetic field terms
 in the dual description\footnote{Note that a
 similar but much more simplified situation arises in  $2+1$ dimensional compact electrodynamics. The abelian duality is performed by solving the Gauss law: $\partial_x E_x(x,y) + \partial_y E_y(x,y)  =0$ in terms of the dual electric scalar potentials
 ${\cal E}$ by writing $E_x \equiv \partial_y {\cal E}$ and $E_y \equiv -\partial_x {\cal E}$. After duality  the magnetic fields $B(=\partial_xA_y-\partial_yA_x)$ and ${\cal E}$ are the conjugate operators appearing in the Hamiltonian after duality transformations . In the present non-abelian case, the simple derivatives above become the covariant derivatives on lattice (as illustrated
  in Figures \ref{mincoup}, \ref{fintt}).
}.  They now create and annihilate  single  (fundamental)  plaquette  loops.
Thus under duality $g^2 \rightarrow { 1/{g^2}}$, as expected.

The focus in this work is on duality transformations in $(2+1)$ dimensions. We  briefly discuss their  extension to $(3+1)$ dimensions at the end.
We stick to the lattice gauge theory notations used in \cite{nonlocal} and will explicitly state if there is any change.
The lattice sites and links will be  denoted by $\vec n=(x,y)$ and $(\vec n;~\hat i~)$ respectively with $x,y= 0,1,2, \cdots ,N$ and $i=1,2$. There are ${\cal N}= (N+1)^2$ sites, ${\cal L} = 2N(N+ 1)$ links and ${\cal P} =N^2$ plaquettes.
	\begin{figure}
	\begin{subfigure}[b]{.5\textwidth}
 	\begin{tikzpicture}[scale=1.3]

 	\draw[ultra thick,->] (0.,-0.1)--(1,-0.1);
        \draw[ultra thick](1,-0.1)--(2,-0.1);
        \draw[fill,gray] (0,-0.1) circle (2pt);
 	\draw[ultra thick,->] (-2.3,-0.1)--(-1.3,-0.1);
        \draw[ultra thick](-1.3,-0.1)--(-.4,-0.1);
        \draw[fill,gray] (-0.4,-.1) circle (2pt);
\node[below]at(-.6,-.1){$\scriptstyle(x,y)$}(-.2,-0.2);
\node[above]at(.8,-.10){$ {E}^a_{+}(x,y; \hat{1})$};
\draw[ultra thick,->](-.2,0.1)--(-.2,1);
\draw[ultra thick](-.2,1)--(-.2,2);
\draw[fill,gray] (-.2,0.1) circle (2pt);
\draw[ultra thick,->](-.2,-2)--(-.2,-1);
\draw[ultra thick](-.2,-1)--(-.2,-.2);
\draw[fill,gray] (-.2,-.2) circle (2pt);
\path[](-.10,0.3)--node[below,sloped]{$ {E}^a_+(x,y; \hat{2})$}(.-0.1,2.3);
\path[](-1.9,-0.)--node[above,sloped]{${E}^a_{-}(x,y;  \hat 1)$}(-.45,-.0);
\path[](-.15,-2.10)--node[below,sloped]{$ {E}^a_{-}(x,y;\hat {2})$}(-.15,.0);
\path[](-2.5,-2.30)--node[below,sloped]{$\sum_{i=1,2}[{E}^a_{-}(x,y; \hat{i}~)+{E}^a_{+}(x,y;\hat{i}~)]=\;0$}(2.5,-2.30);
	\end{tikzpicture}
\caption{Kogut-Susskind formulation}
	\end{subfigure}
\hspace{-1.cm}
\begin{subfigure}[b]{.5\textwidth}
 	\begin{tikzpicture}[scale=1.3]

 \begin{scope}[shift={(0,-.2)}]
 	\draw[ultra thick] (0.1,0)--(1,0);
        \draw[ultra thick,<-](1,0)--(2.2,0);
         \draw[ultra thick,->] (0.1,2.2)--(1,2.2);
        \draw[ultra thick](1,2.2)--(2.2,2.2);
        \draw[ultra thick,->] (0.1,0.3)--(0.1,1);
        \draw[ultra thick](0.1,1)--(0.1,2.2);
        \draw[ultra thick] (2.2,0.)--(2.2,1);
        \draw[ultra thick,<-](2.2,1)--(2.2,2.2);
        \draw[fill,gray] (0.1,0.3) circle (2pt);
        \draw[fill,gray] (0.14,0) circle (2pt);
\node[below]at(-.6,.1){$\scriptstyle(x,y)$}(-.2,0.1);
\node[above]at(1.0,0){$ \mathcal{E}^a_{-}(x,y)$};
\path[](.1,0)--node[below,sloped]{$ \mathcal{E}^a_+(x,y)$}(.1,2.);
\end{scope}
\draw[ultra thick,->](-.2,0.1)--(-.2,1);
\draw[ultra thick](-.2,1)--(-.2,2);
\draw[fill,gray] (-.2,0.1) circle (2pt);
\draw[ultra thick,->](-.2,-2)--(-.2,-1);
\draw[ultra thick](-.2,-1)--(-.2,-.2);
\draw[fill,gray] (-.2,-.2) circle (2pt);
\path[](-.2,0)--node[above,sloped]{$ {F}^a_{Y-}(x,y)$}(-.2,1.6);
\path[](-.15,-1.90)--node[below,sloped]{$ {F}^a_{Y+}(x,y)$}(-.15,-.20);
\path[](-3,-2.30)--node[below,sloped]{$  \mathcal{E}^a_{-}(x,y)+\mathcal{E}^a_{+}(x,y)+{F}^a_{Y+}(x,y)+{F}^a_{Y-}(x,y)=\;0$}(3,-2.30);
	\end{tikzpicture}
\caption{Dual formulation}
	\end{subfigure}
\caption{Gauss laws in the new formulation.}
\end{figure}
\section{The Hamiltonian Dynamics}
\label{secham}
The Hamiltonian of SU(N) lattice gauge theory is \cite{kogsus}:
\bea
\label{ham}
H =  H_E + H_M = {g^2}\sum_{n,~i}\sum_{  a=1}^{\text{N}^2-1}E^a(\vec n;~\hat i~)E^{  a}(\vec n;~\hat i~)
+ {K \over {g^2}} \sum_{\mbox{p}} \text{Tr} \left(2- \left(U_{\mbox{p}} + U^{\dagger}_{\mbox{p}}\right)\right),
\label{ham}
\eea
where $g^2$ is the coupling and K is a constant. The plaquette operator $U_p$ at site $n$ and $(i,j)$ plane is defined as,
$U_{\mbox{p}}=U(n;i)U(n+i;j)U^{\dagger}(n+j;i)U^{\dagger}(n;j).$
This is the electric field description  with the conjugate pairs $(E^a(n,i),U(n,i))$ satisfying:
\bea
\label{com_EU}
[E^{  a}_+(\vec n;~\hat i~),~U_{\alpha\beta}(\vec n;~\hat i~)]=-( T^{ a}U(\vec n;~\hat i~))_{\alpha\beta}, ~~~~[E^{  a}_-(\vec n+\hat i;~\hat i~),U_{\alpha\beta}(\vec n;\hat i~)]=(U(\vec n;~\hat i~)T^{  a})_{\alpha\beta}.
\label{comrel1}
\eea
In (\ref{comrel1})  $T^{  a}$ are the generators of fundamental representation of SU(N). The left and right electric fields $E_\pm^a(\vec n;~\hat i~)$ commute with each other and individually satisfy SU(N) Lie algebra. We will often use the matrix notation $E_\pm \equiv E^a_\pm T^a$.
The right electric field  $E^a_-(\vec n+\hat i;\hat i~)$ rotating the link operator from the right in (\ref{comrel1}) are obtained  by the parallel transports along the link $(\vec n,~\hat i~)$:
\bea
E_-(\vec n+\hat i;~\hat i~) = -U^\dagger (\vec n;~\hat i~)~ E_+(\vec n;~\hat i~)~ U(\vec n;~\hat i~).
\label{lrrel}
\eea
 Note that $ (E_+(\vec n;~\hat i~))^2 = ( E_-(\vec n+\hat i;~\hat i~))^2$. The SU(N) Gauss laws at the lattice site $n$ are \cite{nonlocal}
\bea
\label{sun_gauss}
{\cal G}^a(n) \equiv \sum_{i=1}^{2}\left( E_+^{  a}(n;~\hat i~)+E_-^{  a}(n;~\hat i~) \right)=0, ~~\forall~ n.
\label{ogl}
\eea

\section{Canonical Transformations}
\label{seccantra}
We briefly illustrate the canonical transformations which glue two independent holonomies on two lattice links into two new independent holonomies. We start with the two conjugate pairs:
$\left(E^a_\pm(1),U_{\alpha\beta}(1)\right)$ and $\left(E^a(2)_\pm,U_{\alpha\beta}(2)\right)$. We join them together to define $\left(E^a_\pm(12),U_{\alpha\beta}(12)\right)$ and
$\left(\bar E^a(2),\bar U_{\alpha\beta}(2)\right)$ as shown in Figure \ref{cantransb}. As is clear from this Figure the canonical relations between new and old conjugate operators are
\begin{align}
U_{\alpha\beta}(12) \equiv &~\left(U(1)~ U(2)\right)_{\alpha\beta}, ~~~~~~
E^a_-(12) =  E^a_-(1),  \nonumber \\
\bar  U_{\alpha\beta}(2) \equiv & ~U_{\alpha\beta}(2), ~~~~~~~~~~~~~~~~~~\bar E^a_-(2) =  E^a_+(1) + E^a_-(2).
\label{cantra}
\end{align}
Thus  $U(1)$ is (canonically) converted into $U(12)$.
The above simple canonical transformations are used
to convert all horizontal links at $y \neq 0$ into  local plaquettes. As the process is iterated thrice over each plaquette and is repeated
over the entire lattice\footnote{Each plaquette construction requires 3 canonical transformations. Therefore we need make $3N^2$  canonical transformations to $N^2$ independent plaquettes.},  it is important to collect and summarise all the important and interesting
features of (\ref{cantra}):
\begin{figure}[t]
\begin{center}
        \begin{tikzpicture}[scale=1.0]

        \draw[ultra thick,->] (0,0)--(1.5,0);
        \draw[ultra thick](1.5,0)--(3,0);
        \draw[fill,gray] (0,0) circle (3.5pt);
        \draw[fill,gray] (3,0) circle (3.5pt);
\path[] (1,-.05)--node[below,sloped]{$U_{\alpha\beta}(1)$}(1.5,-.05);
\path[] (-.5,0)--node[above,sloped]{${E}^a_{-}(1)$}(.5,0);
\path[] (1,0)--node[above,sloped]{${E}^a_{+}(1)$}(3.5,0);
\begin{scope}[shift={(3.7,0)}]
        \draw[ultra thick,->] (0,0)--(1.5,0);
        \draw[ultra thick](1.5,0)--(3,0);
        \draw[fill,black,rotate=45] (-.11,-.11) rectangle (0.11,0.11);
\path[] (1,-.05)--node[below,sloped]{$U_{\gamma\delta}(2)$}(1.5,-.05);
\path[] (.2,0)--node[above,sloped]{${E}^a_{-}(2)$}(1.,0);
\path[] (1,0)--node[above,sloped]{${E}^a_{+}(2)$}(3.5,0);
\end{scope}
\begin{scope}[shift={(6.7,0)}]

        \draw[fill,black,rotate=45] (-.11,-.11) rectangle (0.11,0.11);
\end{scope}
\path[] (3,0)--node[above,sloped]{$\longrightarrow$}(3,-2.);
\path[] (1,-1.3)--node[above,sloped]{C. T.}(7,-1.3);
 \begin{scope}[shift={(0,-2.)}]
        \draw[ultra thick,->] (0,0)--(3.5,0);
        \draw[ultra thick](3.45,0)--(6.7,0);
        \draw[fill,gray] (0,0) circle (3.5pt);
\path[] (1,-.05)--node[below,sloped]{$U_{\alpha\beta}(12)=(U(1)U(2))_{\alpha\beta}$}(3.5,-.05);
\path[] (-.5,0)--node[above,sloped]{${E}^a_{-}(12)={E}^a_{-}(1)$}(3.5,0);
\end{scope}
\begin{scope}[shift={(3.7,-4.)}]
        \draw[ultra thick,->] (0,0)--(1.5,0);
        \draw[ultra thick](1.5,0)--(3,0);
        \draw[fill,gray] (0,0) circle (3.5pt);
\path[] (1,-.05)--node[below,sloped]{$\bar{U}(2)=U(2)$}(1.5,-.05);
\path[] (.2,0.1)--node[above,sloped]{$\bar{E}^a_{-}(2)={E}^a_{+}(1)+{E}^a_{-}(2)$}(1.,0.1);
\begin{scope}[shift={(.5,0)}]
        \draw[fill,black,rotate=45] (-.11,-.11) rectangle (0.11,0.11);
\end{scope}
\end{scope}
\end{tikzpicture}
\end{center}
\caption{Gluing two SU(N) holonomies using canonical transformations.}\label{cantransb}
\end{figure}

\begin{itemize}
\item Each of the two new  conjugate pairs $\left(E^a_\pm(12),~U_{\alpha\beta}(12)\right)$ and $\left(\bar E^a(2),~\bar U_{\alpha\beta}(2)\right)$ follow the canonical commutation relations (\ref{comrel1}). They also commute with each other and therefore completely independent as the initial  pairs.
\item The electric fields of the link  which disappears ($E_\pm(1)$  in Figure \ref{cantransb})  appears in both the final electric fields. This aspect is clearly shown in Figure \ref{cantransb} and will be important to write down the final duality relations.
\item Given the left electric fields in (\ref{cantra}), the right electric fields get fixed by the parallel transport along the new links $E^a_+(12) =- R^a_b(U(12)) ~E^b_-(12)$ and
$\bar E^a_+(2) = -R^a_b(\bar U(2))~ \bar E^b_-(2)$.
The new left and right electric fields also satisfy the SU(N) Lie algebra, they commute with each other and their magnitudes are equal.
\end{itemize}

\begin{figure}[t]
\hspace{-1.cm}
\begin{subfigure}[hbt!]{.31\textwidth}
\begin{center}
 	\begin{tikzpicture}[scale=1.2]

 	\draw[ultra thick] (0.1,0)--(1,0);
        \draw[ultra thick,<-](1,0)--(2,0);
         \draw[ultra thick,->] (0.,2)--(1,2);
        \draw[ultra thick](1,2)--(2,2);
        \draw[ultra thick,->] (0,0.16)--(0,1);
        \draw[ultra thick](0,1)--(0,2);
        \draw[ultra thick,->] (2,2)--(2,1);
        \draw[ultra thick](2,1)--(2,0);
        \draw[fill,gray] (0,0.16) circle (2.pt);
        \draw[fill,gray] (0.14,0) circle (2.pt);
 \path[] (-1.7,0.1)--node[below,sloped]{$(x,y)$}(.8,0.1);
\path[] (0.1,.8)--node[above,sloped]{$ \mathcal{W}(x,y)$}(1.9,.8);
\path[] (0.2,-0.1)--node[below,sloped]{$ \mathcal{E}^a_{-}(x,y)$}(1.,-0.1);
\path[] (-0.1,0.4)--node[above,sloped]{$ \mathcal{E}^a_{+}(x,y)$}(-0.1,1.4);
	\end{tikzpicture}
\end{center}
\caption{Plaquette}\label{loops}
	\end{subfigure}
\begin{subfigure}[hbt!]{.31\textwidth}
\begin{center}
 	\begin{tikzpicture}[scale=1.2]

        \draw[ultra thick,->] (0,0.06)--(0,1);
        \draw[ultra thick](0,1)--(0,2);
        \draw[fill,gray] (0,0.06) circle (2.pt);
       \draw[fill,gray] (0,2) circle (2.pt);
 \path[] (-1.7,0.1)--node[below,sloped]{$(x,y)$}(.8,0.1);
\path[] (0.1,.8)--node[above,sloped,rotate=0]{$ V_Y(x,y)$}(1.7,.8);
\path[] (0.2,0.1)--node[below,sloped]{$ {F}^a_{Y+}(x,y)$}(1.8,0.1);
\path[] (0.2,1.8)--node[sloped]{$ {F}^a_{Y-}(x,y+1)$}(2.4,1.8);
	\end{tikzpicture}
\end{center}
\vspace{.2cm}
\caption{Vertical Strings}
	\label{vstrings}
	\end{subfigure}
\hspace{.8cm}
\begin{subfigure}[hbt!]{.31\textwidth}
\begin{center}
 	\begin{tikzpicture}[scale=1.20,shift={(0,0)}]

 	\draw[ultra thick,->] (0,0)--(1,0);
 	\draw[ultra thick](1,0)--(2,0);
 	\draw[fill,gray] (0,0) circle (2pt);
 	\draw[fill,gray] (2,0) circle (2pt);
\path[] (1,-.05)--node[below,sloped]{$ {V}_X(x,0)$}(1.5,-.05);
\path[] (-.5,0)--node[above,sloped]{$ {F}^a_{X+}(x,0)$}(.5,0);
\path[] (1,0)--node[above,sloped]{$ {F}^a_{X-}(x+1,0)$}(3.5,0);
\path[] (-1.2,-.05)--node[below,sloped]{$ (x,0)$}(1,-.05);
	\end{tikzpicture}
	\end{center}
	\vspace{1.8cm}
\caption{Horizontal Strings}
\label{hstrings}
\end{subfigure}
\caption{Final three types of holonomies obtained from the canonical transformations (\ref{cantra}). }
\end{figure}
\subsection*{Flux loops}

There are $N^2$ horizontal links and at $y > 0$. These
SU(N) link fluxes are shown by light grey lines in Figure
1. Using (\ref{cantra}) we canonically
transform them into plaquettes starting from the top
$(x,y=N)$ and joining the links clockwise as shown in
Figure \ref{efgh}.  At the end, when all $N^2$ horizontal links have been converted into $N^2$ plaquettes  we are left with (a) $N^2$ plaquette flux loops, (b) all $N(N+1)$ vertical flux strings and (c) $N$ horizontal  flux strings at $y=0$. These configurations
along with their left and right electric fields are shown in Figure \ref{loops}, \ref{vstrings}, \ref{hstrings}. The above $3N^2$ canonical transformations
finally  lead to the following canonical relations:
\begin{figure}[t]
\begin{subfigure}[b]{.5\textwidth}
\begin{center}
\begin{tikzpicture}[scale=.8]
\draw[ultra thick] (0.1,0)--(1,0);
\draw[ultra thick ,<-](1,0)--(2,0);
\draw[ultra thick,->] (0.,2)--(1,2);
\draw[ultra thick](1,2)--(2,2);
\draw[ultra thick,->] (0,0.16)--(0,1);
\draw[ultra thick](0,1)--(0,2);
\draw[ultra thick,->] (2,2)--(2,1);
\draw[ultra thick](2,1)--(2,0);
\draw[fill,gray] (0,0.2) circle (3pt);
\draw[fill,gray] (0.2,0) circle (3pt);
\path[] (0.,0.4)--node[below,sloped]{$\scriptstyle \mathcal{E}^a_{+}(x,\;y)$}(0.,1.4);
\draw[ultra thick,->] (0,2.6)--(1,2.6);
\draw[ultra thick] (1,2.6)--(2,2.6);
\draw[fill,gray] (2,2.6) circle (3pt);
   \draw[ultra thick,->] (0,4.6)--(1,4.6);
   \draw[ultra thick] (1,4.6)--(2,4.6);
   \draw[fill,gray] (2,4.6) circle (3pt);
   \begin{scope}[shift={(0,-1.5)}]
   \draw[ ultra thick,->] (0,8.6)--(1,8.6);
   \draw[ ultra thick] (1,8.6)--(2,8.6);
   \draw[fill,gray] (2,8.6) circle (3pt);
   \draw[ultra thick,->] (0,11.2)--(1,11.2);
   \draw[ultra thick] (1,11.2)--(2,11.2);
   \draw[fill,gray] (2,11.2) circle (3pt);
   \draw[ultra thick,dotted] (0.8,10.4)--(.8,10.8);
      \draw[ultra thick,dotted] (0.8,9.4)--(.8,9.8);
   \path[] (0.,8.6)--node[above,sloped]{$\scriptstyle {E}^a_{-}(x+1,\;y';\; \hat{1})$}(2,8.6);
   \path[](2.8,8.4)--node[above,sloped]{$\scriptstyle(x+1,\;y')$}(3.8,8.4);
\path[](-2.3,11.2)--node[sloped]{$\scriptstyle(x,\;N)$}(.5,11.2);
\path[] (0.4,10.35)--node[below,sloped]{$\approx$}(1.2,10.35);
   \end{scope}
\draw[ultra thick,gray,] (-.3,1.5)--(-.3,.15);
\draw[ultra thick,gray,->] (-.3,2.3)--(-.3,1.1);
\draw[ultra thick,gray] (1.4,2.3)--(-.3,2.3);
\draw[ultra thick,gray,->](2.4,2.3) --(1.2,2.3);
\draw[ultra thick,gray] (2.4,5.7)--(2.4,2.3);
\draw[ultra thick,gray,->] (2.4,7.15)--(2.4,5.6);
\path[] (2.4,0)--node[below,sloped]{$ \scriptstyle\mathcal{S}(x,\;y'\rightarrow y)$}(2.4,8.6);
 \path[](-1.6,0.2)--node[below,sloped]{$\scriptstyle(x,\;y)$}(.5,0.2);
   \draw[ultra thick,dotted] (0.8,6.2)--(.8,6.6);
      \draw[ultra thick,dotted] (0.8,5.2)--(.8,5.6);
        \end{tikzpicture}
\caption{Plaquette electric field}
\end{center}
\end{subfigure}
\begin{subfigure}[b]{.5\textwidth}\label{pelectric}
\begin{center}
\begin{tikzpicture}[scale=.8]
\begin{scope}[shift={(2.8,0.23)}]
\draw[ultra thick,->] (0,0.)--(0,1.1);
\draw[ultra thick](0,1)--(0,2.1);
\draw[fill,gray] (0,0.) circle (3pt);
\path[] (-1.4,-0.1)--node[below,sloped]{$\scriptstyle (x,\;y)$}(.0,-.1);
\path[] (0.,-0.1)--node[below,sloped]{$\scriptstyle \mathsf{F}^a_{Y+}(x,\;y)$}(1.5,-.1);
\end{scope}
\draw[ultra thick,->] (0,2.6)--(1,2.6);
\draw[ultra thick] (1,2.6)--(2,2.6);
\draw[fill,gray] (2,2.6) circle (3pt);
   \draw[ultra thick,->] (0,4.6)--(1,4.6);
   \draw[ultra thick] (1,4.6)--(2,4.6);
   \draw[fill,gray] (2,4.6) circle (3pt);
   \begin{scope}[shift={(0,-1.5)}]
   \draw[ ultra thick,->] (0,8.6)--(1,8.6);
   \draw[ ultra thick] (1,8.6)--(2,8.6);
   \draw[fill,gray] (2,8.6) circle (3pt);
   \draw[ultra thick,->] (0,11.2)--(1,11.2);
   \draw[ultra thick] (1,11.2)--(2,11.2);
   \draw[fill,gray] (2,11.2) circle (3pt);
   \draw[ultra thick,dotted] (0.8,10.4)--(.8,10.8);
      \draw[ultra thick,dotted] (0.8,9.4)--(.8,9.8);
   \path[] (-.5,8.6)--node[above,sloped]{$\scriptstyle {E}^a_{-}(x,\;y';\; \hat{1})$}(2,8.6);
   \path[](1,8.6)--node[above,sloped]{$\scriptstyle(x,\;y')$}(4,8.6);
\path[](-2.7,11.2)--node[sloped]{$\scriptstyle(x-1,\;N)$}(.5,11.2);
\path[] (0.4,10.35)--node[below,sloped]{$\approx$}(1.2,10.35);
   \end{scope}
\draw[ultra thick,gray] (2.4,3.1)--(2.4,0.15);
\draw[ultra thick,gray,->] (2.4,7.15)--(2.4,3.);
\path[] (2.4,1)--node[below,sloped]{$ \scriptstyle\mathcal{S'}(x,\;y'\rightarrow y)$}(2.4,8.6);
   \draw[ultra thick,dotted] (0.8,6.2)--(.8,6.6);
      \draw[ultra thick,dotted] (0.8,5.2)--(.8,5.6);
\begin{scope}[shift={(3.3,0)}]
\draw[ultra thick,->] (0,2.6)--(1,2.6);
\draw[ultra thick] (1,2.6)--(2,2.6);
\draw[fill,gray] (2,2.6) circle (3pt);
   \draw[ultra thick,->] (0,4.6)--(1,4.6);
   \draw[ultra thick] (1,4.6)--(2,4.6);
   \draw[fill,gray] (2,4.6) circle (3pt);
   \begin{scope}[shift={(0,-1.5)}]
   \draw[ ultra thick,->] (0,8.6)--(1,8.6);
   \draw[ ultra thick] (1,8.6)--(2,8.6);
   \draw[fill,gray] (2,8.6) circle (3pt);
   \draw[ultra thick,->] (0,11.2)--(1,11.2);
   \draw[ultra thick] (1,11.2)--(2,11.2);
   \draw[fill,gray] (2,11.2) circle (3pt);
   \draw[ultra thick,dotted] (0.8,10.4)--(.8,10.8);
      \draw[ultra thick,dotted] (0.8,9.4)--(.8,9.8);
   \path[] (0.,8.6)--node[above,sloped]{$\scriptstyle {E}^a_{-}(x+1,\;y';\; \hat{1})$}(3,8.6);.5,11.2);
\path[] (0.4,10.35)--node[below,sloped]{$\approx$}(1.2,10.35);
   \path[](2,8.2)--node[above,sloped]{$\scriptstyle(x+1,\;y')$}(5,8.2);
   \end{scope}
\draw[ultra thick,gray,] (-.1,1.5)--(-.1,.15);
\draw[ultra thick,gray,->] (-.1,2.3)--(-.1,1.4);
\draw[ultra thick,gray] (1.4,2.3)--(-0.1,2.3);
\draw[ultra thick,gray,->](2.4,2.3) --(1.2,2.3);
\draw[ultra thick,gray] (2.4,5.7)--(2.4,2.3);
\draw[ultra thick,gray,->] (2.4,7.15)--(2.4,5.6);
\path[] (2.4,0)--node[below,sloped]{$ \scriptstyle\mathcal{S}(x,\;y'\rightarrow y)$}(2.4,8.6);
   \draw[ultra thick,dotted] (0.8,6.2)--(.8,6.6);
      \draw[ultra thick,dotted] (0.8,5.2)--(.8,5.6);
      \end{scope}
        \end{tikzpicture}
\caption{String electric field}\label{telectric}
\end{center}
\end{subfigure}
\caption{{ SU(N) loop \& string electric fields  in terms of K-S electric fields (see (\ref{cr2}),  (\ref{cr4})). }}
\end{figure}
\begin{equation}
\mathcal{W}(x,y)=U(x,y;\hat 1)U(x+1,y;\hat 2)U^\dagger(x,y+1, \hat 1)U^\dagger(x,y;\hat 2).
\label{cr1}
\end{equation}
\begin{equation}\label{cr2}
{\cal E}_+(x,y)= -  \sum_{y'=y+1}^N
{\cal S}^\dagger(x+1,y'\rightarrow x,y) ~E_{-}(x+1,y';\hat1)~ {\cal S}(x+1,y'\rightarrow x,y).
\end{equation}
In (\ref{cr2}) we have defined the parallel transport matrix  operator
\bea
{\cal S}(x+1,y' \rightarrow x,y) \equiv
\prod_{j=y'-1}^{y+1} U^\dagger(x+1,j;\hat 2)~U^\dagger(x,y+1;\hat 1)~U^\dagger(x,y;\hat2).
\label{nlstrings}
\eea
The parallel transport operators  ${\cal S}(x+1,y' \rightarrow x,y)$ encode the cumulative effects of all
$3N^2$ canonical transformations over the entire lattice. They are necessary for SU(N) gauge covariance of (\ref{nlstrings}).

The right electric field ${\cal E}_-^a(x,y)$
can now be obtained as:
${\cal E}_-(x,y)=  -{\cal W}^\dagger(x,y) {\cal E}_+(x,y) {\cal W}(x,y).$

\subsection*{Flux strings}
We denote the final $N$ horizontal and $N(N+1)$ vertical strings by  $V_X(x,0)$ and $V_Y(x,y)$ respectively. Their  electric fields, denoted by  $\left( F_{X+}^a(x,0),F _{X-}^a(x+1,0)\right)$ and  $\left(F_{Y+}^a(x,y), F_{Y-}^a(x,y+1)\right)$  are shown in Figure \ref{vstrings},  \ref{hstrings} respectively.
The canonical relations with the old K-S fields are
\begin{align}
V_Y(x,~y)=&\; U(x,y;\hat 2), ~~~~~~V_X(x,y=0)=U(x,0;\hat 1).
\label{cr3} \\
{F}_{Y+}(x,y)
=&\;E_{+}(x,y;\hat 2)-\sum_{y'=y+1}^{N} \big[{\cal S}^\dagger(x+1,y'\rightarrow x,y)~
E_-(x+1,y';\hat 1)~{\cal S}
(x+1,y'\rightarrow x,y)
\nonumber \\
&~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ {\cal S}'^\dagger(x;y'\rightarrow y)~E_-(x,y';\hat 1)~{\cal S}'(x;y'\rightarrow y)\big].
\label{cr4}\\
{F}_{X-}(x,0)=&-\sum_{y'=0}^N {\cal S}'^\dagger(x;y'\rightarrow 0)~ E_-(x,y';\hat 1) ~{\cal S}'(x;y'\rightarrow 0)
\label{cr5}
\end{align}
The parallel transport  ${\cal S}$ in (\ref{cr4})
is defined in (\ref{nlstrings}). As before, the vertical
parallel  transports
${\cal S}'(x;y' \rightarrow y) \left( = \prod_{j=y'-1}^{y}U^\dagger(x,y'';\hat2) \right)$
are essential for gauge covariance and ${\cal S}'(x,0\rightarrow 0) =1$.

\begin{figure}[t]
\hspace{-1. cm}
\begin{subfigure}[b]{.5\textwidth
\begin{center}
        \begin{tikzpicture}[scale=1.3]
\draw[fill,gray](0.15,0) circle(2pt);
\draw[ultra thick,->] (0,0.15)--(0,1);
\draw[ultra thick] (0,1)--(0,2);
\draw[ultra thick,->] (0,2)--(.7,2);
\draw[ultra thick] (.65,2)--(2,2);
\draw[ultra thick,->] (2,2)--(2,1);
\draw[ultra thick] (2,1)--(2,0);
\draw[ultra thick,->] (2,0)--(1.,0);
\draw[ultra thick] (1,0)--(.2,0);
\draw[fill,gray](0,.15) circle(2pt);
\draw[fill,gray](1,1) circle(3pt);
\node[below] at (1,1) {$ \mathcal{E}_{+}(x,y-1)$};
\begin{scope}[shift={(0,.15)} ]
\draw[ultra thick] (0,2.15)--(2,2.15);
\draw[fill,gray](0,2.15) circle(2pt);
\end{scope}
\begin{scope}[shift={(0,2.6)}]
\draw[fill,gray](0.15,0) circle(2pt);
\draw[ultra thick,->] (0,0.15)--(0,1);
\draw[ultra thick] (0,1)--(0,2);
\draw[ultra thick,->] (0,2)--(1,2);
\draw[ultra thick] (1,2)--(2,2);
\draw[ultra thick,->] (2,2)--(2,1);
\draw[ultra thick] (2,1)--(2,0);
\draw[ultra thick,->] (2,0)--(1.6,0);
\draw[ultra thick] (1.75,0)--(.2,0);
\draw[fill,gray](0,.15) circle(2pt);
\draw[fill,gray](1,1) circle(3pt);
\node[above] at (1,1.1) {$\mathcal{E}_{-}(x,y)$};
\end{scope}
\draw[fill,gray,opacity=.7,line width=1.6mm,>=stealth,->] (1,2.49)--(1,3.5);
\draw[gray,opacity=.7,line width=1.6mm,>=stealth,->] (1,2.5)--(1,1.1);
\node[left] at (-.3,1.){$V_Y$};
\node[left] at (-.3,1.8){$(x,y)$};
\node[left] at (-.3,0){$(x,y-1)$};
\node[left,above] at (-1.1,2.){$E_+(x,y;\hat 1)$};
\draw[ultra thick,->] (-.3,-.0)--(-.3,1.4);
\draw[ultra thick] (-.3,1.3)--(-.3,1.9);
        \end{tikzpicture}

\caption{
 \end{center}
\end{subfigure}
\begin{subfigure}[b]{.5\textwidth
\begin{center}
\vspace{2cm}
        \begin{tikzpicture}[scale=1.3]
\draw[fill,gray](0.15,0) circle(2pt);
\draw[ultra thick,->] (0,0.15)--(0,1);
\draw[ultra thick] (0,1)--(0,2);
\draw[ultra thick,->] (0,2)--(1,2);
\draw[ultra thick] (1,2)--(2,2);
\draw[ultra thick,->] (2,2)--(2,1.5);
\draw[ultra thick] (2,1.65)--(2,0);
\draw[ultra thick,->] (2,0)--(1,0);
\draw[ultra thick] (1,0)--(.2,0);
\draw[fill,gray](0,.15) circle(2pt);
\draw[fill,gray](1,1) circle(3pt);
\node[above] at (1,1.1) {$\mathcal{E}_{-}(x-1,y)$};
\draw[ultra thick] (2.3,0)--(2.3,2.);
\draw[fill,gray](2.3,0) circle(2pt);
\begin{scope}[shift={(2.6,.0)}]
\draw[fill,gray](0.15,0) circle(2pt);
\draw[ultra thick,->] (0,0.15)--(0,.81);
\draw[ultra thick] (0,.8)--(0,2);
\draw[ultra thick,->] (0,2)--(1,2);
\draw[ultra thick] (1,2)--(2,2);
\draw[ultra thick,->] (2,2)--(2,1);
\draw[ultra thick] (2,1)--(2,0);
\draw[ultra thick,->] (2,0)--(1,0);
\draw[ultra thick] (1,0)--(.2,0);
\draw[fill,gray](0,.15) circle(2pt);
\draw[fill,gray](1,1) circle(3pt);
\node[above] at (1,1.1) {$\mathcal{E}_{+}(x,y)$};
\end{scope}
\draw[fill,gray,opacity=.7,line width=1.6mm,>=stealth,->] (2.41,1)--(1.1,1);
\draw[gray,opacity=.7,line width=1.6mm,>=stealth,->] (2.4,1)--(3.5,1);
\node[below] at (-0.4,-.3) {${\color{black} (x-1,y)}$};
\node[below] at (2.3,-.3) {$(x,y)$};
\node[below] at (1.2,-.4) {$V_X$};
\node[below] at (4.25,-.1) {$E_+(x,y;\hat 2)$};
\draw[ultra thick,->] (0.15,-.3)--(1.,-.3);
\draw[ultra thick] (1,-.3)--(2.,-.3);
\draw[thin,->] (2.4,-.150)..controls (2.5,-.38) ..(3.3,-.35);

        \end{tikzpicture}
        \end{center}
        \vspace{.1cm}
\caption{
\end{subfigure}
\hspace{-1.7cm}

      \caption{Inverse canonical transformations
      leading to minimal couplings. (a) Two loops separated in the vertical direction couple minimally through $V_Y$
as shown in (\ref{dpot1}) (b) Two loops separated in the
horizontal direction couple minimally through $V_X$
as shown in (\ref{dpot2})}.
\label{mincoup}
\end{figure}
\subsection*{Inverse relations}
It is easy to invert the canonical relations (\ref{cr2}),   (\ref{cr4}) and (\ref{cr5}) for the Kogut-Susskind electric fields:
\begin{align}
E^a_{+}(x,0;\hat 1)=&~{F}^a_{X+}(x,0)+\mathcal{E}_-^a(x,0);~~~~~~~~~~~~~~~~~~~~~~~~\\
 E_{+}(x,y;\hat 1)=&~\mathcal{E}_{-}(x,y)-V^\dagger_Y(x,y-1)\mathcal{E}_{+}(x,y-1) V_Y(x,y-1)
 \label{dpot1}\\
E_{+}(x,y; \hat 2)=&~\mathcal{E}_{+}(x,y)- {\mathsf S}^\dagger (x-1\rightarrow x;y)\mathcal{E}_{-}(x-1,y) {\mathsf S}(x-1\rightarrow x;y)+{F}_{Y+}(x,y).
\label{dpot2}
\end{align}
In (\ref{dpot2}) ${\mathsf S}\left(x-1\rightarrow x;y\right)$ is a non-local flux line from $(x-1,y)$ to $ (x,y)$ defined as
\bea
{\mathsf S}\left(x-1\rightarrow x;y\right)=\prod_{j=1}^{y} V^\dagger_Y(x,~y-j)\mathcal{W}(x,~y-j) V_X(x,~0)\prod_{k=1}^{y-1} V_Y(x+1,~k)
 \eea
The Gauss law constraints (\ref{ogl}) in terms of the new fields are
\bea
{\cal G}^a(x,y)= {\mathcal E}^a_{-}(x,y)+{\mathcal E}^a_{+}(x,y)+{\mathsf E}^a_{Y-}(x,y)+{\mathsf E}^a_{Y+}(x,y)=0.
\eea

\section{SU(N) duality}
The canonical transformations ensure that all $N^2$ fundamental plaquette loop operators satisfy:
\begin{align}
[ \mathcal{E}^a_{+}(x,y), \mathcal{W}_{\alpha\beta}(x,y)]= - \left( {T^a}\mathcal{W}(x,y)\right)_{\alpha\beta}, ~~~~~~
[ \mathcal{E}^a_{-}(x,y), \mathcal{W}_{\alpha\beta}(x,y)]= \;\; \left(\mathcal{W}(x,y){T^a}\right)_{\alpha\beta}
\end{align}
As ${\cal W}$ describes the SU(N) magnetic fields, its
canonically conjugate  fields  ${\cal E}(x,y)$ are the (dual) scalar electric potentials. Note that the Kogut-Susskind
electric fields are no longer fundamental and  obtained
in  terms of the electric potentials in (\ref{dpot1}) and (\ref{dpot2}).
This is the exact SU(N) electric-magnetic duality. Infact
${\cal E}$ can be interpreted as the SU(N) disorder field as it directly affects the magnetic fluxes.

\subsection*{Non-local to local  dynamics}

\begin{figure}[t]
\begin{center}
 	\begin{tikzpicture}[scale=.8]

\draw[ultra thick] (4,4)--(4,6);
\draw[ultra thick] (4,4)--(6,4);
\draw[dotted,ultra thick,opacity=.3] (3,2)--(3,8);
\draw[dotted,ultra thick,opacity=.3] (5,2)--(5,8);
\draw[dotted,ultra thick,opacity=.3] (7,2)--(7,8);
\draw[dotted,ultra thick,opacity=.3] (2,3)--(8,3);
\draw[dotted,ultra thick,opacity=.3] (2,5)--(8,5);
\draw[dotted,ultra thick,opacity=.3] (2,7)--(8,7);
\draw[fill,gray] (2,2) circle (3.5pt);
\draw[fill,gray] (4,2) circle (3.5pt);
\draw[fill,gray] (6,2) circle (3.5pt);
\draw[fill,gray] (8,2) circle (3.5pt);
\draw[fill,gray] (2,4) circle (3.5pt);
\draw[fill,gray] (4,4) circle (3.5pt);
\draw[fill,gray] (6,4) circle (3.5pt);
\draw[fill,gray] (8,4) circle (3.5pt);
\draw[fill,gray] (2,6) circle (3.5pt);
\draw[fill,gray] (4,6) circle (3.5pt);
\draw[fill,gray] (6,6) circle (3.5pt);
\draw[fill,gray] (8,6) circle (3.5pt);
\draw[fill,gray] (2,8) circle (3.5pt);
\draw[fill,gray] (4,8) circle (3.5pt);
\draw[fill,gray] (6,8) circle (3.5pt);
\draw[fill,gray] (8,8) circle (3.5pt);
\node[below]at(4,3.9){{$\mathcal{E}$}};
\node[below]at(6,3.9){$\mathcal{E}$};
\node[above]at(4,6.1){$\mathcal{E}$};
\node[above]at(4.6,5.2){$V_Y$};
\node[above]at(5.4,4.1){$V_X$};
\draw[ultra thick,gray, opacity=.6,->] (6,4.3)..controls (6.9,6.4)..(8.2,6.7);
\node[below]at(9.3,7.8){Minimal};
\node[below]at(9.3,7.3){ Coupling};
	\end{tikzpicture}

\vspace{.4cm}
\end{center}

	\caption{Minimal couplings of neighbouring dual
	potentials ${\cal {E}}(\tilde x, \tilde y)$ in (\ref{hamfin}) on dual lattice with
	dual sites $(\tilde x, \tilde y)$ denoted by ${\textcolor{gray} \bullet} $.}
\label{fintt}
\end{figure}
We have introduced non-locality in
horizontal interactions through ${\mathsf S}(x-1\rightarrow x,~y)$ in (\ref{dpot2}) as horizontal links have been converted into the plaquettes.  This non-locality issue
is resolved if we  introduce new gauge fields  $V_X(x,y)$ on every horizontal link through the constraint:
\bea
V_X(x,~y)V_Y(x+1,~y)V^\dagger_X(x,~y+1)V^\dagger_Y(x,~y) = {\cal W}(x,~y).
\label{remnon}
\eea
It is easy to check the $V_X(x,y)$ defined in
removes non-locality.
Now all adjoint dual potentials are minimally coupled to each other.
The Kogut-Susskind Hamiltonian (\ref{ham})  written in terms of the dual operators is
\begin{align}
\label{hamfin}
H=\;&\frac{K}{g^2}\;\sum_{\vec{n}}\text{Tr}\left[2-\left(\mathcal{W}(\vec{n})+\mathcal{W}^\dagger (\vec{n})\right)\right ] \nonumber\\
        &+g^2 \sum_{\vec{n}} \text{Tr}\left [(\mathcal{E}^2(\vec{n}))-2\sum_{I=X,Y} \big(\mathcal{E}_{-}(\vec{n}+\hat I) V_I (\vec{n})\mathcal{E}_{+}(\vec{n})V^\dagger_I(\vec{n})\big) +  \Delta_Y(\vec n) \right]

        \end{align}
        where
        \begin{align}
\Delta_Y(\vec n) = &\left[({F}_{Y+}^2(\vec{n}))+2({F}_{Y+}(\vec{n})\mathcal{E}_{+}(\vec{n}))-2\big({F}_{Y+}(\vec{n}+1) V_X(\vec{n})\mathcal{E}_{-}(\vec{n})V^\dagger_X(\vec{n})\big)\right]
\end{align}
There are only local interaction in Hamiltonian in terms of new variables also.
Note that
the role of non-interacting and interacting terms $H_E$ and $H_M$ have been reversed as expected and
$g^2 \rightarrow {1 \over{g^2}}$. Therefore, with all interactions proportional to $g^2$,  the dual Hamiltonian see (\ref{hamfin}) can be used to study
confinement at arbitrarily weak lattice coupling $g^2 \rightarrow 0$.

\section{Discussion \& conclusions}

In this work we have shown that
canonical transformations enable us to perform non-abelian duality leading to minimal interactions of the
dual potentials with the gauge fields. They also  convert the SU(N) interactions over plaquette
${\frac{1}{g^2}} Tr(U_1 U_2 U^\dagger_3 U^\dagger_4 + h.c.)$
terms into pure magnetic field terms ${\frac{1}{g^2}} Tr ({\cal W}(x,y) +h.c.)$.  This is a huge simplification as  the plaquette term dominates near the continuum $g^2 \rightarrow 0$ limit. Even in the simple SU(2) lattice gauge theory case these plaquette interaction lead to extremely complicated dynamics in ${\cal H}^{\text phys}$  as shown by various authors in the past \cite{involved}.  It will be interesting to develop weak coupling loop perturbation
with the dual Hamiltonian (\ref{hamfin}).
 In $(3+1)$ dimensions the above canonical transformations
can be carried out in  each of the three $(x,y), (y,z), (z,x)$  planes  by converting $U(x,y > 0, z=0, \hat 1),
 U(x,y, z > 0, \hat 2)$ and
 $U(x,y, z > 0, \hat 1)$ links into the corresponding
 plaquette loops. This leads to non-local dynamics in the
 physical loop Hilbert space ${\cal H}^{phys}$. However,
 putting the new gauge fields and working with two vector potentials should make dynamics local like in the present $(2+1)$ dimensional case.

The work in this direction is in progress and will be reported elsewhere.

\section{Acknowledgements} We would like to thank R. Anishetty and H. S. Mani for useful discussions.

redpajama_set_name: RedPajamaArXiv


text:
name "os-compute-worker"
description "The compute node, most likely with a hypervisor."
run_list(
  "role[os-base]",
  "recipe[openstack-compute::compute]",
  "role[os-network]",
)

redpajama_set_name: RedPajamaGithub


The opposition leaders have been joined in protest by over 35 Sindhi Nationalist leaders, writers and journalists who claimed that the project was a ''well planned conspiracy against Sindhis,'' the Daily News reported.
While the ANP has vowed to resist the construction of the dam, the Sindh minister made it abundantly clear that the project would only benefit Punjab and Sindh would get nothing out of it.
The ANP cabinet, which met in Peshawar on Sunday, passed a resolution, which strongly opposed construction of the dam.
Pakistan's three elected assemblies of Sindh, North West Frontier Provinve and Baluchistan have passed resolutions against the dam on more than one occasion. The NWFP has said if the disputed project is executed it will harm the country's solidarity and unity, the Dawn reported.


You will have your heart delighted with the many places at the Sunderland city. It has attractions that are capable of entertaining all age groups. It also has the perfect locations for all kinds of business meetings and our 17 Seater Minibus Hire Sunderland and 18 Seat Minibus Hire is capable of making your journey successful. Let us give you a brief description about some of the best places in the Sunderland city.
The Herrington Country Park is located in the lap of nature and you can have a great time here along with your travelling crew. This is the best place to visit if your crew consists of all age groups. If you are interested in visiting speciality museums, then National Glass Centre is recommended because it is informative and entertaining. The place is mainly known for its crafts made with glasses.
If you are a teacher interested in taking your students, our 17 Seater Minibus Hire Sunderland and 18 Seat Minibus Hire is the best choice to explore. Our drivers are familiar with each and every corner of the Sunderland city so you can always take their assistance whenever you need. The Sunderland Museum and Winter Gardens will also give you the similar experience so adding it in your travelling list is a good idea.
If you are a sports enthusiast looking for games to watch along with your travelling crew, there can be no better place than the Stadium of Light. Everything is well-arranged here from the parking facilities to the quality of services. There are many bars and restaurants around this place so you get more places to enjoy. Our 17 Seater Minibus Hire Sunderland and 18 Seat Minibus Hire facilities can take your large crew in the most comfortable way.
With Coach Hire Sunderland, you are sure to get to your destination on time to enjoy your favourite games. This city has more places to visit and it is quite a lot to describe all at the same time. Contact Coach Hire Sunderland, refer you the beautiful places like this, we can also take you places in the best quality coaches. Let us describe hiring our 17 Seater Minibus Hire Sunderland and 18 Seat Minibus Hire services is a good idea to explore the Sunderland city.
Our finest leather seats will always make you feel at ease during the journey. The pushback facility and durable seatbelts will ensure your safety along with the comfort. We have enough space even for a large travelling crew and you can comfortably place your mini bags in our overhead racks. There is plenty of space left in our coach to let you move freely. If you want to bring fragile items with you, we also have separate storage places to keep them safe and secure.
We provide many additional facilities like the Wi-Fi, charging sockets, fridge, and overhead heating system to keep you warm in the cold places. Our drivers are equipped with the high connectivity Smartphone so you can frequently stay in touch with them while you are exploring the city outside the coach. We also provide the best DVD players along with the stereo speakers to make your journey musical. You can also choose to play the songs of your choice.
Customer service is our primary concern and we are ready to answer any queries you have in mind. We have made a simple booking procedure which you can contact us anytime. We are proud of our 17 Seater Minibus Hire Sunderland and 18 Seat Minibus Hire services and we will be glad to serve you at Coach Hire Sunderland. So, if you are planning to make your journey an unforgettable experience, we know the best ways to do it. Have a nice day and bon voyage.


text:
/*
 * iperf, Copyright (c) 2014, 2016, The Regents of the University of
 * California, through Lawrence Berkeley National Laboratory (subject
 * to receipt of any required approvals from the U.S. Dept. of
 * Energy).  All rights reserved.
 *
 * If you have questions about your rights to use or distribute this
 * software, please contact Berkeley Lab's Technology Transfer
 * Department at TTD@lbl.gov.
 *
 * NOTICE.  This software is owned by the U.S. Department of Energy.
 * As such, the U.S. Government has been granted for itself and others
 * acting on its behalf a paid-up, nonexclusive, irrevocable,
 * worldwide license in the Software to reproduce, prepare derivative
 * works, and perform publicly and display publicly.  Beginning five
 * (5) years after the date permission to assert copyright is obtained
 * from the U.S. Department of Energy, and subject to any subsequent
 * five (5) year renewals, the U.S. Government is granted for itself
 * and others acting on its behalf a paid-up, nonexclusive,
 * irrevocable, worldwide license in the Software to reproduce,
 * prepare derivative works, distribute copies to the public, perform
 * publicly and display publicly, and to permit others to do so.
 *
 * This code is distributed under a BSD style license, see the LICENSE
 * file for complete information.
 */
/* iperf_util.c
 *
 * Iperf utility functions
 *
 */
#include "iperf_config.h"

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdarg.h>
#include <sys/select.h>
#include <sys/types.h>
#include <sys/time.h>
#include <time.h>
#include <errno.h>

#include "iperf_cjson.h"

/* make_cookie
 *
 * Generate and return a cookie string
 *
 * Iperf uses this function to create test "cookies" which
 * server as unique test identifiers. These cookies are also
 * used for the authentication of stream connections.
 */

void make_cookie(char *cookie)
{
	static int randomized = 0;
	char hostname[500];
	struct timeval tv;
	char temp[1000];

	if (!randomized) {
		srand((int)time(0) ^ getpid());
	}

#ifndef CONFIG_NET_LWIP
	/* Generate a string based on hostname, time, randomness, and filler. */
	(void)gethostname(hostname, sizeof(hostname));
#else
	snprintf(hostname, sizeof(hostname), "tinyara");
#endif
	(void)gettimeofday(&tv, 0);
	(void)snprintf(temp, sizeof(temp), "%s.%ld.%06ld.%08lx%08lx.%s", hostname, (unsigned long int)tv.tv_sec, (unsigned long int)tv.tv_usec, (unsigned long int)rand(), (unsigned long int)rand(), "1234567890123456789012345678901234567890");

	/* Now truncate it to 36 bytes and terminate. */
	memcpy(cookie, temp, 36);
	cookie[36] = '\0';
}

/* is_closed
 *
 * Test if the file descriptor fd is closed.
 *
 * Iperf uses this function to test whether a TCP stream socket
 * is closed, because accepting and denying an invalid connection
 * in iperf_tcp_accept is not considered an error.
 */

int is_closed(int fd)
{
	struct timeval tv;
	fd_set readset;

	FD_ZERO(&readset);
	FD_SET(fd, &readset);
	tv.tv_sec = 0;
	tv.tv_usec = 0;

	if (select(fd + 1, &readset, NULL, NULL, &tv) < 0) {
		if (errno == EBADF) {
			return 1;
		}
	}
	return 0;
}

double timeval_to_double(struct timeval *tv)
{
	double d;

	d = tv->tv_sec + tv->tv_usec / 1000000;

	return d;
}

int timeval_equals(struct timeval *tv0, struct timeval *tv1)
{
	if (tv0->tv_sec == tv1->tv_sec && tv0->tv_usec == tv1->tv_usec) {
		return 1;
	} else {
		return 0;
	}
}

double timeval_diff(struct timeval *tv0, struct timeval *tv1)
{
	double time1;
	double time2;

	time1 = tv0->tv_sec + (tv0->tv_usec / 1000000.0);
	time2 = tv1->tv_sec + (tv1->tv_usec / 1000000.0);

	time1 = time1 - time2;
	if (time1 < 0) {
		time1 = -time1;
	}
	return time1;
}

int delay(int64_t ns)
{
	struct timespec req;
	struct timespec rem;

	req.tv_sec = 0;

	while (ns >= 1000000000L) {
		ns -= 1000000000L;
		req.tv_sec += 1;
	}

	req.tv_nsec = ns;

	while (nanosleep(&req, &rem) == -1)
		if (EINTR == errno) {
			memcpy(&req, &rem, sizeof(rem));
		} else {
			return -1;
		}
	return 0;
}

#ifdef DELAY_SELECT_METHOD
int delay(int us)
{
	struct timeval tv;

	tv.tv_sec = 0;
	tv.tv_usec = us;
	(void)select(1, (fd_set *)0, (fd_set *)0, (fd_set *)0, &tv);
	return 1;
}
#endif

void cpu_util(double pcpu[3])
{
#if 0
	static struct timeval last;
	static clock_t clast;
	static struct rusage rlast;
	struct timeval temp;
	clock_t ctemp;
	struct rusage rtemp;
	double timediff;
	double userdiff;
	double systemdiff;

	if (pcpu == NULL) {
		gettimeofday(&last, NULL);
		clast = clock();
		getrusage(RUSAGE_SELF, &rlast);
		return;
	}

	gettimeofday(&temp, NULL);
	ctemp = clock();
	getrusage(RUSAGE_SELF, &rtemp);

	timediff = ((temp.tv_sec * 1000000.0 + temp.tv_usec) - (last.tv_sec * 1000000.0 + last.tv_usec));
	userdiff = ((rtemp.ru_utime.tv_sec * 1000000.0 + rtemp.ru_utime.tv_usec) - (rlast.ru_utime.tv_sec * 1000000.0 + rlast.ru_utime.tv_usec));
	systemdiff = ((rtemp.ru_stime.tv_sec * 1000000.0 + rtemp.ru_stime.tv_usec) - (rlast.ru_stime.tv_sec * 1000000.0 + rlast.ru_stime.tv_usec));

	pcpu[0] = (((ctemp - clast) * 1000000.0 / CLOCKS_PER_SEC) / timediff) * 100;
	pcpu[1] = (userdiff / timediff) * 100;
	pcpu[2] = (systemdiff / timediff) * 100;
#endif
}

const char *get_system_info(void)
{
#if 0
	static char buf[1024];
	struct utsname uts;

	memset(buf, 0, 1024);
	uname(&uts);

	snprintf(buf, sizeof(buf), "%s %s %s %s %s", uts.sysname, uts.nodename, uts.release, uts.version, uts.machine);

	return buf;
#else
	return NULL;
#endif
}

const char *get_optional_features(void)
{
	static char features[1024];
	unsigned int numfeatures = 0;

	snprintf(features, sizeof(features), "Optional features available: ");

#if defined(HAVE_CPU_AFFINITY)
	if (numfeatures > 0) {
		strncat(features, ", ", sizeof(features) - strlen(features) - 1);
	}
	strncat(features, "CPU affinity setting", sizeof(features) - strlen(features) - 1);
	numfeatures++;
#endif							/* HAVE_CPU_AFFINITY */

#if defined(HAVE_FLOWLABEL)
	if (numfeatures > 0) {
		strncat(features, ", ", sizeof(features) - strlen(features) - 1);
	}
	strncat(features, "IPv6 flow label", sizeof(features) - strlen(features) - 1);
	numfeatures++;
#endif							/* HAVE_FLOWLABEL */

#if defined(HAVE_SCTP)
	if (numfeatures > 0) {
		strncat(features, ", ", sizeof(features) - strlen(features) - 1);
	}
	strncat(features, "SCTP", sizeof(features) - strlen(features) - 1);
	numfeatures++;
#endif							/* HAVE_SCTP */

#if defined(HAVE_TCP_CONGESTION)
	if (numfeatures > 0) {
		strncat(features, ", ", sizeof(features) - strlen(features) - 1);
	}
	strncat(features, "TCP congestion algorithm setting", sizeof(features) - strlen(features) - 1);
	numfeatures++;
#endif							/* HAVE_TCP_CONGESTION */

#if defined(HAVE_SENDFILE)
	if (numfeatures > 0) {
		strncat(features, ", ", sizeof(features) - strlen(features) - 1);
	}
	strncat(features, "sendfile / zerocopy", sizeof(features) - strlen(features) - 1);
	numfeatures++;
#endif							/* HAVE_SENDFILE */

#if defined(HAVE_SO_MAX_PACING_RATE)
	if (numfeatures > 0) {
		strncat(features, ", ", sizeof(features) - strlen(features) - 1);
	}
	strncat(features, "socket pacing", sizeof(features) - strlen(features) - 1);
	numfeatures++;
#endif							/* HAVE_SO_MAX_PACING_RATE */

	if (numfeatures == 0) {
		strncat(features, "None", sizeof(features) - strlen(features) - 1);
	}

	return features;
}

/* Helper routine for building cJSON objects in a printf-like manner.
**
** Sample call:
**   j = iperf_json_printf("foo: %b  bar: %d  bletch: %f  eep: %s", b, i, f, s);
**
** The four formatting characters and the types they expect are:
**   %b  boolean           int
**   %d  integer           int64_t
**   %f  floating point    double
**   %s  string            char *
** If the values you're passing in are not these exact types, you must
** cast them, there is no automatic type coercion/widening here.
**
** The colons mark the end of field names, and blanks are ignored.
**
** This routine is not particularly robust, but it's not part of the API,
** it's just for internal iperf3 use.
*/
cJSON *iperf_json_printf(const char *format, ...)
{
	cJSON *o;
	va_list argp;
	const char *cp;
	char name[100];
	char *np;
	cJSON *j;

	o = cJSON_CreateObject();
	if (o == NULL) {
		return NULL;
	}
	va_start(argp, format);
	np = name;
	for (cp = format; *cp != '\0'; ++cp) {
		switch (*cp) {
		case ' ':
			break;
		case ':':
			*np = '\0';
			break;
		case '%':
			++cp;
			switch (*cp) {
			case 'b':
				j = cJSON_CreateBool(va_arg(argp, int));
				break;
			case 'd':
				j = cJSON_CreateNumber(va_arg(argp, int64_t));
				break;
			case 'f':
				j = cJSON_CreateNumber(va_arg(argp, double));
				break;
			case 's':
				j = cJSON_CreateString(va_arg(argp, char *));
				break;
			default:
				va_end(argp);
				return NULL;
			}
			if (j == NULL) {
				va_end(argp);
				return NULL;
			}
			cJSON_AddItemToObject(o, name, j);
			np = name;
			break;
		default:
			*np++ = *cp;
			break;
		}
	}
	va_end(argp);
	return o;
}

/* Debugging routine to dump out an fd_set. */
void iperf_dump_fdset(FILE *fp, char *str, int nfds, fd_set *fds)
{
	int fd;
	int comma;

	fprintf(fp, "%s: [", str);
	comma = 0;
	for (fd = 0; fd < nfds; ++fd) {
		if (FD_ISSET(fd, fds)) {
			if (comma) {
				fprintf(fp, ", ");
			}
			fprintf(fp, "%d", fd);
			comma = 1;
		}
	}
	fprintf(fp, "]\n");
}


Beatrice names the orders of angels to Dante; Seraphim, Cherubim, Thrones, Dominions, Virtues, Powers, Principalities, Archangels and Angels.
This painting is in acrylic on a Loxley Gold box canvas and has two layers of varnish. It is signed on the reverse in pencil. All edges are painted and varnished. The image size is 10cm x 15cm (4" x 6").


The Metropolitan Oval U-12 team opened their spring campaign with a visit to rivals NY Red Bulls this past Saturday afternoon. Fresh off a trip to the finals in the NYC Indoor Classic–the culmination of their winter futsal training cycle–the Met Oval boys had yet to train outdoors in preparation for this opening match. With temperatures hovering around 32ºF, the team headed to the Red Bulls training facility in NJ expecting a competitive and entertaining contest.
The game would not disappoint as both teams were evenly balanced and motivated for a positive result. The Red Bulls came out strong and capitalized on their early pressure, as a miscued Met Oval back pass led to an indirect Red Bulls free-kick from extremely close range inside the box. The Red Bulls promptly converted, giving themselves a 1-0 lead after just one minute of play. Despite the sluggish start, Met Oval stuck together and exhibited impressive mental toughness as they fought back for the remainder of the 1st half, establishing quality possession and an ability to play out of the back against high pressure.
The intensity from both teams continued in the second half. Met Oval was able to break through the defensive lines of the Red Bulls forcing them to withdraw from their high pressure tactic. High quality midfield possession and sharp passing combinations helped Met Oval produce numerous attacking waves and threatening goal scoring opportunities. Met Oval equalized 15 minutes into the second half when Abdul Seck forcefully slotted a rebound from Balthazar Saunders' long-range effort that struck off the post, providing a spark to an already energetic and intense match.
Both sides responded well to Abdul's equalizer, raising the intensity and trading goal-scoring opportunities for the remainder of the second half. Strong defensive performances by Jobany Garcia, Juan Orosio, Omar Torres and GK Manny Smalios helped Met Oval keep the score level at one. Pierro Elias' and Niko Kapandaze's attacking prowess continued to generate goal-scoring opportunities, keeping the Red Bulls on their heels defensively. Met Oval almost found winning goals in the final minutes via efforts from both Balthazar and Niko, but unfortunately, their shots narrowly missed the target.
The match finished with a final score of 1-1. Though Met Oval would have liked to have opened their spring campaign in winning fashion, the boys have many confidence-building positives to take away from this performance. They showed mental toughness away from home and an ability to compete with any team in the region. Most importantly, they showed an impressive amount of trust in the Met Oval style of play (uptempo and possession-based attacking soccer) in adverse conditions.
Met Oval U-12 will look to build off this result when they host Everton FC Westchester U-12 in their next match in the Northeast Pre-Academy League. This game is scheduled for a 1:00pm kickoff on Saturday, March 21st at Met Oval.
March 9, 2015 by Matthew Ratajczak.


text:
What Is a "Cool" Parent?
By Land or By Sea, This Texas Boat Parade Is One Big Party
Susie Tommaney
| Special Events |
Susie Tommaney | February 8, 2017 | 6:00am
As many as 125 boats are expected to participate in this year's Yachty Gras Grand Night Parade.
Photo by Darrell Picha
Shrinking violets don't stand a chance in Clear Lake's annual Yachty Gras Grand Night Parade, billed as "America's largest Mardi Gras boat parade." Sure, judging is based on all sorts of factors – theme, music, lighting, creativity and costumes – but it's the enthusiasm that will take you over the top for the win.
2016 Best of Show winner, Cajun Seadation, pulled out all the stops last year.
It was the hula-hoopin', umbrella-twirling krewe of Cajun Seadation that snagged Best of Show last year, while the dancing jesters of Palagic Soul earned top honors in the power category.
21 Best Things to Do in Houston This Week: Babs, Ol' Blue Eyes & Broadway's N'Kenge
Discipline and protocol garnered second place for the Sea Scout Ship Triton in the sail division last year. Standing at attention in their dress whites, their shipshape formation and unified salute commanded respect. But they were pushed out of the top spot by those disco-dancing, glitter-garbed revelers on board the Halcyon Daze.
Hailing from St. Andrew's Episcopal Church in Pearland, the Scouts came close to winning the sail division last year.
What we can't figure out is, "Who's having the most fun?" The landlubbers on shore trying to catch the beads, or the krewes making as much noise as possible each time they pass the parade judges at Bubba Gump Shrimp Co. on the Kemah Boardwalk.
Boats of all sizes participate – all it takes is proper insurance and an appropriately silenced exhaust system – which means we've seen everything from 100-footers to one brave soul in a rowboat. "It was really funny because he had a little lantern that was like a candle, and he just rode along and stayed off to the side," says Maurine Howard, Ph.D., executive director of the Yachty Gras Foundation.
She says the boats line up in front of the Watergate Marina, then travel down Clear Creek Channel, past Clear Lake Shores, along the Kemah Boardwalk and then circle back to Galveston Bay. "They keep doing that route and they do three to four passes. It takes quite a while to do that many boats," says Dr. Howard.
2015 Best of Show winner Max Krewe lit up the night to impress the judges during that year's competition.
Yachty Gras extends invitations to the mayors of Houston, Galveston and surrounding areas as arbiters of originality and good taste. "All around the lake, every city, La Porte, Baytown, Pearland, every city's mayor is invited to be a judge," says Howard.
And whoever started that rumor about "no beads" needs to walk the plank. Howard assures us that the skippers are out buying beads in bulk, and that people are already standing in line to catch them. They're in the process of sourcing vendors and, come next year, they'll be introducing biodegradable beads.
The Yachty Gras Grand Night Parade begins February 18 at 7 p.m. along the Seabrook Channel and the Kemah Boardwalk in Clear Lake. For information, visit yachtygras.com. Free to watch.
Susie Tommaney is a contributing writer who enjoys covering the lively arts and culture scene in Houston and surrounding areas, connecting creative makers with the Houston Press readers to make every week a great one.
Bloody Hell: The First Bananas Horror Film of the Year
Toxic Masculinity Makes Crisis Harder

redpajama_set_name: RedPajamaCommonCrawl


The payload's buzzer alarm filtered down through the Virginia forest; we had found it. We now knew at least some part of the payload survived a 100,000-foot-high trip to the stratosphere, and we were able to find it again. Dangling about 50 feet in the air were the remains of our space balloon. I wish I could say that I was the one who was able to snag the branch using a slingshot and fishing wire, but that honor went to another of my colleagues.
Part of the payload was a mini-figure avatar of Engility's senior vice president for the Space and Mission Systems Group, Mark Bruno. The group's technical director, Darwin Bingham, had included mini-Mark as part of the company's Flat Stanley contest. We'd been trying to get it down for over an hour, and were about to try using a bow and arrow, when it finally fell. Darwin screamed out that mini-Mark survived! He was so excited, he could hardly contain himself. After we trekked back to our cars with the intact cameras in hand, we found we had captured the money shot of mini-Mark outlined against the curvature of the earth.
Internships with Slingshots and Mini-figures?
How did my summer internship with Engility lead me to the backwoods of Virginia, toting a slingshot and searching for mini-figures, you ask? I, and other interns, were invited to join Darwin and other Engility employees in some after-work-hours fun…could we affordably get a payload into the stratosphere?
The launch demonstrated that we could indeed launch and retrieve a high-altitude balloon with limited manpower and budget…not to mention it was a fun hands-on experience for the interns and a social/team-building activity. It was nice to work with colleagues and my bosses on something that wasn't related to my internship project. You get to know people better and it was fun to actually build and troubleshoot hardware. The most fun part was just the experience of launch day and finding a place to launch, then trying to track the balloon, then walking through the woods in hopes of finding the cameras, it was something I hadn't imagined I'd do with my bosses. Did I mention I drove a chase car, helped inflate the balloon, and ultimately launched our creation skyward?
This was my second summer working as an Engility intern. The summer before last, I worked as a research assistant at the South African National Space Agency in Hermanus, South Africa, about an hour and a half east of Cape Town. That experience was vastly different for many reasons, and the experience of doing research versus working on a contractor project is also very different. In South Africa, I worked with people from very dissimilar backgrounds and lived in another country for some time. I didn't anticipate all the minute cultural differences I'd encounter. Working at Engility introduced me to corporate culture and opened my eyes to the whole government contractor world. Both were pretty technical, and the whole work environment is very distinctive.
Little did I imagine the fun I would have this summer. I hope my graduate studies are half as interesting.
I just graduated in April from the University of Michigan-Ann Arbor with a bachelor's degree in Aerospace Engineering. I'm now going back to Michigan to pursue a master's degree in Space Engineering. I'm originally from the Chicago area, I played Euphonium in the Michigan Marching Band, I like to ride motorcycles, and love the space industry.


Now is a GREAT time to plan to renew your vows whether you've been married a few years or decades, and you can plan to do it however you want to with any group of witnesses you want to. The budget can be large or small. You can have the full blown wedding you never had before, a recreation of the glorious day, or the get-away wedding you truly wanted the first time!
If they issued you a wedding certificate with the longitude and latitude of your spot, you can plan to do it all over again in the exact same spot at sea. This may not be unique to the Keys yachts, so if you were married on the boat in the Atlantic or Chesapeake Bay, check in on this feature. It is pretty awesome.
It's not legal or illegal, so don't sweat having an official document or an officiate (unless you want the officiate you had previously). Couples have conducted it themselves, after all this is charted water, or they've had a friend or love one preside over the ceremony.
For all sorts of good reasons, you can narrow your guest list down to those intimate few, including new children. Or you can have the dozens of new people in your life for a great gathering. Big or small, vow renewals have had it all.
Everything is acceptable from wearing the wedding gown and tuxedo from the original "I Do" day to wearing a sundress and shorts on the beach.
If you had a beach wedding, do it again. If you want to do it in the barn, go for it. Want to go to the islands? Yes. Want it to be done in a different decade or style? Far out, man. Disco to Renaissance, themes are all open.
Along with no officiate, there isn't a wedding registry unless truly desired or necessitated. Think of going for a charity or donation drive for your special day. This will work best if you have a large guest list. For small, intimate gathers, presence not presents.
Send minted invitations. Carry a bouquet. Exchange vows. Pick a beautiful venue. Have your three tier cake! Toast with champagne! You deserve it.
There are hundreds of good reasons to have a vow renewal ceremony, but the number one reason I believe is to acknowledge that you have accomplished something momentous in your personal life. Marriage is commitment and hard work. Marriage is life altering. Vow renewals at the least should be an acknowledgement of your accomplishment.