\definecolor{mygreenfill}{RGB}{169, 234, 186}
\definecolor{mygreenborder}{RGB}{29, 145, 61}
\definecolor{mybluefill}{RGB}{204, 222, 255}
\definecolor{myblueborder}{RGB}{66, 106, 189}
\definecolor{mygray}{RGB}{150, 150, 150}



\begin{tikzpicture}[
    node distance=2cm,
    % Style for Green Nodes
    greenbox/.style={
        rectangle,
        draw=mygreenborder,
        fill=mygreenfill,
        line width=1.2pt,
        align=center,
        minimum height=1cm,
        font=\sffamily
    },
    % Style for Blue Nodes
    bluebox/.style={
        rectangle,
        draw=myblueborder,
        fill=mybluefill,
        line width=1.2pt,
        align=center,
        minimum height=1cm,
        font=\sffamily
    },
    % Style for Arrows
    myarrow/.style={
        ->,
        >={Stealth[length=3mm, width=2mm]},
        draw=black!80,
        line width=1.2pt,
        rounded corners=5pt
    },
    % Style for Background Dashed Circles
    dashedloop/.style={
        dashed,
        draw=mygray,
        line width=1pt
    }
]

    % --- Coordinate Layout ---
    % Defining a grid relative to the center

    % Left Loop (Green) Nodes
    \node[greenbox, minimum width=3.5cm] (commerce) at (-3.5, 2) {Commerce Experiment};
    \node[greenbox, minimum width=1.5cm] (raw) at (-6.5, 0) {Raw\\Logs};
    \node[greenbox, minimum width=1.5cm] (features) at (-4, -2.5) {Features};
    \node[greenbox, minimum width=2.5cm] (classification) at (-1, -0.5) {Classification\\Training A/H};

    % Right Loop (Blue) Nodes
    \node[bluebox, minimum width=2.5cm] (trainedpricing) at (2.5, 2) {Trained Pricing};
    \node[bluebox, minimum width=2.5cm] (policy) at (5.5, 0) {Trained Pricing\\Policy};
    \node[bluebox, minimum width=2.5cm] (rlgym) at (2.5, -2.2) {RL Gym\\Training};

    % --- Background Dashed Loops ---
    \begin{scope}[on background layer]
        % Left Loop Circle
        \draw[dashedloop] (-3.5, 0) ellipse (3.5cm and 2.8cm);
        % Right Loop Circle
        \draw[dashedloop] (3.5, 0) ellipse (3.5cm and 2.8cm);
    \end{scope}

    % --- Arrows: Loop One (Green) ---
    % Commerce -> Raw Logs
    \draw[myarrow] (commerce.west) to[out=180, in=90] (raw.north);

    % Raw Logs -> Features
    \draw[myarrow] (raw.south) to[out=270, in=180] (features.west);

    % Features -> Classification
    \draw[myarrow] (features.east) to[out=0, in=250] (classification.south);

    % Classification -> Commerce (Closing the loop)
    \draw[myarrow] (classification.north) to[out=110, in=0] (commerce.east);

    % --- Arrows: Loop Two (Blue) ---
    % Classification (Green) -> RL Gym (Blue) - Crossing over
    \draw[myarrow] (classification.east) to[out=0, in=180] (rlgym.west);

    % RL Gym -> Policy
    \draw[myarrow] (rlgym.east) to[out=0, in=270] (policy.south);

    % Policy -> Trained Pricing
    \draw[myarrow] (policy.north) to[out=90, in=0] (trainedpricing.east);

    % Trained Pricing -> Commerce (Crossing back)
    \draw[myarrow] (trainedpricing.west) -- node[above, font=\sffamily\small, yshift=2pt] {New Pricing} (commerce.east);

    % --- Text Labels ---

    % Loop One Label
    \node[font=\sffamily, align=center] at (-3.8, 0) {Loop One:\\Data \textit{(Online)}};

    % Loop Two Label
    \node[font=\sffamily, align=center] at (3.5, 0) {Loop Two:\\Defense Gym \textit{(Offline)}};

    % Bottom Legend
    \node[font=\sffamily\small] (taskA) at (-4, -4) {Dynamic Pricing Task A};
    \node[font=\sffamily\small] (taskB) at (4, -4) {Dynamic Pricing Task B};
    \node[font=\sffamily\small] (indep) at (0, -4) {Independent};

    % Arrows for bottom legend
    \draw[->, >=Stealth, thick, darkgray] (indep.west) -- (taskA.east);
    \draw[->, >=Stealth, thick, darkgray] (indep.east) -- (taskB.west);

\end{tikzpicture}
